I pushed this patch removing getName() from GLModule, preferring
it's name variable directly. I mentioned previously I found
differentiating these a bit confusing [1]:
module.getName()
module.name
str(module)
Especially when they were mixed together in the same function or same
line.
Bruno said [2]:
> In pure OO, one would not make the 'name' public, since it's meant to
> be a read-only property. It eliminates possible side effects on the
> 'name' property from the beginning.
and the previous knowledge summarization engine gave some other details.
I chose to just use GLModule.name since I prefer it and I think it is
what I am most accustomed to seeing in Python code.
I guess you see setters/getters more frequently in something like Java
because it is more pure OO. More worrying about encapsulation and
such. Then you have to deal with public/private/protected. In Python
there is no such thing. You even can define instance variables
anywhere:
module = GLModule(...)
module.non_existent = 'now exists'
I don't think accidental modifying the 'module.name' will be a
problem. I think the most common way to avoid that would be @property,
but no point in adding that unnecessarily.
[1] https://lists.gnu.org/archive/html/bug-gnulib/2024-04/msg00307.html
[2] https://lists.gnu.org/archive/html/bug-gnulib/2024-04/msg00309.html
Collin
From ffde99059e2f30c9b1030ce2cf9dae7fb41b3a73 Mon Sep 17 00:00:00 2001
From: Collin Funk <collin.fu...@gmail.com>
Date: Wed, 1 May 2024 01:12:18 -0700
Subject: [PATCH] gnulib-tool.py: Use the GLModule's name variable directly.
* pygnulib/GLModuleSystem.py (GLModule.getName): Remove function.
(GLModule.__str__, GLModule.__repr__, GLModule.isNonTests)
(GLModule.repeatModuleInTests, GLModule.getDependenciesRecursively)
(GLModule.getShellFunc, GLModule.getShellVar)
(GLModule.getConditionalName, GLModule.getApplicability)
(GLModule.getDependencies, GLModule.getAutomakeSnippet_Unconditional)
(GLModule.getLicense, GLModuleSystem.find)
(GLModuleTable.transitive_closure): Use the GLModule's name instance
variable instead of using str() or removed getName() function.
* pygnulib/GLEmiter.py (GLEmiter.autoconfSnippet)
(GLEmiter.preEarlyMacros, GLEmiter.lib_Makefile_am)
(GLEmiter.tests_Makefile_am): Likewise.
* pygnulib/GLImport.py (GLImport.gnulib_comp, GLImport.prepare):
Likewise.
* pygnulib/GLTestDir.py (GLTestDir.execute, GLMegaTestDir.execute):
Likewise.
---
ChangeLog | 20 ++++++++++++++
pygnulib/GLEmiter.py | 24 ++++++++---------
pygnulib/GLImport.py | 22 +++++++--------
pygnulib/GLModuleSystem.py | 55 +++++++++++++++++---------------------
pygnulib/GLTestDir.py | 32 +++++++++++-----------
5 files changed, 84 insertions(+), 69 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index e2c736f854..917761a7d2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2024-05-01 Collin Funk <collin.fu...@gmail.com>
+
+ gnulib-tool.py: Use the GLModule's name variable directly.
+ * pygnulib/GLModuleSystem.py (GLModule.getName): Remove function.
+ (GLModule.__str__, GLModule.__repr__, GLModule.isNonTests)
+ (GLModule.repeatModuleInTests, GLModule.getDependenciesRecursively)
+ (GLModule.getShellFunc, GLModule.getShellVar)
+ (GLModule.getConditionalName, GLModule.getApplicability)
+ (GLModule.getDependencies, GLModule.getAutomakeSnippet_Unconditional)
+ (GLModule.getLicense, GLModuleSystem.find)
+ (GLModuleTable.transitive_closure): Use the GLModule's name instance
+ variable instead of using str() or removed getName() function.
+ * pygnulib/GLEmiter.py (GLEmiter.autoconfSnippet)
+ (GLEmiter.preEarlyMacros, GLEmiter.lib_Makefile_am)
+ (GLEmiter.tests_Makefile_am): Likewise.
+ * pygnulib/GLImport.py (GLImport.gnulib_comp, GLImport.prepare):
+ Likewise.
+ * pygnulib/GLTestDir.py (GLTestDir.execute, GLMegaTestDir.execute):
+ Likewise.
+
2024-04-30 Paul Eggert <egg...@cs.ucla.edu>
intprops: document fix for GCC bug 68193
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py
index 3fbf796aaa..38b23bbfcf 100644
--- a/pygnulib/GLEmiter.py
+++ b/pygnulib/GLEmiter.py
@@ -206,10 +206,10 @@ def autoconfSnippet(self, module: GLModule, toplevel: bool, disable_libtool: boo
libtool = self.config['libtool']
include_guard_prefix = self.config['include_guard_prefix']
emit = ''
- if str(module) in ['gnumakefile', 'maintainer-makefile']:
+ if module.name in ['gnumakefile', 'maintainer-makefile']:
# These modules are meant to be used only in the top-level directory.
flag = toplevel
- else: # if str(module) not in ['gnumakefile', 'maintainer-makefile']
+ else: # if module.name not in ['gnumakefile', 'maintainer-makefile']
flag = True
if flag:
snippet = module.getAutoconfSnippet()
@@ -231,7 +231,7 @@ def autoconfSnippet(self, module: GLModule, toplevel: bool, disable_libtool: boo
# autopoint through at least GNU gettext version 0.18.2.
snippet = re.compile(r'^ *AM_GNU_GETTEXT_VERSION', re.M).sub(r'AM_GNU_GETTEXT_VERSION', snippet)
emit += snippet
- if str(module) == 'alloca' and libtool and not disable_libtool:
+ if module.name == 'alloca' and libtool and not disable_libtool:
emit += 'changequote(,)dnl\n'
emit += "LTALLOCA=`echo \"$ALLOCA\" | sed -e 's/\\.[^.]* /.lo /g;s/\\.[^.]*$/.lo/'`\n"
emit += 'changequote([, ])dnl\n'
@@ -396,7 +396,7 @@ def preEarlyMacros(self, require: bool, indentation: str, modules: list[GLModule
emit = '\n' + indentation + '# Pre-early section.\n'
# We need to call gl_USE_SYSTEM_EXTENSIONS before gl_PROG_AR_RANLIB.
# Doing AC_REQUIRE in configure-ac.early is not early enough.
- if any(str(module) == 'extensions' for module in modules):
+ if any(module.name == 'extensions' for module in modules):
if require:
emit += indentation + 'AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])\n'
else:
@@ -749,7 +749,7 @@ def lib_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable: G
amsnippet1 = amsnippet1.replace('check_PROGRAMS', 'noinst_PROGRAMS')
amsnippet1 = amsnippet1.replace('${gl_include_guard_prefix}',
include_guard_prefix)
- if str(module) == 'alloca':
+ if module.name == 'alloca':
amsnippet1 += '%s_%s_LIBADD += @%sALLOCA@\n' % (libname, libext, perhapsLT)
amsnippet1 += '%s_%s_DEPENDENCIES += @%sALLOCA@\n' % (libname, libext, perhapsLT)
amsnippet1 = combine_lines_matching(re.compile(r'%s_%s_SOURCES' % (libname, libext)),
@@ -764,9 +764,9 @@ def lib_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable: G
'$(' + module_indicator_prefix + '_GNULIB_')
# Skip the contents if it's entirely empty.
if (amsnippet1 + amsnippet2).strip() != '':
- allsnippets += '## begin gnulib module %s\n' % str(module)
+ allsnippets += '## begin gnulib module %s\n' % module.name
if gnu_make:
- allsnippets += 'ifeq (,$(OMIT_GNULIB_MODULE_%s))\n' % str(module)
+ allsnippets += 'ifeq (,$(OMIT_GNULIB_MODULE_%s))\n' % module.name
allsnippets += '\n'
if conddeps:
if moduletable.isConditional(module):
@@ -788,7 +788,7 @@ def lib_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable: G
allsnippets += amsnippet2
if gnu_make:
allsnippets += 'endif\n'
- allsnippets += '## end gnulib module %s\n\n' % str(module)
+ allsnippets += '## end gnulib module %s\n\n' % module.name
# Test whether there are some source files in subdirectories.
for file in module.getFiles():
@@ -1044,7 +1044,7 @@ def tests_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable:
amsnippet1 = amsnippet1.replace('${gl_include_guard_prefix}',
include_guard_prefix)
# Check if module is 'alloca'.
- if libtests and str(module) == 'alloca':
+ if libtests and module.name == 'alloca':
amsnippet1 += 'libtests_a_LIBADD += @ALLOCA@\n'
amsnippet1 += 'libtests_a_DEPENDENCIES += @ALLOCA@\n'
@@ -1059,9 +1059,9 @@ def tests_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable:
'$(' + module_indicator_prefix + '_GNULIB_')
# Skip the contents if it's entirely empty.
if (amsnippet1 + amsnippet2).strip() != '':
- snippet = '## begin gnulib module %s\n' % str(module)
+ snippet = '## begin gnulib module %s\n' % module.name
if gnu_make:
- snippet += 'ifeq (,$(OMIT_GNULIB_MODULE_%s))\n' % str(module)
+ snippet += 'ifeq (,$(OMIT_GNULIB_MODULE_%s))\n' % module.name
snippet += '\n'
if conddeps:
if moduletable.isConditional(module):
@@ -1083,7 +1083,7 @@ def tests_Makefile_am(self, destfile: str, modules: list[GLModule], moduletable:
snippet += amsnippet2
if gnu_make:
snippet += 'endif\n'
- snippet += '## end gnulib module %s\n\n' % str(module)
+ snippet += '## end gnulib module %s\n\n' % module.name
# Mention long-running tests at the end.
if 'longrunning-test' in module.getStatuses():
longrun_snippets += snippet
diff --git a/pygnulib/GLImport.py b/pygnulib/GLImport.py
index 63877342d2..833e186b8f 100644
--- a/pygnulib/GLImport.py
+++ b/pygnulib/GLImport.py
@@ -570,7 +570,7 @@ def gnulib_comp(self, filetable: GLFileTable, gentests: bool) -> str:
m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable\n''' % (configure_ac, macro_prefix)
emit += self.emitter.preEarlyMacros(True, ' ', moduletable.getFinalModules())
for module in moduletable.getFinalModules():
- emit += ' # Code from module %s:\n' % str(module)
+ emit += ' # Code from module %s:\n' % module.name
snippet = module.getAutoconfEarlySnippet()
lines = [ line
for line in snippet.split('\n')
@@ -762,10 +762,10 @@ def prepare(self) -> tuple[GLFileTable, dict[str, tuple[re.Pattern, str] | None]
(bold_on, bold_off) = bold_escapes()
print('Module list with included dependencies (indented):')
for module in final_modules:
- if str(module) in self.config.getModules():
- print(' %s%s%s' % (bold_on, module, bold_off))
- else: # if str(module) not in self.config.getModules()
- print(' %s' % module)
+ if module.name in self.config.getModules():
+ print(' %s%s%s' % (bold_on, module.name, bold_off))
+ else: # if module.name not in self.config.getModules()
+ print(' %s' % module.name)
# Separate modules into main_modules and tests_modules.
modules = \
@@ -776,10 +776,10 @@ def prepare(self) -> tuple[GLFileTable, dict[str, tuple[re.Pattern, str] | None]
if verbose >= 1:
print('Main module list:')
for module in main_modules:
- print(' %s' % str(module))
+ print(' %s' % module.name)
print('Tests-related module list:')
for module in tests_modules:
- print(' %s' % str(module))
+ print(' %s' % module.name)
# Determine whether a $testsbase/libtests.a is needed.
libtests = False
@@ -819,10 +819,10 @@ def prepare(self) -> tuple[GLFileTable, dict[str, tuple[re.Pattern, str] | None]
if license not in compatibilities['all']:
if lgpl == True:
if license not in compatibilities['3']:
- listing.append(tuple([str(module), license]))
+ listing.append(tuple([module.name, license]))
else:
if license not in compatibilities[lgpl]:
- listing.append(tuple([str(module), license]))
+ listing.append(tuple([module.name, license]))
if listing:
raise GLError(11, listing)
@@ -831,14 +831,14 @@ def prepare(self) -> tuple[GLFileTable, dict[str, tuple[re.Pattern, str] | None]
for module in main_modules:
notice = module.getNotice().strip('\n')
if notice:
- print('Notice from module %s:' % str(module))
+ print('Notice from module %s:' % module.name)
pattern = re.compile(r'^(.*?)$', re.S | re.M)
notice = pattern.sub(r' \1', notice)
print(notice)
# Determine script to apply to imported library files.
sed_transform_lib_file = None
- if 'config-h' in [ str(module)
+ if 'config-h' in [ module.name
for module in main_modules ]:
sed_transform_lib_file = (re.compile(r'^#ifdef[\t ]*HAVE_CONFIG_H[\t ]*$', re.MULTILINE), r'#if 1')
diff --git a/pygnulib/GLModuleSystem.py b/pygnulib/GLModuleSystem.py
index 01ee393d12..2bfd5b252f 100644
--- a/pygnulib/GLModuleSystem.py
+++ b/pygnulib/GLModuleSystem.py
@@ -101,7 +101,7 @@ def find(self, module: str) -> GLModule | None:
raise GLError(3, module)
else: # if not self.config['errors']
sys.stderr.write('gnulib-tool: warning: ')
- sys.stderr.write("module %s doesn't exist\n" % str(module))
+ sys.stderr.write("module %s doesn't exist\n" % module.name)
def file_is_module(self, filename: str) -> bool:
'''Given the name of a file in the modules/ directory, return true
@@ -272,18 +272,13 @@ def __lt__(self, module: object) -> bool:
def __str__(self) -> str:
'''x.__str__() <==> str(x)'''
- result = self.getName()
- return result
+ return self.name
def __repr__(self) -> str:
'''x.__repr__ <==> repr(x)'''
- result = '<pygnulib.GLModule %s %s>' % (repr(self.getName()), hex(id(self)))
+ result = '<pygnulib.GLModule %s %s>' % (repr(self.name), hex(id(self)))
return result
- def getName(self) -> str:
- '''Return the name of the module.'''
- return self.name
-
def isPatched(self) -> bool:
'''Check whether module was created after applying patch.'''
return self.patched
@@ -296,7 +291,7 @@ def isTests(self) -> bool:
def isNonTests(self) -> bool:
'''Check whether module is not a *-tests module.'''
- result = not self.getName().endswith('-tests')
+ result = not self.name.endswith('-tests')
return result
def getTestsName(self) -> str:
@@ -317,7 +312,7 @@ def repeatModuleInTests(self) -> bool:
# tests contain such an invocation, the module - as part of tests -
# will produce different AC_SUBSTed variable values than the same module
# - as part of the main configure.ac -.
- result = self.getName() == 'libtextstyle-optional'
+ result = self.name == 'libtextstyle-optional'
return result
def getDependenciesRecursively(self) -> str:
@@ -343,7 +338,7 @@ def getDependenciesRecursively(self) -> str:
# Remove handledmodules from inmodules.
inmodules = inmodules.difference(handledmodules)
- module_names = sorted([ str(module)
+ module_names = sorted([ module.name
for module in outmodules ])
return lines_to_multiline(module_names)
@@ -388,14 +383,14 @@ def getShellFunc(self) -> str:
for the module.'''
macro_prefix = self.config['macro_prefix']
valid_shell_id = True
- for char in self.getName():
+ for char in self.name:
if char not in GLModule.shell_id_chars:
valid_shell_id = False
break
if valid_shell_id:
- identifier = self.getName()
+ identifier = self.name
else:
- hash_input = '%s\n' % self.getName()
+ hash_input = '%s\n' % self.name
identifier = hashlib.md5(hash_input.encode(ENCS['default'])).hexdigest()
result = 'func_%s_gnulib_m4code_%s' % (macro_prefix, identifier)
return result
@@ -405,14 +400,14 @@ def getShellVar(self) -> str:
m4 macros for the module have been executed.'''
macro_prefix = self.config['macro_prefix']
valid_shell_id = True
- for char in self.getName():
+ for char in self.name:
if char not in GLModule.shell_id_chars:
valid_shell_id = False
break
if valid_shell_id:
- identifier = self.getName()
+ identifier = self.name
else:
- hash_input = '%s\n' % self.getName()
+ hash_input = '%s\n' % self.name
identifier = hashlib.md5(hash_input.encode(ENCS['default'])).hexdigest()
result = '%s_gnulib_enabled_%s' % (macro_prefix, identifier)
return result
@@ -422,14 +417,14 @@ def getConditionalName(self) -> str:
GLConfig: macro_prefix.'''
macro_prefix = self.config['macro_prefix']
valid_shell_id = True
- for char in self.getName():
+ for char in self.name:
if char not in GLModule.shell_id_chars:
valid_shell_id = False
break
if valid_shell_id:
- identifier = self.getName()
+ identifier = self.name
else:
- hash_input = '%s\n' % self.getName()
+ hash_input = '%s\n' % self.name
identifier = hashlib.md5(hash_input.encode(ENCS['default'])).hexdigest()
result = '%s_GNULIB_ENABLED_%s' % (macro_prefix, identifier)
return result
@@ -467,7 +462,7 @@ def getApplicability(self) -> str:
result = result.strip()
if not result:
# The default is 'main' or 'tests', depending on the module's name.
- if self.getName().endswith('-tests'):
+ if self.name.endswith('-tests'):
result = 'tests'
else:
result = 'main'
@@ -497,8 +492,8 @@ def getDependencies(self) -> str:
if 'dependencies' not in self.cache:
result = ''
# ${module}-tests implicitly depends on ${module}, if that module exists.
- if self.getName().endswith('-tests'):
- main_module = subend('-tests', '', self.getName())
+ if self.name.endswith('-tests'):
+ main_module = subend('-tests', '', self.name)
if self.modulesystem.exists(main_module):
result += '%s\n' % main_module
# Then the explicit dependencies listed in the module description.
@@ -584,7 +579,7 @@ def getAutomakeSnippet_Unconditional(self) -> str:
auxdir = self.config['auxdir']
result = ''
if 'makefile-unconditional' not in self.cache:
- if self.getName().endswith('-tests'):
+ if self.name.endswith('-tests'):
# *-tests module live in tests/, not lib/.
# Synthesize an EXTRA_DIST augmentation.
files = self.getFiles()
@@ -627,7 +622,7 @@ def getAutomakeSnippet_Unconditional(self) -> str:
# If some .c file exists and is not used with AC_LIBOBJ - for example,
# a .c file is preprocessed into another .c file for BUILT_SOURCES -,
# automake will generate a useless dependency; this is harmless.
- if str(self) != 'relocatable-prog-wrapper' and str(self) != 'pt_chown':
+ if self.name != 'relocatable-prog-wrapper' and self.name != 'pt_chown':
extra_files = filter_filelist('\n', extra_files,
'', '.c', '', '')
if extra_files != '':
@@ -666,13 +661,13 @@ def getLicense(self) -> str:
if 'license' not in self.cache:
license = self.getLicense_Raw().strip()
# Warn if the License field is missing.
- if not self.getName().endswith('-tests'):
+ if not self.name.endswith('-tests'):
if not license:
if self.config['errors']:
- raise GLError(18, str(self))
+ raise GLError(18, self.name)
else: # if not self.config['errors']
- sys.stderr.write('gnulib-tool: warning: module %s lacks a License\n' % str(self))
- if str(self).startswith('parse-datetime'):
+ sys.stderr.write('gnulib-tool: warning: module %s lacks a License\n' % self.name)
+ if self.name.startswith('parse-datetime'):
# These modules are under a weaker license only for the purpose of some
# users who hand-edit it and don't use gnulib-tool. For the regular
# gnulib users they are under a stricter license.
@@ -852,7 +847,7 @@ def transitive_closure(self, modules: list[GLModule]) -> list[GLModule]:
for depmodule in set(depmodules)
if depmodules.count(depmodule) > 1 ]
if duplicate_depmodules:
- duplicate_depmodule_names = [ str(depmodule)
+ duplicate_depmodule_names = [ depmodule.name
for depmodule in duplicate_depmodules ]
message = ('gnulib-tool: warning: module %s has duplicated dependencies: %s\n'
% (module, duplicate_depmodule_names))
diff --git a/pygnulib/GLTestDir.py b/pygnulib/GLTestDir.py
index 8ddc1ea4c8..3394468016 100644
--- a/pygnulib/GLTestDir.py
+++ b/pygnulib/GLTestDir.py
@@ -221,13 +221,13 @@ def execute(self) -> None:
if verbose >= 0:
(bold_on, bold_off) = bold_escapes()
print('Module list with included dependencies (indented):')
- specified_modules_set = { str(module)
+ specified_modules_set = { module.name
for module in specified_modules }
for module in final_modules:
- if str(module) in specified_modules_set:
- print(' %s%s%s' % (bold_on, module, bold_off))
- else: # if str(module) not in specified_modules_set
- print(' %s' % module)
+ if module.name in specified_modules_set:
+ print(' %s%s%s' % (bold_on, module.name, bold_off))
+ else: # if module.name not in specified_modules_set
+ print(' %s' % module.name)
# Generate lists of the modules.
if single_configure:
@@ -238,10 +238,10 @@ def execute(self) -> None:
if verbose >= 1:
print('Main module list:')
for module in main_modules:
- print(' %s' % str(module))
+ print(' %s' % module.name)
print('Tests-related module list:')
for module in tests_modules:
- print(' %s' % str(module))
+ print(' %s' % module.name)
# Determine whether a $testsbase/libtests.a is needed.
libtests = False
for module in tests_modules:
@@ -267,7 +267,7 @@ def execute(self) -> None:
for module in main_modules:
notice = module.getNotice().strip('\n')
if notice:
- print('Notice from module %s:' % str(module))
+ print('Notice from module %s:' % module.name)
pattern = re.compile(r'^(.*)$', re.M)
notice = pattern.sub(r' \1', notice)
print(notice)
@@ -276,7 +276,7 @@ def execute(self) -> None:
for module in modules:
notice = module.getNotice().strip('\n')
if notice:
- print('Notice from module %s:' % str(module))
+ print('Notice from module %s:' % module.name)
pattern = re.compile(r'^(.*)$', re.M)
notice = pattern.sub(r' \1', notice)
print(notice)
@@ -417,10 +417,10 @@ def execute(self) -> None:
emit += self.emitter.preEarlyMacros(False, '', modules)
snippets = []
for module in modules:
- if str(module) in ['gnumakefile', 'maintainer-makefile']:
+ if module.name in ['gnumakefile', 'maintainer-makefile']:
# These are meant to be used only in the top-level directory.
pass
- # if str(module) not in ['gnumakefile', 'maintainer-makefile']
+ # if module.name not in ['gnumakefile', 'maintainer-makefile']
else:
snippet = module.getAutoconfEarlySnippet()
lines = [ line
@@ -894,16 +894,16 @@ def execute(self) -> None:
# First, all modules one by one.
for module in modules:
- self.config.setModules([str(module)])
- GLTestDir(self.config, joinpath(self.megatestdir, str(module))).execute()
- megasubdirs.append(str(module))
+ self.config.setModules([module.name])
+ GLTestDir(self.config, joinpath(self.megatestdir, module.name)).execute()
+ megasubdirs.append(module.name)
# Then, all modules all together.
# Except config-h, which breaks all modules which use HAVE_CONFIG_H.
modules = [ module
for module in modules
- if str(module) != 'config-h' ]
- self.config.setModules([ str(module)
+ if module.name != 'config-h' ]
+ self.config.setModules([ module.name
for module in modules ])
GLTestDir(self.config, joinpath(self.megatestdir, 'ALL')).execute()
megasubdirs.append('ALL')
--
2.44.0