diff --git a/docs/example_plugins/basic.py b/docs/example_plugins/basic.py index b80af0c6..33190490 100644 --- a/docs/example_plugins/basic.py +++ b/docs/example_plugins/basic.py @@ -22,11 +22,11 @@ def stop(self): super().stop() def handle_command(self, arguments, lxm): - response_content = "Hello "+RNS.prettyhexrep(lxm.source_hash)+". " + response_content = f"Hello {RNS.prettyhexrep(lxm.source_hash)}. " response_content += "This is a response from the basic command example. It doesn't do much, but here is a list of the arguments you included:\n" for argument in arguments: - response_content += "\n"+str(argument) + response_content += f"\n{argument)}" # Let the Sideband core send a reply. self.get_sideband().send_message( diff --git a/docs/example_plugins/comic.py b/docs/example_plugins/comic.py index 3e5a3f4a..3a8022ed 100644 --- a/docs/example_plugins/comic.py +++ b/docs/example_plugins/comic.py @@ -61,7 +61,7 @@ def handle_command(self, arguments, lxm): except Exception as e: # Send an error message self.get_sideband().send_message( - "An error occurred while trying to fetch the specified comic:\n\n"+str(e), + f"An error occurred while trying to fetch the specified comic:\n\n{e)}", lxm.source_hash, False, # Don't use propagation by default, try direct first skip_fields = True, # Don't include any additional fields automatically diff --git a/docs/example_plugins/service.py b/docs/example_plugins/service.py index 085c2655..22c5e2a9 100644 --- a/docs/example_plugins/service.py +++ b/docs/example_plugins/service.py @@ -12,9 +12,9 @@ class BasicServicePlugin(SidebandServicePlugin): def service_jobs(self): while self.should_run: time.sleep(5) - RNS.log("Service ping from "+str(self)) + RNS.log(f"Service ping from {self)}") - RNS.log("Jobs stopped running for "+str(self)) + RNS.log(f"Jobs stopped running for {self)}") def start(self): # Do any initialisation work here diff --git a/docs/example_plugins/view.py b/docs/example_plugins/view.py index a30f9d1b..e4a755f1 100644 --- a/docs/example_plugins/view.py +++ b/docs/example_plugins/view.py @@ -131,7 +131,7 @@ def read_frames(self): self.frame_queue.put(frame) except Exception as e: - RNS.log("An error occurred while reading frames from the camera: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while reading frames from the camera: {e)}", RNS.LOG_ERROR) self.release_camera() @@ -195,10 +195,10 @@ def read_frames(self): self.frame_queue.put(frame) - RNS.log(str(self)+" idled", RNS.LOG_DEBUG) + RNS.log(f"{self)} idled", RNS.LOG_DEBUG) except Exception as e: - RNS.log("An error occurred while reading frames from the stream: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while reading frames from the stream: {e)}", RNS.LOG_ERROR) self.release_stream() @@ -236,7 +236,7 @@ def update(self): self.source_data = image_file.read() except Exception as e: - RNS.log("Could not read image at \"{self.path}\": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not read image at \"{{self.path}}\": {e)}", RNS.LOG_ERROR) self.source_data = None class ViewCommandPlugin(SidebandCommandPlugin): @@ -292,7 +292,7 @@ def handle_command(self, arguments, lxm): else: response = "Available Sources:\n" for source in self.sources: - response += "\n - "+str(source) + response += f"\n - {source)}" self.message_response(response, requestor) return diff --git a/docs/utilities/rns_audio_call_calc.py b/docs/utilities/rns_audio_call_calc.py index 61bbfffe..238aa458 100644 --- a/docs/utilities/rns_audio_call_calc.py +++ b/docs/utilities/rns_audio_call_calc.py @@ -100,7 +100,7 @@ def simulate(link_speed=9600, audio_slot_ms=70, codec_rate=1200, method="msgpack print(f" On-air length : {PACKET_LEN} bytes") print(f" Packet airtime : {PACKET_AIRTIME}ms") - print( "\n===== Results for "+RNS.prettyspeed(LINK_SPEED)+" Link Speed ===\n") + print( f"\n===== Results for {RNS.prettyspeed(LINK_SPEED)} Link Speed ===\n") print(f" Final latency : {TOTAL_LATENCY}ms") print(f" Recording latency : contributes {TARGET_MS}ms") print(f" Packet transport : contributes {PACKET_LATENCY}ms") diff --git a/recipes/codec2/__init__.py b/recipes/codec2/__init__.py index 81aa527a..44219bce 100644 --- a/recipes/codec2/__init__.py +++ b/recipes/codec2/__init__.py @@ -13,13 +13,13 @@ class Codec2Recipe(Recipe): def include_flags(self, arch): '''Returns a string with the include folders''' codec2_includes = join(self.get_build_dir(arch.arch), 'build_android') - return (' -I' + codec2_includes) + return (f" -I{codec2_includes}") def link_dirs_flags(self, arch): '''Returns a string with the appropriate `-L` to link with the libs. This string is usually added to the environment variable `LDFLAGS`''' - return ' -L' + self.get_build_dir(arch.arch) + return f" -L{self.get_build_dir(arch.arch)}" # def link_libs_flags(self): # '''Returns a string with the appropriate `-l` flags to link with diff --git a/recipes/ffpyplayer/__init__.py b/recipes/ffpyplayer/__init__.py index f1e1d49a..9f8fb9a6 100644 --- a/recipes/ffpyplayer/__init__.py +++ b/recipes/ffpyplayer/__init__.py @@ -146,12 +146,12 @@ class Recipe(metaclass=RecipeMeta): def get_stl_library(self, arch): return join( arch.ndk_lib_dir, - 'lib{name}.so'.format(name=self.stl_lib_name), + f'lib{self.stl_lib_name}.so', ) def install_stl_lib(self, arch): if not self.ctx.has_lib( - arch.arch, 'lib{name}.so'.format(name=self.stl_lib_name) + arch.arch, f'lib{self.stl_lib_name}.so' ): self.install_libs(arch, self.get_stl_library(arch)) @@ -181,7 +181,7 @@ def download_file(self, url, target, cwd=None): if not url: return - info('Downloading {} from {}'.format(self.name, url)) + info(f'Downloading {self.name} from {url}') if cwd: target = join(cwd, target) @@ -190,12 +190,11 @@ def download_file(self, url, target, cwd=None): if parsed_url.scheme in ('http', 'https'): def report_hook(index, blksize, size): if size <= 0: - progression = '{} bytes'.format(index * blksize) + progression = f'{index * blksize} bytes' else: - progression = '{:.2f}%'.format( - index * blksize * 100. / float(size)) + progression = f'{index * blksize * 100.0 / float(size):.2f}%' if "CI" not in environ: - stdout.write('- Download {}\r'.format(progression)) + stdout.write(f'- Download {progression}\r') stdout.flush() if exists(target): @@ -214,7 +213,7 @@ def report_hook(index, blksize, size): attempts += 1 if attempts >= 5: raise - stdout.write('Download failed: {}; retrying in {} second(s)...'.format(e, seconds)) + stdout.write(f'Download failed: {e}; retrying in {seconds} second(s)...') time.sleep(seconds) seconds *= 2 continue @@ -253,20 +252,20 @@ def apply_patch(self, filename, arch, build_dir=None): .. versionchanged:: 0.6.0 Add ability to apply patch from any dir via kwarg `build_dir`''' """ - info("Applying patch {}".format(filename)) + info(f"Applying patch {filename}") build_dir = build_dir if build_dir else self.get_build_dir(arch) filename = join(self.get_recipe_dir(), filename) shprint(sh.patch, "-t", "-d", build_dir, "-p1", "-i", filename, _tail=10) def copy_file(self, filename, dest): - info("Copy {} to {}".format(filename, dest)) + info(f"Copy {filename} to {dest}") filename = join(self.get_recipe_dir(), filename) dest = join(self.build_dir, dest) shutil.copy(filename, dest) def append_file(self, filename, dest): - info("Append {} to {}".format(filename, dest)) + info(f"Append {filename} to {dest}") filename = join(self.get_recipe_dir(), filename) dest = join(self.build_dir, dest) with open(filename, "rb") as fd: @@ -322,7 +321,7 @@ def get_build_container_dir(self, arch): ''' dir_name = self.get_dir_name() return join(self.ctx.build_dir, 'other_builds', - dir_name, '{}__ndk_target_{}'.format(arch, self.ctx.ndk_api)) + dir_name, f'{arch}__ndk_target_{self.ctx.ndk_api}') def get_dir_name(self): choices = self.check_recipe_choices() @@ -349,17 +348,16 @@ def get_recipe_dir(self): # Public Recipe API to be subclassed if needed def download_if_necessary(self): - info_main('Downloading {}'.format(self.name)) - user_dir = environ.get('P4A_{}_DIR'.format(self.name.lower())) + info_main(f'Downloading {self.name}') + user_dir = environ.get(f'P4A_{self.name.lower()}_DIR') if user_dir is not None: - info('P4A_{}_DIR is set, skipping download for {}'.format( - self.name, self.name)) + info(f'P4A_{self.name}_DIR is set, skipping download for {self.name}') return self.download() def download(self): if self.url is None: - info('Skipping {} download as no URL is set'.format(self.name)) + info(f'Skipping {self.name} download as no URL is set') return url = self.versioned_url @@ -383,7 +381,7 @@ def download(self): filename = shprint(sh.basename, url).stdout[:-1].decode('utf-8') do_download = True - marker_filename = '.mark-{}'.format(filename) + marker_filename = f'.mark-{filename}' if exists(filename) and isfile(filename): if not exists(marker_filename): shprint(sh.rm, filename) @@ -391,10 +389,8 @@ def download(self): for alg, expected_digest in expected_digests.items(): current_digest = algsum(alg, filename) if current_digest != expected_digest: - debug('* Generated {}sum: {}'.format(alg, - current_digest)) - debug('* Expected {}sum: {}'.format(alg, - expected_digest)) + debug(f'* Generated {alg}sum: {current_digest}') + debug(f'* Expected {alg}sum: {expected_digest}') raise ValueError( ('Generated {0}sum does not match expected {0}sum ' 'for {1} recipe').format(alg, self.name)) @@ -402,7 +398,7 @@ def download(self): # If we got this far, we will download if do_download: - debug('Downloading {} from {}'.format(self.name, url)) + debug(f'Downloading {self.name} from {url}') shprint(sh.rm, '-f', marker_filename) self.download_file(self.versioned_url, filename) @@ -412,25 +408,22 @@ def download(self): for alg, expected_digest in expected_digests.items(): current_digest = algsum(alg, filename) if current_digest != expected_digest: - debug('* Generated {}sum: {}'.format(alg, - current_digest)) - debug('* Expected {}sum: {}'.format(alg, - expected_digest)) + debug(f'* Generated {alg}sum: {current_digest}') + debug(f'* Expected {alg}sum: {expected_digest}') raise ValueError( ('Generated {0}sum does not match expected {0}sum ' 'for {1} recipe').format(alg, self.name)) else: - info('{} download already cached, skipping'.format(self.name)) + info(f'{self.name} download already cached, skipping') def unpack(self, arch): - info_main('Unpacking {} for {}'.format(self.name, arch)) + info_main(f'Unpacking {self.name} for {arch}') build_dir = self.get_build_container_dir(arch) - user_dir = environ.get('P4A_{}_DIR'.format(self.name.lower())) + user_dir = environ.get(f'P4A_{self.name.lower()}_DIR') if user_dir is not None: - info('P4A_{}_DIR exists, symlinking instead'.format( - self.name.lower())) + info(f'P4A_{self.name.lower()}_DIR exists, symlinking instead') if exists(self.get_build_dir(arch)): return rmdir(build_dir) @@ -439,7 +432,7 @@ def unpack(self, arch): return if self.url is None: - info('Skipping {} unpack as no URL is set'.format(self.name)) + info(f'Skipping {self.name} unpack as no URL is set') return filename = shprint( @@ -493,7 +486,7 @@ def unpack(self, arch): .format(extraction_filename)) else: - info('{} is already unpacked, skipping'.format(self.name)) + info(f'{self.name} is already unpacked, skipping') def get_recipe_env(self, arch=None, with_flags_in_cc=True): """Return the env specialized for the recipe @@ -507,11 +500,11 @@ def prebuild_arch(self, arch): '''Run any pre-build tasks for the Recipe. By default, this checks if any prebuild_archname methods exist for the archname of the current architecture, and runs them if so.''' - prebuild = "prebuild_{}".format(arch.arch.replace('-', '_')) + prebuild = f"prebuild_{arch.arch.replace('-', '_')}" if hasattr(self, prebuild): getattr(self, prebuild)() else: - info('{} has no {}, skipping'.format(self.name, prebuild)) + info(f'{self.name} has no {prebuild}, skipping') def is_patched(self, arch): build_dir = self.get_build_dir(arch.arch) @@ -523,11 +516,10 @@ def apply_patches(self, arch, build_dir=None): .. versionchanged:: 0.6.0 Add ability to apply patches from any dir via kwarg `build_dir`''' if self.patches: - info_main('Applying patches for {}[{}]' - .format(self.name, arch.arch)) + info_main(f'Applying patches for {self.name}[{arch.arch}]') if self.is_patched(arch): - info_main('{} already patched, skipping'.format(self.name)) + info_main(f'{self.name} already patched, skipping') return build_dir = build_dir if build_dir else self.get_build_dir(arch.arch) @@ -559,7 +551,7 @@ def build_arch(self, arch): '''Run any build tasks for the Recipe. By default, this checks if any build_archname methods exist for the archname of the current architecture, and runs them if so.''' - build = "build_{}".format(arch.arch) + build = f"build_{arch.arch}" if hasattr(self, build): getattr(self, build)() @@ -581,7 +573,7 @@ def postbuild_arch(self, arch): any postbuild_archname methods exist for the archname of the current architecture, and runs them if so. ''' - postbuild = "postbuild_{}".format(arch.arch) + postbuild = f"postbuild_{arch.arch}" if hasattr(self, postbuild): getattr(self, postbuild)() @@ -707,9 +699,9 @@ def get_recipe(cls, name, ctx): break else: - raise ValueError('Recipe does not exist: {}'.format(name)) + raise ValueError(f'Recipe does not exist: {name}') - mod = import_recipe('pythonforandroid.recipes.{}'.format(name), recipe_file) + mod = import_recipe(f'pythonforandroid.recipes.{name}', recipe_file) if len(logger.handlers) > 1: logger.removeHandler(logger.handlers[1]) recipe = mod.recipe @@ -765,8 +757,7 @@ def get_recipe_env(self, arch=None, with_flags_in_cc=True, with_python=False): env['PYTHON_INCLUDE_ROOT'] = self.ctx.python_recipe.include_root(arch.arch) env['PYTHON_LINK_ROOT'] = self.ctx.python_recipe.link_root(arch.arch) - env['EXTRA_LDLIBS'] = ' -lpython{}'.format( - self.ctx.python_recipe.link_version) + env['EXTRA_LDLIBS'] = f' -lpython{self.ctx.python_recipe.link_version}' return env @@ -868,18 +859,18 @@ def clean_build(self, arch=None): if site_packages_dir: build_dir = join(site_packages_dir[0], name) if exists(build_dir): - info('Deleted {}'.format(build_dir)) + info(f'Deleted {build_dir}') rmdir(build_dir) @property def real_hostpython_location(self): - host_name = 'host{}'.format(self.ctx.python_recipe.name) + host_name = f'host{self.ctx.python_recipe.name}' if host_name == 'hostpython3': python_recipe = Recipe.get_recipe(host_name, self.ctx) return python_recipe.python_exe else: python_recipe = self.ctx.python_recipe - return 'python{}'.format(python_recipe.version) + return f'python{python_recipe.version}' @property def hostpython_location(self): @@ -905,9 +896,7 @@ def get_recipe_env(self, arch=None, with_flags_in_cc=True): env["PATH"] = join(self.hostpython_site_dir, "bin") + ":" + env["PATH"] if not self.call_hostpython_via_targetpython: - env['CFLAGS'] += ' -I{}'.format( - self.ctx.python_recipe.include_root(arch.arch) - ) + env['CFLAGS'] += f' -I{self.ctx.python_recipe.include_root(arch.arch)}' env['LDFLAGS'] += ' -L{} -lpython{}'.format( self.ctx.python_recipe.link_root(arch.arch), self.ctx.python_recipe.link_version, @@ -932,7 +921,7 @@ def should_build(self, arch): if self.ctx.has_package(name, arch): info('Python package already exists in site-packages') return False - info('{} apparently isn\'t already in site-packages'.format(name)) + info(f'{name} apparently isn\'t already in site-packages') return True def build_arch(self, arch): @@ -951,13 +940,13 @@ def install_python_package(self, arch, name=None, env=None, is_dir=True): if env is None: env = self.get_recipe_env(arch) - info('Installing {} into site-packages'.format(self.name)) + info(f'Installing {self.name} into site-packages') hostpython = sh.Command(self.hostpython_location) hpenv = env.copy() with current_directory(self.get_build_dir(arch.arch)): shprint(hostpython, 'setup.py', 'install', '-O2', - '--root={}'.format(self.ctx.get_python_install_dir(arch.arch)), + f'--root={self.ctx.get_python_install_dir(arch.arch)}', '--install-lib=.', _env=hpenv, *self.setup_extra_args) @@ -978,7 +967,7 @@ def install_hostpython_package(self, arch): env = self.get_hostrecipe_env(arch) real_hostpython = sh.Command(self.real_hostpython_location) shprint(real_hostpython, 'setup.py', 'install', '-O2', - '--root={}'.format(dirname(self.real_hostpython_location)), + f'--root={dirname(self.real_hostpython_location)}', '--install-lib=Lib/site-packages', _env=env, *self.setup_extra_args) @@ -1030,7 +1019,7 @@ def build_arch(self, arch): self.install_python_package(arch) def build_compiled_components(self, arch): - info('Building compiled components in {}'.format(self.name)) + info(f'Building compiled components in {self.name}') env = self.get_recipe_env(arch) hostpython = sh.Command(self.hostpython_location) @@ -1049,7 +1038,7 @@ def install_hostpython_package(self, arch): super().install_hostpython_package(arch) def rebuild_compiled_components(self, arch, env): - info('Rebuilding compiled components in {}'.format(self.name)) + info(f'Rebuilding compiled components in {self.name}') hostpython = sh.Command(self.real_hostpython_location) shprint(hostpython, 'setup.py', 'clean', '--all', _env=env) @@ -1078,14 +1067,14 @@ def build_arch(self, arch): self.install_python_package(arch) def build_cython_components(self, arch): - info('Cythonizing anything necessary in {}'.format(self.name)) + info(f'Cythonizing anything necessary in {self.name}') env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): hostpython = sh.Command(self.ctx.hostpython) shprint(hostpython, '-c', 'import sys; print(sys.path)', _env=env) - debug('cwd is {}'.format(realpath(curdir))) + debug(f'cwd is {realpath(curdir)}') info('Trying first build of {} to get cython files: this is ' 'expected to fail'.format(self.name)) @@ -1095,7 +1084,7 @@ def build_cython_components(self, arch): *self.setup_extra_args) except sh.ErrorReturnCode_1: print() - info('{} first build failed (as expected)'.format(self.name)) + info(f'{self.name} first build failed (as expected)') manually_cythonise = True if manually_cythonise: @@ -1125,7 +1114,7 @@ def cythonize_file(self, env, build_dir, filename): short_filename = filename if filename.startswith(build_dir): short_filename = filename[len(build_dir) + 1:] - info("Cythonize {}".format(short_filename)) + info(f"Cythonize {short_filename}") cyenv = env.copy() if 'CYTHONPATH' in cyenv: cyenv['PYTHONPATH'] = cyenv['CYTHONPATH'] @@ -1166,7 +1155,7 @@ def get_recipe_env(self, arch, with_flags_in_cc=True): # Every recipe uses its own liblink path, object files are # collected and biglinked later liblink_path = join(self.get_build_container_dir(arch.arch), - 'objects_{}'.format(self.name)) + f'objects_{self.name}') env['LIBLINK_PATH'] = liblink_path ensure_dir(liblink_path) @@ -1190,9 +1179,7 @@ def get_recipe_env(self, arch, **kwargs): build_opts = join(build_dir, "build-opts.cfg") with open(build_opts, "w") as file: - file.write("[bdist_wheel]\nplat-name={}".format( - self.get_wheel_platform_tag(arch) - )) + file.write(f"[bdist_wheel]\nplat-name={self.get_wheel_platform_tag(arch)}") file.close() env["DIST_EXTRA_CONFIG"] = build_opts @@ -1246,7 +1233,7 @@ def build_arch(self, arch): "build", "--wheel", "--config-setting", - "builddir={}".format(sub_build_dir), + f"builddir={sub_build_dir}", ] + self.extra_build_args built_wheels = [] @@ -1309,13 +1296,13 @@ def write_build_options(self, arch): option_data = "" build_options = self.get_recipe_meson_options(arch) for key in build_options.keys(): - data_chunk = "[{}]".format(key) + data_chunk = f"[{key}]" for subkey in build_options[key].keys(): value = build_options[key][subkey] if isinstance(value, int): value = str(value) elif isinstance(value, str): - value = "'{}'".format(value) + value = f"'{value}'" elif isinstance(value, bool): value = "true" if value else "false" elif isinstance(value, list): @@ -1331,17 +1318,17 @@ def ensure_args(self, *args): def build_arch(self, arch): cross_file = join("/tmp", "android.meson.cross") - info("Writing cross file at: {}".format(cross_file)) + info(f"Writing cross file at: {cross_file}") # write cross config file with open(cross_file, "w") as file: file.write(self.write_build_options(arch)) file.close() # set cross file - self.ensure_args('-Csetup-args=--cross-file', '-Csetup-args={}'.format(cross_file)) + self.ensure_args('-Csetup-args=--cross-file', f'-Csetup-args={cross_file}') # ensure ninja and meson for dep in [ - "ninja=={}".format(self.ninja_version), - "meson=={}".format(self.meson_version), + f"ninja=={self.ninja_version}", + f"meson=={self.meson_version}", ]: if dep not in self.hostpython_prerequisites: self.hostpython_prerequisites.append(dep) @@ -1388,7 +1375,7 @@ def get_recipe_env(self, arch, **kwargs): env["PYO3_CROSS_LIB_DIR"] = realpath(glob.glob(join( realpython_dir, "android-build", "build", - "lib.linux-*-{}/".format(self.python_major_minor_version), + f"lib.linux-*-{self.python_major_minor_version}/", ))[0]) info_main("Ensuring rust build toolchain") @@ -1447,7 +1434,7 @@ def create_python_bundle(self, dirn, arch): copying all the modules and standard library to the right place. """ - raise NotImplementedError('{} does not implement create_python_bundle'.format(self)) + raise NotImplementedError(f'{self} does not implement create_python_bundle') def reduce_object_file_names(self, dirn): """Recursively renames all files named XXX.cpython-...-linux-gnu.so" diff --git a/recipes/libopus/__init__.py b/recipes/libopus/__init__.py index 1eb49776..c6988097 100644 --- a/recipes/libopus/__init__.py +++ b/recipes/libopus/__init__.py @@ -12,7 +12,7 @@ def build_arch(self, arch): with current_directory(self.get_build_dir(arch.arch)): env = self.get_recipe_env(arch) flags = [ - '--host=' + arch.command_prefix, + f"--host={arch.command_prefix}", ] configure = sh.Command('./configure') shprint(configure, *flags, _env=env) diff --git a/recipes/mffmpeg/__init__.py b/recipes/mffmpeg/__init__.py index a51a246b..c11ea81d 100644 --- a/recipes/mffmpeg/__init__.py +++ b/recipes/mffmpeg/__init__.py @@ -40,9 +40,9 @@ def build_arch(self, arch): ] build_dir = Recipe.get_recipe( 'openssl', self.ctx).get_build_dir(arch.arch) - cflags += ['-I' + build_dir + '/include/', + cflags += [f"-I{build_dir}/include/", '-DOPENSSL_API_COMPAT=0x10002000L'] - ldflags += ['-L' + build_dir] + ldflags += [f"-L{build_dir}"] if 'ffpyplayer_codecs' in self.ctx.recipe_build_order: # Enable GPL @@ -52,22 +52,22 @@ def build_arch(self, arch): flags += ['--enable-libx264'] build_dir = Recipe.get_recipe( 'libx264', self.ctx).get_build_dir(arch.arch) - cflags += ['-I' + build_dir + '/include/'] - ldflags += ['-lx264', '-L' + build_dir + '/lib/'] + cflags += [f"-I{build_dir}/include/"] + ldflags += ['-lx264', f"-L{build_dir}/lib/"] # libshine flags += ['--enable-libshine'] build_dir = Recipe.get_recipe('libshine', self.ctx).get_build_dir(arch.arch) - cflags += ['-I' + build_dir + '/include/'] - ldflags += ['-lshine', '-L' + build_dir + '/lib/'] + cflags += [f"-I{build_dir}/include/"] + ldflags += ['-lshine', f"-L{build_dir}/lib/"] ldflags += ['-lm'] # libvpx flags += ['--enable-libvpx'] build_dir = Recipe.get_recipe( 'libvpx', self.ctx).get_build_dir(arch.arch) - cflags += ['-I' + build_dir + '/include/'] - ldflags += ['-lvpx', '-L' + build_dir + '/lib/'] + cflags += [f"-I{build_dir}/include/"] + ldflags += ['-lvpx', f"-L{build_dir}/lib/"] # Enable all codecs: flags += [ @@ -122,12 +122,12 @@ def build_arch(self, arch): flags += [ '--target-os=android', '--enable-cross-compile', - '--cross-prefix={}-'.format(arch.target), - '--arch={}'.format(arch_flag), - '--strip={}'.format(self.ctx.ndk.llvm_strip), - '--sysroot={}'.format(self.ctx.ndk.sysroot), + f'--cross-prefix={arch.target}-', + f'--arch={arch_flag}', + f'--strip={self.ctx.ndk.llvm_strip}', + f'--sysroot={self.ctx.ndk.sysroot}', '--enable-neon', - '--prefix={}'.format(realpath('.')), + f"--prefix={realpath('.')}", ] if arch_flag == 'arm': @@ -137,8 +137,8 @@ def build_arch(self, arch): '-fPIC', ] - env['CFLAGS'] += ' ' + ' '.join(cflags) - env['LDFLAGS'] += ' ' + ' '.join(ldflags) + env['CFLAGS'] += f" {' '.join(cflags)}" + env['LDFLAGS'] += f" {' '.join(ldflags)}" configure = sh.Command('./configure') shprint(configure, *flags, _env=env) diff --git a/recipes/numpy/__init__.py b/recipes/numpy/__init__.py index 55a02797..2f845d82 100644 --- a/recipes/numpy/__init__.py +++ b/recipes/numpy/__init__.py @@ -37,7 +37,7 @@ def get_recipe_env(self, arch=None, with_flags_in_cc=True): return env def _build_compiled_components(self, arch): - info('Building compiled components in {}'.format(self.name)) + info(f'Building compiled components in {self.name}') env = self.get_recipe_env(arch) with current_directory(self.get_build_dir(arch.arch)): @@ -49,7 +49,7 @@ def _build_compiled_components(self, arch): env['STRIP'], '{}', ';', _env=env) def _rebuild_compiled_components(self, arch, env): - info('Rebuilding compiled components in {}'.format(self.name)) + info(f'Rebuilding compiled components in {self.name}') hostpython = sh.Command(self.real_hostpython_location) shprint(hostpython, 'setup.py', 'clean', '--all', '--force', _env=env) diff --git a/recipes/opusfile/__init__.py b/recipes/opusfile/__init__.py index 27d0f29e..e82282b1 100644 --- a/recipes/opusfile/__init__.py +++ b/recipes/opusfile/__init__.py @@ -15,7 +15,7 @@ def build_arch(self, arch): with current_directory(self.get_build_dir(arch.arch)): env = self.get_recipe_env(arch) flags = [ - "--host=" + arch.command_prefix, + f"--host={arch.command_prefix}", "--disable-http", "--disable-examples", "--disable-doc", diff --git a/recipes/pycodec2/__init__.py b/recipes/pycodec2/__init__.py index 6ad05bd1..cb4918be 100644 --- a/recipes/pycodec2/__init__.py +++ b/recipes/pycodec2/__init__.py @@ -17,9 +17,9 @@ def get_recipe_env(self, arch, with_flags_in_cc=True): env = super().get_recipe_env(arch, with_flags_in_cc) codec2_recipe = self.get_recipe('codec2', self.ctx) - env['CFLAGS'] += codec2_recipe.include_flags(arch) +" -l:libcodec2.so" - env['LDFLAGS'] += ' -L{}'.format(self.ctx.get_libs_dir(arch.arch)) - env['LDFLAGS'] += ' -L{}'.format(self.ctx.libs_dir) + env['CFLAGS'] += f"{codec2_recipe.include_flags(arch)} -l:libcodec2.so" + env['LDFLAGS'] += f' -L{self.ctx.get_libs_dir(arch.arch)}' + env['LDFLAGS'] += f' -L{self.ctx.libs_dir}' env['LDFLAGS'] += codec2_recipe.link_dirs_flags(arch) return env diff --git a/sbapp/__init__.py b/sbapp/__init__.py index f49e360a..1d037108 100644 --- a/sbapp/__init__.py +++ b/sbapp/__init__.py @@ -1,5 +1,5 @@ import os import glob -modules = glob.glob(os.path.dirname(__file__)+"/*.py") +modules = glob.glob(f"{os.path.dirname(__file__)}/*.py") __all__ = [ os.path.basename(f)[:-3] for f in modules if not f.endswith('__init__.py')] \ No newline at end of file diff --git a/sbapp/assets/icons_macos.py b/sbapp/assets/icons_macos.py index cbab2cbb..fa575374 100644 --- a/sbapp/assets/icons_macos.py +++ b/sbapp/assets/icons_macos.py @@ -222,10 +222,7 @@ def main(): iconsetDir.mkdir() except Exception as ex: raise SystemExit( - " ".join(( - "[ERROR] Could not create temporary", - f"iconset folder: {iconsetDir}" - )) + f"[ERROR] Could not create temporary iconset folder: {iconsetDir}" ) else: if False: # cliArgs.delete_tmp_iconset: @@ -303,10 +300,7 @@ def main(): ) else: print( - " ".join(( - "[SUCCESS] An iconset was successfully", - f"generated to {resultingIconset}" - )) + f"[SUCCESS] An iconset was successfully generated to {resultingIconset}" ) raise SystemExit(0) diff --git a/sbapp/freeze.py b/sbapp/freeze.py index 4a5d30a4..bdbe0f0b 100644 --- a/sbapp/freeze.py +++ b/sbapp/freeze.py @@ -60,14 +60,14 @@ def glob_paths(pattern): ] } -print("Freezing Sideband "+__version__+" "+__variant__) +print(f"Freezing Sideband {__version__} {__variant__}") if build_appimage: global_excludes = [".buildozer", "build", "dist"] # Dependencies are automatically detected, but they might need fine-tuning. appimage_options = { "target_name": "Sideband", - "target_version": __version__+" "+__variant__, + "target_version": f"{__version__} {__variant__}", "include_files": [], "excludes": [], "packages": ["kivy"], diff --git a/sbapp/kivymd/font_definitions.py b/sbapp/kivymd/font_definitions.py index e7cc8e2b..84c45a5d 100755 --- a/sbapp/kivymd/font_definitions.py +++ b/sbapp/kivymd/font_definitions.py @@ -14,34 +14,34 @@ fonts = [ { "name": "Roboto", - "fn_regular": fonts_path + "Roboto-Regular.ttf", - "fn_bold": fonts_path + "Roboto-Bold.ttf", - "fn_italic": fonts_path + "Roboto-Italic.ttf", - "fn_bolditalic": fonts_path + "Roboto-BoldItalic.ttf", + "fn_regular": f"{fonts_path}Roboto-Regular.ttf", + "fn_bold": f"{fonts_path}Roboto-Bold.ttf", + "fn_italic": f"{fonts_path}Roboto-Italic.ttf", + "fn_bolditalic": f"{fonts_path}Roboto-BoldItalic.ttf", }, { "name": "RobotoThin", - "fn_regular": fonts_path + "Roboto-Thin.ttf", - "fn_italic": fonts_path + "Roboto-ThinItalic.ttf", + "fn_regular": f"{fonts_path}Roboto-Thin.ttf", + "fn_italic": f"{fonts_path}Roboto-ThinItalic.ttf", }, { "name": "RobotoLight", - "fn_regular": fonts_path + "Roboto-Light.ttf", - "fn_italic": fonts_path + "Roboto-LightItalic.ttf", + "fn_regular": f"{fonts_path}Roboto-Light.ttf", + "fn_italic": f"{fonts_path}Roboto-LightItalic.ttf", }, { "name": "RobotoMedium", - "fn_regular": fonts_path + "Roboto-Medium.ttf", - "fn_italic": fonts_path + "Roboto-MediumItalic.ttf", + "fn_regular": f"{fonts_path}Roboto-Medium.ttf", + "fn_italic": f"{fonts_path}Roboto-MediumItalic.ttf", }, { "name": "RobotoBlack", - "fn_regular": fonts_path + "Roboto-Black.ttf", - "fn_italic": fonts_path + "Roboto-BlackItalic.ttf", + "fn_regular": f"{fonts_path}Roboto-Black.ttf", + "fn_italic": f"{fonts_path}Roboto-BlackItalic.ttf", }, { "name": "Icons", - "fn_regular": fonts_path + "materialdesignicons-webfont.ttf", + "fn_regular": f"{fonts_path}materialdesignicons-webfont.ttf", }, ] diff --git a/sbapp/kivymd/tools/hotreload/app.py b/sbapp/kivymd/tools/hotreload/app.py index d3ef77fb..47d7c280 100644 --- a/sbapp/kivymd/tools/hotreload/app.py +++ b/sbapp/kivymd/tools/hotreload/app.py @@ -182,7 +182,7 @@ class MDApp(BaseApp): def build(self): if self.DEBUG: - Logger.info("{}: Debug mode activated".format(self.appname)) + Logger.info(f"{self.appname}: Debug mode activated") self.enable_autoreload() self.patch_builder() self.bind_key(32, self.rebuild) @@ -267,7 +267,7 @@ def load_app_dependencies(self): Builder.load_file(path_to_kv_file) def rebuild(self, *args, **kwargs): - print("{}: Rebuild the application".format(self.appname)) + print(f"{self.appname}: Rebuild the application") first = kwargs.get("first", False) try: if not first: @@ -287,7 +287,7 @@ def rebuild(self, *args, **kwargs): except Exception as exc: import traceback - Logger.exception("{}: Error when building app".format(self.appname)) + Logger.exception(f"{self.appname}: Error when building app") self.set_error(repr(exc), traceback.format_exc()) if not self.DEBUG and self.RAISE_ERROR: raise @@ -304,7 +304,7 @@ def set_error(self, exc, tb=None): lbl = Factory.Label( text_size=(Window.width - 100, None), size_hint_y=None, - text="{}\n\n{}".format(exc, tb or ""), + text=f"{exc}\n\n{tb or ''}", ) lbl.bind(texture_size=lbl.setter("size")) scroll.add_widget(lbl) @@ -338,10 +338,10 @@ def enable_autoreload(self): from watchdog.observers import Observer except ImportError: Logger.warn( - "{}: Autoreloader is missing watchdog".format(self.appname) + f"{self.appname}: Autoreloader is missing watchdog" ) return - Logger.info("{}: Autoreloader activated".format(self.appname)) + Logger.info(f"{self.appname}: Autoreloader activated") rootpath = self.get_root_path() self.w_handler = handler = FileSystemEventHandler() handler.dispatch = self._reload_from_watchdog @@ -402,16 +402,12 @@ def install_idle(self, timeout=60): if monotonic is None: Logger.exception( - "{}: Cannot use idle detector, monotonic is missing".format( - self.appname - ) + f"{self.appname}: Cannot use idle detector, monotonic is missing" ) self.idle_timer = None self.idle_timeout = timeout Logger.info( - "{}: Install idle detector, {} seconds".format( - self.appname, timeout - ) + f"{self.appname}: Install idle detector, {timeout} seconds" ) Clock.schedule_interval(self._check_idle, 1) self.root.bind( @@ -498,7 +494,7 @@ def _reload_py(self, filename): module = self._filename_to_module(filename) if module in sys.modules: - Logger.debug("{}: Module exist, reload it".format(self.appname)) + Logger.debug(f"{self.appname}: Module exist, reload it") Factory.unregister_from_filename(filename) self._unregister_factory_from_module(module) reload(sys.modules[module]) @@ -528,9 +524,7 @@ def _filename_to_module(self, filename): filename = filename[1:] module = filename[:-3].replace("/", ".") Logger.debug( - "{}: Translated {} to {}".format( - self.appname, orig_filename, module - ) + f"{self.appname}: Translated {orig_filename} to {module}" ) return module diff --git a/sbapp/kivymd/tools/patterns/create_project.py b/sbapp/kivymd/tools/patterns/create_project.py index 47224713..c1aaa0d7 100644 --- a/sbapp/kivymd/tools/patterns/create_project.py +++ b/sbapp/kivymd/tools/patterns/create_project.py @@ -982,7 +982,7 @@ def create_module_screens() -> None: path_to_module_screens = os.path.join(path_to_project, "View", "screens.py") with open(path_to_module_screens, "w", encoding="utf-8") as module_screens: module_screens.write( - "{}\nscreens = {{{}}}".format(temp_screens_imports, temp_screens_data) + f"{temp_screens_imports}\nscreens = {{{temp_screens_data}}}" ) diff --git a/sbapp/kivymd/tools/release/make_release.py b/sbapp/kivymd/tools/release/make_release.py index 841ba063..eb24bc63 100644 --- a/sbapp/kivymd/tools/release/make_release.py +++ b/sbapp/kivymd/tools/release/make_release.py @@ -218,7 +218,7 @@ def main(): release = args.command == "release" version = args.version or "0.0.0" next_version = args.next_version or ( - (version[:-1] + str(int(version[-1]) + 1) + ".dev0") + f"{version[:-1] + str(int(version[-1]) + 1)}.dev0" if "rc" not in version else version ) diff --git a/sbapp/kivymd/tools/release/update_icons.py b/sbapp/kivymd/tools/release/update_icons.py index 9dbe4fe4..96627dbb 100644 --- a/sbapp/kivymd/tools/release/update_icons.py +++ b/sbapp/kivymd/tools/release/update_icons.py @@ -101,7 +101,7 @@ def make_icon_definitions(icons): icon_definitions += f'"{i["name"]}": "\\U{i["hex"].upper()}",\n' else: icon_definitions += f'"{i["name"]}": "\\u{i["hex"].upper()}",\n' - icon_definitions += " " * 4 + '"blank": " ",\n' # Add blank icon (space) + icon_definitions += f"{' ' * 4}\"blank\": \" \",\n" # Add blank icon (space) icon_definitions += "}" return icon_definitions diff --git a/sbapp/kivymd/uix/filemanager/filemanager.py b/sbapp/kivymd/uix/filemanager/filemanager.py index 728c7964..217afe4d 100755 --- a/sbapp/kivymd/uix/filemanager/filemanager.py +++ b/sbapp/kivymd/uix/filemanager/filemanager.py @@ -650,7 +650,7 @@ def get_content( return dirs, files except OSError as e: - print("Filemanager OSError: "+str(e)) + print(f"Filemanager OSError: {e)}") return None, None def close(self) -> None: diff --git a/sbapp/kivymd/uix/pickers/datepicker/datepicker.py b/sbapp/kivymd/uix/pickers/datepicker/datepicker.py index c08ef570..0d2731d3 100644 --- a/sbapp/kivymd/uix/pickers/datepicker/datepicker.py +++ b/sbapp/kivymd/uix/pickers/datepicker/datepicker.py @@ -1299,7 +1299,7 @@ def set_text_full_date(self, year, month, day, orientation): horizontal = orientation == "portrait" or self._input_date_dialog_open def date_repr(date): - return date.strftime("%b").capitalize() + " " + str(date.day) + return f"{date.strftime('%b').capitalize()} {date.day)}" input_dates = self._get_dates_from_fields() if self.mode == "picker": diff --git a/sbapp/kivymd/uix/pickers/timepicker/timepicker.py b/sbapp/kivymd/uix/pickers/timepicker/timepicker.py index e45a7841..8a55a32b 100644 --- a/sbapp/kivymd/uix/pickers/timepicker/timepicker.py +++ b/sbapp/kivymd/uix/pickers/timepicker/timepicker.py @@ -243,7 +243,7 @@ def validate_time(self, text) -> Union[None, re.Match]: def insert_text(self, text, from_undo=False): strip_text = self.text.strip() - current_string = "".join([strip_text, text]) + current_string = f"{strip_text}{text}" if not self.validate_time(current_string): text = "" return super().insert_text(text, from_undo=from_undo) diff --git a/sbapp/kivymd/uix/textfield/textfield.py b/sbapp/kivymd/uix/textfield/textfield.py index 9536f613..b2802ab7 100755 --- a/sbapp/kivymd/uix/textfield/textfield.py +++ b/sbapp/kivymd/uix/textfield/textfield.py @@ -356,7 +356,7 @@ def format(self, value): elif len(value) == 4: start = self.text[:-1] end = self.text[-1] - self.text = "{}) {}".format(start, end) + self.text = f"{start}) {end}" self._check_cursor() elif len(value) == 8: self.text += "-" @@ -364,7 +364,7 @@ def format(self, value): elif len(value) in [12, 16]: start = self.text[:-1] end = self.text[-1] - self.text = "{}-{}".format(start, end) + self.text = f"{start}-{end}" self._check_cursor() def _check_cursor(self): diff --git a/sbapp/kivymd/utils/fpsmonitor.py b/sbapp/kivymd/utils/fpsmonitor.py index 4fbc2fca..7756474f 100644 --- a/sbapp/kivymd/utils/fpsmonitor.py +++ b/sbapp/kivymd/utils/fpsmonitor.py @@ -45,4 +45,4 @@ def start(self): Clock.schedule_interval(self.update_fps, self.updated_interval) def update_fps(self, *args): - self._fsp_value = "FPS: %f" % Clock.get_fps() + self._fsp_value = f"FPS: {Clock.get_fps():f}" diff --git a/sbapp/main.py b/sbapp/main.py index 4a222e9e..b695e7c6 100644 --- a/sbapp/main.py +++ b/sbapp/main.py @@ -11,7 +11,7 @@ parser.add_argument("-d", "--daemon", action='store_true', default=False, help="run as a daemon, without user interface") parser.add_argument("--export-settings", action='store', default=None, help="export application settings to file") parser.add_argument("--import-settings", action='store', default=None, help="import application settings from file") -parser.add_argument("--version", action="version", version="sideband {version}".format(version=__version__)) +parser.add_argument("--version", action="version", version=f"sideband {__version__}") args = parser.parse_args() sys.argv = [sys.argv[0]] @@ -35,7 +35,7 @@ load_config_only=True, ) - sideband.version_str = "v"+__version__+" "+__variant__ + sideband.version_str = f"v{__version__} {__variant__}" import json export = sideband.config.copy() @@ -64,7 +64,7 @@ load_config_only=True, ) - sideband.version_str = "v"+__version__+" "+__variant__ + sideband.version_str = f"v{__version__} {__variant__}" import json addr_fields = ["lxmf_propagation_node", "last_lxmf_propagation_node", "nn_home_node", "telemetry_collector"] @@ -106,9 +106,9 @@ def debug(self, arg): def trace(self, arg): pass def warning(self, arg): - RNS.log("Kivy error: "+str(arg), RNS.LOG_WARNING) + RNS.log(f"Kivy error: {arg)}", RNS.LOG_WARNING) def critical(self, arg): - RNS.log("Kivy error: "+str(arg), RNS.LOG_ERROR) + RNS.log(f"Kivy error: {arg)}", RNS.LOG_ERROR) if RNS.vendor.platformutils.get_platform() == "android": import jnius.reflect @@ -272,7 +272,7 @@ def __init__(self, **kwargs): else: self.sideband = SidebandCore(self, config_path=self.config_path, is_client=False, verbose=(args.verbose or __debug_build__)) - self.sideband.version_str = "v"+__version__+" "+__variant__ + self.sideband.version_str = f"v{__version__} {__variant__}" self.set_ui_theme() self.font_config() @@ -318,8 +318,8 @@ def __init__(self, **kwargs): self.key_ptt_down = False Window.softinput_mode = "below_target" - self.icon = self.sideband.asset_dir+"/icon.png" - self.notification_icon = self.sideband.asset_dir+"/notification_icon.png" + self.icon = f"{self.sideband.asset_dir}/icon.png" + self.notification_icon = f"{self.sideband.asset_dir}/notification_icon.png" self.connectivity_updater = None self.last_map_update = 0 @@ -370,7 +370,7 @@ def sjob(dt): def start_service(self): if RNS.vendor.platformutils.is_android(): - RNS.log("Running on Android API level "+str(android_api_version)) + RNS.log(f"Running on Android API level {android_api_version)}") RNS.log("Launching platform-specific service for RNS and LXMF") if RNS.vendor.platformutils.get_platform() == "android": @@ -442,7 +442,7 @@ def check_errors(dt): ) self.hw_error_dialog = MDDialog( title="Hardware Error", - text="When starting a connected RNode, Reticulum reported the following error:\n\n[i]"+str(description)+"[/i]", + text=f"When starting a connected RNode, Reticulum reported the following error:\n\n[i]{description)}[/i]", buttons=[ yes_button ], # elevation=0, ) @@ -479,31 +479,31 @@ def set_ui_theme(self): def font_config(self): from kivy.core.text import LabelBase, DEFAULT_FONT - fb_path = self.sideband.asset_dir+"/fonts/" + fb_path = f"{self.sideband.asset_dir}/fonts/" LabelBase.register(name="hebrew", - fn_regular=fb_path+"NotoSansHebrew-Regular.ttf", - fn_bold=fb_path+"NotoSansHebrew-Bold.ttf",) + fn_regular=f"{fb_path}NotoSansHebrew-Regular.ttf", + fn_bold=f"{fb_path}NotoSansHebrew-Bold.ttf",) LabelBase.register(name="japanese", - fn_regular=fb_path+"NotoSansJP-Regular.ttf") + fn_regular=f"{fb_path}NotoSansJP-Regular.ttf") LabelBase.register(name="chinese", - fn_regular=fb_path+"NotoSansSC-Regular.ttf") + fn_regular=f"{fb_path}NotoSansSC-Regular.ttf") LabelBase.register(name="korean", - fn_regular=fb_path+"NotoSansKR-Regular.ttf") + fn_regular=f"{fb_path}NotoSansKR-Regular.ttf") LabelBase.register(name="emoji", - fn_regular=fb_path+"NotoEmoji-Regular.ttf") + fn_regular=f"{fb_path}NotoEmoji-Regular.ttf") LabelBase.register(name="defaultinput", - fn_regular=fb_path+"DefaultInput.ttf") + fn_regular=f"{fb_path}DefaultInput.ttf") LabelBase.register(name="combined", - fn_regular=fb_path+"NotoSans-Regular.ttf", - fn_bold=fb_path+"NotoSans-Bold.ttf", - fn_italic=fb_path+"NotoSans-Italic.ttf", - fn_bolditalic=fb_path+"NotoSans-BoldItalic.ttf") + fn_regular=f"{fb_path}NotoSans-Regular.ttf", + fn_bold=f"{fb_path}NotoSans-Bold.ttf", + fn_italic=f"{fb_path}NotoSans-Italic.ttf", + fn_bolditalic=f"{fb_path}NotoSans-BoldItalic.ttf") def update_input_language(self): language = self.sideband.config["input_language"] @@ -512,7 +512,7 @@ def update_input_language(self): else: self.input_font = language - RNS.log("Setting input language to "+str(self.input_font), RNS.LOG_DEBUG) + RNS.log(f"Setting input language to {self.input_font)}", RNS.LOG_DEBUG) # def modify_input_font(self, ids): # BIND_CLASSES = ["kivymd.uix.textfield.textfield.MDTextField",] @@ -629,11 +629,11 @@ def share_text(self, text): def share_image(self, image, filename): if RNS.vendor.platformutils.get_platform() == "android": save_path = self.sideband.exports_dir - file_path = save_path+"/"+filename + file_path = f"{save_path}/{filename}" try: if not os.path.isdir(save_path): - RNS.log("Creating directory: "+str(save_path)) + RNS.log(f"Creating directory: {save_path)}") os.makedirs(save_path) Intent = autoclass("android.content.Intent") @@ -660,7 +660,7 @@ def share_image(self, image, filename): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Export Error", - text="The resource could not be exported and shared:\n\n"+str(e), + text=f"The resource could not be exported and shared:\n\n{e)}", buttons=[ ok_button ], ) def dl_ok(s): @@ -878,15 +878,15 @@ def handle_action(self, action, data): self.ingest_lxm_uri(data) def ingest_lxm_uri(self, lxm_uri): - RNS.log("Ingesting LXMF paper message from URI: "+str(lxm_uri), RNS.LOG_DEBUG) + RNS.log(f"Ingesting LXMF paper message from URI: {lxm_uri)}", RNS.LOG_DEBUG) self.sideband.lxm_ingest_uri(lxm_uri) def build(self): - FONT_PATH = self.sideband.asset_dir+"/fonts" + FONT_PATH = f"{self.sideband.asset_dir}/fonts" if RNS.vendor.platformutils.is_darwin(): - self.icon = self.sideband.asset_dir+"/icon_macos_formed.png" + self.icon = f"{self.sideband.asset_dir}/icon_macos_formed.png" else: - self.icon = self.sideband.asset_dir+"/icon.png" + self.icon = f"{self.sideband.asset_dir}/icon.png" self.announces_view = None @@ -949,7 +949,7 @@ def dl_ok(s): ) self.hw_error_dialog = MDDialog( title="Hardware Error", - text="While communicating with an RNode, Reticulum reported the following error:\n\n[i]"+str(description)+"[/i]", + text=f"While communicating with an RNode, Reticulum reported the following error:\n\n[i]{description)}[/i]", buttons=[ yes_button ], # elevation=0, ) @@ -1076,12 +1076,12 @@ def on_start(self): Window.bind(on_request_close=self.close_requested) if __variant__ != "": - variant_str = " "+__variant__ + variant_str = f" {__variant__}" else: variant_str = "" self.root.ids.screen_manager.app = self - self.root.ids.app_version_info.text = "Sideband v"+__version__+variant_str + self.root.ids.app_version_info.text = f"Sideband v{__version__}{variant_str}" self.root.ids.nav_scrollview.effect_cls = ScrollEffect Clock.schedule_once(self.start_core, 0.25) @@ -1300,7 +1300,7 @@ def ui_clipboard_action(self, sender=None, event=None): action = "tap" if RNS.vendor.platformutils.is_android() else "click" toast(f"Field copied, double-{action} any empty field to paste") except Exception as e: - RNS.log("An error occurred while handling clipboard action: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while handling clipboard action: {e)}", RNS.LOG_ERROR) def loader_init(self, sender=None): if not self.root.ids.screen_manager.has_screen("loader_screen"): @@ -1501,7 +1501,7 @@ def cb(dt): if not self.outbound_mode_command and not self.outbound_mode_paper: if self.attach_type != None and self.attach_path != None: try: - RNS.log("Processing "+str(self.attach_type)+" attachment \""+str(self.attach_path)+"\"", RNS.LOG_DEBUG) + RNS.log(f"Processing {self.attach_type)} attachment \"{self.attach_path)}\"", RNS.LOG_DEBUG) fbn = os.path.basename(self.attach_path) if self.attach_type == "file": @@ -1543,7 +1543,7 @@ def cb(dt): except Exception as e: self.messages_view.send_error_dialog = MDDialog( title="Attachment Error", - text="An error occurred while processing the attachment:\n\n[i]"+str(e)+"[/i]", + text=f"An error occurred while processing the attachment:\n\n[i]{e)}[/i]", buttons=[ MDRectangleFlatButton( text="OK", @@ -1649,26 +1649,26 @@ def message_fm_got_path(self, path): self.attach_path = path if RNS.vendor.platformutils.is_android(): - toast("Attached \""+str(fbn)+"\"") + toast(f"Attached \"{fbn)}\"") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) ate_dialog = MDDialog( title="File Attached", - text="The file \""+str(fbn)+"\" was attached, and will be included with the next message sent.", + text=f"The file \"{fbn)}\" was attached, and will be included with the next message sent.", buttons=[ ok_button ], ) ok_button.bind(on_release=ate_dialog.dismiss) ate_dialog.open() except Exception as e: - RNS.log(f"Error while attaching \"{fbn}\": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while attaching \"{fbn}\": {e)}", RNS.LOG_ERROR) if RNS.vendor.platformutils.get_platform() == "android": - toast("Could not attach \""+str(fbn)+"\"") + toast(f"Could not attach \"{fbn)}\"") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) ate_dialog = MDDialog( title="Attachment Error", - text="The specified file could not be attached:\n\n[i]"+str(e)+"[/i]", + text=f"The specified file could not be attached:\n\n[i]{e)}[/i]", buttons=[ ok_button ], ) ok_button.bind(on_release=ate_dialog.dismiss) @@ -1791,12 +1791,12 @@ def cb(sender): return if audio_field[0] == LXMF.AM_OPUS_OGG: - temp_path = self.sideband.rec_cache+"/msg.ogg" + temp_path = f"{self.sideband.rec_cache}/msg.ogg" with open(temp_path, "wb") as af: af.write(self.last_msg_audio) elif audio_field[0] >= LXMF.AM_CODEC2_700C and audio_field[0] <= LXMF.AM_CODEC2_3200: - temp_path = self.sideband.rec_cache+"/msg.ogg" + temp_path = f"{self.sideband.rec_cache}/msg.ogg" from sideband.audioproc import samples_to_ogg, decode_codec2, detect_codec2 target_rate = 8000 @@ -1805,7 +1805,7 @@ def cb(sender): if detect_codec2(): if samples_to_ogg(decode_codec2(audio_field[1], audio_field[0]), temp_path, input_rate=8000, output_rate=target_rate): - RNS.log("Wrote OGG file to: "+temp_path, RNS.LOG_DEBUG) + RNS.log(f"Wrote OGG file to: {temp_path}", RNS.LOG_DEBUG) else: RNS.log("OGG write failed", RNS.LOG_DEBUG) else: @@ -1839,7 +1839,7 @@ def cb(sender): RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR) except Exception as e: - RNS.log("Error while playing message audio:"+str(e)) + RNS.log(f"Error while playing message audio:{e)}") RNS.trace_exception(e) def message_ptt_down_action(self, sender=None): @@ -1884,7 +1884,7 @@ def cb_s(dt): try: self.msg_audio.stop() except Exception as e: - RNS.log("An error occurred while stopping recording: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while stopping recording: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) self.sideband.ui_stopped_recording() @@ -1936,9 +1936,9 @@ def message_process_audio(self): encoded = encode_codec2(samples, self.audio_msg_mode) ap_duration = time.time() - ap_start - RNS.log("Audio processing complete in "+RNS.prettytime(ap_duration), RNS.LOG_DEBUG) + RNS.log(f"Audio processing complete in {RNS.prettytime(ap_duration)}", RNS.LOG_DEBUG) - export_path = self.sideband.rec_cache+"/recording.enc" + export_path = f"{self.sideband.rec_cache}/recording.enc" with open(export_path, "wb") as export_file: export_file.write(encoded) self.attach_path = export_path @@ -1958,7 +1958,7 @@ def message_init_rec_dialog(self): from sbapp.plyer import audio self.msg_audio = audio - self.msg_audio._file_path = self.sideband.rec_cache+"/recording.ogg" + self.msg_audio._file_path = f"{self.sideband.rec_cache}/recording.ogg" def a_rec_action(sender): if not self.rec_dialog.recording: @@ -1970,7 +1970,7 @@ def a_rec_action(sender): el.theme_text_color="Custom" el.text_color=mdc("Red","400") el.icon = "stop-circle" - self.rec_dialog.rec_item.text = "[size="+str(ss)+"]Stop Recording[/size]" + self.rec_dialog.rec_item.text = f"[size={ss)}]Stop Recording[/size]" def cb(dt): self.msg_audio.start() Clock.schedule_once(cb, 0.10) @@ -1979,7 +1979,7 @@ def cb(dt): self.sideband.ui_stopped_recording() RNS.log("Stopping recording...") # TODO: Remove self.rec_dialog.recording = False - self.rec_dialog.rec_item.text = "[size="+str(ss)+"]Start Recording[/size]" + self.rec_dialog.rec_item.text = f"[size={ss)}]Start Recording[/size]" el = self.rec_dialog.rec_item.children[0].children[0] el.icon = "record" el.text_color = self.theme_cls._get_text_color() @@ -1997,13 +1997,13 @@ def a_play(sender): RNS.log("Playing recording...", RNS.LOG_DEBUG) self.rec_dialog.playing = True self.rec_dialog.play_item.children[0].children[0].icon = "stop" - self.rec_dialog.play_item.text = "[size="+str(ss)+"]Stop[/size]" + self.rec_dialog.play_item.text = f"[size={ss)}]Stop[/size]" self.msg_audio.play() else: RNS.log("Stopping playback...", RNS.LOG_DEBUG) self.rec_dialog.playing = False self.rec_dialog.play_item.children[0].children[0].icon = "play" - self.rec_dialog.play_item.text = "[size="+str(ss)+"]Play[/size]" + self.rec_dialog.play_item.text = f"[size={ss)}]Play[/size]" self.msg_audio.stop() self.msg_rec_a_play = a_play @@ -2012,7 +2012,7 @@ def a_finished(sender): RNS.log("Playback finished", RNS.LOG_DEBUG) self.rec_dialog.playing = False self.rec_dialog.play_item.children[0].children[0].icon = "play" - self.rec_dialog.play_item.text = "[size="+str(ss)+"]Play[/size]" + self.rec_dialog.play_item.text = f"[size={ss)}]Play[/size]" self.msg_audio._finished_callback = a_finished @@ -2045,9 +2045,9 @@ def a_save(sender): self.msg_rec_a_save = a_save cancel_button = MDRectangleFlatButton(text="Cancel", font_size=dp(18)) - rec_item = DialogItem(IconLeftWidget(icon="record", on_release=a_rec_action), text="[size="+str(ss)+"]Start Recording[/size]", on_release=a_rec_action) - play_item = DialogItem(IconLeftWidget(icon="play", on_release=a_play), text="[size="+str(ss)+"]Play[/size]", on_release=a_play, disabled=True) - save_item = DialogItem(IconLeftWidget(icon="content-save-move-outline", on_release=a_save), text="[size="+str(ss)+"]Save to message[/size]", on_release=a_save, disabled=True) + rec_item = DialogItem(IconLeftWidget(icon="record", on_release=a_rec_action), text=f"[size={ss)}]Start Recording[/size]", on_release=a_rec_action) + play_item = DialogItem(IconLeftWidget(icon="play", on_release=a_play), text=f"[size={ss)}]Play[/size]", on_release=a_play, disabled=True) + save_item = DialogItem(IconLeftWidget(icon="content-save-move-outline", on_release=a_save), text=f"[size={ss)}]Save to message[/size]", on_release=a_save, disabled=True) self.rec_dialog = MDDialog( title="Record Audio", type="simple", @@ -2076,7 +2076,7 @@ def message_record_audio_action(self): self.rec_dialog.play_item.disabled = True self.rec_dialog.save_item.disabled = True self.rec_dialog.recording = False - self.rec_dialog.rec_item.text = "[size="+str(ss)+"]Start Recording[/size]" + self.rec_dialog.rec_item.text = f"[size={ss)}]Start Recording[/size]" self.rec_dialog.rec_item.children[0].children[0].icon = "record" self.rec_dialog.open() @@ -2125,12 +2125,12 @@ def a_audio_lb(sender): ss = int(dp(18)) cancel_button = MDRectangleFlatButton(text="Cancel", font_size=dp(18)) ad_items = [ - DialogItem(IconLeftWidget(icon="message-image-outline", on_release=a_img_lb), text="[size="+str(ss)+"]Low-bandwidth Image[/size]", on_release=a_img_lb), - DialogItem(IconLeftWidget(icon="file-image", on_release=a_img_def), text="[size="+str(ss)+"]Medium Image[/size]", on_release=a_img_def), - DialogItem(IconLeftWidget(icon="image-outline", on_release=a_img_hq), text="[size="+str(ss)+"]High-res Image[/size]", on_release=a_img_hq), - DialogItem(IconLeftWidget(icon="account-voice", on_release=a_audio_lb), text="[size="+str(ss)+"]Low-bandwidth Voice[/size]", on_release=a_audio_lb), - DialogItem(IconLeftWidget(icon="microphone-message", on_release=a_audio_hq), text="[size="+str(ss)+"]High-quality Voice[/size]", on_release=a_audio_hq), - DialogItem(IconLeftWidget(icon="file-outline", on_release=a_file), text="[size="+str(ss)+"]File Attachment[/size]", on_release=a_file)] + DialogItem(IconLeftWidget(icon="message-image-outline", on_release=a_img_lb), text=f"[size={ss)}]Low-bandwidth Image[/size]", on_release=a_img_lb), + DialogItem(IconLeftWidget(icon="file-image", on_release=a_img_def), text=f"[size={ss)}]Medium Image[/size]", on_release=a_img_def), + DialogItem(IconLeftWidget(icon="image-outline", on_release=a_img_hq), text=f"[size={ss)}]High-res Image[/size]", on_release=a_img_hq), + DialogItem(IconLeftWidget(icon="account-voice", on_release=a_audio_lb), text=f"[size={ss)}]Low-bandwidth Voice[/size]", on_release=a_audio_lb), + DialogItem(IconLeftWidget(icon="microphone-message", on_release=a_audio_hq), text=f"[size={ss)}]High-quality Voice[/size]", on_release=a_audio_hq), + DialogItem(IconLeftWidget(icon="file-outline", on_release=a_file), text=f"[size={ss)}]File Attachment[/size]", on_release=a_file)] if RNS.vendor.platformutils.is_windows(): ad_items.pop(3) @@ -2204,7 +2204,7 @@ def update_message_widgets(self): def key_query_action(self, sender): context_dest = self.messages_view.ids.messages_scrollview.active_conversation if self.sideband.request_key(context_dest): - keys_str = "Public key information for "+RNS.prettyhexrep(context_dest)+" was requested from the network. Waiting for request to be answered." + keys_str = f"Public key information for {RNS.prettyhexrep(context_dest)} was requested from the network. Waiting for request to be answered." self.messages_view.ids.nokeys_text.text = keys_str else: keys_str = "Could not send request. Check your connectivity and addresses." @@ -2299,7 +2299,7 @@ def get_connectivity_text(self): return connectivity_status except Exception as e: - RNS.log("An error occurred while retrieving connectivity status: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while retrieving connectivity status: {e)}", RNS.LOG_ERROR) return "Could not retrieve connectivity status" def connectivity_status(self, sender): @@ -2346,14 +2346,14 @@ def open_ingest_lxm_dialog(self, sender=None): def dl_yes(s): try: lxm_uri = Clipboard.paste() - if not lxm_uri.lower().startswith(LXMF.LXMessage.URI_SCHEMA+"://"): - lxm_uri = LXMF.LXMessage.URI_SCHEMA+"://"+lxm_uri + if not lxm_uri.lower().startswith(f"{LXMF.LXMessage.URI_SCHEMA}://"): + lxm_uri = f"{LXMF.LXMessage.URI_SCHEMA}://{lxm_uri}" self.ingest_lxm_uri(lxm_uri) dialog.dismiss() except Exception as e: - response = "Error ingesting message from URI: "+str(e) + response = f"Error ingesting message from URI: {e)}" RNS.log(response, RNS.LOG_ERROR) self.sideband.setstate("lxm_uri_ingest.result", response) dialog.dismiss() @@ -2372,7 +2372,7 @@ def dl_ds(s): self.dialog_open = True except Exception as e: - RNS.log("Error while creating ingest LXM dialog: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating ingest LXM dialog: {e)}", RNS.LOG_ERROR) def lxmf_sync_action(self, sender): def cb(dt): @@ -2406,7 +2406,7 @@ def dl_yes(s): dialog_content = MsgSync() dialog = MDDialog( - title="LXMF Sync via "+RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node()), + title=f"LXMF Sync via {RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node())}", type="custom", content_cls=dialog_content, buttons=[ stop_button, close_button ], @@ -2443,7 +2443,7 @@ def cb(dt): dsp = 0 self.sideband.setstate("app.flags.lxmf_sync_dialog_open", True) - self.message_sync_dialog.title = f"LXMF Sync via "+RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node()) + self.message_sync_dialog.title = f"LXMF Sync via {RNS.prettyhexrep(self.sideband.message_router.get_outbound_propagation_node())}" self.message_sync_dialog.d_content.ids.sync_status.text = self.sideband.get_sync_status() self.message_sync_dialog.d_content.ids.sync_progress.value = dsp self.message_sync_dialog.d_content.ids.sync_progress.start() @@ -2484,7 +2484,7 @@ def dl_yes(s): new_result = self.sideband.new_conversation(n_address, n_name, n_trusted) except Exception as e: - RNS.log("Error while creating conversation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating conversation: {e)}", RNS.LOG_ERROR) if new_result: dialog.d_content.ids["n_address_field"].error = False @@ -2509,7 +2509,7 @@ def dl_ds(s): self.dialog_open = True except Exception as e: - RNS.log("Error while creating new conversation dialog: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating new conversation dialog: {e)}", RNS.LOG_ERROR) ### Information/version screen ###################################### @@ -2537,14 +2537,14 @@ def lj(): threading.Thread(target=lj, daemon=True).start() self.information_screen.ids.information_scrollview.effect_cls = ScrollEffect - self.information_screen.ids.information_logo.icon = self.sideband.asset_dir+"/rns_256.png" + self.information_screen.ids.information_logo.icon = f"{self.sideband.asset_dir}/rns_256.png" str_comps = " - [b]Reticulum[/b] (MIT License)\n - [b]LXMF[/b] (MIT License)\n - [b]KivyMD[/b] (MIT License)" str_comps += "\n - [b]Kivy[/b] (MIT License)\n - [b]Codec2[/b] (LGPL License)\n - [b]PyCodec2[/b] (BSD-3 License)" str_comps += "\n - [b]PyDub[/b] (MIT License)\n - [b]PyOgg[/b] (Public Domain)" str_comps += "\n - [b]GeoidHeight[/b] (LGPL License)\n - [b]Python[/b] (PSF License)" - str_comps += "\n\nGo to [u][ref=link]https://unsigned.io/donate[/ref][/u] to support the project.\n\nThe Sideband app is Copyright (c) 2024 Mark Qvist / unsigned.io\n\nPermission is granted to freely share and distribute binary copies of "+self.root.ids.app_version_info.text+", so long as no payment or compensation is charged for said distribution or sharing.\n\nIf you were charged or paid anything for this copy of Sideband, please report it to [b]license@unsigned.io[/b].\n\nTHIS IS EXPERIMENTAL SOFTWARE - SIDEBAND COMES WITH ABSOLUTELY NO WARRANTY - USE AT YOUR OWN RISK AND RESPONSIBILITY" - info = "This is "+self.root.ids.app_version_info.text+", on RNS v"+RNS.__version__+" and LXMF v"+LXMF.__version__+".\n\nHumbly build using the following open components:\n\n"+str_comps + str_comps += f"\n\nGo to [u][ref=link]https://unsigned.io/donate[/ref][/u] to support the project.\n\nThe Sideband app is Copyright (c) 2024 Mark Qvist / unsigned.io\n\nPermission is granted to freely share and distribute binary copies of {self.root.ids.app_version_info.text}, so long as no payment or compensation is charged for said distribution or sharing.\n\nIf you were charged or paid anything for this copy of Sideband, please report it to [b]license@unsigned.io[/b].\n\nTHIS IS EXPERIMENTAL SOFTWARE - SIDEBAND COMES WITH ABSOLUTELY NO WARRANTY - USE AT YOUR OWN RISK AND RESPONSIBILITY" + info = f"This is {self.root.ids.app_version_info.text}, on RNS v{RNS.__version__} and LXMF v{LXMF.__version__}.\n\nHumbly build using the following open components:\n\n{str_comps}" self.information_screen.ids.information_info.text = info self.information_screen.ids.information_info.bind(on_ref_press=link_exec) @@ -2846,7 +2846,7 @@ def sync_interval_change(sender=None, event=None, save=True): interval_text = RNS.prettytime(interval) pre = self.settings_screen.ids.settings_lxmf_sync_periodic.text - self.settings_screen.ids.settings_lxmf_sync_periodic.text = "Auto sync every "+interval_text + self.settings_screen.ids.settings_lxmf_sync_periodic.text = f"Auto sync every {interval_text}" if save: if (event == None or not hasattr(event, "button") or not event.button) or not "scroll" in event.button: self.sideband.config["lxmf_sync_interval"] = interval @@ -3201,7 +3201,7 @@ def ifmode_validate(sender=None, event=None): all_valid = True iftypes = ["local", "tcp", "i2p", "rnode", "modem", "serial"] for iftype in iftypes: - element = self.connectivity_screen.ids["connectivity_"+iftype+"_ifmode"] + element = self.connectivity_screen.ids[f"connectivity_{iftype}_ifmode"] modes = ["full", "gateway", "access point", "roaming", "boundary"] value = element.text.lower() if value in ["", "f"] or value.startswith("fu"): @@ -3356,7 +3356,7 @@ def dl_yes(s): dialog.dismiss() yes_button.bind(on_release=dl_yes) - rpc_string = "rpc_key = "+RNS.hexrep(self.sideband.reticulum.rpc_key, delimit=False) + rpc_string = f"rpc_key = {RNS.hexrep(self.sideband.reticulum.rpc_key, delimit=False)}" Clipboard.copy(rpc_string) dialog.open() @@ -3427,7 +3427,7 @@ def getIP(): adrs.append(ha) except Exception as e: - RNS.log("Error while getting repository IP address: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while getting repository IP address: {e)}", RNS.LOG_ERROR) return None return adrs @@ -3439,11 +3439,11 @@ def getIP(): else: ipstr = "" for ip in ips: - ipstr += "http://"+str(ip)+":4444/\n" + ipstr += f"http://{ip)}:4444/\n" self.reposository_url = ipstr ms = "" if len(ips) == 1 else "es" - info += "The repository server is running at the following address"+ms+":\n [u][ref=link]"+ipstr+"[/ref][u]" + info += f"The repository server is running at the following address{ms}:\n [u][ref=link]{ipstr}[/ref][u]" self.repository_screen.ids.repository_info.bind(on_ref_press=self.repository_link_action) self.repository_screen.ids.repository_enable_button.disabled = True @@ -3487,10 +3487,10 @@ def update_job(sender=None): apk_version = release["tag_name"] RNS.log(f"Found version {apk_version} artefact {pkgname} at {apk_url}") except Exception as e: - self.repository_screen.ids.repository_update.text = f"Downloading release info failed with the error:\n"+str(e) + self.repository_screen.ids.repository_update.text = f"Downloading release info failed with the error:\n{e)}" return - self.repository_screen.ids.repository_update.text = "Downloading: "+str(apk_url) + self.repository_screen.ids.repository_update.text = f"Downloading: {apk_url)}" with requests.get(apk_url, stream=True) as response: with open("./dl_tmp", "wb") as tmp_file: cs = 32*1024 @@ -3498,12 +3498,12 @@ def update_job(sender=None): for chunk in response.iter_content(chunk_size=cs): tmp_file.write(chunk) tds += cs - self.repository_screen.ids.repository_update.text = "Downloaded "+RNS.prettysize(tds)+" of "+str(pkgname) + self.repository_screen.ids.repository_update.text = f"Downloaded {RNS.prettysize(tds)} of {pkgname)}" os.rename("./dl_tmp", f"./share/pkg/{pkgname}") self.repository_screen.ids.repository_update.text = f"Added {pkgname} to the repository!" except Exception as e: - self.repository_screen.ids.repository_update.text = f"Downloading contents failed with the error:\n"+str(e) + self.repository_screen.ids.repository_update.text = f"Downloading contents failed with the error:\n{e)}" self.repository_screen.ids.repository_update.text = "Starting package download..." def start_update_job(sender=None): @@ -3996,7 +3996,7 @@ def dl_yes(s): yes_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Import Failed", - text="The read data did not contain a valid config mote. If any data was decoded, you may try to correct it by editing the relevant fields. The reported error was:\n\n"+str(e), + text=f"The read data did not contain a valid config mote. If any data was decoded, you may try to correct it by editing the relevant fields. The reported error was:\n\n{e)}", buttons=[ yes_button ], # elevation=0, ) @@ -4550,7 +4550,7 @@ def identity_display_action(self, sender=None): yes_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( - text="Your Identity key, in base32 format is as follows:\n\n[b]"+str(base64.b32encode(self.sideband.identity.get_private_key()).decode("utf-8"))+"[/b]", + text=f"Your Identity key, in base32 format is as follows:\n\n[b]{base64.b32encode(self.sideband.identity.get_private_key()).decode('utf-8'))}[/b]", buttons=[ yes_button ], # elevation=0, ) @@ -4613,7 +4613,7 @@ def dl_yes(s): except Exception as e: yes_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) - dialog = MDDialog(text="[b]The provided Identity key data was not valid[/b]\n\nThe error reported by Reticulum was:\n\n[i]"+str(e)+"[/i]\n\nNo Identity was imported into Sideband.", buttons=[ yes_button ]) + dialog = MDDialog(text=f"[b]The provided Identity key data was not valid[/b]\n\nThe error reported by Reticulum was:\n\n[i]{e)}[/i]\n\nNo Identity was imported into Sideband.", buttons=[ yes_button ]) def dl_yes(s): dialog.dismiss() yes_button.bind(on_release=dl_yes) @@ -4697,26 +4697,26 @@ def plugins_fm_got_path(self, path): self.sideband.save_configuration() if RNS.vendor.platformutils.is_android(): - toast("Using \""+str(path)+"\" as plugin directory") + toast(f"Using \"{path)}\" as plugin directory") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) ate_dialog = MDDialog( title="Directory Set", - text="Using \""+str(path)+"\" as plugin directory", + text=f"Using \"{path)}\" as plugin directory", buttons=[ ok_button ], ) ok_button.bind(on_release=ate_dialog.dismiss) ate_dialog.open() except Exception as e: - RNS.log(f"Error while setting plugins directory to \"{path}\": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while setting plugins directory to \"{path}\": {e)}", RNS.LOG_ERROR) if RNS.vendor.platformutils.get_platform() == "android": - toast("Could not set plugins directory to \""+str(path)+"\"") + toast(f"Could not set plugins directory to \"{path)}\"") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) e_dialog = MDDialog( title="Error", - text="Could not set plugins directory to \""+str(path)+"\"", + text=f"Could not set plugins directory to \"{path)}\"", buttons=[ ok_button ], ) ok_button.bind(on_release=e_dialog.dismiss) @@ -4875,7 +4875,7 @@ def dl_ok(s): info_str = "There was no new data to send." else: title_str = "Unknown Status" - info_str = "The status of the telemetry update is unknown: "+str(result) + info_str = f"The status of the telemetry update is unknown: {result)}" self.telemetry_info_dialog.title = title_str self.telemetry_info_dialog.text = info_str @@ -4913,7 +4913,7 @@ def dl_ok(s): info_str = "A telemetry request could not be sent." else: title_str = "Unknown Status" - info_str = "The status of the telemetry request is unknown: "+str(result) + info_str = f"The status of the telemetry request is unknown: {result)}" self.telemetry_info_dialog.title = title_str self.telemetry_info_dialog.text = info_str @@ -4932,21 +4932,21 @@ def map_fm_got_path(self, path): self.sideband.save_configuration() if RNS.vendor.platformutils.is_android(): - toast("Using \""+os.path.basename(path)+"\" as offline map") + toast(f"Using \"{os.path.basename(path)}\" as offline map") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) ate_dialog = MDDialog( title="Map Set", - text="Using \""+os.path.basename(path)+"\" as offline map", + text=f"Using \"{os.path.basename(path)}\" as offline map", buttons=[ ok_button ], ) ok_button.bind(on_release=ate_dialog.dismiss) ate_dialog.open() except Exception as e: - RNS.log(f"Error while loading map \"{path}\": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while loading map \"{path}\": {e)}", RNS.LOG_ERROR) if RNS.vendor.platformutils.get_platform() == "android": - toast("Could not load map \""+os.path.basename(path)+"\"") + toast(f"Could not load map \"{os.path.basename(path)}\"") else: ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) map_dialog = MDDialog( @@ -5041,7 +5041,7 @@ def map_get_offline_source(self): return self.offline_source except Exception as e: - RNS.log(f"Error while loading map from \"{current_map_path}\": "+str(e)) + RNS.log(f"Error while loading map from \"{current_map_path}\": {e)}") self.sideband.config["map_storage_file"] = None self.sideband.config["map_use_offline"] = False self.sideband.config["map_use_online"] = True @@ -5114,7 +5114,7 @@ def map_layers_action(self, sender=None): self.map_layer = ml self.map_update_source(source) except Exception as e: - RNS.log("Error while switching map layer: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while switching map layer: {e)}", RNS.LOG_ERROR) map_nav_divisor = 12 map_nav_zoom = 0.25 @@ -5479,7 +5479,7 @@ def map_create_marker(self, source, telemetry, appearance): return marker except Exception as e: - RNS.log("Could not create map marker for "+RNS.prettyhexrep(source)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not create map marker for {RNS.prettyhexrep(source)}: {e)}", RNS.LOG_ERROR) return None def map_update_markers(self, sender=None): @@ -5546,17 +5546,17 @@ def map_update_markers(self, sender=None): stale_markers.append(marker) for marker in stale_markers: - RNS.log("Removing stale marker: "+str(marker), RNS.LOG_DEBUG) + RNS.log(f"Removing stale marker: {marker)}", RNS.LOG_DEBUG) try: to_remove = self.map_markers[marker] self.map_screen.ids.map_layout.map.remove_marker(to_remove) self.map_markers.pop(marker) changes = True except Exception as e: - RNS.log("Error while removing map marker: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while removing map marker: {e)}", RNS.LOG_ERROR) except Exception as e: - RNS.log("Error while updating own map marker: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while updating own map marker: {e)}", RNS.LOG_ERROR) for telemetry_source in telemetry_entries: try: @@ -5601,7 +5601,7 @@ def map_update_markers(self, sender=None): changes = True except Exception as e: - RNS.log("Error while updating map entry for "+RNS.prettyhexrep(telemetry_source)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while updating map entry for {RNS.prettyhexrep(telemetry_source)}: {e)}", RNS.LOG_ERROR) self.last_map_update = time.time() if changes: @@ -5740,16 +5740,16 @@ def lj(): info9 = guide_text9 if self.theme_cls.theme_style == "Dark": - info1 = "[color=#"+dark_theme_text_color+"]"+info1+"[/color]" - info2 = "[color=#"+dark_theme_text_color+"]"+info2+"[/color]" - info3 = "[color=#"+dark_theme_text_color+"]"+info3+"[/color]" - info4 = "[color=#"+dark_theme_text_color+"]"+info4+"[/color]" - info5 = "[color=#"+dark_theme_text_color+"]"+info5+"[/color]" - info6 = "[color=#"+dark_theme_text_color+"]"+info6+"[/color]" - info7 = "[color=#"+dark_theme_text_color+"]"+info7+"[/color]" - info8 = "[color=#"+dark_theme_text_color+"]"+info8+"[/color]" - info9 = "[color=#"+dark_theme_text_color+"]"+info9+"[/color]" - info10 = "[color=#"+dark_theme_text_color+"]"+info10+"[/color]" + info1 = f"[color=#{dark_theme_text_color}]{info1}[/color]" + info2 = f"[color=#{dark_theme_text_color}]{info2}[/color]" + info3 = f"[color=#{dark_theme_text_color}]{info3}[/color]" + info4 = f"[color=#{dark_theme_text_color}]{info4}[/color]" + info5 = f"[color=#{dark_theme_text_color}]{info5}[/color]" + info6 = f"[color=#{dark_theme_text_color}]{info6}[/color]" + info7 = f"[color=#{dark_theme_text_color}]{info7}[/color]" + info8 = f"[color=#{dark_theme_text_color}]{info8}[/color]" + info9 = f"[color=#{dark_theme_text_color}]{info9}[/color]" + info10 = f"[color=#{dark_theme_text_color}]{info10}[/color]" self.guide_screen.ids.guide_info1.text = info1 self.guide_screen.ids.guide_info2.text = info2 self.guide_screen.ids.guide_info3.text = info3 @@ -5788,7 +5788,7 @@ def broadcasts_open(self, sender=None, direction="left", no_transition=False): info = "The [b]Local Broadcasts[/b] feature will allow you to send and listen for local broadcast transmissions on all connected interfaces.\n\n[b]Local Broadcasts[/b] makes it easy to establish public information exchange with anyone in direct radio range, or even with large areas far away using the [i]Remote Broadcast Repeater[/i] feature.\n\nThese features are not yet implemented in Sideband.\n\nWant it faster? Go to [u][ref=link]https://unsigned.io/donate[/ref][/u] to support the project." if self.theme_cls.theme_style == "Dark": - info = "[color=#"+dark_theme_text_color+"]"+info+"[/color]" + info = f"[color=#{dark_theme_text_color}]{info}[/color]" self.broadcasts_screen.ids.broadcasts_info.text = info self.root.ids.screen_manager.current = "broadcasts_screen" @@ -5830,7 +5830,7 @@ def handle_exception(self, e): if etype != SystemExit: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An unhandled {str(type(e))} exception occurred: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An unhandled {type(e))} exception occurred: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) return ExceptionManager.PASS else: @@ -5847,7 +5847,7 @@ def run(): is_daemon=True ) - sideband.version_str = "v"+__version__+" "+__variant__ + sideband.version_str = f"v{__version__} {__variant__}" sideband.start() while True: time.sleep(5) diff --git a/sbapp/mapview/clustered_marker_layer.py b/sbapp/mapview/clustered_marker_layer.py index 31fa2763..b3876a93 100644 --- a/sbapp/mapview/clustered_marker_layer.py +++ b/sbapp/mapview/clustered_marker_layer.py @@ -264,9 +264,7 @@ def __init__(self, lon, lat, cls=MapMarker, options=None): self.widget = None def __repr__(self): - return "".format( - self.lon, self.lat, self.source - ) + return f"" class SuperCluster: diff --git a/sbapp/mapview/downloader.py b/sbapp/mapview/downloader.py index a387c26b..80c423bb 100644 --- a/sbapp/mapview/downloader.py +++ b/sbapp/mapview/downloader.py @@ -50,7 +50,7 @@ def __init__(self, max_workers=None, cap_time=None, **kwargs): self._futures = [] Clock.schedule_interval(self._check_executor, 1 / 60.0) if not exists(self.cache_dir): - RNS.log("Creating cache dir "+str(self.cache_dir), RNS.LOG_WARNING) + RNS.log(f"Creating cache dir {self.cache_dir)}", RNS.LOG_WARNING) makedirs(self.cache_dir) logging.getLogger("urllib3").setLevel(logging.WARNING) @@ -132,7 +132,7 @@ def _load_tile(self, tile): # Logger.debug("Downloaded {} bytes: {}".format(len(data), uri)) return tile.set_source, (cache_fn,) except Exception as e: - print("Downloader error: {!r}".format(e)) + print(f"Downloader error: {e!r}") def _check_executor(self, dt): start = time() diff --git a/sbapp/mapview/mbtsource.py b/sbapp/mapview/mbtsource.py index bfed036f..da02b8ec 100644 --- a/sbapp/mapview/mbtsource.py +++ b/sbapp/mapview/mbtsource.py @@ -86,7 +86,7 @@ def _load_tile(self, tile): im = CoreImage( data, ext='png', - filename="{}.{}.{}.png".format(tile.zoom, tile.tile_x, tile.tile_y), + filename=f"{tile.zoom}.{tile.tile_x}.{tile.tile_y}.png", ) if im is None: diff --git a/sbapp/plyer/platforms/android/__init__.py b/sbapp/plyer/platforms/android/__init__.py index 8fe12635..3285ee6c 100644 --- a/sbapp/plyer/platforms/android/__init__.py +++ b/sbapp/plyer/platforms/android/__init__.py @@ -11,8 +11,8 @@ ns = 'org.renpy.android' if 'PYTHON_SERVICE_ARGUMENT' in environ: - PythonService = autoclass(ns + '.PythonService') + PythonService = autoclass(f"{ns}.PythonService") activity = PythonService.mService else: - PythonActivity = autoclass(ns + '.PythonActivity') + PythonActivity = autoclass(f"{ns}.PythonActivity") activity = PythonActivity.mActivity diff --git a/sbapp/plyer/platforms/android/audio.py b/sbapp/plyer/platforms/android/audio.py index 33a0a0d4..58cd9c5f 100644 --- a/sbapp/plyer/platforms/android/audio.py +++ b/sbapp/plyer/platforms/android/audio.py @@ -72,7 +72,7 @@ def _stop(self): self._recorder.stop() self._recorder.release() except Exception as e: - print("Could not stop recording: "+str(e)) + print(f"Could not stop recording: {e)}") self._recorder = None @@ -81,7 +81,7 @@ def _stop(self): self._player.stop() self._player.release() except Exception as e: - print("Could not stop playback: "+str(e)) + print(f"Could not stop playback: {e)}") self._player = None diff --git a/sbapp/plyer/platforms/android/call.py b/sbapp/plyer/platforms/android/call.py index 2a1388c7..a5d14cff 100644 --- a/sbapp/plyer/platforms/android/call.py +++ b/sbapp/plyer/platforms/android/call.py @@ -17,7 +17,7 @@ def _makecall(self, **kwargs): intent = Intent(Intent.ACTION_CALL) tel = kwargs.get('tel') - intent.setData(uri.parse("tel:{}".format(tel))) + intent.setData(uri.parse(f"tel:{tel}")) activity.startActivity(intent) def _dialcall(self, **kwargs): diff --git a/sbapp/plyer/platforms/android/camera.py b/sbapp/plyer/platforms/android/camera.py index 3384a66d..d3ed04c3 100644 --- a/sbapp/plyer/platforms/android/camera.py +++ b/sbapp/plyer/platforms/android/camera.py @@ -20,7 +20,7 @@ def _take_picture(self, on_complete, filename=None): android.activity.unbind(on_activity_result=self._on_activity_result) android.activity.bind(on_activity_result=self._on_activity_result) intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) - uri = Uri.parse('file://' + filename) + uri = Uri.parse(f"file://{filename}") parcelable = cast('android.os.Parcelable', uri) intent.putExtra(MediaStore.EXTRA_OUTPUT, parcelable) activity.startActivityForResult(intent, 0x123) @@ -32,7 +32,7 @@ def _take_video(self, on_complete, filename=None): android.activity.unbind(on_activity_result=self._on_activity_result) android.activity.bind(on_activity_result=self._on_activity_result) intent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) - uri = Uri.parse('file://' + filename) + uri = Uri.parse(f"file://{filename}") parcelable = cast('android.os.Parcelable', uri) intent.putExtra(MediaStore.EXTRA_OUTPUT, parcelable) diff --git a/sbapp/plyer/platforms/android/filechooser.py b/sbapp/plyer/platforms/android/filechooser.py index b8c943cf..dea9791f 100644 --- a/sbapp/plyer/platforms/android/filechooser.py +++ b/sbapp/plyer/platforms/android/filechooser.py @@ -93,8 +93,7 @@ class AndroidFileChooser(FileChooser): "pptx": "application/vnd.openxmlformats-officedocument." + "presentationml.presentation", "xls": "application/vnd.ms-excel", - "xlsx": "application/vnd.openxmlformats-officedocument." + - "spreadsheetml.sheet", + "xlsx": f"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "text": "text/*", "pdf": "application/pdf", "zip": "application/zip", diff --git a/sbapp/plyer/platforms/android/gps.py b/sbapp/plyer/platforms/android/gps.py index 740b636c..5a8a7842 100644 --- a/sbapp/plyer/platforms/android/gps.py +++ b/sbapp/plyer/platforms/android/gps.py @@ -55,8 +55,7 @@ def onStatusChanged(self, provider, status, extras): s_status = 'temporarily-unavailable' elif status == 0x02: s_status = 'available' - self.root.on_status('provider-status', '{}: {}'.format( - provider, s_status)) + self.root.on_status('provider-status', f'{provider}: {s_status}') class AndroidGPS(GPS): diff --git a/sbapp/plyer/platforms/android/stt.py b/sbapp/plyer/platforms/android/stt.py index 51681e04..40caf337 100644 --- a/sbapp/plyer/platforms/android/stt.py +++ b/sbapp/plyer/platforms/android/stt.py @@ -134,7 +134,7 @@ def onError(self, error): msg = 'speech_timeout' if msg and self.error_callback: - self.error_callback('error:' + msg) + self.error_callback(f"error:{msg}") @java_method('(ILandroid/os/Bundle;)V') def onEvent(self, event_type, params): diff --git a/sbapp/plyer/platforms/ios/call.py b/sbapp/plyer/platforms/ios/call.py index 9999d6aa..9bac8686 100644 --- a/sbapp/plyer/platforms/ios/call.py +++ b/sbapp/plyer/platforms/ios/call.py @@ -15,7 +15,7 @@ class IOSCall(Call): def _makecall(self, **kwargs): tel = kwargs.get('tel') - url = "tel://" + tel + url = f"tel://{tel}" nsurl = NSURL.alloc().initWithString_(objc_str(url)) UIApplication.sharedApplication().openURL_(nsurl) diff --git a/sbapp/plyer/platforms/ios/gps.py b/sbapp/plyer/platforms/ios/gps.py index 4cc0f784..42e25391 100644 --- a/sbapp/plyer/platforms/ios/gps.py +++ b/sbapp/plyer/platforms/ios/gps.py @@ -50,8 +50,7 @@ def locationManager_didChangeAuthorizationStatus_(self, manager, status): elif status == 4: provider_status = 'provider-enabled' s_status = 'authorizedWhenInUse' - self.on_status(provider_status, '{}: {}'.format( - provider, s_status)) + self.on_status(provider_status, f'{provider}: {s_status}') @protocol('CLLocationManagerDelegate') def locationManager_didUpdateLocations_(self, manager, locations): diff --git a/sbapp/plyer/platforms/ios/maps.py b/sbapp/plyer/platforms/ios/maps.py index dac01d5d..efeb6061 100644 --- a/sbapp/plyer/platforms/ios/maps.py +++ b/sbapp/plyer/platforms/ios/maps.py @@ -18,7 +18,7 @@ def _open_by_address(self, address, **kwargs): ''' address = quote_plus(address, safe=',') - maps_address = 'http://maps.apple.com/?address=' + address + maps_address = f"http://maps.apple.com/?address={address}" webbrowser.open(maps_address) @@ -31,8 +31,7 @@ def _open_by_lat_long(self, latitude, longitude, **kwargs): ''' name = kwargs.get("name", "Selected Location") - maps_address = 'http://maps.apple.com/?ll={},{}&q={}'.format( - latitude, longitude, name) + maps_address = f'http://maps.apple.com/?ll={latitude},{longitude}&q={name}' webbrowser.open(maps_address) @@ -51,10 +50,10 @@ def _search(self, query, **kwargs): longitude = kwargs.get('longitude') query = quote_plus(query, safe=',') - maps_address = 'http://maps.apple.com/?q=' + query + maps_address = f"http://maps.apple.com/?q={query}" if latitude is not None and longitude is not None: - maps_address += '&sll={},{}'.format(latitude, longitude) + maps_address += f'&sll={latitude},{longitude}' webbrowser.open(maps_address) @@ -66,8 +65,7 @@ def _route(self, saddr, daddr, **kwargs): saddr = quote_plus(saddr, safe=',') daddr = quote_plus(daddr, safe=',') - maps_address = 'http://maps.apple.com/?saddr={}&daddr={}'.format( - saddr, daddr) + maps_address = f'http://maps.apple.com/?saddr={saddr}&daddr={daddr}' webbrowser.open(maps_address) diff --git a/sbapp/plyer/platforms/linux/cpu.py b/sbapp/plyer/platforms/linux/cpu.py index 66a532f4..c07d6ce1 100644 --- a/sbapp/plyer/platforms/linux/cpu.py +++ b/sbapp/plyer/platforms/linux/cpu.py @@ -83,7 +83,7 @@ def _cache(self): else: present = [present[0]] - cores = ['cpu{}'.format(i) for i in present] + cores = [f'cpu{i}' for i in present] for core in cores: indicies = [ # get 'indexN' files from 'cache' folder assuming @@ -97,7 +97,7 @@ def _cache(self): index_type = join(cpu_path, core, 'cache', index, 'level') with open(index_type, 'rb') as fle: cache_level = fle.read().decode('utf-8').strip() - values['L{}'.format(cache_level)] += 1 + values[f'L{cache_level}'] += 1 return values @staticmethod diff --git a/sbapp/plyer/platforms/linux/filechooser.py b/sbapp/plyer/platforms/linux/filechooser.py index a8e2ef2a..8a945cda 100644 --- a/sbapp/plyer/platforms/linux/filechooser.py +++ b/sbapp/plyer/platforms/linux/filechooser.py @@ -127,7 +127,7 @@ def _gen_cmdline(self): else: cmdline += [ "--file-filter", - "{name} | {flt}".format(name=f[0], flt=" ".join(f[1:])) + f"{f[0]} | {' '.join(f[1:])}" ] return cmdline @@ -220,7 +220,7 @@ def _gen_cmdline(self): else: cmdline += [ "--file-filter", - "{name} | {flt}".format(name=f[0], flt=" ".join(f[1:])) + f"{f[0]} | {' '.join(f[1:])}" ] return cmdline diff --git a/sbapp/plyer/platforms/linux/notification.py b/sbapp/plyer/platforms/linux/notification.py index 552519ea..409b6080 100644 --- a/sbapp/plyer/platforms/linux/notification.py +++ b/sbapp/plyer/platforms/linux/notification.py @@ -23,7 +23,7 @@ def _notify(self, **kwargs): "org.freedesktop.portal.Desktop", "--object-path", "/org/freedesktop/portal/desktop", "--method", "org.freedesktop.portal.Notification.AddNotification", "", - "{'title': <'" + title + "'>, 'body': <'" + body + "'>}" + f"{{'title': <'{title}'>, 'body': <'{body}'>}}" ], stdout=subprocess.DEVNULL) diff --git a/sbapp/plyer/platforms/linux/storagepath.py b/sbapp/plyer/platforms/linux/storagepath.py index 58dc02bd..b18be2be 100755 --- a/sbapp/plyer/platforms/linux/storagepath.py +++ b/sbapp/plyer/platforms/linux/storagepath.py @@ -30,7 +30,7 @@ def _get_from_user_dirs(self, name): with open(user_dirs) as f: for line in f.readlines(): - if line.startswith("XDG_" + name): + if line.startswith(f"XDG_{name}"): return line.split('"')[1] return default @@ -39,7 +39,7 @@ def _get_home_dir(self): return expanduser('~') def _get_external_storage_dir(self): - return "/media/" + self._get_home_dir().split("/")[-1] + return f"/media/{self._get_home_dir().split('/')[-1]}" def _get_root_dir(self): return "/" diff --git a/sbapp/plyer/platforms/linux/wifi.py b/sbapp/plyer/platforms/linux/wifi.py index 144f58ac..1b3e1ede 100644 --- a/sbapp/plyer/platforms/linux/wifi.py +++ b/sbapp/plyer/platforms/linux/wifi.py @@ -13,8 +13,7 @@ import wifi except ModuleNotFoundError as err: raise ModuleNotFoundError( - "python-wifi not installed. try:" + - "`pip install --user wifi`.") from err + f"python-wifi not installed. try:`pip install --user wifi`.") from err class NMCLIWifi(Wifi): @@ -170,7 +169,7 @@ def _get_network_info(self, name): ret_list['signal'] = self.names[name]['SIGNAL'] bars = len(self.names[name]['BARS']) - ret_list['quality'] = '{}/100'.format(bars / 5.0 * 100) + ret_list['quality'] = f'{bars / 5.0 * 100}/100' ret_list['frequency'] = self.names[name]['FREQ'] ret_list['bitrates'] = self.names[name]['RATE'] diff --git a/sbapp/plyer/platforms/macosx/maps.py b/sbapp/plyer/platforms/macosx/maps.py index 7a6d998a..2671dff7 100644 --- a/sbapp/plyer/platforms/macosx/maps.py +++ b/sbapp/plyer/platforms/macosx/maps.py @@ -18,7 +18,7 @@ def _open_by_address(self, address, **kwargs): ''' address = quote_plus(address, safe=',') - maps_address = 'http://maps.apple.com/?address=' + address + maps_address = f"http://maps.apple.com/?address={address}" process = Popen( ['open', '-a', 'Maps', maps_address], @@ -34,8 +34,7 @@ def _open_by_lat_long(self, latitude, longitude, **kwargs): ''' name = kwargs.get("name", "Selected Location") - maps_address = 'http://maps.apple.com/?ll={},{}&q={}'.format( - latitude, longitude, name) + maps_address = f'http://maps.apple.com/?ll={latitude},{longitude}&q={name}' process = Popen( ['open', '-a', 'Maps', maps_address], @@ -57,10 +56,10 @@ def _search(self, query, **kwargs): longitude = kwargs.get('longitude') query = quote_plus(query, safe=',') - maps_address = 'http://maps.apple.com/?q=' + query + maps_address = f"http://maps.apple.com/?q={query}" if latitude is not None and longitude is not None: - maps_address += '&sll={},{}'.format(latitude, longitude) + maps_address += f'&sll={latitude},{longitude}' process = Popen( ['open', '-a', 'Maps', maps_address], @@ -75,8 +74,7 @@ def _route(self, saddr, daddr, **kwargs): saddr = quote_plus(saddr, safe=',') daddr = quote_plus(daddr, safe=',') - maps_address = 'http://maps.apple.com/?saddr={}&daddr={}'.format( - saddr, daddr) + maps_address = f'http://maps.apple.com/?saddr={saddr}&daddr={daddr}' process = Popen( ['open', '-a', 'Maps', maps_address], stdout=PIPE, stderr=PIPE) diff --git a/sbapp/plyer/platforms/win/filechooser.py b/sbapp/plyer/platforms/win/filechooser.py index 9932d9bf..7a99e5c2 100644 --- a/sbapp/plyer/platforms/win/filechooser.py +++ b/sbapp/plyer/platforms/win/filechooser.py @@ -85,9 +85,9 @@ def run(self): filters = "" for f in self.filters: if isinstance(f, str): - filters += (f + "\x00") * 2 + filters += f'{f}\x00' * 2 else: - filters += f[0] + "\x00" + ";".join(f[1:]) + "\x00" + filters += f"{f[0]}\x00{';'.join(f[1:])}\x00" args["Filter"] = filters flags = win32con.OFN_OVERWRITEPROMPT diff --git a/sbapp/plyer/platforms/win/libs/balloontip.py b/sbapp/plyer/platforms/win/libs/balloontip.py index c42db432..7645bd0a 100644 --- a/sbapp/plyer/platforms/win/libs/balloontip.py +++ b/sbapp/plyer/platforms/win/libs/balloontip.py @@ -86,7 +86,7 @@ def __init__(self, title, message, app_name, app_icon='', atexit.register(self.__del__) wnd_class_ex = win_api_defs.get_WNDCLASSEXW() - class_name = 'PlyerTaskbar' + str(WindowsBalloonTip._get_unique_id()) + class_name = f"PlyerTaskbar{WindowsBalloonTip._get_unique_id())}" wnd_class_ex.lpszClassName = class_name @@ -126,7 +126,7 @@ def __init__(self, title, message, app_name, app_icon='', ) if hicon is None: - raise Exception('Could not load icon {}'.format(app_icon)) + raise Exception(f'Could not load icon {app_icon}') self._balloon_icon = self._hicon = hicon else: self._hicon = win_api_defs.LoadIconW( diff --git a/sbapp/plyer/tools/pep8checker/pep8.py b/sbapp/plyer/tools/pep8checker/pep8.py index 97a73fc7..3300d98d 100644 --- a/sbapp/plyer/tools/pep8checker/pep8.py +++ b/sbapp/plyer/tools/pep8checker/pep8.py @@ -308,14 +308,14 @@ def blank_lines(logical_line, blank_lines, indent_level, line_number, if blank_lines: yield 0, "E304 blank lines found after function decorator" elif blank_lines > 2 or (indent_level and blank_lines == 2): - yield 0, "E303 too many blank lines (%d)" % blank_lines + yield 0, f"E303 too many blank lines ({int(blank_lines)})" elif logical_line.startswith(('def ', 'class ', '@')): if indent_level: if not (blank_lines or previous_indent_level < indent_level or DOCSTRING_REGEX.match(previous_logical)): yield 0, "E301 expected 1 blank line, found 0" elif blank_lines != 2: - yield 0, "E302 expected 2 blank lines, found %d" % blank_lines + yield 0, f"E302 expected 2 blank lines, found {int(blank_lines)}" def extraneous_whitespace(logical_line): @@ -343,12 +343,12 @@ def extraneous_whitespace(logical_line): text = match.group() char = text.strip() found = match.start() - if text == char + ' ': + if text == f"{char} ": # assert char in '([{' - yield found + 1, "E201 whitespace after '%s'" % char + yield found + 1, f"E201 whitespace after '{char}'" elif line[found - 1] != ',': code = ('E202' if char in '}])' else 'E203') # if char in ',;:' - yield found, "{} whitespace before '{}'".format(code, char) + yield found, f"{code} whitespace before '{char}'" def whitespace_around_keywords(logical_line): @@ -397,7 +397,7 @@ def missing_whitespace(logical_line): continue # Slice syntax, no space required if char == ',' and line[index + 1] == ')': continue # Allow tuple with only one element: (3,) - yield index, "E231 missing whitespace after '%s'" % char + yield index, f"E231 missing whitespace after '{char}'" def indentation(logical_line, previous_logical, indent_char, @@ -474,7 +474,7 @@ def continuation_line_indentation(logical_line, tokens, indent_level, verbose): indent_chances = {} last_indent = (0, 0) if verbose >= 3: - print(">>> " + tokens[0][4].rstrip()) + print(f">>> {tokens[0][4].rstrip()}") for token_type, text, start, end, line in tokens: newline = row < start[0] - first_row @@ -487,7 +487,7 @@ def continuation_line_indentation(logical_line, tokens, indent_level, verbose): # this is the beginning of a continuation line. last_indent = start if verbose >= 3: - print("... " + line.rstrip()) + print(f"... {line.rstrip()}") # record the initial indent. rel_indent[row] = start[1] - indent_level @@ -544,7 +544,7 @@ def continuation_line_indentation(logical_line, tokens, indent_level, verbose): indent[depth] = start[1] indent_chances[start[1]] = True if verbose >= 4: - print("bracket depth {} indent to {}".format(depth, start[1])) + print(f"bracket depth {depth} indent to {start[1]}") # deal with implicit string concatenation elif token_type == tokenize.STRING or text in ('u', 'ur', 'b', 'br'): indent_chances[start[1]] = str @@ -616,7 +616,7 @@ def whitespace_before_parameters(logical_line, tokens): (index < 2 or tokens[index - 2][1] != 'class') and # Allow "return (a.foo for a in range(5))" not keyword.iskeyword(prev_text)): - yield prev_end, "E211 whitespace before '%s'" % text + yield prev_end, f"E211 whitespace before '{text}'" prev_type = token_type prev_text = text prev_end = end @@ -743,9 +743,9 @@ def whitespace_around_comma(logical_line): for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line): found = m.start() + 1 if '\t' in m.group(): - yield found, "E242 tab after '%s'" % m.group()[0] + yield found, f"E242 tab after '{m.group()[0]}'" else: - yield found, "E241 multiple spaces after '%s'" % m.group()[0] + yield found, f"E241 multiple spaces after '{m.group()[0]}'" def whitespace_around_named_parameter_equals(logical_line, tokens): @@ -925,16 +925,15 @@ def comparison_to_singleton(logical_line): if match: same = (match.group(1) == '==') singleton = match.group(2) - msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton) + msg = f"'if cond is {('' if same else 'not ') + singleton}:'" if singleton in ('None',): code = 'E711' else: code = 'E712' nonzero = ((singleton == 'True' and same) or (singleton == 'False' and not same)) - msg += " or 'if %scond:'" % ('' if nonzero else 'not ') - yield match.start(1), ("%s comparison to %s should be %s" % - (code, singleton, msg)) + msg += f" or 'if {'' if nonzero else 'not '}cond:'" + yield match.start(1), (f"{code} comparison to {singleton} should be {msg}") def comparison_type(logical_line): @@ -1180,7 +1179,7 @@ def __init__(self, filename, lines=None, self.lines = readlines(filename) except OSError: exc_type, exc = sys.exc_info()[:2] - self._io_error = '{}: {}'.format(exc_type.__name__, exc) + self._io_error = f'{exc_type.__name__}: {exc}' self.lines = [] else: self.lines = lines @@ -1276,7 +1275,7 @@ def check_logical(self): print(self.logical_line[:80].rstrip()) for name, check, argument_names in self._logical_checks: if self.verbose >= 4: - print(' ' + name) + print(f" {name}") for result in self.run_check(check, argument_names): offset, text = result if isinstance(offset, tuple): @@ -1291,7 +1290,7 @@ def check_logical(self): def generate_tokens(self): if self._io_error: - self.report_error(1, 0, 'E902 %s' % self._io_error, readlines) + self.report_error(1, 0, f'E902 {self._io_error}', readlines) tokengen = tokenize.generate_tokens(self.readline_check_physical) try: yield from tokengen @@ -1301,7 +1300,7 @@ def generate_tokens(self): if len(offset) > 2: offset = offset[1:3] self.report_error(offset[0], offset[1], - 'E901 {}: {}'.format(exc_type.__name__, exc.args[0]), + f'E901 {exc_type.__name__}: {exc.args[0]}', self.generate_tokens) generate_tokens.__doc__ = " Check if the syntax is valid." @@ -1322,9 +1321,9 @@ def check_all(self, expected=None, line_offset=0): token_type, text = token[0:2] if self.verbose >= 3: if token[2][0] == token[3][0]: - pos = '[{}:{}]'.format(token[2][1] or '', token[3][1]) + pos = f"[{token[2][1] or ''}:{token[3][1]}]" else: - pos = 'l.%s' % token[3][0] + pos = f'l.{token[3][0]}' print('l.%s\t%s\t%s\t%r' % (token[2][0], pos, tokenize.tok_name[token[0]], text)) if token_type == tokenize.COMMENT or token_type == tokenize.STRING: @@ -1458,7 +1457,7 @@ def print_statistics(self, prefix=''): def print_benchmark(self): """Print benchmark numbers.""" - print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed')) + print(f'{self.elapsed:<7.2f} seconds elapsed') if self.elapsed: for key in self._benchmark_keys: print('%-7d %s per second (%d total)' % @@ -1499,7 +1498,7 @@ def error(self, line_number, offset, text, check): else: line = self.lines[line_number - 1] print(line.rstrip()) - print(' ' * offset + '^') + print(f"{' ' * offset}^") if self._show_pep8 and check is not None: print(check.__doc__.lstrip('\n').rstrip()) return code @@ -1528,16 +1527,15 @@ def __init__(self, options): def get_file_results(self): # Check if the expected errors were found - label = '{}:{}:1'.format(self.filename, self.line_offset) + label = f'{self.filename}:{self.line_offset}:1' codes = sorted(self.expected) for code in codes: if not self.counters.get(code): self.file_errors += 1 self.total_errors += 1 - print('{}: error {} not found'.format(label, code)) + print(f'{label}: error {code} not found') if self._verbose and not self.file_errors: - print('%s: passed (%s)' % - (label, ' '.join(codes) or 'Okay')) + print(f"{label}: passed ({' '.join(codes) or 'Okay'})") self.counters['test cases'] += 1 if self.file_errors: self.counters['failed tests'] += 1 @@ -1613,7 +1611,7 @@ def check_files(self, paths=None): def input_file(self, filename, lines=None, expected=None, line_offset=0): """Run all checks on a Python source file.""" if self.options.verbose: - print('checking %s' % filename) + print(f'checking {filename}') fchecker = Checker(filename, lines=lines, options=self.options) return fchecker.check_all(expected=expected, line_offset=line_offset) @@ -1628,7 +1626,7 @@ def input_dir(self, dirname): runner = self.runner for root, dirs, files in os.walk(dirname): if verbose: - print('directory ' + root) + print(f"directory {root}") counters['directories'] += 1 for subdir in sorted(dirs): if self.excluded(subdir): @@ -1739,16 +1737,16 @@ def selftest(options): for part in source.split(r'\n'): part = part.replace(r'\t', '\t') part = part.replace(r'\s', ' ') - checker.lines.append(part + '\n') + checker.lines.append(f"{part}\n") checker.check_all() error = None if code == 'Okay': if len(counters) > len(options.benchmark_keys): codes = [key for key in counters if key not in options.benchmark_keys] - error = "incorrectly found %s" % ', '.join(codes) + error = f"incorrectly found {', '.join(codes)}" elif not counters.get(code): - error = "failed to find %s" % code + error = f"failed to find {code}" # Keep showing errors for multiple tests for key in set(counters) - set(options.benchmark_keys): del counters[key] @@ -1756,10 +1754,10 @@ def selftest(options): count_all += 1 if not error: if options.verbose: - print("{}: {}".format(code, source)) + print(f"{code}: {source}") else: count_failed += 1 - print("{}: {}:".format(__file__, error)) + print(f"{__file__}: {error}:") for line in checker.lines: print(line.rstrip()) return count_failed, count_all @@ -1772,7 +1770,7 @@ def read_config(options, args, arglist, parser): user_conf = options.config if user_conf and os.path.isfile(user_conf): if options.verbose: - print('user configuration: %s' % user_conf) + print(f'user configuration: {user_conf}') config.read(user_conf) parent = tail = args and os.path.abspath(os.path.commonprefix(args)) @@ -1780,7 +1778,7 @@ def read_config(options, args, arglist, parser): local_conf = os.path.join(parent, '.pep8') if os.path.isfile(local_conf): if options.verbose: - print('local configuration: %s' % local_conf) + print(f'local configuration: {local_conf}') config.read(local_conf) break parent, tail = os.path.split(parent) @@ -1795,7 +1793,7 @@ def read_config(options, args, arglist, parser): # Second, parse the configuration for opt in config.options('pep8'): if options.verbose > 1: - print(' {} = {}'.format(opt, config.get('pep8', opt))) + print(f" {opt} = {config.get('pep8', opt)}") if opt.replace('_', '-') not in parser.config_options: print('Unknown option: \'%s\'\n not in [%s]' % (opt, ' '.join(parser.config_options))) @@ -1929,7 +1927,7 @@ def _main(): count_failed = fail_s + fail_d if not options.quiet: count_passed = done_d + done_s - count_failed - print("%d passed and %d failed." % (count_passed, count_failed)) + print(f"{int(count_passed)} passed and {int(count_failed)} failed.") print("Test failed." if count_failed else "Test passed.") if count_failed: sys.exit(1) @@ -1944,7 +1942,7 @@ def _main(): report.print_results() if report.total_errors: if options.count: - sys.stderr.write(str(report.total_errors) + '\n') + sys.stderr.write(f"{report.total_errors)}\n") sys.exit(1) diff --git a/sbapp/plyer/tools/pep8checker/pep8kivy.py b/sbapp/plyer/tools/pep8checker/pep8kivy.py index 05e46e3b..d709f9b3 100644 --- a/sbapp/plyer/tools/pep8checker/pep8kivy.py +++ b/sbapp/plyer/tools/pep8checker/pep8kivy.py @@ -26,7 +26,7 @@ def report_error(self, line_number, offset, text, check): ) # html generation - print('{}{}'.format(line_number, text)) + print(f'{line_number}{text}') if __name__ == '__main__': @@ -70,8 +70,7 @@ def check(fn): path = join(dirname(abspath(__file__)), 'pep8base.html') print(open(path).read()) print( - '''

Generated: %s

''' - '' % (time.strftime('%c')) + f'''

Generated: {time.strftime('%c')}

''' ) for dirpath, dirnames, filenames in walk(target): @@ -95,8 +94,7 @@ def check(fn): if htmlmode: print( - '' - '' % complete_filename + f'' ) errors += check(complete_filename) diff --git a/sbapp/plyer/utils.py b/sbapp/plyer/utils.py index 573075de..452e85c0 100644 --- a/sbapp/plyer/utils.py +++ b/sbapp/plyer/utils.py @@ -32,10 +32,7 @@ def __str__(self): return self._get_platform() def __repr__(self): - return 'platform name: \'{platform}\' from: \n{instance}'.format( - platform=self._get_platform(), - instance=super().__repr__() - ) + return f'platform name: \'{self._get_platform()}\' from: \n{super().__repr__()}' def __hash__(self): return self._get_platform().__hash__() @@ -93,9 +90,9 @@ def _ensure_obj(self): try: name = object.__getattribute__(self, '_name') if RNS.vendor.platformutils.is_android(): - module = 'plyer.platforms.{}.{}'.format(platform, name) + module = f'plyer.platforms.{platform}.{name}' else: - module = 'sbapp.plyer.platforms.{}.{}'.format(platform, name) + module = f'sbapp.plyer.platforms.{platform}.{name}' mod = __import__(module, fromlist='.') obj = mod.instance() except Exception: @@ -227,7 +224,7 @@ def new_func(*args, **kwargs): ) ) - warnings.warn('[{}] {}'.format('WARNING', warning)) + warnings.warn(f'[WARNING] {warning}') # if there is a docstring present, emit docstring too if obj.__doc__: diff --git a/sbapp/pydub/audio_segment.py b/sbapp/pydub/audio_segment.py index f85fceb8..f39aee18 100644 --- a/sbapp/pydub/audio_segment.py +++ b/sbapp/pydub/audio_segment.py @@ -113,8 +113,7 @@ def read_wav_audio(data, headers=None): pos = fmt.position + 8 audio_format = struct.unpack_from(' Optional[ctypes.CDLL]: return None # Attempt to load the library from here - path = _here + "/" + lib_dir + "/" + name + path = f"{_here}/{lib_dir}/{name}" try: lib = ctypes.CDLL(path) except OSError as e: @@ -101,8 +101,8 @@ def load(name, paths = None, tests = []): @staticmethod def load_other(name, paths = None, tests = []): - os.environ["PATH"] += ";" + ";".join((os.getcwd(), _here)) - if paths: os.environ["PATH"] += ";" + ";".join(paths) + os.environ["PATH"] += f";{f"{os.getcwd()};{_here}"}" + if paths: os.environ["PATH"] += f";{';'.join(paths)}" for style in _other_styles: candidate = style.format(name) @@ -117,8 +117,8 @@ def load_other(name, paths = None, tests = []): @staticmethod def load_windows(name, paths = None, tests = []): - os.environ["PATH"] += ";" + ";".join((os.getcwd(), _here)) - if paths: os.environ["PATH"] += ";" + ";".join(paths) + os.environ["PATH"] += f";{f"{os.getcwd()};{_here}"}" + if paths: os.environ["PATH"] += f";{';'.join(paths)}" not_supported = [] # libraries that were found, but are not supported for style in _windows_styles: @@ -137,10 +137,10 @@ def load_windows(name, paths = None, tests = []): if not_supported: - raise ExternalLibraryError("library '{}' couldn't be loaded, because the following candidates were not supported:".format(name) + raise ExternalLibraryError(f"library '{name}' couldn't be loaded, because the following candidates were not supported:" + ("\n{}" * len(not_supported)).format(*not_supported)) - raise ExternalLibraryError("library '{}' couldn't be loaded".format(name)) + raise ExternalLibraryError(f"library '{name}' couldn't be loaded") diff --git a/sbapp/pyogg/ogg_opus_writer.py b/sbapp/pyogg/ogg_opus_writer.py index 547d0f5a..feebc0a8 100644 --- a/sbapp/pyogg/ogg_opus_writer.py +++ b/sbapp/pyogg/ogg_opus_writer.py @@ -107,8 +107,7 @@ def write(self, pcm: memoryview) -> None: # Check that the stream hasn't already been finished if self._finished: raise PyOggError( - "Stream has already ended. Perhaps close() was "+ - "called too early?") + f"Stream has already ended. Perhaps close() was called too early?") # If we haven't already written out the headers, do so # now. Then, write a frame of silence to warm up the diff --git a/sbapp/pyogg/opus_buffered_encoder.py b/sbapp/pyogg/opus_buffered_encoder.py index 3b120b35..16f784d1 100644 --- a/sbapp/pyogg/opus_buffered_encoder.py +++ b/sbapp/pyogg/opus_buffered_encoder.py @@ -38,8 +38,7 @@ def set_frame_size(self, frame_size: float) -> None: # units of 0.1ms to avoid floating point comparison if int(frame_size*10) not in [25, 50, 100, 200, 400, 600]: raise PyOggError( - "Frame size ({:f}) not one of ".format(frame_size)+ - "the acceptable values" + f"Frame size ({frame_size:f}) not one of the acceptable values" ) self._frame_size_ms = frame_size diff --git a/sbapp/pyogg/opus_decoder.py b/sbapp/pyogg/opus_decoder.py index 8a1f4dd3..00688d23 100644 --- a/sbapp/pyogg/opus_decoder.py +++ b/sbapp/pyogg/opus_decoder.py @@ -32,8 +32,7 @@ def set_channels(self, n): if self._decoder is None: if n < 0 or n > 2: raise PyOggError( - "Invalid number of channels in call to "+ - "set_channels()" + f"Invalid number of channels in call to set_channels()" ) self._channels = n else: @@ -65,7 +64,7 @@ def set_sampling_frequency(self, samples_per_second): else: raise PyOggError( "Specified sampling frequency "+ - "({:d}) ".format(samples_per_second)+ + f"({samples_per_second:d}) "+ "was not one of the accepted values" ) else: @@ -152,7 +151,7 @@ def decode_missing_packet(self, frame_duration): # avoid floating-point comparisons. if int(frame_duration*10) not in [25, 50, 100, 200, 400, 600]: raise PyOggError( - "Frame duration ({:f}) is not one of the accepted values".format(frame_duration) + f"Frame duration ({frame_duration:f}) is not one of the accepted values" ) # Calculate frame size diff --git a/sbapp/pyogg/opus_encoder.py b/sbapp/pyogg/opus_encoder.py index 1da82daf..b1d5390b 100644 --- a/sbapp/pyogg/opus_encoder.py +++ b/sbapp/pyogg/opus_encoder.py @@ -32,8 +32,7 @@ def set_channels(self, n: int) -> None: if self._encoder is None: if n < 0 or n > 2: raise PyOggError( - "Invalid number of channels in call to "+ - "set_channels()" + f"Invalid number of channels in call to set_channels()" ) self._channels = n else: @@ -62,7 +61,7 @@ def set_sampling_frequency(self, samples_per_second: int) -> None: else: raise PyOggError( "Specified sampling frequency "+ - "({:d}) ".format(samples_per_second)+ + f"({samples_per_second:d}) "+ "was not one of the accepted values" ) else: @@ -111,7 +110,7 @@ def set_application(self, application: str) -> None: self._application = opus.OPUS_APPLICATION_RESTRICTED_LOWDELAY else: raise PyOggError( - "The application specification '{:s}' ".format(application)+ + f"The application specification '{application:s}' "+ "wasn't one of the accepted values." ) @@ -170,8 +169,7 @@ def encode(self, pcm: Union[bytes, bytearray, memoryview]) -> memoryview: # Check that we have a valid frame size if int(frame_duration) not in [25, 50, 100, 200, 400, 600]: raise PyOggError( - "The effective frame duration ({:.1f} ms) " - .format(frame_duration/10)+ + f"The effective frame duration ({frame_duration / 10:.1f} ms) "+ "was not one of the acceptable values." ) diff --git a/sbapp/pyogg/opus_file.py b/sbapp/pyogg/opus_file.py index f8519f41..123d98b7 100644 --- a/sbapp/pyogg/opus_file.py +++ b/sbapp/pyogg/opus_file.py @@ -72,8 +72,7 @@ def __init__(self, path: str) -> None: # Check for errors if ns<0: raise PyOggError( - "Error while reading OggOpus file. "+ - "Error code: {}".format(ns) + f"Error while reading OggOpus file. Error code: {ns}" ) # Increment the pointer diff --git a/sbapp/pyogg/opus_file_stream.py b/sbapp/pyogg/opus_file_stream.py index b3e1723a..c464fcaf 100644 --- a/sbapp/pyogg/opus_file_stream.py +++ b/sbapp/pyogg/opus_file_stream.py @@ -21,7 +21,7 @@ def __init__(self, path): if error.value != 0: self.of = None - raise PyOggError("file couldn't be opened or doesn't exist. Error code : {}".format(error.value)) + raise PyOggError(f"file couldn't be opened or doesn't exist. Error code : {error.value}") #: Number of channels in audio file self.channels = opus.op_channel_count(self.of, -1) @@ -75,7 +75,7 @@ def get_buffer(self): # Check for errors if samples_read < 0: raise PyOggError( - "Failed to read OpusFileStream. Error {:d}".format(samples_read) + f"Failed to read OpusFileStream. Error {samples_read:d}" ) # Check if we've reached the end of the stream diff --git a/sbapp/pyogg/vorbis_file.py b/sbapp/pyogg/vorbis_file.py index 918f1e8f..dcb1d234 100644 --- a/sbapp/pyogg/vorbis_file.py +++ b/sbapp/pyogg/vorbis_file.py @@ -131,8 +131,7 @@ def __init__(self, # Check for errors if result < 0: raise PyOggError( - "An error occurred decoding the Vorbis file: "+ - f"Error code: {result}" + f"An error occurred decoding the Vorbis file: Error code: {result}" ) # Check that the bitstream hasn't changed as we only diff --git a/sbapp/pyogg/vorbis_file_stream.py b/sbapp/pyogg/vorbis_file_stream.py index 57677ba7..61e50eec 100644 --- a/sbapp/pyogg/vorbis_file_stream.py +++ b/sbapp/pyogg/vorbis_file_stream.py @@ -11,7 +11,7 @@ def __init__(self, path, buffer_size=8192): self.vf = vorbis.OggVorbis_File() error = vorbis.ov_fopen(path, ctypes.byref(self.vf)) if error != 0: - raise PyOggError("file couldn't be opened or doesn't exist. Error code : {}".format(error)) + raise PyOggError(f"file couldn't be opened or doesn't exist. Error code : {error}") info = vorbis.ov_info(ctypes.byref(self.vf), -1) diff --git a/sbapp/services/sidebandservice.py b/sbapp/services/sidebandservice.py index e718a6ff..05203aa9 100644 --- a/sbapp/services/sidebandservice.py +++ b/sbapp/services/sidebandservice.py @@ -78,11 +78,11 @@ def android_notification(self, title="", content="", ticker="", group=None, cont channel_id = package_name group_id = "" if group != None: - channel_id += "."+str(group) + channel_id += f".{group)}" group_id += str(group) if context_id != None: - channel_id += "."+str(context_id) - group_id += "."+str(context_id) + channel_id += f".{context_id)}" + group_id += f".{context_id)}" if not title or title == "": channel_name = "Sideband" @@ -134,12 +134,12 @@ def android_notification(self, title="", content="", ticker="", group=None, cont def check_permission(self, permission): if RNS.vendor.platformutils.is_android(): try: - result = self.android_service.checkSelfPermission("android.permission."+permission) + result = self.android_service.checkSelfPermission(f"android.permission.{permission}") if result == 0: return True except Exception as e: - RNS.log("Error while checking permission: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking permission: {e)}", RNS.LOG_ERROR) return False @@ -238,14 +238,14 @@ def __init__(self): except Exception as e: self.wifi_manager = None RNS.log("Could not acquire Android WiFi Manager! Keeping WiFi-based interfaces up will be unavailable.", RNS.LOG_ERROR) - RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"The contained exception was: {e)}", RNS.LOG_ERROR) try: self.power_manager = self.app_context.getSystemService(Context.POWER_SERVICE) except Exception as e: self.power_manager = None RNS.log("Could not acquire Android Power Manager! Taking wakelocks and keeping the CPU running will be unavailable.", RNS.LOG_ERROR) - RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"The contained exception was: {e)}", RNS.LOG_ERROR) self.discover_usb_devices() @@ -259,7 +259,7 @@ def __init__(self): self.update_power_restrictions() if RNS.vendor.platformutils.is_android(): - RNS.log("Discovered USB devices: "+str(self.usb_devices), RNS.LOG_EXTREME) + RNS.log(f"Discovered USB devices: {self.usb_devices)}", RNS.LOG_EXTREME) self.update_location_provider() @@ -281,7 +281,7 @@ def discover_usb_devices(self): self.usb_devices.append(device_entry) except Exception as e: - RNS.log("Could not list USB devices. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not list USB devices. The contained exception was: {e)}", RNS.LOG_ERROR) def start(self): self.should_run = True @@ -351,7 +351,7 @@ def get_connectivity_status(self): if len(netdevs) > 0: ds = "Using " for netdev in netdevs: - ds += "[i]"+str(netdev)+"[/i], " + ds += f"[i]{netdev)}[/i], " ds = ds[:-2] else: ds = "No usable network devices" @@ -360,13 +360,13 @@ def get_connectivity_status(self): if np == 1: ws = "1 reachable peer" else: - ws = str(np)+" reachable peers" + ws = f"{np)} reachable peers" - stat += "[b]Local[/b]\n{ds}\n{ws}\n\n".format(ds=ds, ws=ws) + stat += f"[b]Local[/b]\n{ds}\n{ws}\n\n" if self.sideband.interface_rnode != None: if self.sideband.interface_rnode.online: - rs = "On-air at "+str(self.sideband.interface_rnode.bitrate_kbps)+" Kbps" + rs = f"On-air at {self.sideband.interface_rnode.bitrate_kbps)} Kbps" else: rs = "Interface Down" @@ -384,23 +384,23 @@ def get_connectivity_status(self): else: rm = "Interface Down" - stat += "[b]Radio Modem[/b]\n{rm}\n\n".format(rm=rm) + stat += f"[b]Radio Modem[/b]\n{rm}\n\n" if self.sideband.interface_serial != None: if self.sideband.interface_serial.online: - rs = "Running at "+RNS.prettysize(self.sideband.interface_serial.bitrate/8, suffix="b")+"ps" + rs = f"Running at {RNS.prettysize(self.sideband.interface_serial.bitrate / 8, suffix='b')}ps" else: rs = "Interface Down" - stat += "[b]Serial Port[/b]\n{rs}\n\n".format(rs=rs) + stat += f"[b]Serial Port[/b]\n{rs}\n\n" if self.sideband.interface_tcp != None: if self.sideband.interface_tcp.online: - ts = "Connected to "+str(self.sideband.interface_tcp.target_ip)+":"+str(self.sideband.interface_tcp.target_port) + ts = f"Connected to {self.sideband.interface_tcp.target_ip)}:{self.sideband.interface_tcp.target_port)}" else: ts = "Interface Down" - stat += "[b]TCP[/b]\n{ts}\n\n".format(ts=ts) + stat += f"[b]TCP[/b]\n{ts}\n\n" if self.sideband.interface_i2p != None: i2s = "Unknown" @@ -417,7 +417,7 @@ def get_connectivity_status(self): else: i2s = "Connecting to I2P" - stat += "[b]I2P[/b]\n{i2s}\n\n".format(i2s=i2s) + stat += f"[b]I2P[/b]\n{i2s}\n\n" total_rxb = 0 total_txb = 0 @@ -449,7 +449,7 @@ def get_connectivity_status(self): if RNS.Reticulum.transport_enabled(): stat += "[b]Transport Instance[/b]\nRouting Traffic\n\n" - stat += "[b]Traffic[/b]\nIn: {inb}\nOut: {outb}\n\n".format(inb=RNS.prettysize(total_rxb), outb=RNS.prettysize(total_txb)) + stat += f"[b]Traffic[/b]\nIn: {RNS.prettysize(total_rxb)}\nOut: {RNS.prettysize(total_txb)}\n\n" if stat.endswith("\n\n"): stat = stat[:-2] @@ -492,7 +492,7 @@ def handle_exception(exc_type, exc_value, exc_traceback): import traceback exc_text = "".join(traceback.format_exception(exc_type, exc_value, exc_traceback)) - RNS.log(f"An unhandled {str(exc_type)} exception occurred: {str(exc_value)}", RNS.LOG_ERROR) + RNS.log(f"An unhandled {exc_type)} exception occurred: {exc_value)}", RNS.LOG_ERROR) RNS.log(exc_text, RNS.LOG_ERROR) sys.excepthook = handle_exception diff --git a/sbapp/sideband/__init__.py b/sbapp/sideband/__init__.py index f49e360a..1d037108 100644 --- a/sbapp/sideband/__init__.py +++ b/sbapp/sideband/__init__.py @@ -1,5 +1,5 @@ import os import glob -modules = glob.glob(os.path.dirname(__file__)+"/*.py") +modules = glob.glob(f"{os.path.dirname(__file__)}/*.py") __all__ = [ os.path.basename(f)[:-3] for f in modules if not f.endswith('__init__.py')] \ No newline at end of file diff --git a/sbapp/sideband/audioproc.py b/sbapp/sideband/audioproc.py index fcca1829..542773a4 100644 --- a/sbapp/sideband/audioproc.py +++ b/sbapp/sideband/audioproc.py @@ -108,7 +108,7 @@ def voice_processing(input_path): filters = "highpass=f=250, lowpass=f=3000,speechnorm=e=12.5:r=0.0001:l=1" output_bitrate = "12k" opus_apptype = "audio" - output_path = input_path.replace(".ogg","")+".p.ogg" + output_path = f"{input_path.replace('.ogg', '')}.p.ogg" args = [ "-i", input_path, "-filter:a", filters, "-c:a", "libopus", "-application", opus_apptype, @@ -148,7 +148,7 @@ def encode_codec2(samples, mode): c2 = pycodec2.Codec2(codec2_modes[mode]) SPF = c2.samples_per_frame() PACKET_SIZE = SPF * 2 # 16-bit samples - STRUCT_FORMAT = '{}h'.format(SPF) + STRUCT_FORMAT = f'{SPF}h' F_FRAMES = len(samples)/SPF N_FRAMES = math.floor(len(samples)/SPF) # TODO: Add padding to align to whole frames @@ -163,7 +163,7 @@ def encode_codec2(samples, mode): encoded += encoded_packet ap_duration = time.time() - ap_start - RNS.log("Codec2 encoding complete in "+RNS.prettytime(ap_duration)+", bytes out: "+str(len(encoded)), RNS.LOG_DEBUG) + RNS.log(f"Codec2 encoding complete in {RNS.prettytime(ap_duration)}, bytes out: {len(encoded))}", RNS.LOG_DEBUG) return encoded @@ -176,7 +176,7 @@ def decode_codec2(encoded_bytes, mode): c2 = pycodec2.Codec2(codec2_modes[mode]) SPF = c2.samples_per_frame() BPF = c2.bytes_per_frame() - STRUCT_FORMAT = '{}h'.format(SPF) + STRUCT_FORMAT = f'{SPF}h' N_FRAMES = math.floor(len(encoded_bytes)/BPF) decoded = b"" @@ -188,6 +188,6 @@ def decode_codec2(encoded_bytes, mode): decoded += struct.pack(STRUCT_FORMAT, *decoded_frame) ap_duration = time.time() - ap_start - RNS.log("Codec2 decoding complete in "+RNS.prettytime(ap_duration)+", samples out: "+str(len(decoded)), RNS.LOG_DEBUG) + RNS.log(f"Codec2 decoding complete in {RNS.prettytime(ap_duration)}, samples out: {len(decoded))}", RNS.LOG_DEBUG) return decoded \ No newline at end of file diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py index e330aade..237b6497 100644 --- a/sbapp/sideband/core.py +++ b/sbapp/sideband/core.py @@ -61,7 +61,7 @@ def received_announce(self, destination_hash, announced_identity, app_data): # age = 0 pass - RNS.log("Detected active propagation node "+RNS.prettyhexrep(destination_hash)+" emission "+str(age)+" seconds ago, "+str(hops)+" hops away") + RNS.log(f"Detected active propagation node {RNS.prettyhexrep(destination_hash)} emission {age)} seconds ago, {hops)} hops away") self.owner.log_announce(destination_hash, RNS.prettyhexrep(destination_hash).encode("utf-8"), dest_type=PropagationNodeDetector.aspect_filter) if self.owner.config["lxmf_propagation_node"] == None: @@ -77,7 +77,7 @@ def received_announce(self, destination_hash, announced_identity, app_data): pass except Exception as e: - RNS.log("Error while processing received propagation node announce: "+str(e)) + RNS.log(f"Error while processing received propagation node announce: {e)}") def __init__(self, owner): self.owner = owner @@ -161,20 +161,20 @@ def __init__(self, owner_app, config_path = None, is_service=False, is_client=Fa self.version_str = "" if config_path == None: - self.app_dir = plyer.storagepath.get_home_dir()+"/.config/sideband" + self.app_dir = f"{plyer.storagepath.get_home_dir()}/.config/sideband" if self.app_dir.startswith("file://"): self.app_dir = self.app_dir.replace("file://", "") else: self.app_dir = config_path - self.cache_dir = self.app_dir+"/cache" + self.cache_dir = f"{self.app_dir}/cache" self.rns_configdir = None if RNS.vendor.platformutils.is_android(): - self.app_dir = android_app_dir+"/io.unsigned.sideband/files/" - self.cache_dir = self.app_dir+"/cache" - self.rns_configdir = self.app_dir+"/app_storage/reticulum" - self.asset_dir = self.app_dir+"/app/assets" + self.app_dir = f"{android_app_dir}/io.unsigned.sideband/files/" + self.cache_dir = f"{self.app_dir}/cache" + self.rns_configdir = f"{self.app_dir}/app_storage/reticulum" + self.asset_dir = f"{self.app_dir}/app/assets" elif RNS.vendor.platformutils.is_darwin(): core_path = os.path.abspath(__file__) self.asset_dir = core_path.replace("/sideband/core.py", "/assets") @@ -185,35 +185,35 @@ def __init__(self, owner_app, config_path = None, is_service=False, is_client=Fa core_path = os.path.abspath(__file__) self.asset_dir = core_path.replace("\\sideband\\core.py", "\\assets") else: - self.asset_dir = plyer.storagepath.get_application_dir()+"/sbapp/assets" + self.asset_dir = f"{plyer.storagepath.get_application_dir()}/sbapp/assets" - self.map_cache = self.cache_dir+"/maps" + self.map_cache = f"{self.cache_dir}/maps" if not os.path.isdir(self.map_cache): os.makedirs(self.map_cache) - self.rec_cache = self.cache_dir+"/rec" + self.rec_cache = f"{self.cache_dir}/rec" if not os.path.isdir(self.rec_cache): os.makedirs(self.rec_cache) - self.icon = self.asset_dir+"/icon.png" - self.icon_48 = self.asset_dir+"/icon_48.png" - self.icon_32 = self.asset_dir+"/icon_32.png" - self.icon_macos = self.asset_dir+"/icon_macos.png" - self.notification_icon = self.asset_dir+"/notification_icon.png" - self.notif_icon_black = self.asset_dir+"/notification_icon_black.png" + self.icon = f"{self.asset_dir}/icon.png" + self.icon_48 = f"{self.asset_dir}/icon_48.png" + self.icon_32 = f"{self.asset_dir}/icon_32.png" + self.icon_macos = f"{self.asset_dir}/icon_macos.png" + self.notification_icon = f"{self.asset_dir}/notification_icon.png" + self.notif_icon_black = f"{self.asset_dir}/notification_icon_black.png" os.environ["TELEMETER_GEOID_PATH"] = os.path.join(self.asset_dir, "geoids") - if not os.path.isdir(self.app_dir+"/app_storage"): - os.makedirs(self.app_dir+"/app_storage") + if not os.path.isdir(f"{self.app_dir}/app_storage"): + os.makedirs(f"{self.app_dir}/app_storage") - self.config_path = self.app_dir+"/app_storage/sideband_config" - self.identity_path = self.app_dir+"/app_storage/primary_identity" - self.db_path = self.app_dir+"/app_storage/sideband.db" - self.lxmf_storage = self.app_dir+"/app_storage/" - self.log_dir = self.app_dir+"/app_storage/" - self.tmp_dir = self.app_dir+"/app_storage/tmp" - self.exports_dir = self.app_dir+"/exports" + self.config_path = f"{self.app_dir}/app_storage/sideband_config" + self.identity_path = f"{self.app_dir}/app_storage/primary_identity" + self.db_path = f"{self.app_dir}/app_storage/sideband.db" + self.lxmf_storage = f"{self.app_dir}/app_storage/" + self.log_dir = f"{self.app_dir}/app_storage/" + self.tmp_dir = f"{self.app_dir}/app_storage/tmp" + self.exports_dir = f"{self.app_dir}/exports" self.webshare_dir = "./share/" self.first_run = True @@ -248,7 +248,7 @@ def __init__(self, owner_app, config_path = None, is_service=False, is_client=Fa self.clear_exports_dir() except Exception as e: - RNS.log("Error while configuring Sideband: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while configuring Sideband: {e)}", RNS.LOG_ERROR) if load_config_only: return @@ -256,7 +256,7 @@ def __init__(self, owner_app, config_path = None, is_service=False, is_client=Fa # Initialise Reticulum configuration if RNS.vendor.platformutils.get_platform() == "android": try: - self.rns_configdir = self.app_dir+"/app_storage/reticulum" + self.rns_configdir = f"{self.app_dir}/app_storage/reticulum" if not os.path.isdir(self.rns_configdir): os.makedirs(self.rns_configdir) @@ -269,12 +269,12 @@ def __init__(self, owner_app, config_path = None, is_service=False, is_client=Fa generated_config = rns_config.replace("TRANSPORT_IS_ENABLED", "No") - config_file = open(self.rns_configdir+"/config", "wb") + config_file = open(f"{self.rns_configdir}/config", "wb") config_file.write(generated_config.encode("utf-8")) config_file.close() except Exception as e: - RNS.log("Error while configuring Reticulum instance: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while configuring Reticulum instance: {e)}", RNS.LOG_ERROR) else: pass @@ -304,10 +304,10 @@ def load_job(): app_entry_dir = os.path.expanduser("~/.local/share/applications") icon_dir = os.path.expanduser("~/.local/share/icons/hicolor/512x512/apps") de_filename = "io.unsigned.sideband.desktop" - de_source = self.asset_dir+"/"+de_filename - de_target = app_entry_dir+"/"+de_filename - icn_source = self.asset_dir+"/icon.png" - icn_target = icon_dir+"/io.unsigned.sideband.png" + de_source = f"{self.asset_dir}/{de_filename}" + de_target = f"{app_entry_dir}/{de_filename}" + icn_source = f"{self.asset_dir}/icon.png" + icn_target = f"{icon_dir}/io.unsigned.sideband.png" if os.path.isdir(local_share_dir): if not os.path.exists(app_entry_dir): os.makedirs(app_entry_dir) @@ -333,31 +333,31 @@ def load_job(): if update_de: RNS.log("Setting up desktop integration...", lde_level) import shutil - RNS.log("Installing menu entry to \""+str(de_target)+"\"...", lde_level) + RNS.log(f"Installing menu entry to \"{de_target)}\"...", lde_level) shutil.copy(de_source, de_target) if not os.path.exists(icon_dir): os.makedirs(icon_dir) - RNS.log("Installing icon to \""+str(icn_target)+"\"...", lde_level) + RNS.log(f"Installing icon to \"{icn_target)}\"...", lde_level) shutil.copy(icn_source, icn_target) else: RNS.log("Desktop integration is already set up", lde_level) except Exception as e: - RNS.log("An error occurred while setting up desktop integration: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while setting up desktop integration: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) def clear_tmp_dir(self): if os.path.isdir(self.tmp_dir): for file in os.listdir(self.tmp_dir): - fpath = self.tmp_dir+"/"+file + fpath = f"{self.tmp_dir}/{file}" os.unlink(fpath) def clear_exports_dir(self): if os.path.isdir(self.exports_dir): for file in os.listdir(self.exports_dir): - fpath = self.exports_dir+"/"+file - RNS.log("Clearing "+str(fpath)) + fpath = f"{self.exports_dir}/{file}" + RNS.log(f"Clearing {fpath)}") os.unlink(fpath) def __init_config(self): @@ -493,7 +493,7 @@ def __load_config(self): self.rpc_addr = ("127.0.0.1", 48165) self.rpc_key = RNS.Identity.full_hash(self.identity.get_private_key()) - RNS.log("Loading Sideband configuration... "+str(self.config_path), RNS.LOG_DEBUG) + RNS.log(f"Loading Sideband configuration... {self.config_path)}", RNS.LOG_DEBUG) config_file = open(self.config_path, "rb") self.config = msgpack.unpackb(config_file.read()) config_file.close() @@ -763,7 +763,7 @@ def __reload_config(self): self.update_active_lxmf_propagation_node() self.update_ignore_invalid_stamps() except Exception as e: - RNS.log("Error while reloading configuration: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while reloading configuration: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) def __save_config(self): @@ -779,7 +779,7 @@ def save_function(): self.saving_configuration = False except Exception as e: self.saving_configuration = False - RNS.log("Error while saving Sideband configuration: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while saving Sideband configuration: {e)}", RNS.LOG_ERROR) threading.Thread(target=save_function, daemon=True).start() @@ -802,7 +802,7 @@ def __load_plugins(self): plugin_globals["SidebandServicePlugin"] = SidebandServicePlugin plugin_globals["SidebandCommandPlugin"] = SidebandCommandPlugin plugin_globals["SidebandTelemetryPlugin"] = SidebandTelemetryPlugin - RNS.log("Loading plugin \""+str(file)+"\"", RNS.LOG_NOTICE) + RNS.log(f"Loading plugin \"{file)}\"", RNS.LOG_NOTICE) plugin_path = os.path.join(plugins_path, file) exec(open(plugin_path).read(), plugin_globals) plugin_class = plugin_globals["plugin_class"] @@ -816,17 +816,17 @@ def __load_plugins(self): command_name = plugin.command_name if not command_name in self.active_command_plugins: self.active_command_plugins[command_name] = plugin - RNS.log("Registered "+str(plugin)+" as handler for command \""+str(command_name)+"\"", RNS.LOG_NOTICE) + RNS.log(f"Registered {plugin)} as handler for command \"{command_name)}\"", RNS.LOG_NOTICE) else: - RNS.log("Could not register "+str(plugin)+" as handler for command \""+str(command_name)+"\". Command name was already registered", RNS.LOG_ERROR) + RNS.log(f"Could not register {plugin)} as handler for command \"{command_name)}\". Command name was already registered", RNS.LOG_ERROR) elif issubclass(type(plugin), SidebandServicePlugin): service_name = plugin.service_name if not service_name in self.active_service_plugins: self.active_service_plugins[service_name] = plugin - RNS.log("Registered "+str(plugin)+" for service \""+str(service_name)+"\"", RNS.LOG_NOTICE) + RNS.log(f"Registered {plugin)} for service \"{service_name)}\"", RNS.LOG_NOTICE) else: - RNS.log("Could not register "+str(plugin)+" for service \""+str(service_name)+"\". Service name was already registered", RNS.LOG_ERROR) + RNS.log(f"Could not register {plugin)} for service \"{service_name)}\". Service name was already registered", RNS.LOG_ERROR) try: plugin.stop() except Exception as e: @@ -837,9 +837,9 @@ def __load_plugins(self): plugin_name = plugin.plugin_name if not plugin_name in self.active_telemetry_plugins: self.active_telemetry_plugins[plugin_name] = plugin - RNS.log("Registered "+str(plugin)+" as telemetry plugin \""+str(plugin_name)+"\"", RNS.LOG_NOTICE) + RNS.log(f"Registered {plugin)} as telemetry plugin \"{plugin_name)}\"", RNS.LOG_NOTICE) else: - RNS.log("Could not register "+str(plugin)+" as telemetry plugin \""+str(plugin_name)+"\". Telemetry type was already registered", RNS.LOG_ERROR) + RNS.log(f"Could not register {plugin)} as telemetry plugin \"{plugin_name)}\". Telemetry type was already registered", RNS.LOG_ERROR) try: plugin.stop() except Exception as e: @@ -855,7 +855,7 @@ def __load_plugins(self): del plugin else: - RNS.log("Plugin "+str(plugin)+" failed to start, ignoring it.", RNS.LOG_ERROR) + RNS.log(f"Plugin {plugin)} failed to start, ignoring it.", RNS.LOG_ERROR) del plugin @@ -875,10 +875,10 @@ def set_active_propagation_node(self, dest): self.config["last_lxmf_propagation_node"] = dest self.message_router.set_outbound_propagation_node(dest) - RNS.log("Active propagation node set to: "+RNS.prettyhexrep(dest)) + RNS.log(f"Active propagation node set to: {RNS.prettyhexrep(dest)}") self.__save_config() except Exception as e: - RNS.log("Error while setting LXMF propagation node: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while setting LXMF propagation node: {e)}", RNS.LOG_ERROR) def notify(self, title, content, group=None, context_id=None): if not self.is_daemon: @@ -911,12 +911,12 @@ def log_announce(self, dest, app_data, dest_type, stamp_cost=None): if app_data == None: app_data = b"" app_data = msgpack.packb([app_data, stamp_cost]) - RNS.log("Received "+str(dest_type)+" announce for "+RNS.prettyhexrep(dest)+" with data: "+str(app_data), RNS.LOG_DEBUG) + RNS.log(f"Received {dest_type)} announce for {RNS.prettyhexrep(dest)} with data: {app_data)}", RNS.LOG_DEBUG) self._db_save_announce(dest, app_data, dest_type) self.setstate("app.flags.new_announces", True) except Exception as e: - RNS.log("Exception while decoding LXMF destination announce data:"+str(e)) + RNS.log(f"Exception while decoding LXMF destination announce data:{e)}") def list_conversations(self, conversations=True, objects=False): result = self._db_conversations(conversations, objects) @@ -955,7 +955,7 @@ def is_trusted(self, context_dest, conv_data = None): return False except Exception as e: - RNS.log("Error while checking trust for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking trust for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def is_object(self, context_dest, conv_data = None): @@ -974,7 +974,7 @@ def is_object(self, context_dest, conv_data = None): return False except Exception as e: - RNS.log("Error while checking trust for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking trust for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def ptt_enabled(self, context_dest, conv_data = None): @@ -993,7 +993,7 @@ def ptt_enabled(self, context_dest, conv_data = None): return False except Exception as e: - RNS.log("Error while checking PTT-enabled for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking PTT-enabled for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def should_send_telemetry(self, context_dest, conv_data=None): @@ -1020,7 +1020,7 @@ def should_send_telemetry(self, context_dest, conv_data=None): return False except Exception as e: - RNS.log("Error while checking telemetry sending for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking telemetry sending for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def allow_request_from(self, context_dest): @@ -1035,7 +1035,7 @@ def allow_request_from(self, context_dest): return self.requests_allowed_from(context_dest) except Exception as e: - RNS.log("Error while checking request permissions for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking request permissions for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def requests_allowed_from(self, context_dest, conv_data=None): @@ -1055,7 +1055,7 @@ def requests_allowed_from(self, context_dest, conv_data=None): return False except Exception as e: - RNS.log("Error while checking request permissions for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking request permissions for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return False def raw_display_name(self, context_dest): @@ -1070,7 +1070,7 @@ def raw_display_name(self, context_dest): return "" except Exception as e: - RNS.log("Error while getting peer name: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while getting peer name: {e)}", RNS.LOG_ERROR) return "" def peer_appearance(self, context_dest, conv=None): @@ -1092,7 +1092,7 @@ def peer_display_name(self, context_dest): if existing_conv["trust"] == 1: return existing_conv["name"] else: - return existing_conv["name"]+" "+RNS.prettyhexrep(context_dest) + return f"{existing_conv['name']} {RNS.prettyhexrep(context_dest)}" else: app_data = RNS.Identity.recall_app_data(context_dest) @@ -1100,7 +1100,7 @@ def peer_display_name(self, context_dest): if existing_conv["trust"] == 1: return LXMF.display_name_from_app_data(app_data) else: - return LXMF.display_name_from_app_data(app_data)+" "+RNS.prettyhexrep(context_dest) + return f"{LXMF.display_name_from_app_data(app_data)} {RNS.prettyhexrep(context_dest)}" else: return RNS.prettyhexrep(context_dest) else: @@ -1108,13 +1108,13 @@ def peer_display_name(self, context_dest): if app_data != None: name_str = LXMF.display_name_from_app_data(app_data) addr_str = RNS.prettyhexrep(context_dest) - return name_str+" "+addr_str + return f"{name_str} {addr_str}" else: - return "Anonymous Peer "+RNS.prettyhexrep(context_dest) + return f"Anonymous Peer {RNS.prettyhexrep(context_dest)}" except Exception as e: - RNS.log("Could not decode a valid peer name from data: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Could not decode a valid peer name from data: {e)}", RNS.LOG_DEBUG) return RNS.prettyhexrep(context_dest) def clear_conversation(self, context_dest): @@ -1179,7 +1179,7 @@ def count_messages(self, context_dest): def outbound_telemetry_finished(self, message): if message.state == LXMF.LXMessage.FAILED and hasattr(message, "try_propagation_on_fail") and message.try_propagation_on_fail: - RNS.log("Direct delivery of telemetry update "+str(message)+" failed. Retrying as propagated message.", RNS.LOG_VERBOSE) + RNS.log(f"Direct delivery of telemetry update {message)} failed. Retrying as propagated message.", RNS.LOG_VERBOSE) message.try_propagation_on_fail = None message.delivery_attempts = 0 del message.next_delivery_attempt @@ -1200,7 +1200,7 @@ def outbound_telemetry_finished(self, message): def telemetry_request_finished(self, message): if message.state == LXMF.LXMessage.FAILED and hasattr(message, "try_propagation_on_fail") and message.try_propagation_on_fail: - RNS.log("Direct delivery of telemetry request "+str(message)+" failed. Retrying as propagated message.", RNS.LOG_VERBOSE) + RNS.log(f"Direct delivery of telemetry request {message)} failed. Retrying as propagated message.", RNS.LOG_VERBOSE) message.try_propagation_on_fail = None message.delivery_attempts = 0 del message.next_delivery_attempt @@ -1228,7 +1228,7 @@ def _service_request_latest_telemetry(self, from_addr=None): return self.service_rpc_request({"request_latest_telemetry": {"from_addr": from_addr}}) except Exception as e: - RNS.log("Error while requesting latest telemetry over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while requesting latest telemetry over RPC: {e)}", RNS.LOG_DEBUG) RNS.trace_exception(e) return False else: @@ -1240,7 +1240,7 @@ def request_latest_telemetry(self, from_addr=None): return self._service_request_latest_telemetry(from_addr) except Exception as e: - RNS.log("Error requesting latest telemetry: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error requesting latest telemetry: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) return "not_sent" @@ -1256,7 +1256,7 @@ def request_latest_telemetry(self, from_addr=None): dest_identity = RNS.Identity.recall(from_addr) if dest_identity == None: - RNS.log("The identity for "+RNS.prettyhexrep(from_addr)+" could not be recalled. Requesting identity from network...", RNS.LOG_DEBUG) + RNS.log(f"The identity for {RNS.prettyhexrep(from_addr)} could not be recalled. Requesting identity from network...", RNS.LOG_DEBUG) RNS.Transport.request_path(from_addr) return "destination_unknown" @@ -1306,7 +1306,7 @@ def _service_send_latest_telemetry(self, to_addr=None, stream=None, is_authorize }) except Exception as e: - RNS.log("Error while sending latest telemetry over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while sending latest telemetry over RPC: {e)}", RNS.LOG_DEBUG) RNS.trace_exception(e) return False else: @@ -1318,7 +1318,7 @@ def send_latest_telemetry(self, to_addr=None, stream=None, is_authorized_telemet return self._service_send_latest_telemetry(to_addr, stream, is_authorized_telemetry_request) except Exception as e: - RNS.log("Error requesting latest telemetry: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error requesting latest telemetry: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) return "not_sent" @@ -1337,7 +1337,7 @@ def send_latest_telemetry(self, to_addr=None, stream=None, is_authorized_telemet dest_identity = RNS.Identity.recall(to_addr) if dest_identity == None: - RNS.log("The identity for "+RNS.prettyhexrep(to_addr)+" could not be recalled. Requesting identity from network...", RNS.LOG_DEBUG) + RNS.log(f"The identity for {RNS.prettyhexrep(to_addr)} could not be recalled. Requesting identity from network...", RNS.LOG_DEBUG) RNS.Transport.request_path(to_addr) return "destination_unknown" @@ -1409,7 +1409,7 @@ def peer_telemetry(self, context_dest, after = None, before = None, limit = None return [] except Exception as e: - RNS.log("An error occurred while retrieving telemetry from the database: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while retrieving telemetry from the database: {e)}", RNS.LOG_ERROR) return [] try: @@ -1418,7 +1418,7 @@ def peer_telemetry(self, context_dest, after = None, before = None, limit = None if context_dest in pts: return pts[context_dest] except Exception as e: - RNS.log("An error occurred while retrieving telemetry from the database: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while retrieving telemetry from the database: {e)}", RNS.LOG_ERROR) return [] @@ -1441,7 +1441,7 @@ def peer_location(self, context_dest): return None except Exception as e: - RNS.log("Error while getting own location: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while getting own location: {e)}", RNS.LOG_ERROR) after_time = time.time()-3*30*24*60*60 pts = self.peer_telemetry(context_dest, after=after_time) @@ -1470,25 +1470,25 @@ def service_available(self): now = time.time() service_heartbeat = self.getstate("service.heartbeat") if not service_heartbeat: - RNS.log("No service heartbeat available at "+str(now), RNS.LOG_DEBUG) + RNS.log(f"No service heartbeat available at {now)}", RNS.LOG_DEBUG) return False else: try: if now - service_heartbeat > heartbeat_stale_time: - RNS.log("Stale service heartbeat at "+str(now)+", retrying...", RNS.LOG_DEBUG) + RNS.log(f"Stale service heartbeat at {now)}, retrying...", RNS.LOG_DEBUG) now = time.time() service_heartbeat = self.getstate("service.heartbeat") if now - service_heartbeat > heartbeat_stale_time: RNS.log("Service heartbeat did not recover after retry", RNS.LOG_DEBUG) return False else: - RNS.log("Service heartbeat recovered at"+str(now), RNS.LOG_DEBUG) + RNS.log(f"Service heartbeat recovered at{now)}", RNS.LOG_DEBUG) return True else: return True except Exception as e: - RNS.log("Error while getting service heartbeat: "+str(e), RNS.LOG_ERROR) - RNS.log("Response was: "+str(service_heartbeat), RNS.LOG_ERROR) + RNS.log(f"Error while getting service heartbeat: {e)}", RNS.LOG_ERROR) + RNS.log(f"Response was: {service_heartbeat)}", RNS.LOG_ERROR) return False def gui_foreground(self): @@ -1517,11 +1517,11 @@ def set(): try: set() except Exception as e: - RNS.log("Error while setting state over RPC: "+str(e)+". Retrying once.", RNS.LOG_DEBUG) + RNS.log(f"Error while setting state over RPC: {e)}. Retrying once.", RNS.LOG_DEBUG) try: set() except Exception as e: - RNS.log("Error on retry as well: "+str(e)+". Giving up.", RNS.LOG_DEBUG) + RNS.log(f"Error on retry as well: {e)}. Giving up.", RNS.LOG_DEBUG) return False def service_set_latest_telemetry(self, latest_telemetry, latest_packed_telemetry): @@ -1536,7 +1536,7 @@ def service_set_latest_telemetry(self, latest_telemetry, latest_packed_telemetry try: return self.service_rpc_request({"latest_telemetry": (latest_telemetry, latest_packed_telemetry)}) except Exception as e: - RNS.log("Error while setting telemetry over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while setting telemetry over RPC: {e)}", RNS.LOG_DEBUG) return False def service_rpc_set_debug(self, debug): @@ -1553,7 +1553,7 @@ def service_rpc_set_debug(self, debug): try: return self.service_rpc_request({"set_debug": debug}) except Exception as e: - RNS.log("Error while setting log level over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while setting log level over RPC: {e)}", RNS.LOG_DEBUG) return False def service_rpc_set_ui_recording(self, recording): @@ -1567,7 +1567,7 @@ def service_rpc_set_ui_recording(self, recording): try: return self.service_rpc_request({"set_ui_recording": recording}) except Exception as e: - RNS.log("Error while setting UI recording status over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while setting UI recording status over RPC: {e)}", RNS.LOG_DEBUG) return False def service_rpc_request(self, request): @@ -1605,7 +1605,7 @@ def getstate(self, prop, allow_cache=False): return self.service_rpc_request({"getstate": prop}) except Exception as e: - RNS.log("Error while retrieving state "+str(prop)+" over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while retrieving state {prop)} over RPC: {e)}", RNS.LOG_DEBUG) self.rpc_connection = None return None @@ -1624,9 +1624,9 @@ def _get_plugins_info(self): if np == 0: plugins_info_text = "[i]No plugins are currently loaded[/i]" elif np == 1: - plugins_info_text = "Currently, 1 plugin is loaded and active:\n" + plugins_info_text + plugins_info_text = f"Currently, 1 plugin is loaded and active:\n{plugins_info_text}" else: - plugins_info_text = f"Currently, {np} plugins are loaded and active:\n" + plugins_info_text + plugins_info_text = f"Currently, {np} plugins are loaded and active:\n{plugins_info_text}" return plugins_info_text def get_plugins_info(self): @@ -1639,7 +1639,7 @@ def get_plugins_info(self): try: return self.service_rpc_request({"get_plugins_info": True}) except Exception as e: - ed = "Error while getting plugins info over RPC: "+str(e) + ed = f"Error while getting plugins info over RPC: {e)}" RNS.log(ed, RNS.LOG_DEBUG) return ed @@ -1674,7 +1674,7 @@ def get_destination_establishment_rate(self, destination_hash): try: return self.service_rpc_request({"get_destination_establishment_rate": destination_hash}) except Exception as e: - ed = "Error while getting destination link etablishment rate over RPC: "+str(e) + ed = f"Error while getting destination link etablishment rate over RPC: {e)}" RNS.log(ed, RNS.LOG_DEBUG) return None @@ -1686,7 +1686,7 @@ def __start_rpc_listener(self): thread.daemon = True thread.start() except Exception as e: - RNS.log("Could not start RPC listener on "+str(self.rpc_addr)+". Terminating now. Clear up anything using the port and try again.", RNS.LOG_ERROR) + RNS.log(f"Could not start RPC listener on {self.rpc_addr)}. Terminating now. Clear up anything using the port and try again.", RNS.LOG_ERROR) RNS.panic() def __rpc_loop(self): @@ -1760,7 +1760,7 @@ def rpc_client_job(): connection.send(None) except Exception as e: - RNS.log("Error on client RPC connection: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error on client RPC connection: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) try: connection.close() @@ -1772,7 +1772,7 @@ def rpc_client_job(): threading.Thread(target=job_factory(rpc_connection), daemon=True).start() except Exception as e: - RNS.log("An error ocurred while handling RPC call from local client: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error ocurred while handling RPC call from local client: {e)}", RNS.LOG_ERROR) def setpersistent(self, prop, val): @@ -1894,11 +1894,11 @@ def _db_getpersistent(self, prop): return val except Exception as e: - RNS.log("Could not unpack persistent value from database for property \""+str(prop)+"\". The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not unpack persistent value from database for property \"{prop)}\". The contained exception was: {e)}", RNS.LOG_ERROR) return None except Exception as e: - RNS.log("An error occurred during persistent getstate database operation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred during persistent getstate database operation: {e)}", RNS.LOG_ERROR) self.db = None def _db_setpersistent(self, prop, val): @@ -1919,7 +1919,7 @@ def _db_setpersistent(self, prop, val): db.commit() except Exception as e: - RNS.log("Error while setting persistent state property "+str(prop)+" in DB: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while setting persistent state property {prop)} in DB: {e)}", RNS.LOG_ERROR) RNS.log("Retrying as update query...") query = "UPDATE state set value=:bval where property=:uprop;" dbc.execute(query, {"bval": bval, "uprop": uprop}) @@ -1931,7 +1931,7 @@ def _db_setpersistent(self, prop, val): db.commit() except Exception as e: - RNS.log("An error occurred during persistent setstate database operation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred during persistent setstate database operation: {e)}", RNS.LOG_ERROR) self.db = None def _db_conversation_update_txtime(self, context_dest, is_retry = False): @@ -1947,7 +1947,7 @@ def _db_conversation_update_txtime(self, context_dest, is_retry = False): result = dbc.fetchall() db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation TX time: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation TX time: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -1974,7 +1974,7 @@ def _db_conversation_set_unread(self, context_dest, unread, tx = False, is_retry result = dbc.fetchall() db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation unread flag: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation unread flag: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -1987,17 +1987,17 @@ def _db_telemetry(self, context_dest = None, after = None, before = None, limit limit_part = "" if limit: - limit_part = " LIMIT "+str(int(limit)) - order_part = " order by ts DESC"+limit_part + limit_part = f" LIMIT {int(limit))}" + order_part = f" order by ts DESC{limit_part}" if context_dest == None: if after != None and before == None: - query = "select * from telemetry where ts>:after_ts"+order_part + query = f"select * from telemetry where ts>:after_ts{order_part}" dbc.execute(query, {"after_ts": after}) elif after == None and before != None: - query = "select * from telemetry where ts<:before_ts"+order_part + query = f"select * from telemetry where ts<:before_ts{order_part}" dbc.execute(query, {"before_ts": before}) elif after != None and before != None: - query = "select * from telemetry where ts<:before_ts and ts>:after_ts"+order_part + query = f"select * from telemetry where ts<:before_ts and ts>:after_ts{order_part}" dbc.execute(query, {"before_ts": before, "after_ts": after}) else: query = query = "select * from telemetry" @@ -2005,16 +2005,16 @@ def _db_telemetry(self, context_dest = None, after = None, before = None, limit else: if after != None and before == None: - query = "select * from telemetry where dest_context=:context_dest and ts>:after_ts"+order_part + query = f"select * from telemetry where dest_context=:context_dest and ts>:after_ts{order_part}" dbc.execute(query, {"context_dest": context_dest, "after_ts": after}) elif after == None and before != None: - query = "select * from telemetry where dest_context=:context_dest and ts<:before_ts"+order_part + query = f"select * from telemetry where dest_context=:context_dest and ts<:before_ts{order_part}" dbc.execute(query, {"context_dest": context_dest, "before_ts": before}) elif after != None and before != None: - query = "select * from telemetry where dest_context=:context_dest and ts<:before_ts and ts>:after_ts"+order_part + query = f"select * from telemetry where dest_context=:context_dest and ts<:before_ts and ts>:after_ts{order_part}" dbc.execute(query, {"context_dest": context_dest, "before_ts": before, "after_ts": after}) else: - query = query = "select * from telemetry where dest_context=:context_dest"+order_part + query = query = f"select * from telemetry where dest_context=:context_dest{order_part}" dbc.execute(query, {"context_dest": context_dest}) result = dbc.fetchall() @@ -2050,7 +2050,7 @@ def _db_save_telemetry(self, context_dest, telemetry, physical_link = None, sour result = dbc.fetchall() if len(result) != 0: - RNS.log("Telemetry entry with source "+RNS.prettyhexrep(context_dest)+" and timestamp "+str(telemetry_timestamp)+" already exists, skipping save", RNS.LOG_DEBUG) + RNS.log(f"Telemetry entry with source {RNS.prettyhexrep(context_dest)} and timestamp {telemetry_timestamp)} already exists, skipping save", RNS.LOG_DEBUG) return None if physical_link != None and len(physical_link) != 0: @@ -2104,7 +2104,7 @@ def _db_save_telemetry(self, context_dest, telemetry, physical_link = None, sour try: db.commit() except Exception as e: - RNS.log("An error occurred while commiting telemetry to database: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while commiting telemetry to database: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2118,7 +2118,7 @@ def _db_save_telemetry(self, context_dest, telemetry, physical_link = None, sour except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"A {str(type(e))} occurred while saving telemetry to database: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"A {type(e))} occurred while saving telemetry to database: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) self.db = None @@ -2129,7 +2129,7 @@ def _db_update_appearance(self, context_dest, timestamp, appearance, from_bulk_t ae = [appearance, int(time.time())] # TODO: Clean out these temporary values at some interval. # Probably expire after 14 days or so. - self.setpersistent("temp.peer_appearance."+RNS.hexrep(context_dest, delimit=False), ae) + self.setpersistent(f"temp.peer_appearance.{RNS.hexrep(context_dest, delimit=False)}", ae) else: with self.db_lock: @@ -2141,7 +2141,7 @@ def _db_update_appearance(self, context_dest, timestamp, appearance, from_bulk_t data_dict["appearance"] = None if from_bulk_telemetry and data_dict["appearance"] != SidebandCore.DEFAULT_APPEARANCE: - RNS.log("Aborting appearance update from bulk transfer, since conversation already has appearance set: "+str(appearance)+" / "+str(data_dict["appearance"]), RNS.LOG_DEBUG) + RNS.log(f"Aborting appearance update from bulk transfer, since conversation already has appearance set: {appearance)} / {data_dict['appearance'])}", RNS.LOG_DEBUG) return if data_dict["appearance"] != appearance: @@ -2174,12 +2174,12 @@ def _db_get_appearance(self, context_dest, conv = None, raw=False): if data_dict != None: if not "appearance" in data_dict or data_dict["appearance"] == None: - apd = self.getpersistent("temp.peer_appearance."+RNS.hexrep(context_dest, delimit=False)) + apd = self.getpersistent(f"temp.peer_appearance.{RNS.hexrep(context_dest, delimit=False)}") if apd != None: try: data_dict["appearance"] = apd[0] except Exception as e: - RNS.log("Could not get appearance data from database: "+str(e),RNS.LOG_ERROR) + RNS.log(f"Could not get appearance data from database: {e)}",RNS.LOG_ERROR) data_dict = None try: @@ -2198,7 +2198,7 @@ def htf(cbytes): return appearance except Exception as e: - RNS.log("Could not retrieve appearance for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not retrieve appearance for {RNS.prettyhexrep(context_dest)}: {e)}", RNS.LOG_ERROR) return None @@ -2224,7 +2224,7 @@ def _db_conversation_set_telemetry(self, context_dest, send_telemetry=False, is_ try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation telemetry options: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation telemetry options: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2251,7 +2251,7 @@ def _db_conversation_set_requests(self, context_dest, allow_requests=False, is_r try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation request options: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation request options: {e)}", RNS.LOG_ERROR) self.__db_reconnect() if not is_retry: RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2278,7 +2278,7 @@ def _db_conversation_set_object(self, context_dest, is_object=False): try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation object option: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation object option: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2305,7 +2305,7 @@ def _db_conversation_set_ptt_enabled(self, context_dest, ptt_enabled=False): try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation PTT option: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation PTT option: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2324,7 +2324,7 @@ def _db_conversation_set_trusted(self, context_dest, trusted): try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation trusted option: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation trusted option: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2342,7 +2342,7 @@ def _db_conversation_set_name(self, context_dest, name): try: db.commit() except Exception as e: - RNS.log("An error occurred while updating conversation name option: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating conversation name option: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2420,7 +2420,7 @@ def _db_announces(self): added_dests.append(entry[2]) announces.append(announce) except Exception as e: - RNS.log("Exception while fetching announce from DB: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Exception while fetching announce from DB: {e)}", RNS.LOG_ERROR) announces.reverse() return announces @@ -2451,7 +2451,7 @@ def _db_conversation(self, context_dest): return conv def _db_clear_conversation(self, context_dest): - RNS.log("Clearing conversation with "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Clearing conversation with {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2461,7 +2461,7 @@ def _db_clear_conversation(self, context_dest): db.commit() def _db_clear_telemetry(self, context_dest): - RNS.log("Clearing telemetry for "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Clearing telemetry for {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2473,7 +2473,7 @@ def _db_clear_telemetry(self, context_dest): self.setstate("app.flags.last_telemetry", time.time()) def _db_delete_conversation(self, context_dest): - RNS.log("Deleting conversation with "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Deleting conversation with {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2484,7 +2484,7 @@ def _db_delete_conversation(self, context_dest): def _db_delete_announce(self, context_dest): - RNS.log("Deleting announce with "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Deleting announce with {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2494,7 +2494,7 @@ def _db_delete_announce(self, context_dest): db.commit() def _db_create_conversation(self, context_dest, name = None, trust = False): - RNS.log("Creating conversation for "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Creating conversation for {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2515,7 +2515,7 @@ def _db_create_conversation(self, context_dest, name = None, trust = False): self.__event_conversations_changed() def _db_delete_message(self, msg_hash): - RNS.log("Deleting message "+RNS.prettyhexrep(msg_hash)) + RNS.log(f"Deleting message {RNS.prettyhexrep(msg_hash)}") with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2525,7 +2525,7 @@ def _db_delete_message(self, msg_hash): db.commit() def _db_clean_messages(self): - RNS.log("Purging stale messages... "+str(self.db_path)) + RNS.log(f"Purging stale messages... {self.db_path)}") with self.db_lock: db = self.__db_connect() dbc = db.cursor() @@ -2552,7 +2552,7 @@ def _db_message_set_state(self, lxm_hash, state, is_retry=False, ratchet_id=None msg_extras["stamp_value"] = originator_stamp[2] except Exception as e: - RNS.log("An error occurred while getting message extras: "+str(e)) + RNS.log(f"An error occurred while getting message extras: {e)}") with self.db_lock: db = self.__db_connect() @@ -2573,7 +2573,7 @@ def _db_message_set_state(self, lxm_hash, state, is_retry=False, ratchet_id=None db.commit() result = dbc.fetchall() except Exception as e: - RNS.log("An error occurred while updating message state: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating message state: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2592,7 +2592,7 @@ def _db_message_set_method(self, lxm_hash, method): db.commit() result = dbc.fetchall() except Exception as e: - RNS.log("An error occurred while updating message method: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while updating message method: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2756,15 +2756,15 @@ def _db_save_lxm(self, lxm, context_dest, originator = False, own_command = Fals appearance = telemetry_entry[3] max_timebase = max(max_timebase, ttstamp) if self._db_save_telemetry(tsource, tpacked, via = context_dest): - RNS.log("Saved telemetry stream entry from "+RNS.prettyhexrep(tsource), RNS.LOG_DEBUG) + RNS.log(f"Saved telemetry stream entry from {RNS.prettyhexrep(tsource)}", RNS.LOG_DEBUG) if appearance != None: self._db_update_appearance(tsource, ttstamp, appearance, from_bulk_telemetry=True) - RNS.log("Updated appearance entry from "+RNS.prettyhexrep(tsource), RNS.LOG_DEBUG) + RNS.log(f"Updated appearance entry from {RNS.prettyhexrep(tsource)}", RNS.LOG_DEBUG) self.setpersistent(f"telemetry.{RNS.hexrep(context_dest, delimit=False)}.timebase", max_timebase) else: - RNS.log("Received telemetry stream field with no data: "+str(lxm.fields[LXMF.FIELD_TELEMETRY_STREAM]), RNS.LOG_DEBUG) + RNS.log(f"Received telemetry stream field with no data: {lxm.fields[LXMF.FIELD_TELEMETRY_STREAM])}", RNS.LOG_DEBUG) if own_command or len(lxm.content) != 0 or len(lxm.title) != 0: with self.db_lock: @@ -2820,7 +2820,7 @@ def _db_save_lxm(self, lxm, context_dest, originator = False, own_command = Fals try: db.commit() except Exception as e: - RNS.log("An error occurred while saving message to database: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while saving message to database: {e)}", RNS.LOG_ERROR) self.__db_reconnect() # if not is_retry: # RNS.log("Retrying operation...", RNS.LOG_ERROR) @@ -2834,7 +2834,7 @@ def _db_save_announce(self, destination_hash, app_data, dest_type="lxmf.delivery db = self.__db_connect() dbc = db.cursor() - query = "delete from announce where id is NULL or id not in (select id from announce order by received desc limit "+str(self.MAX_ANNOUNCES)+")" + query = f"delete from announce where id is NULL or id not in (select id from announce order by received desc limit {self.MAX_ANNOUNCES)})" dbc.execute(query) query = "delete from announce where (source=:source);" @@ -2866,7 +2866,7 @@ def lxmf_announce(self, attached_interface=None): self.lxmf_destination.announce(attached_interface=attached_interface) self.last_lxmf_announce = time.time() self.next_auto_announce = time.time() + 60*(random.random()*(SidebandCore.AUTO_ANNOUNCE_RANDOM_MAX-SidebandCore.AUTO_ANNOUNCE_RANDOM_MIN)+SidebandCore.AUTO_ANNOUNCE_RANDOM_MIN) - RNS.log("Next auto announce in "+RNS.prettytime(self.next_auto_announce-time.time()), RNS.LOG_DEBUG) + RNS.log(f"Next auto announce in {RNS.prettytime(self.next_auto_announce - time.time())}", RNS.LOG_DEBUG) self.setstate("wants.announce", False) else: @@ -2898,7 +2898,7 @@ def telemetry_job(): except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An {str(type(e))} occurred while updating service telemetry: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An {type(e))} occurred while updating service telemetry: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) time.sleep(SidebandCore.SERVICE_TELEMETRY_INTERVAL) @@ -2960,12 +2960,12 @@ def update_telemetry(self): try: self.service_set_latest_telemetry(self.latest_telemetry, self.latest_packed_telemetry) except Exception as e: - RNS.log("Error while sending latest telemetry to service: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while sending latest telemetry to service: {e)}", RNS.LOG_ERROR) except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An {str(type(e))} occurred while updating telemetry: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An {type(e))} occurred while updating telemetry: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) def update_telemeter_config(self): @@ -2978,7 +2978,7 @@ def update_telemeter_config(self): sensors = ["location", "information", "battery", "pressure", "temperature", "humidity", "magnetic_field", "ambient_light", "gravity", "angular_velocity", "acceleration", "proximity"] for sensor in sensors: - if self.config["telemetry_s_"+sensor]: + if self.config[f"telemetry_s_{sensor}"]: self.telemeter.enable(sensor) else: if sensor == "location": @@ -2998,7 +2998,7 @@ def update_telemeter_config(self): plugin.update_telemetry(self.telemeter) except Exception as e: - RNS.log("An error occurred while "+str(telemetry_plugin)+" was handling telemetry. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while {telemetry_plugin)} was handling telemetry. The contained exception was: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) if self.config["telemetry_s_fixed_location"]: @@ -3059,7 +3059,7 @@ def request_key(self, dest_hash): return True except Exception as e: - RNS.log("Error while querying for key: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while querying for key: {e)}", RNS.LOG_ERROR) return False def _update_delivery_limits(self): @@ -3070,10 +3070,10 @@ def _update_delivery_limits(self): lxm_limit = self.default_lxm_limit if self.message_router.delivery_per_transfer_limit != lxm_limit: self.message_router.delivery_per_transfer_limit = lxm_limit - RNS.log("Updated delivery limit to "+RNS.prettysize(self.message_router.delivery_per_transfer_limit*1000), RNS.LOG_DEBUG) + RNS.log(f"Updated delivery limit to {RNS.prettysize(self.message_router.delivery_per_transfer_limit * 1000)}", RNS.LOG_DEBUG) except Exception as e: - RNS.log("Error while updating LXMF router delivery limit: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while updating LXMF router delivery limit: {e)}", RNS.LOG_ERROR) def _service_jobs(self): if self.is_service: @@ -3137,7 +3137,7 @@ def job(): except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An {str(type(e))} occurred while running interface checks: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An {type(e))} occurred while running interface checks: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) announce_wanted = self.getstate("wants.announce") @@ -3152,13 +3152,13 @@ def job(): if hasattr(self.interface_local, "had_peers"): if not self.interface_local.had_peers and have_peers: - RNS.log("Peers became reachable on the interface "+str(self.interface_local), RNS.LOG_DEBUG) + RNS.log(f"Peers became reachable on the interface {self.interface_local)}", RNS.LOG_DEBUG) needs_if_change_announce = True announce_attached_interface = self.interface_local announce_delay = 10 if self.interface_local.had_peers and not have_peers: - RNS.log("No peers reachable on the interface "+str(self.interface_local), RNS.LOG_DEBUG) + RNS.log(f"No peers reachable on the interface {self.interface_local)}", RNS.LOG_DEBUG) needs_if_change_announce = True self.interface_local.had_peers = have_peers @@ -3167,11 +3167,11 @@ def job(): if not hasattr(self, "interface_local") or interface != self.interface_local: if hasattr(interface, "was_online"): if not interface.was_online and interface.online: - RNS.log("The interface "+str(interface)+" became available", RNS.LOG_DEBUG) + RNS.log(f"The interface {interface)} became available", RNS.LOG_DEBUG) needs_if_change_announce = True if interface.was_online and not interface.online: - RNS.log("The interface "+str(interface)+" became unavailable", RNS.LOG_DEBUG) + RNS.log(f"The interface {interface)} became unavailable", RNS.LOG_DEBUG) needs_if_change_announce = True interface.was_online = interface.online @@ -3242,7 +3242,7 @@ def x(): target_port = self.owner_app.usb_devices[0]["port"] RNS.Interfaces.Android.RNodeInterface.RNodeInterface.bluetooth_control(port=target_port, pairing_mode = True) except Exception as e: - self.setstate("hardware_operation.error", "An error occurred while trying to communicate with the device. Please make sure that Sideband has been granted permissions to access the device.\n\nThe reported error was:\n\n[i]"+str(e)+"[/i]") + self.setstate("hardware_operation.error", f"An error occurred while trying to communicate with the device. Please make sure that Sideband has been granted permissions to access the device.\n\nThe reported error was:\n\n[i]{e)}[/i]") else: RNS.log("Could not execute RNode Bluetooth control command, no USB devices available", RNS.LOG_ERROR) self.setstate("executing.bt_pair", False) @@ -3256,7 +3256,7 @@ def x(): if len(self.owner_app.usb_devices) > 0: target_device = self.owner_app.usb_devices[0] if self.interface_rnode.port != target_device["port"]: - RNS.log("Updating RNode device to "+str(target_device)) + RNS.log(f"Updating RNode device to {target_device)}") self.interface_rnode.port = target_device["port"] if self.interface_serial != None and not self.interface_serial.online: @@ -3267,7 +3267,7 @@ def x(): if len(self.owner_app.usb_devices) > 0: target_device = self.owner_app.usb_devices[0] if self.interface_serial.port != target_device["port"]: - RNS.log("Updating serial device to "+str(target_device)) + RNS.log(f"Updating serial device to {target_device)}") self.interface_serial.port = target_device["port"] if self.interface_modem != None and not self.interface_modem.online: @@ -3278,7 +3278,7 @@ def x(): if len(self.owner_app.usb_devices) > 0: target_device = self.owner_app.usb_devices[0] if self.interface_modem.port != target_device["port"]: - RNS.log("Updating modem device to "+str(target_device)) + RNS.log(f"Updating modem device to {target_device)}") self.interface_modem.port = target_device["port"] def _periodic_jobs(self): @@ -3299,8 +3299,8 @@ def _periodic_jobs(self): lastsync = self.getpersistent("lxmf.lastsync") nextsync = lastsync+syncinterval - RNS.log("Last LXMF sync was "+RNS.prettytime(now-lastsync)+" ago", RNS.LOG_EXTREME) - RNS.log("Next LXMF sync is "+("in "+RNS.prettytime(nextsync-now) if nextsync-now > 0 else "now"), RNS.LOG_EXTREME) + RNS.log(f"Last LXMF sync was {RNS.prettytime(now - lastsync)} ago", RNS.LOG_EXTREME) + RNS.log(f"Next LXMF sync is {f'in {RNS.prettytime(nextsync - now)}' if nextsync - now > 0 else 'now'}", RNS.LOG_EXTREME) if now > nextsync: if self.request_lxmf_sync(): RNS.log("Scheduled LXMF sync succeeded", RNS.LOG_DEBUG) @@ -3308,7 +3308,7 @@ def _periodic_jobs(self): self.setpersistent("lxmf.syncretrying", False) else: if not self.getpersistent("lxmf.syncretrying"): - RNS.log("Scheduled LXMF sync failed, retrying in "+RNS.prettytime(SidebandCore.PERIODIC_SYNC_RETRY), RNS.LOG_DEBUG) + RNS.log(f"Scheduled LXMF sync failed, retrying in {RNS.prettytime(SidebandCore.PERIODIC_SYNC_RETRY)}", RNS.LOG_DEBUG) self.setpersistent("lxmf.lastsync", lastsync+SidebandCore.PERIODIC_SYNC_RETRY) self.setpersistent("lxmf.syncretrying", True) else: @@ -3328,8 +3328,8 @@ def _periodic_jobs(self): scheduled = next_send-now; blocked = self.telemetry_send_blocked_until-now next_send_in = max(scheduled, blocked) - RNS.log("Last telemetry send was "+RNS.prettytime(now-last_send_timebase)+" ago", RNS.LOG_EXTREME) - RNS.log("Next telemetry send is "+("in "+RNS.prettytime(next_send_in) if next_send_in > 0 else "now"), RNS.LOG_EXTREME) + RNS.log(f"Last telemetry send was {RNS.prettytime(now - last_send_timebase)} ago", RNS.LOG_EXTREME) + RNS.log(f"Next telemetry send is {f'in {RNS.prettytime(next_send_in)}' if next_send_in > 0 else 'now'}", RNS.LOG_EXTREME) if now > last_send_timebase+send_interval and now > self.telemetry_send_blocked_until: RNS.log("Initiating telemetry send to collector", RNS.LOG_DEBUG) @@ -3350,7 +3350,7 @@ def _periodic_jobs(self): self.pending_telemetry_send_try = 0 except Exception as e: - RNS.log("An error occurred while sending scheduled telemetry to collector: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while sending scheduled telemetry to collector: {e)}", RNS.LOG_ERROR) if self.config["telemetry_request_from_collector"]: if self.config["telemetry_collector"] != None and self.config["telemetry_collector"] != self.lxmf_destination.hash: @@ -3361,18 +3361,18 @@ def _periodic_jobs(self): request_interval = self.config["telemetry_request_interval"] next_request = last_request_timebase+request_interval - RNS.log("Last telemetry request was "+RNS.prettytime(now-last_request_timebase)+" ago", RNS.LOG_EXTREME) - RNS.log("Next telemetry request is "+("in "+RNS.prettytime(next_request-now) if next_request-now > 0 else "now"), RNS.LOG_EXTREME) + RNS.log(f"Last telemetry request was {RNS.prettytime(now - last_request_timebase)} ago", RNS.LOG_EXTREME) + RNS.log(f"Next telemetry request is {f'in {RNS.prettytime(next_request - now)}' if next_request - now > 0 else 'now'}", RNS.LOG_EXTREME) if now > last_request_timebase+request_interval: try: RNS.log("Initiating telemetry request to collector", RNS.LOG_DEBUG) self.request_latest_telemetry(from_addr=self.config["telemetry_collector"]) except Exception as e: - RNS.log("An error occurred while requesting a telemetry update from collector. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while requesting a telemetry update from collector. The contained exception was: {e)}", RNS.LOG_ERROR) except Exception as e: - RNS.log("An error occurred while requesting scheduled telemetry from collector: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while requesting scheduled telemetry from collector: {e)}", RNS.LOG_ERROR) def __start_jobs_deferred(self): if self.is_service: @@ -3443,7 +3443,7 @@ def __add_localinterface(self, delay=None): self.interface_local_adding = False except Exception as e: - RNS.log("Error while adding AutoInterface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding AutoInterface. The contained exception was: {e)}") self.interface_local = None self.interface_local_adding = False @@ -3583,7 +3583,7 @@ def __add_rnodeinterface(self, delay=None): self.interface_rnode.disable_external_framebuffer() except Exception as e: - RNS.log("Error while adding RNode Interface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding RNode Interface. The contained exception was: {e)}") self.interface_rnode = None self.interface_rnode_adding = False @@ -3687,7 +3687,7 @@ def __start_jobs_immediate(self): self.interface_tcp = tcpinterface except Exception as e: - RNS.log("Error while adding TCP Interface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding TCP Interface. The contained exception was: {e)}") self.interface_tcp = None if self.config["connect_i2p"]: @@ -3742,7 +3742,7 @@ def __start_jobs_immediate(self): except Exception as e: - RNS.log("Error while adding I2P Interface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding I2P Interface. The contained exception was: {e)}") self.interface_i2p = None if self.config["connect_rnode"]: @@ -3799,7 +3799,7 @@ def __start_jobs_immediate(self): self.interface_serial = serialinterface except Exception as e: - RNS.log("Error while adding Serial Interface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding Serial Interface. The contained exception was: {e)}") self.interface_serial = None elif self.config["connect_modem"]: @@ -3859,7 +3859,7 @@ def __start_jobs_immediate(self): self.interface_modem = modeminterface except Exception as e: - RNS.log("Error while adding Modem Interface. The contained exception was: "+str(e)) + RNS.log(f"Error while adding Modem Interface. The contained exception was: {e)}") self.interface_modem = None RNS.log("Reticulum started, activating LXMF...") @@ -3918,7 +3918,7 @@ def message_notification(self, message, no_display=False): if not no_display: self.lxm_ingest(message, originator=True) else: - RNS.log("Direct delivery of "+str(message)+" failed. Retrying as propagated message.", RNS.LOG_VERBOSE) + RNS.log(f"Direct delivery of {message)} failed. Retrying as propagated message.", RNS.LOG_VERBOSE) message.try_propagation_on_fail = None message.delivery_attempts = 0 if hasattr(message, "next_delivery_attempt"): @@ -3936,10 +3936,10 @@ def message_notification(self, message, no_display=False): try: telemeter = Telemeter.from_packed(message.fields[LXMF.FIELD_TELEMETRY]) telemetry_timebase = telemeter.read_all()["time"]["utc"] - RNS.log("Setting last successul telemetry timebase for "+RNS.prettyhexrep(message.destination_hash)+" to "+str(telemetry_timebase), RNS.LOG_DEBUG) + RNS.log(f"Setting last successul telemetry timebase for {RNS.prettyhexrep(message.destination_hash)} to {telemetry_timebase)}", RNS.LOG_DEBUG) self.setpersistent(f"telemetry.{RNS.hexrep(message.destination_hash, delimit=False)}.last_send_success_timebase", telemetry_timebase) except Exception as e: - RNS.log("Error while setting last successul telemetry timebase for "+RNS.prettyhexrep(message.destination_hash), RNS.LOG_DEBUG) + RNS.log(f"Error while setting last successul telemetry timebase for {RNS.prettyhexrep(message.destination_hash)}", RNS.LOG_DEBUG) def get_message_fields(self, context_dest, telemetry_update=False, is_authorized_telemetry_request=False, signal_already_sent=False): fields = {} @@ -3953,7 +3953,7 @@ def get_message_fields(self, context_dest, telemetry_update=False, is_authorized if telemetry_timebase > last_success_tb: RNS.log("Embedding own telemetry in message since current telemetry is newer than latest successful timebase", RNS.LOG_DEBUG) else: - RNS.log("Not embedding own telemetry in message since current telemetry timebase ("+str(telemetry_timebase)+") is not newer than latest successful timebase ("+str(last_success_tb)+")", RNS.LOG_DEBUG) + RNS.log(f"Not embedding own telemetry in message since current telemetry timebase ({telemetry_timebase)}) is not newer than latest successful timebase ({last_success_tb)})", RNS.LOG_DEBUG) send_telemetry = False send_appearance = False if signal_already_sent: @@ -4000,7 +4000,7 @@ def paper_message(self, content, destination_hash): return True except Exception as e: - RNS.log("Error while creating paper message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating paper message: {e)}", RNS.LOG_ERROR) return False def _service_get_lxm_progress(self, lxm_hash): @@ -4012,7 +4012,7 @@ def _service_get_lxm_progress(self, lxm_hash): return self.service_rpc_request({"get_lxm_progress": {"lxm_hash": lxm_hash}}) except Exception as e: - RNS.log("Error while getting LXM progress over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while getting LXM progress over RPC: {e)}", RNS.LOG_DEBUG) RNS.trace_exception(e) return False else: @@ -4027,14 +4027,14 @@ def get_lxm_progress(self, lxm_hash): return prg except Exception as e: - RNS.log("An error occurred while getting message transfer progress: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while getting message transfer progress: {e)}", RNS.LOG_ERROR) return None def get_lxm_stamp_cost(self, lxm_hash): try: return self.message_router.get_outbound_lxm_stamp_cost(lxm_hash) except Exception as e: - RNS.log("An error occurred while getting message transfer stamp cost: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while getting message transfer stamp cost: {e)}", RNS.LOG_ERROR) return None def _service_send_message(self, content, destination_hash, propagation, skip_fields=False, no_display=False, attachment = None, image = None, audio = None): @@ -4055,7 +4055,7 @@ def _service_send_message(self, content, destination_hash, propagation, skip_fie }) except Exception as e: - RNS.log("Error while sending message over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while sending message over RPC: {e)}", RNS.LOG_DEBUG) RNS.trace_exception(e) return False else: @@ -4074,7 +4074,7 @@ def _service_send_command(self, content, destination_hash, propagation): }) except Exception as e: - RNS.log("Error while sending command over RPC: "+str(e), RNS.LOG_DEBUG) + RNS.log(f"Error while sending command over RPC: {e)}", RNS.LOG_DEBUG) RNS.trace_exception(e) return False else: @@ -4086,7 +4086,7 @@ def send_message(self, content, destination_hash, propagation, skip_fields=False return self._service_send_message(content, destination_hash, propagation, skip_fields, no_display, attachment, image, audio) except Exception as e: - RNS.log("Error while sending message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while sending message: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) return False @@ -4141,7 +4141,7 @@ def send_message(self, content, destination_hash, propagation, skip_fields=False return True except Exception as e: - RNS.log("Error while sending message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while sending message: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) return False @@ -4151,7 +4151,7 @@ def send_command(self, content, destination_hash, propagation): return self._service_send_command(content, destination_hash, propagation) except Exception as e: - RNS.log("Error while sending message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while sending message: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) return False @@ -4202,7 +4202,7 @@ def send_command(self, content, destination_hash, propagation): return True except Exception as e: - RNS.log("Error while sending message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while sending message: {e)}", RNS.LOG_ERROR) return False def new_conversation(self, dest_str, name = "", trusted = False): @@ -4214,7 +4214,7 @@ def new_conversation(self, dest_str, name = "", trusted = False): self._db_create_conversation(addr_b, name, trusted) except Exception as e: - RNS.log("Error while creating conversation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating conversation: {e)}", RNS.LOG_ERROR) return False return True @@ -4224,7 +4224,7 @@ def create_conversation(self, context_dest, name = None, trusted = False): self._db_create_conversation(context_dest, name, trusted) except Exception as e: - RNS.log("Error while creating conversation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating conversation: {e)}", RNS.LOG_ERROR) return False return True @@ -4273,7 +4273,7 @@ def lxm_ingest(self, message, originator = False): own_command = True if self._db_message(message.hash): - RNS.log("Message exists, setting state to: "+str(message.state), RNS.LOG_DEBUG) + RNS.log(f"Message exists, setting state to: {message.state)}", RNS.LOG_DEBUG) stamp = None if originator and message.stamp != None: stamp = [message.stamp, message.stamp_valid, message.stamp_value] @@ -4345,7 +4345,7 @@ def lxm_ingest(self, message, originator = False): try: self.notify(title=self.peer_display_name(context_dest), content=notification_content, group="LXM", context_id=RNS.hexrep(context_dest, delimit=False)) except Exception as e: - RNS.log("Could not post notification for received message: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Could not post notification for received message: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) def ptt_playback(self, message): @@ -4375,12 +4375,12 @@ def ptt_playback(self, message): return if audio_field[0] == LXMF.AM_OPUS_OGG: - temp_path = self.rec_cache+"/msg.ogg" + temp_path = f"{self.rec_cache}/msg.ogg" with open(temp_path, "wb") as af: af.write(self.last_msg_audio) elif audio_field[0] >= LXMF.AM_CODEC2_700C and audio_field[0] <= LXMF.AM_CODEC2_3200: - temp_path = self.rec_cache+"/msg.ogg" + temp_path = f"{self.rec_cache}/msg.ogg" from sideband.audioproc import samples_to_ogg, decode_codec2, detect_codec2 target_rate = 8000 @@ -4389,7 +4389,7 @@ def ptt_playback(self, message): if detect_codec2(): if samples_to_ogg(decode_codec2(audio_field[1], audio_field[0]), temp_path, input_rate=8000, output_rate=target_rate): - RNS.log("Wrote OGG file to: "+temp_path, RNS.LOG_DEBUG) + RNS.log(f"Wrote OGG file to: {temp_path}", RNS.LOG_DEBUG) else: RNS.log("OGG write failed", RNS.LOG_DEBUG) else: @@ -4411,7 +4411,7 @@ def ptt_playback(self, message): RNS.log("Playback was requested, but no audio data was loaded for playback", RNS.LOG_ERROR) except Exception as e: - RNS.log("Error while playing message audio:"+str(e)) + RNS.log(f"Error while playing message audio:{e)}") RNS.trace_exception(e) def ptt_event(self, message): @@ -4422,7 +4422,7 @@ def ptt_job(): time.sleep(0.5) self.ptt_playback(message) except Exception as e: - RNS.log("Error while starting playback for PTT-enabled conversation: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while starting playback for PTT-enabled conversation: {e)}", RNS.LOG_ERROR) finally: self.ptt_playback_lock.release() @@ -4445,7 +4445,7 @@ def start(self): thread.start() self.setstate("core.started", True) - RNS.log("Sideband Core "+str(self)+" "+str(self.version_str)+" started") + RNS.log(f"Sideband Core {self)} {self.version_str)} started") def stop_webshare(self): if self.webshare_server != None: @@ -4468,7 +4468,7 @@ def do_GET(self): self.path = self.path.split("?")[0] path = serve_root + self.path if self.path == "/": - path = serve_root + "/index.html" + path = f"{serve_root}/index.html" if "/.." in self.path: self.send_response(403) self.end_headers() @@ -4478,12 +4478,12 @@ def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/json") self.end_headers() - json_result = json.dumps(os.listdir(serve_root+"/pkg")) + json_result = json.dumps(os.listdir(f"{serve_root}/pkg")) self.wfile.write(json_result.encode("utf-8")) except Exception as e: self.send_response(500) self.end_headers() - RNS.log("Error listing directory "+str(path)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error listing directory {path)}: {e)}", RNS.LOG_ERROR) es = "Error" self.wfile.write(es.encode("utf-8")) else: @@ -4498,7 +4498,7 @@ def do_GET(self): except Exception as e: self.send_response(500) self.end_headers() - RNS.log("Error serving file "+str(path)+": "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error serving file {path)}: {e)}", RNS.LOG_ERROR) es = "Error" self.wfile.write(es.encode("utf-8")) @@ -4513,7 +4513,7 @@ def do_GET(self): def request_lxmf_sync(self, limit = None): if self.message_router.propagation_transfer_state == LXMF.LXMRouter.PR_IDLE or self.message_router.propagation_transfer_state >= LXMF.LXMRouter.PR_COMPLETE: self.message_router.request_messages_from_propagation_node(self.identity, max_messages = limit) - RNS.log("LXMF message sync requested from propagation node "+RNS.prettyhexrep(self.message_router.get_outbound_propagation_node())+" for "+str(self.identity)) + RNS.log(f"LXMF message sync requested from propagation node {RNS.prettyhexrep(self.message_router.get_outbound_propagation_node())} for {self.identity)}") return True else: return False @@ -4547,13 +4547,13 @@ def lxmf_delivery(self, message): if message.unverified_reason == LXMF.LXMessage.SOURCE_UNKNOWN: signature_string = "Cannot verify, source is unknown" - RNS.log("LXMF delivery "+str(time_string)+". "+str(signature_string)+".", RNS.LOG_DEBUG) + RNS.log(f"LXMF delivery {time_string)}. {signature_string)}.", RNS.LOG_DEBUG) try: context_dest = message.source_hash if self.config["lxmf_ignore_unknown"] == True: if self._db_conversation(context_dest) == None: - RNS.log("Dropping message from unknown sender "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Dropping message from unknown sender {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) return if message.signature_validated and LXMF.FIELD_COMMANDS in message.fields: @@ -4563,13 +4563,13 @@ def lxmf_delivery(self, message): else: # TODO: Add these event to built-in log/event viewer # when it is implemented. - RNS.log("Unauthorized command received from "+RNS.prettyhexrep(context_dest), RNS.LOG_WARNING) + RNS.log(f"Unauthorized command received from {RNS.prettyhexrep(context_dest)}", RNS.LOG_WARNING) else: self.lxm_ingest(message) except Exception as e: - RNS.log("Error while ingesting LXMF message "+RNS.prettyhexrep(message.hash)+" to database: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while ingesting LXMF message {RNS.prettyhexrep(message.hash)} to database: {e)}", RNS.LOG_ERROR) def handle_plugin_command(self, command_string, message): try: @@ -4577,21 +4577,21 @@ def handle_plugin_command(self, command_string, message): command = call[0] arguments = call[1:] if command in self.active_command_plugins: - RNS.log("Handling command \""+str(command)+"\" via command plugin "+str(self.active_command_plugins[command]), RNS.LOG_DEBUG) + RNS.log(f"Handling command \"{command)}\" via command plugin {self.active_command_plugins[command])}", RNS.LOG_DEBUG) self.active_command_plugins[command].handle_command(arguments, message) except Exception as e: - RNS.log("An error occurred while handling a plugin command. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while handling a plugin command. The contained exception was: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) def handle_commands(self, commands, message): try: context_dest = message.source_hash - RNS.log("Handling commands from "+RNS.prettyhexrep(context_dest), RNS.LOG_DEBUG) + RNS.log(f"Handling commands from {RNS.prettyhexrep(context_dest)}", RNS.LOG_DEBUG) for command in commands: if Commands.TELEMETRY_REQUEST in command: timebase = int(command[Commands.TELEMETRY_REQUEST]) - RNS.log("Handling telemetry request with timebase "+str(timebase), RNS.LOG_DEBUG) + RNS.log(f"Handling telemetry request with timebase {timebase)}", RNS.LOG_DEBUG) if self.config["telemetry_collector_enabled"]: RNS.log(f"Collector requests enabled, returning complete telemetry response for all known objects since {timebase}", RNS.LOG_DEBUG) self.create_telemetry_collector_response(to_addr=context_dest, timebase=timebase, is_authorized_telemetry_request=True) @@ -4604,7 +4604,7 @@ def handle_commands(self, commands, message): self.send_message("Ping reply", context_dest, False, skip_fields=True, no_display=True) elif Commands.ECHO in command: - msg_content = "Echo reply: "+command[Commands.ECHO].decode("utf-8") + msg_content = f"Echo reply: {command[Commands.ECHO].decode('utf-8')}" RNS.log("Handling echo request", RNS.LOG_DEBUG) self.send_message(msg_content, context_dest, False, skip_fields=True, no_display=True) @@ -4628,7 +4628,7 @@ def handle_commands(self, commands, message): self.handle_plugin_command(command[Commands.PLUGIN_COMMAND], message) except Exception as e: - RNS.log("Error while handling commands: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while handling commands: {e)}", RNS.LOG_ERROR) def create_telemetry_collector_response(self, to_addr, timebase, is_authorized_telemetry_request=False): added_sources = {} @@ -4698,7 +4698,7 @@ def get_sync_status(self): if new_msgs == 0: return "Done, no new messages" else: - return "Downloaded "+str(new_msgs)+" new messages" + return f"Downloaded {new_msgs)} new messages" else: return "Unknown" diff --git a/sbapp/sideband/sense.py b/sbapp/sideband/sense.py index aa1c3fa0..6c567e6e 100644 --- a/sbapp/sideband/sense.py +++ b/sbapp/sideband/sense.py @@ -38,7 +38,7 @@ def from_packed(packed): return t except Exception as e: - RNS.log("An error occurred while unpacking telemetry. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while unpacking telemetry. The contained exception was: {e)}", RNS.LOG_ERROR) return None def __init__(self, from_packed=False, android_context=None, service=False, location_provider=None): @@ -153,18 +153,18 @@ def check_permission(self, permission): if RNS.vendor.platformutils.is_android(): if self.android_context != None: try: - result = self.android_context.checkSelfPermission("android.permission."+permission) + result = self.android_context.checkSelfPermission(f"android.permission.{permission}") if result == 0: return True except Exception as e: - RNS.log("Error while checking permission: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while checking permission: {e)}", RNS.LOG_ERROR) return False else: from android.permissions import check_permission - return check_permission("android.permission."+permission) + return check_permission(f"android.permission.{permission}") else: return False @@ -273,7 +273,7 @@ def check_permission(self, permission): return self._telemeter.check_permission(permission) else: from android.permissions import check_permission - return check_permission("android.permission."+permission) + return check_permission(f"android.permission.{permission}") class Time(Sensor): SID = Sensor.SID_TIME @@ -446,9 +446,9 @@ def __init__(self): bn = 0 node_name = None for bi in range(0,10): - path = os.path.join('/sys', 'class', 'power_supply', 'BAT'+str(bi)) + path = os.path.join('/sys', 'class', 'power_supply', f"BAT{bi)}") if os.path.isdir(path): - node_name = "BAT"+str(bi) + node_name = f"BAT{bi)}" break self.battery_node_name = node_name @@ -784,7 +784,7 @@ def pack(self): d["last_update"], ] except Exception as e: - RNS.log("An error occurred while packing location sensor data. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while packing location sensor data. The contained exception was: {e)}", RNS.LOG_ERROR) return None def unpack(self, packed): diff --git a/sbapp/ui/__init__.py b/sbapp/ui/__init__.py index f49e360a..1d037108 100644 --- a/sbapp/ui/__init__.py +++ b/sbapp/ui/__init__.py @@ -1,5 +1,5 @@ import os import glob -modules = glob.glob(os.path.dirname(__file__)+"/*.py") +modules = glob.glob(f"{os.path.dirname(__file__)}/*.py") __all__ = [ os.path.basename(f)[:-3] for f in modules if not f.endswith('__init__.py')] \ No newline at end of file diff --git a/sbapp/ui/announces.py b/sbapp/ui/announces.py index 5e58dbb8..b021988a 100644 --- a/sbapp/ui/announces.py +++ b/sbapp/ui/announces.py @@ -63,7 +63,7 @@ def update(self): self.fetch_announces() self.update_widget() self.app.sideband.setstate("app.flags.new_announces", False) - RNS.log("Updated announce stream widgets in "+RNS.prettytime(time.time()-us), RNS.LOG_DEBUG) + RNS.log(f"Updated announce stream widgets in {RNS.prettytime(time.time() - us)}", RNS.LOG_DEBUG) def update_widget(self): if self.list == None: @@ -105,10 +105,10 @@ def gen_info(ts, dest, name, cost, dtype): def x(sender): yes_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) if dtype == "lxmf.delivery": - ad_text = "[size=22dp]LXMF Peer[/size]\n\n[b]Received[/b] "+ts+"\n[b]Address[/b] "+RNS.prettyhexrep(dest)+"\n[b]Name[/b] "+name+"\n[b]Stamp Cost[/b] "+cost + ad_text = f"[size=22dp]LXMF Peer[/size]\n\n[b]Received[/b] {ts}\n[b]Address[/b] {RNS.prettyhexrep(dest)}\n[b]Name[/b] {name}\n[b]Stamp Cost[/b] {cost}" if dtype == "lxmf.propagation": - ad_text = "[size=22dp]LXMF Propagation Node[/size]\n\n[b]Received[/b] "+ts+"\n[b]Address[/b] "+RNS.prettyhexrep(dest) + ad_text = f"[size=22dp]LXMF Propagation Node[/size]\n\n[b]Received[/b] {ts}\n[b]Address[/b] {RNS.prettyhexrep(dest)}" dialog = MDDialog( text=ad_text, @@ -130,7 +130,7 @@ def dl_yes(s): iconl = IconLeftWidget(icon=trust_icon) elif dest_type == "lxmf.propagation": - disp_name = "Propagation Node "+RNS.prettyhexrep(context_dest) + disp_name = f"Propagation Node {RNS.prettyhexrep(context_dest)}" iconl = IconLeftWidget(icon="upload-network") else: diff --git a/sbapp/ui/conversations.py b/sbapp/ui/conversations.py index 4427af3f..0f38b629 100644 --- a/sbapp/ui/conversations.py +++ b/sbapp/ui/conversations.py @@ -224,7 +224,7 @@ def x(): dialog = MDDialog( title="Edit Conversation", - text= "With "+RNS.prettyhexrep(dest), + text= f"With {RNS.prettyhexrep(dest)}", type="custom", content_cls=dialog_content, buttons=[ yes_button, no_button ], @@ -269,7 +269,7 @@ def dl_yes(s): self.app.sideband.named_conversation(name, dest) except Exception as e: - RNS.log("Error while saving conversation settings: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while saving conversation settings: {e)}", RNS.LOG_ERROR) dialog.dismiss() @@ -284,10 +284,10 @@ def dl_no(s): no_button.bind(on_release=dl_no) item.dmenu.dismiss() dialog.open() - RNS.log("Generated edit dialog in "+str(RNS.prettytime(time.time()-t_s)), RNS.LOG_DEBUG) + RNS.log(f"Generated edit dialog in {RNS.prettytime(time.time() - t_s))}", RNS.LOG_DEBUG) except Exception as e: - RNS.log("Error while creating conversation settings: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while creating conversation settings: {e)}", RNS.LOG_ERROR) return x @@ -479,7 +479,7 @@ def x(sender): self.list.children.sort(key=lambda w: (w.trusted, w.last_activity)) - RNS.log("Updated conversation list widgets in "+RNS.prettytime(time.time()-us), RNS.LOG_DEBUG) + RNS.log(f"Updated conversation list widgets in {RNS.prettytime(time.time() - us)}", RNS.LOG_DEBUG) def get_widget(self): return self.list diff --git a/sbapp/ui/helpers.py b/sbapp/ui/helpers.py index 68f73d44..93cc6cef 100644 --- a/sbapp/ui/helpers.py +++ b/sbapp/ui/helpers.py @@ -83,7 +83,7 @@ def multilingual_markup(data): if pfont != "default": do += "[/font]" if rfont != "default": - do += "[font="+str(rfont)+"]" + do += f"[font={rfont)}]" do += cp diff --git a/sbapp/ui/messages.py b/sbapp/ui/messages.py index 9baff871..5c2f4419 100644 --- a/sbapp/ui/messages.py +++ b/sbapp/ui/messages.py @@ -278,7 +278,7 @@ def lmcb(sender): sphrase = "Sending" prg = self.app.sideband.get_lxm_progress(msg["hash"]) if prg != None: - prgstr = ", "+str(round(prg*100, 1))+"% done" + prgstr = f", {round(prg * 100, 1))}% done" if prg <= 0.00: stamp_cost = self.app.sideband.get_lxm_stamp_cost(msg["hash"]) if stamp_cost: @@ -296,8 +296,8 @@ def lmcb(sender): sphrase = "Sending" if msg["title"]: - titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n" - w.heading = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] "+sphrase+prgstr+" " + titlestr = f"[b]Title[/b] {msg['title'].decode('utf-8')}\n" + w.heading = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] {sphrase}{prgstr} " if w.has_audio: alstr = RNS.prettysize(w.audio_size) w.heading += f"\n[b]Audio Message[/b] ({alstr})" @@ -309,8 +309,8 @@ def lmcb(sender): txstr = time.strftime(ts_format, time.localtime(msg["sent"])) titlestr = "" if msg["title"]: - titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n" - w.heading = titlestr+"[b]Sent[/b] "+txstr+delivery_syms+"\n[b]State[/b] Delivered" + titlestr = f"[b]Title[/b] {msg['title'].decode('utf-8')}\n" + w.heading = f"{titlestr}[b]Sent[/b] {txstr}{delivery_syms}\n[b]State[/b] Delivered" if w.has_audio: alstr = RNS.prettysize(w.audio_size) w.heading += f"\n[b]Audio Message[/b] ({alstr})" @@ -321,8 +321,8 @@ def lmcb(sender): txstr = time.strftime(ts_format, time.localtime(msg["sent"])) titlestr = "" if msg["title"]: - titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n" - w.heading = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Paper Message" + titlestr = f"[b]Title[/b] {msg['title'].decode('utf-8')}\n" + w.heading = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] Paper Message" m["state"] = msg["state"] if msg["method"] == LXMF.LXMessage.PROPAGATED and msg["state"] == LXMF.LXMessage.SENT: @@ -330,8 +330,8 @@ def lmcb(sender): txstr = time.strftime(ts_format, time.localtime(msg["sent"])) titlestr = "" if msg["title"]: - titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n" - w.heading = titlestr+"[b]Sent[/b] "+txstr+delivery_syms+"\n[b]State[/b] On Propagation Net" + titlestr = f"[b]Title[/b] {msg['title'].decode('utf-8')}\n" + w.heading = f"{titlestr}[b]Sent[/b] {txstr}{delivery_syms}\n[b]State[/b] On Propagation Net" if w.has_audio: alstr = RNS.prettysize(w.audio_size) w.heading += f"\n[b]Audio Message[/b] ({alstr})" @@ -342,8 +342,8 @@ def lmcb(sender): txstr = time.strftime(ts_format, time.localtime(msg["sent"])) titlestr = "" if msg["title"]: - titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n" - w.heading = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Failed" + titlestr = f"[b]Title[/b] {msg['title'].decode('utf-8')}\n" + w.heading = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] Failed" m["state"] = msg["state"] if w.has_audio: alstr = RNS.prettysize(w.audio_size) @@ -438,18 +438,18 @@ def update_widget(self): commands = m["lxm"].fields[LXMF.FIELD_COMMANDS] for command in commands: if Commands.ECHO in command: - extra_content = "[font=RobotoMono-Regular]> echo "+command[Commands.ECHO].decode("utf-8")+"[/font]\n" + extra_content = f"[font=RobotoMono-Regular]> echo {command[Commands.ECHO].decode('utf-8')}[/font]\n" if Commands.PING in command: extra_content = "[font=RobotoMono-Regular]> ping[/font]\n" if Commands.SIGNAL_REPORT in command: extra_content = "[font=RobotoMono-Regular]> sig[/font]\n" if Commands.PLUGIN_COMMAND in command: cmd_content = command[Commands.PLUGIN_COMMAND] - extra_content = "[font=RobotoMono-Regular]> "+str(cmd_content)+"[/font]\n" + extra_content = f"[font=RobotoMono-Regular]> {cmd_content)}[/font]\n" extra_content = extra_content[:-1] force_markup = True except Exception as e: - RNS.log("Error while generating command display: "+str(e), RNS.LOG_ERROR) + RNS.log(f"Error while generating command display: {e)}", RNS.LOG_ERROR) if telemeter == None and "lxm" in m and m["lxm"] and m["lxm"].fields != None and LXMF.FIELD_TELEMETRY in m["lxm"].fields: try: @@ -488,11 +488,11 @@ def update_widget(self): if "euclidian" in d: edst = d["euclidian"] if edst != None: - rcvd_d_str = "\n[b]Distance[/b] "+RNS.prettydistance(edst) + rcvd_d_str = f"\n[b]Distance[/b] {RNS.prettydistance(edst)}" elif "geodesic" in d: gdst = d["geodesic"] if gdst != None: - rcvd_d_str = "\n[b]Distance[/b] "+RNS.prettydistance(gdst) + " (geodesic)" + rcvd_d_str = f"\n[b]Distance[/b] {RNS.prettydistance(gdst)} (geodesic)" phy_stats_str = "" if "extras" in m and m["extras"] != None: @@ -500,64 +500,64 @@ def update_widget(self): if "q" in phy_stats: try: lq = round(float(phy_stats["q"]), 1) - phy_stats_str += "[b]Link Quality[/b] "+str(lq)+"% " + phy_stats_str += f"[b]Link Quality[/b] {lq)}% " extra_telemetry["quality"] = lq except: pass if "rssi" in phy_stats: try: lr = round(float(phy_stats["rssi"]), 1) - phy_stats_str += "[b]RSSI[/b] "+str(lr)+"dBm " + phy_stats_str += f"[b]RSSI[/b] {lr)}dBm " extra_telemetry["rssi"] = lr except: pass if "snr" in phy_stats: try: ls = round(float(phy_stats["snr"]), 1) - phy_stats_str += "[b]SNR[/b] "+str(ls)+"dB " + phy_stats_str += f"[b]SNR[/b] {ls)}dB " extra_telemetry["snr"] = ls except: pass if m["title"]: - titlestr = "[b]Title[/b] "+m["title"].decode("utf-8")+"\n" + titlestr = f"[b]Title[/b] {m['title'].decode('utf-8')}\n" if m["source"] == self.app.sideband.lxmf_destination.hash: if m["state"] == LXMF.LXMessage.DELIVERED: msg_color = mdc(color_delivered, intensity_msgs) - heading_str = titlestr+"[b]Sent[/b] "+txstr+delivery_syms+"\n[b]State[/b] Delivered" + heading_str = f"{titlestr}[b]Sent[/b] {txstr}{delivery_syms}\n[b]State[/b] Delivered" elif m["method"] == LXMF.LXMessage.PROPAGATED and m["state"] == LXMF.LXMessage.SENT: msg_color = mdc(color_propagated, intensity_msgs) - heading_str = titlestr+"[b]Sent[/b] "+txstr+delivery_syms+"\n[b]State[/b] On Propagation Net" + heading_str = f"{titlestr}[b]Sent[/b] {txstr}{delivery_syms}\n[b]State[/b] On Propagation Net" elif m["method"] == LXMF.LXMessage.PAPER: msg_color = mdc(color_paper, intensity_msgs) - heading_str = titlestr+"[b]Created[/b] "+txstr+"\n[b]State[/b] Paper Message" + heading_str = f"{titlestr}[b]Created[/b] {txstr}\n[b]State[/b] Paper Message" elif m["state"] == LXMF.LXMessage.FAILED: msg_color = mdc(color_failed, intensity_msgs) - heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Failed" + heading_str = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] Failed" elif m["state"] == LXMF.LXMessage.OUTBOUND or m["state"] == LXMF.LXMessage.SENDING: msg_color = mdc(color_unknown, intensity_msgs) - heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Sending " + heading_str = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] Sending " else: msg_color = mdc(color_unknown, intensity_msgs) - heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Unknown" + heading_str = f"{titlestr}[b]Sent[/b] {txstr}\n[b]State[/b] Unknown" else: msg_color = mdc(color_received, intensity_msgs) heading_str = titlestr if phy_stats_str != "" and self.app.sideband.config["advanced_stats"]: - heading_str += phy_stats_str+"\n" + heading_str += f"{phy_stats_str}\n" # TODO: Remove # if stamp_valid: # txstr += f" [b]Stamp[/b] value is {stamp_value} " - heading_str += "[b]Sent[/b] "+txstr+delivery_syms - heading_str += "\n[b]Received[/b] "+rxstr + heading_str += f"[b]Sent[/b] {txstr}{delivery_syms}" + heading_str += f"\n[b]Received[/b] {rxstr}" if rcvd_d_str != "": heading_str += rcvd_d_str @@ -575,7 +575,7 @@ def update_widget(self): if has_attachment: heading_str += "\n[b]Attachments[/b] " for attachment in attachments_field: - heading_str += str(attachment[0])+", " + heading_str += f"{attachment[0])}, " heading_str = heading_str[:-2] if has_audio: @@ -724,7 +724,7 @@ def gen_save_image(item): def x(): image_field = item.image_field extension = str(image_field[0]).replace(".", "") - filename = time.strftime("LXM_%Y_%m_%d_%H_%M_%S", time.localtime(time.time()))+"."+str(extension) + filename = f"{time.strftime('LXM_%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))}.{extension)}" self.app.share_image(image_field[1], filename) item.dmenu.dismiss() @@ -735,11 +735,11 @@ def x(): image_field = item.image_field try: extension = str(image_field[0]).replace(".", "") - filename = time.strftime("LXM_%Y_%m_%d_%H_%M_%S", time.localtime(time.time()))+"."+str(extension) + filename = f"{time.strftime('LXM_%Y_%m_%d_%H_%M_%S', time.localtime(time.time()))}.{extension)}" if RNS.vendor.platformutils.is_darwin(): save_path = str(plyer.storagepath.get_downloads_dir()+filename).replace("file://", "") else: - save_path = plyer.storagepath.get_downloads_dir()+"/"+filename + save_path = f"{plyer.storagepath.get_downloads_dir()}/{filename}" with open(save_path, "wb") as save_file: save_file.write(image_field[1]) @@ -749,7 +749,7 @@ def x(): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Image Saved", - text="The image has been saved to: "+save_path+"", + text=f"The image has been saved to: {save_path}", buttons=[ ok_button ], # elevation=0, ) @@ -764,7 +764,7 @@ def dl_ok(s): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Error", - text="Could not save the image:\n\n"+save_path+"\n\n"+str(e), + text=f"Could not save the image:\n\n{save_path}\n\n{e)}", buttons=[ ok_button ], # elevation=0, ) @@ -786,13 +786,13 @@ def x(): if RNS.vendor.platformutils.is_darwin(): output_path = str(plyer.storagepath.get_downloads_dir()).replace("file://", "") else: - output_path = plyer.storagepath.get_downloads_dir()+"/" + output_path = f"{plyer.storagepath.get_downloads_dir()}/" if len(attachments_field) == 1: - saved_text = "The attached file has been saved to: "+output_path + saved_text = f"The attached file has been saved to: {output_path}" saved_title = "Attachment Saved" else: - saved_text = "The attached files have been saved to: "+output_path + saved_text = f"The attached files have been saved to: {output_path}" saved_title = "Attachment Saved" for attachment in attachments_field: @@ -800,15 +800,15 @@ def x(): if RNS.vendor.platformutils.is_darwin(): save_path = str(plyer.storagepath.get_downloads_dir()+filename).replace("file://", "") else: - save_path = plyer.storagepath.get_downloads_dir()+"/"+filename + save_path = f"{plyer.storagepath.get_downloads_dir()}/{filename}" name_counter = 1 pre_count = save_path while os.path.exists(save_path): - save_path = str(pre_count)+"."+str(name_counter) + save_path = f"{pre_count)}.{name_counter)}" name_counter += 1 - saved_text = "The attached file has been saved to: "+save_path + saved_text = f"The attached file has been saved to: {save_path}" with open(save_path, "wb") as save_file: save_file.write(attachment[1]) @@ -833,7 +833,7 @@ def dl_ok(s): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Error", - text="Could not save the attachment:\n\n"+save_path+"\n\n"+str(e), + text=f"Could not save the attachment:\n\n{save_path}\n\n{e)}", buttons=[ ok_button ], # elevation=0, ) @@ -863,7 +863,7 @@ def x(): Clipboard.copy(str(tlm)) item.dmenu.dismiss() except Exception as e: - RNS.log("An error occurred while decoding telemetry. The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"An error occurred while decoding telemetry. The contained exception was: {e)}", RNS.LOG_ERROR) Clipboard.copy("Could not decode telemetry") return x @@ -880,7 +880,7 @@ def gen_save_qr(lxm, item): def x(): qr_image = lxm.as_qr() hash_str = RNS.hexrep(lxm.hash[-2:], delimit=False) - filename = "Paper_Message_"+time.strftime(file_ts_format, time.localtime(m["sent"]))+"_"+hash_str+".png" + filename = f"Paper_Message_{time.strftime(file_ts_format, time.localtime(m['sent']))}_{hash_str}.png" # filename = "Paper_Message.png" self.app.share_image(qr_image, filename) item.dmenu.dismiss() @@ -891,11 +891,11 @@ def x(): try: qr_image = lxm.as_qr() hash_str = RNS.hexrep(lxm.hash[-2:], delimit=False) - filename = "Paper_Message_"+time.strftime(file_ts_format, time.localtime(m["sent"]))+"_"+hash_str+".png" + filename = f"Paper_Message_{time.strftime(file_ts_format, time.localtime(m['sent']))}_{hash_str}.png" if RNS.vendor.platformutils.is_darwin(): save_path = str(plyer.storagepath.get_downloads_dir()+filename).replace("file://", "") else: - save_path = plyer.storagepath.get_downloads_dir()+"/"+filename + save_path = f"{plyer.storagepath.get_downloads_dir()}/{filename}" qr_image.save(save_path) item.dmenu.dismiss() @@ -903,7 +903,7 @@ def x(): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="QR Code Saved", - text="The paper message has been saved to: "+save_path+"", + text=f"The paper message has been saved to: {save_path}", buttons=[ ok_button ], # elevation=0, ) @@ -918,7 +918,7 @@ def dl_ok(s): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Error", - text="Could not save the paper message QR-code to:\n\n"+save_path+"\n\n"+str(e), + text=f"Could not save the paper message QR-code to:\n\n{save_path}\n\n{e)}", buttons=[ ok_button ], # elevation=0, ) @@ -940,10 +940,10 @@ def x(): def x(): try: qr_image = lxm.as_qr() - qr_tmp_path = self.app.sideband.tmp_dir+"/"+str(RNS.hexrep(lxm.hash, delimit=False)) + qr_tmp_path = f"{self.app.sideband.tmp_dir}/{RNS.hexrep(lxm.hash, delimit=False))}" qr_image.save(qr_tmp_path) - print_command = self.app.sideband.config["print_command"]+" "+qr_tmp_path + print_command = f"{self.app.sideband.config['print_command']} {qr_tmp_path}" return_code = subprocess.call(shlex.split(print_command), stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) os.unlink(qr_tmp_path) @@ -955,7 +955,7 @@ def x(): ok_button = MDRectangleFlatButton(text="OK",font_size=dp(18)) dialog = MDDialog( title="Error", - text="Could not print the paper message QR-code.\n\n"+str(e), + text=f"Could not print the paper message QR-code.\n\n{e)}", buttons=[ ok_button ], # elevation=0, ) diff --git a/sbapp/ui/objectdetails.py b/sbapp/ui/objectdetails.py index 38d00745..1f0f4466 100644 --- a/sbapp/ui/objectdetails.py +++ b/sbapp/ui/objectdetails.py @@ -155,9 +155,9 @@ def set_source(self, source_dest, from_conv=False, from_objects=False, from_tele self.screen.ids.name_label.text = pds if source_dest == own_address: - self.screen.ids.name_label.text = pds+" (this device)" + self.screen.ids.name_label.text = f"{pds} (this device)" elif source_dest == self.app.sideband.config["telemetry_collector"]: - self.screen.ids.name_label.text = pds+" (collector)" + self.screen.ids.name_label.text = f"{pds} (collector)" self.screen.ids.coordinates_button.disabled = True self.screen.ids.object_appearance.icon = appearance[0] @@ -211,7 +211,7 @@ def job(dt): except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An {str(type(e))} occurred while updating service telemetry: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An {type(e))} occurred while updating service telemetry: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) def reload(self): @@ -274,7 +274,7 @@ def clear_widget(self): def update(self): us = time.time() self.update_widget() - RNS.log("Updated object details in "+RNS.prettytime(time.time()-us), RNS.LOG_DEBUG) + RNS.log(f"Updated object details in {RNS.prettytime(time.time() - us)}", RNS.LOG_DEBUG) def update_widget(self): if self.widget == None: @@ -414,7 +414,7 @@ def copy_info(e=None): else: cs_str = f" ({cs})" - if p != None: formatted_values = f"{name} [b]{p}%[/b]"+cs_str + if p != None: formatted_values = f"{name} [b]{p}%[/b]{cs_str}" elif name == "Ambient Pressure": p = s["values"]["mbar"] @@ -447,10 +447,10 @@ def copy_info(e=None): if q != None: q_str = f"Link Quality [b]{q}%[/b]" if rssi != None: rssi_str = f"RSSI [b]{rssi} dBm[/b]" - if q != None: rssi_str = ", "+rssi_str + if q != None: rssi_str = f", {rssi_str}" if snr != None: snr_str = f"SNR [b]{snr} dB[/b]" - if q != None or rssi != None: snr_str = ", "+snr_str + if q != None or rssi != None: snr_str = f", {snr_str}" if q_str or rssi_str or snr_str: formatted_values = q_str+rssi_str+snr_str @@ -592,7 +592,7 @@ def copy_info(e=None): pct = round(load*100.0, 1) avgs_str = f", averages are [b]{round(avgs[0],2)}[/b], [b]{round(avgs[1],2)}[/b], [b]{round(avgs[2],2)}[/b]" if avgs != None and len(avgs) == 3 else "" - clock_str = " at [b]"+RNS.prettyfrequency(clock)+"[/b]" if clock != None else "" + clock_str = f" at [b]{RNS.prettyfrequency(clock)}[/b]" if clock != None else "" e_text = f"Using [b]{pct}%[/b] of {label}{clock_str}{avgs_str}" e_text = f"{label} use is [b]{pct}%[/b]{clock_str}{avgs_str}" @@ -650,7 +650,7 @@ def copy_info(e=None): speed_formatted_values = f"Object is [b]stationary[/b]" else: speed_formatted_values = None - extra_formatted_values = f"Uncertainty [b]{accuracy} meters[/b]"+updated_str + extra_formatted_values = f"Uncertainty [b]{accuracy} meters[/b]{updated_str}" data = {"icon": s["icon"], "text": f"{formatted_values}"} @@ -778,7 +778,7 @@ def lj(): except Exception as e: RNS.log("An error ocurred while displaying telemetry for object", RNS.LOG_ERROR) - RNS.log("The contained exception was: "+str(e), RNS.LOG_ERROR) + RNS.log(f"The contained exception was: {e)}", RNS.LOG_ERROR) RNS.trace_exception(e) try: @@ -816,7 +816,7 @@ def lj(): if ticket_expires: t_str = ", but have ticket" if stamp_cost: - self.entries.append({"icon": "postage-stamp", "text": f"Required stamp cost [b]{stamp_cost}[/b]"+t_str, "on_release": pass_job}) + self.entries.append({"icon": "postage-stamp", "text": f"Required stamp cost [b]{stamp_cost}[/b]{t_str}", "on_release": pass_job}) else: self.entries.append({"icon": "postage-stamp", "text": f"No required stamp cost", "on_release": pass_job}) if ticket_expires: @@ -834,7 +834,7 @@ def lj(): except Exception as e: import traceback exception_info = "".join(traceback.TracebackException.from_exception(e).format()) - RNS.log(f"An {str(type(e))} occurred while updating service telemetry: {str(e)}", RNS.LOG_ERROR) + RNS.log(f"An {type(e))} occurred while updating service telemetry: {e)}", RNS.LOG_ERROR) RNS.log(exception_info, RNS.LOG_ERROR) diff --git a/sbapp/ui/telemetry.py b/sbapp/ui/telemetry.py index 71858b58..60ab64f5 100644 --- a/sbapp/ui/telemetry.py +++ b/sbapp/ui/telemetry.py @@ -99,7 +99,7 @@ def __init__(self, app): info += "Sideband will become a Telemetry Collector, and other authorized peers will be able to query its collected data.\n" if self.app.theme_cls.theme_style == "Dark": - info = "[color=#"+self.app.dark_theme_text_color+"]"+info+"[/color]" + info = f"[color=#{self.app.dark_theme_text_color}]{info}[/color]" self.screen.ids.telemetry_info.text = info @@ -118,7 +118,7 @@ def send_interval_change(sender=None, event=None, save=True): interval_text = RNS.prettytime(interval) if self.screen.ids.telemetry_send_to_collector.active: - self.screen.ids.telemetry_send_to_collector_label.text = "Auto sync to collector every "+interval_text + self.screen.ids.telemetry_send_to_collector_label.text = f"Auto sync to collector every {interval_text}" else: self.screen.ids.telemetry_send_to_collector_label.text = "Auto sync to collector" @@ -164,7 +164,7 @@ def request_interval_change(sender=None, event=None, save=True): interval_text = RNS.prettytime(interval) if self.screen.ids.telemetry_request_from_collector.active: - self.screen.ids.telemetry_request_from_collector_label.text = "Auto sync from collector every "+interval_text + self.screen.ids.telemetry_request_from_collector_label.text = f"Auto sync from collector every {interval_text}" else: self.screen.ids.telemetry_request_from_collector_label.text = "Auto sync from collector" @@ -329,7 +329,7 @@ def sensors_init(self): info3 = "\nTo include a specific type of telemetry data while sending, it must be enabled below. Please note that some sensor types are not supported on all devices. Sideband will only be able to read a specific type of sensor if your device actually includes hardware for it.\n" if self.app.theme_cls.theme_style == "Dark": - info3 = "[color=#"+self.app.dark_theme_text_color+"]"+info3+"[/color]" + info3 = f"[color=#{self.app.dark_theme_text_color}]{info3}[/color]" self.sensors_screen.ids.telemetry_info3.text = info3 self.sensors_screen.ids.sensors_scrollview.effect_cls = ScrollEffect @@ -506,7 +506,7 @@ def telemetry_set_icon(self, text="", search=False): self.own_appearance_changed = True def icons_selected(self, selected=None): - RNS.log("Selected: "+str(selected)) + RNS.log(f"Selected: {selected)}") if selected == None: selected = "alpha-p-circle-outline" self.telemetry_set_icon(selected) diff --git a/setup.py b/setup.py index 17aaad27..1f1f6e72 100644 --- a/setup.py +++ b/setup.py @@ -69,8 +69,8 @@ def glob_paths(pattern): variant_str = "" if __variant__: - variant_str = " "+__variant__ -print("Packaging Sideband "+__version__+variant_str) + variant_str = f" {__variant__}" +print(f"Packaging Sideband {__version__}{variant_str}") setuptools.setup( name="sbapp",
%s
{complete_filename}