From bf2f566269d8815c2734f374668cbfe62c50d888 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Mon, 1 Apr 2024 21:28:23 +0200 Subject: [PATCH] gnulib-tool.py: Simplify imports. * pygnulib/enums.py: New file, extracted from pygnulib/GLFileSystem.py. * pygnulib/classes.py: Remove file. * pygnulib/GLFileSystem.py: Remove class CopyAction. Update imports. * pygnulib/GLTestDir.py: Update imports. * pygnulib/GLConfig.py: Update imports and remove 'classes.' prefix. * pygnulib/main.py: Likewise. --- ChangeLog | 10 +++++ pygnulib/GLConfig.py | 38 ++++++++--------- pygnulib/GLFileSystem.py | 10 +---- pygnulib/GLTestDir.py | 2 +- pygnulib/classes.py | 90 ---------------------------------------- pygnulib/enums.py | 30 ++++++++++++++ pygnulib/main.py | 87 +++++++++++++++++++++----------------- 7 files changed, 109 insertions(+), 158 deletions(-) delete mode 100644 pygnulib/classes.py create mode 100644 pygnulib/enums.py diff --git a/ChangeLog b/ChangeLog index 127d1f44b1..ef529a5e4c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2024-04-01 Bruno Haible + + gnulib-tool.py: Simplify imports. + * pygnulib/enums.py: New file, extracted from pygnulib/GLFileSystem.py. + * pygnulib/classes.py: Remove file. + * pygnulib/GLFileSystem.py: Remove class CopyAction. Update imports. + * pygnulib/GLTestDir.py: Update imports. + * pygnulib/GLConfig.py: Update imports and remove 'classes.' prefix. + * pygnulib/main.py: Likewise. + 2024-04-01 Collin Funk gnulib-tool.py: Only check existence for --extract-tests-module. diff --git a/pygnulib/GLConfig.py b/pygnulib/GLConfig.py index 662814b6be..80719d35f2 100644 --- a/pygnulib/GLConfig.py +++ b/pygnulib/GLConfig.py @@ -23,7 +23,7 @@ import copy import tempfile from . import constants from .GLError import GLError -from pygnulib import classes +from pygnulib.enums import CopyAction #=============================================================================== @@ -82,8 +82,8 @@ class GLConfig(object): podomain: str | None = None, witness_c_macro: str | None = None, vc_files: bool | None = None, - copymode: classes.CopyAction | None = None, - lcopymode: classes.CopyAction | None = None, + copymode: CopyAction | None = None, + lcopymode: CopyAction | None = None, configure_ac: str | None = None, ac_version: float | int | None = None, libtests: bool | None = None, @@ -206,13 +206,13 @@ class GLConfig(object): self.resetCopyMode() if copymode == None: # Default to copying. - copymode = classes.CopyAction.Copy + copymode = CopyAction.Copy self.setCopyMode(copymode) # lcopymode (--local-symlink and --local-hardlink) self.resetLCopyMode() if lcopymode == None: # Default to copying. - lcopymode = classes.CopyAction.Copy + lcopymode = CopyAction.Copy self.setLCopyMode(lcopymode) # configure_ac self.resetAutoconfFile() @@ -248,7 +248,7 @@ class GLConfig(object): '''x.__repr__() <==> repr(x)''' return '' - def __getitem__(self, y: str) -> str | float | int | bool | classes.CopyAction | list[str] | None: + def __getitem__(self, y: str) -> str | float | int | bool | CopyAction | list[str] | None: '''x.__getitem__(y) <==> x[y]''' if y in self.table: result = self.table[y] @@ -262,7 +262,7 @@ class GLConfig(object): else: # if y not in self.table raise KeyError('GLConfig does not contain key: %s' % repr(y)) - def dictionary(self) -> dict[str, str | float | int | bool | classes.CopyAction | list[str] | None]: + def dictionary(self) -> dict[str, str | float | int | bool | CopyAction | list[str] | None]: '''Return the configuration as a dict object.''' return dict(self.table) @@ -304,7 +304,7 @@ class GLConfig(object): else: # if key not in self.table raise KeyError('GLConfig does not contain key: %s' % repr(key)) - def default(self, key: str) -> str | float | int | bool | classes.CopyAction | list[str] | None: + def default(self, key: str) -> str | float | int | bool | CopyAction | list[str] | None: '''Return default value for the given key.''' if key in self.table: if key == 'libname': @@ -325,7 +325,7 @@ class GLConfig(object): 'libtests', 'dryrun']: return False elif key in ['copymode', 'lcopymode']: - return classes.CopyAction.Copy + return CopyAction.Copy elif key in ['lgpl', 'vc_files']: return None elif key == 'errors': @@ -335,7 +335,7 @@ class GLConfig(object): else: # if key not in self.table raise KeyError('GLConfig does not contain key: %s' % repr(key)) - def isdefault(self, key: str, value: str | float | int | bool | classes.CopyAction | list[str] | None) -> bool: + def isdefault(self, key: str, value: str | float | int | bool | CopyAction | list[str] | None) -> bool: '''Check whether the value for the given key is a default value.''' if key in self.table: default = self.default(key) @@ -347,7 +347,7 @@ class GLConfig(object): '''Return list of keys.''' return list(self.table.keys()) - def values(self) -> list[str | float | int | bool | classes.CopyAction | list[str] | None]: + def values(self) -> list[str | float | int | bool | CopyAction | list[str] | None]: '''Return list of values.''' return list(self.table.values()) @@ -1065,13 +1065,13 @@ class GLConfig(object): self.table['ac_version'] = 2.64 # Define copymode methods. - def checkCopyMode(self) -> classes.CopyAction: + def checkCopyMode(self) -> CopyAction: '''Check if pygnulib will copy files, create symlinks, or create hard links.''' return self.table['copymode'] - def setCopyMode(self, value: classes.CopyAction) -> None: + def setCopyMode(self, value: CopyAction) -> None: '''Change the method used for copying / linking files.''' - if type(value) is classes.CopyAction: + if type(value) is CopyAction: self.table['copymode'] = value else: # if type(value) is not CopyAction raise TypeError('value must be a CopyAction, not %s' @@ -1079,18 +1079,18 @@ class GLConfig(object): def resetCopyMode(self) -> None: '''Reset the method used for creating files to copying instead of linking.''' - self.table['copymode'] = classes.CopyAction.Copy + self.table['copymode'] = CopyAction.Copy # Define lcopymode methods. - def checkLCopyMode(self) -> classes.CopyAction: + def checkLCopyMode(self) -> CopyAction: '''Check if pygnulib will copy files, create symlinks, or create hard links, only for files from the local override directories.''' return self.table['lcopymode'] - def setLCopyMode(self, value: classes.CopyAction) -> None: + def setLCopyMode(self, value: CopyAction) -> None: '''Change the method used for copying / linking files, only for files from the local override directories.''' - if type(value) is classes.CopyAction: + if type(value) is CopyAction: self.table['lcopymode'] = value else: # if type(value) is not CopyAction raise TypeError('value must be a CopyAction, not %s' @@ -1099,7 +1099,7 @@ class GLConfig(object): def resetLCopyMode(self) -> None: '''Reset the method used for creating files to copying instead of linking, only for files from the local override directories.''' - self.table['lcopymode'] = classes.CopyAction.Copy + self.table['lcopymode'] = CopyAction.Copy # Define verbosity methods. def getVerbosity(self) -> int: diff --git a/pygnulib/GLFileSystem.py b/pygnulib/GLFileSystem.py index e06eab316a..4709b0b092 100644 --- a/pygnulib/GLFileSystem.py +++ b/pygnulib/GLFileSystem.py @@ -25,6 +25,7 @@ import filecmp import subprocess as sp from enum import Enum from . import constants +from pygnulib.enums import CopyAction from .GLError import GLError from .GLConfig import GLConfig @@ -53,15 +54,6 @@ isfile = os.path.isfile islink = os.path.islink -#=============================================================================== -# Define CopyAction class -#=============================================================================== -class CopyAction(Enum): - Copy = 0 - Symlink = 1 - Hardlink = 2 - - #=============================================================================== # Define GLFileSystem class #=============================================================================== diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py index 2a39eb3c5d..f0fe993c58 100644 --- a/pygnulib/GLTestDir.py +++ b/pygnulib/GLTestDir.py @@ -26,11 +26,11 @@ import subprocess as sp import shutil from pathlib import Path from . import constants +from .enums import CopyAction from .GLError import GLError from .GLConfig import GLConfig from .GLModuleSystem import GLModuleTable from .GLModuleSystem import GLModuleSystem -from .GLFileSystem import CopyAction from .GLFileSystem import GLFileSystem from .GLFileSystem import GLFileAssistant from .GLMakefileTable import GLMakefileTable diff --git a/pygnulib/classes.py b/pygnulib/classes.py deleted file mode 100644 index 537872a37b..0000000000 --- a/pygnulib/classes.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (C) 2002-2024 Free Software Foundation, Inc. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -'''An easy access to pygnulib classes.''' - -#=============================================================================== -# Define global imports -#=============================================================================== -__all__ = list() - -try: - # Constants - from . import constants - - # Main classes - from .GLConfig import GLConfig - from .GLError import GLError - from .GLInfo import GLInfo - - # File system - from .GLFileSystem import CopyAction - from .GLFileSystem import GLFileSystem - from .GLFileSystem import GLFileAssistant - - # Module system - from .GLModuleSystem import GLModule - from .GLModuleSystem import GLModuleSystem - from .GLModuleSystem import GLModuleTable - - # Different modes - from .GLImport import GLImport - from .GLEmiter import GLEmiter - from .GLTestDir import GLTestDir - from .GLTestDir import GLMegaTestDir - - # Other modules - from .GLMakefileTable import GLMakefileTable -except ValueError as error: - # Constants - import constants - - # Main classes - from GLConfig import GLConfig - from GLError import GLError - from GLInfo import GLInfo - - # File system - from GLFileSystem import CopyAction - from GLFileSystem import GLFileSystem - from GLFileSystem import GLFileAssistant - - # Module system - from GLModuleSystem import GLModule - from GLModuleSystem import GLModuleSystem - from GLModuleSystem import GLModuleTable - - # Different modes - from GLImport import GLImport - from GLEmiter import GLEmiter - from GLTestDir import GLTestDir - from GLTestDir import GLMegaTestDir - - # Other modules - from GLMakefileTable import GLMakefileTable - -# Append modules to namespace. -__all__ += ['GLConfig', 'GLError', 'GLInfo'] -__all__ += ['CopyAction', 'GLFileSystem', 'GLFileAssistant'] -__all__ += ['GLModule', 'GLModuleSystem', 'GLModuleTable'] -__all__ += ['GLImport', 'GLEmiter', 'GLTestDir'] -__all__ += ['GLMakefileTable'] - -#=============================================================================== -# Define module information -#=============================================================================== -__author__ = constants.__author__ -__license__ = constants.__license__ -__copyright__ = constants.__copyright__ diff --git a/pygnulib/enums.py b/pygnulib/enums.py new file mode 100644 index 0000000000..f6781dd011 --- /dev/null +++ b/pygnulib/enums.py @@ -0,0 +1,30 @@ +# Copyright (C) 2002-2024 Free Software Foundation, Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import annotations + +#=============================================================================== +# Define global imports +#=============================================================================== +from enum import Enum + + +#=============================================================================== +# Define CopyAction class +#=============================================================================== +class CopyAction(Enum): + Copy = 0 + Symlink = 1 + Hardlink = 2 diff --git a/pygnulib/main.py b/pygnulib/main.py index 55d635d074..31bb434b3a 100644 --- a/pygnulib/main.py +++ b/pygnulib/main.py @@ -82,7 +82,16 @@ import subprocess as sp import shlex from tempfile import mktemp from pygnulib import constants -from pygnulib import classes +from pygnulib.enums import CopyAction +from pygnulib.GLConfig import GLConfig +from pygnulib.GLError import GLError +from pygnulib.GLFileSystem import GLFileSystem +from pygnulib.GLFileSystem import GLFileAssistant +from pygnulib.GLImport import GLImport +from pygnulib.GLInfo import GLInfo +from pygnulib.GLModuleSystem import GLModuleSystem +from pygnulib.GLTestDir import GLTestDir +from pygnulib.GLTestDir import GLMegaTestDir #=============================================================================== @@ -107,7 +116,7 @@ isfile = os.path.isfile # Define main part #=============================================================================== def main() -> None: - info = classes.GLInfo() + info = GLInfo() parser = argparse.ArgumentParser( prog=constants.APP['name'], usage='gnulib-tool.py --help', @@ -462,22 +471,22 @@ def main() -> None: parser.add_argument('-s', '-S', '--symbolic', '--symlink', '--more-symlinks', dest='copymode', default=None, - action='store_const', const=classes.CopyAction.Symlink) + action='store_const', const=CopyAction.Symlink) # local-symlink parser.add_argument('--local-symlink', dest='lcopymode', default=None, - action='store_const', const=classes.CopyAction.Symlink) + action='store_const', const=CopyAction.Symlink) # hardlink parser.add_argument('-h', '-H', '--hardlink', '--more-hardlinks', dest='copymode', default=None, - action='store_const', const=classes.CopyAction.Hardlink) + action='store_const', const=CopyAction.Hardlink) # local-hardlink parser.add_argument('--local-hardlink', dest='lcopymode', default=None, - action='store_const', const=classes.CopyAction.Hardlink) + action='store_const', const=CopyAction.Hardlink) # Undocumented option. Only used for the gnulib-tool test suite. parser.add_argument('--gnulib-dir', dest='gnulib_dir', @@ -802,7 +811,7 @@ def main() -> None: docbase = None # Create pygnulib configuration. - config = classes.GLConfig( + config = GLConfig( destdir=destdir, localpath=localpath, m4base=m4base, @@ -837,14 +846,14 @@ def main() -> None: # Work in the given mode. if mode == 'list': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) listing = modulesystem.list() result = lines_to_multiline(listing) os.rmdir(config['tempdir']) print(result, end='') elif mode == 'find': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for filename in files: if (isfile(joinpath(DIRS['root'], filename)) or (localpath != None @@ -902,7 +911,7 @@ def main() -> None: elif isfile(joinpath(destdir, 'configure.in')): configure_ac = joinpath(destdir, 'configure.in') else: - raise classes.GLError(3, joinpath(destdir, 'configure.ac')) + raise GLError(3, joinpath(destdir, 'configure.ac')) # Save the Autoconf file path for the rest of the import. config.setAutoconfFile(configure_ac) @@ -937,7 +946,7 @@ def main() -> None: config.setMacroPrefix(macro_prefix) # Perform GLImport actions. - importer = classes.GLImport(config, mode) + importer = GLImport(config, mode) filetable, transformers = importer.prepare() importer.execute(filetable, transformers) @@ -961,7 +970,7 @@ def main() -> None: config.setTestsBase(testsbase) config.setMacroPrefix(macro_prefix) # Perform GLImport actions. - importer = classes.GLImport(config, mode) + importer = GLImport(config, mode) filetable, transformers = importer.prepare() importer.execute(filetable, transformers) else: # if not m4base @@ -1027,7 +1036,7 @@ def main() -> None: config.setTestsBase(testsbase) config.setMacroPrefix(macro_prefix) # Perform GLImport actions. - importer = classes.GLImport(config, mode) + importer = GLImport(config, mode) filetable, transformers = importer.prepare() importer.execute(filetable, transformers) elif len(m4dirs) == 1: @@ -1036,7 +1045,7 @@ def main() -> None: m4base = m4dirs[-1] config.setM4Base(m4base) # Perform GLImport actions. - importer = classes.GLImport(config, mode) + importer = GLImport(config, mode) filetable, transformers = importer.prepare() importer.execute(filetable, transformers) else: # if len(m4dirs) > 1 @@ -1044,7 +1053,7 @@ def main() -> None: for m4base in m4dirs: config.setM4Base(m4base) # Perform GLImport actions. - importer = classes.GLImport(config, mode) + importer = GLImport(config, mode) filetable, transformers = importer.prepare() importer.execute(filetable, transformers) @@ -1058,7 +1067,7 @@ def main() -> None: if not auxdir: auxdir = 'build-aux' config.setAuxDir(auxdir) - testdir = classes.GLTestDir(config, destdir) + testdir = GLTestDir(config, destdir) testdir.execute() elif mode == 'create-megatestdir': @@ -1071,7 +1080,7 @@ def main() -> None: if not auxdir: auxdir = 'build-aux' config.setAuxDir(auxdir) - testdir = classes.GLMegaTestDir(config, destdir) + testdir = GLMegaTestDir(config, destdir) testdir.execute() elif mode == 'test': @@ -1080,7 +1089,7 @@ def main() -> None: if not auxdir: auxdir = 'build-aux' config.setAuxDir(auxdir) - testdir = classes.GLTestDir(config, destdir) + testdir = GLTestDir(config, destdir) testdir.execute() constants.force_output() os.chdir(destdir) @@ -1113,7 +1122,7 @@ def main() -> None: if not auxdir: auxdir = 'build-aux' config.setAuxDir(auxdir) - testdir = classes.GLMegaTestDir(config, destdir) + testdir = GLMegaTestDir(config, destdir) testdir.execute() constants.force_output() os.chdir(destdir) @@ -1138,42 +1147,42 @@ def main() -> None: sp.call(['rm', '-rf', destdir], shell=False) elif mode == 'extract-description': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getDescription()) elif mode == 'extract-comment': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getComment()) elif mode == 'extract-status': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getStatus()) elif mode == 'extract-notice': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getNotice()) elif mode == 'extract-applicability': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: print(module.getApplicability()) elif mode == 'extract-filelist': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: @@ -1190,7 +1199,7 @@ def main() -> None: message += '%s: *** Stop.\n' % constants.APP['name'] sys.stderr.write(message) sys.exit(1) - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: @@ -1203,35 +1212,35 @@ def main() -> None: message += '%s: *** Stop.\n' % constants.APP['name'] sys.stderr.write(message) sys.exit(1) - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getDependenciesRecursively()) elif mode == 'extract-autoconf-snippet': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getAutoconfSnippet()) elif mode == 'extract-automake-snippet': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getAutomakeSnippet()) elif mode == 'extract-include-directive': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getInclude()) elif mode == 'extract-link-directive': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: @@ -1244,28 +1253,28 @@ def main() -> None: message += '%s: *** Stop.\n' % constants.APP['name'] sys.stderr.write(message) sys.exit(1) - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getLinkDirectiveRecursively()) elif mode == 'extract-license': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: print(module.getLicense()) elif mode == 'extract-maintainer': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module: sys.stdout.write(module.getMaintainer()) elif mode == 'extract-tests-module': - modulesystem = classes.GLModuleSystem(config) + modulesystem = GLModuleSystem(config) for name in modules: module = modulesystem.find(name) if module and modulesystem.exists(module.getTestsName()): @@ -1294,7 +1303,7 @@ def main() -> None: config.setM4Base(m4base) config.setDocBase(docbase) config.setTestsBase(testsbase) - filesystem = classes.GLFileSystem(config) + filesystem = GLFileSystem(config) lookedup, flag = filesystem.lookup(srcpath) if isdir(dest): destdir = dest @@ -1324,7 +1333,7 @@ def main() -> None: except FileExistsError: pass # Copy the file. - assistant = classes.GLFileAssistant(config) + assistant = GLFileAssistant(config) tmpfile = assistant.tmpfilename(destpath) copyfile(lookedup, tmpfile) ensure_writable(tmpfile) @@ -1350,7 +1359,7 @@ def main() -> None: sys.stderr.write(message) sys.exit(1) - if copymode == classes.CopyAction.Hardlink or lcopymode == classes.CopyAction.Hardlink: + if copymode == CopyAction.Hardlink or lcopymode == CopyAction.Hardlink: # Setting hard links modifies the ctime of files in the gnulib checkout. # This disturbs the result of the next "gitk" invocation. # Workaround: Let git scan the files. This can be done through @@ -1367,7 +1376,7 @@ def main() -> None: if __name__ == '__main__': try: # Try to execute main() - except classes.GLError as error: + except GLError as error: errmode = 0 # gnulib-style errors errno = error.errno errinfo = error.errinfo -- 2.39.5