mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-14 11:00:10 +01:00
clarify that config/options can be global or module-level variable
This commit is contained in:
parent
92a3f4b191
commit
717df09be0
@ -374,7 +374,27 @@ def fill_config_defaults(thisconfig):
|
|||||||
|
|
||||||
|
|
||||||
def get_config(opts=None):
|
def get_config(opts=None):
|
||||||
"""Get config instace. This function takes care of initializing config data before returning it."""
|
"""Get the initalized, singleton config instance.
|
||||||
|
|
||||||
|
config and options are intertwined in read_config(), so they have
|
||||||
|
to be here too. In the current ugly state of things, there are
|
||||||
|
multiple potential instances of config and options in use:
|
||||||
|
|
||||||
|
* global
|
||||||
|
* module-level in the subcommand module (e.g. fdroidserver/build.py)
|
||||||
|
* module-level in fdroidserver.common
|
||||||
|
|
||||||
|
There are some insane parts of the code that are probably
|
||||||
|
referring to multiple instances of these at different points.
|
||||||
|
This can be super confusing and maddening.
|
||||||
|
|
||||||
|
The current intermediate refactoring step is to move all
|
||||||
|
subcommands to always get/set config and options via this function
|
||||||
|
so that there is no longer a distinction between the global and
|
||||||
|
module-level instances. Then there can be only one module-level
|
||||||
|
instance in fdroidserver.common.
|
||||||
|
|
||||||
|
"""
|
||||||
global config, options
|
global config, options
|
||||||
|
|
||||||
if config is not None:
|
if config is not None:
|
||||||
|
@ -3237,6 +3237,60 @@ class SignerExtractionTest(unittest.TestCase):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigOptionsScopeTest(unittest.TestCase):
|
||||||
|
"""Test assumptions about variable scope for "config" and "options".
|
||||||
|
|
||||||
|
The ancient architecture of config and options in fdroidserver has
|
||||||
|
weird issues around unexpected scope, like there are cases where
|
||||||
|
the global config is not the same as the module-level config, and
|
||||||
|
more.
|
||||||
|
|
||||||
|
This is about describing what is happening, it is not about
|
||||||
|
documenting behaviors that are good design. The config and options
|
||||||
|
handling should really be refactored into a well-known, workable
|
||||||
|
Pythonic pattern.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
# these are declared as None at the top of the module file
|
||||||
|
fdroidserver.common.config = None
|
||||||
|
fdroidserver.common.options = None
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
fdroidserver.common.config = None
|
||||||
|
fdroidserver.common.options = None
|
||||||
|
if 'config' in globals():
|
||||||
|
global config
|
||||||
|
del config
|
||||||
|
if 'options' in globals():
|
||||||
|
global options
|
||||||
|
del options
|
||||||
|
|
||||||
|
def test_get_config(self):
|
||||||
|
"""Show how the module-level variables are initialized."""
|
||||||
|
self.assertTrue('config' not in vars() and 'config' not in globals())
|
||||||
|
self.assertIsNone(fdroidserver.common.config)
|
||||||
|
config = fdroidserver.common.get_config()
|
||||||
|
self.assertIsNotNone(fdroidserver.common.config)
|
||||||
|
self.assertEqual(dict, type(config))
|
||||||
|
self.assertEqual(config, fdroidserver.common.config)
|
||||||
|
|
||||||
|
def test_get_config_global(self):
|
||||||
|
"""Test assumptions about variable scope using global keyword."""
|
||||||
|
global config
|
||||||
|
self.assertTrue('config' not in vars() and 'config' not in globals())
|
||||||
|
self.assertIsNone(fdroidserver.common.config)
|
||||||
|
c = fdroidserver.common.get_config()
|
||||||
|
self.assertIsNotNone(fdroidserver.common.config)
|
||||||
|
self.assertEqual(dict, type(c))
|
||||||
|
self.assertEqual(c, fdroidserver.common.config)
|
||||||
|
self.assertTrue(
|
||||||
|
'config' not in vars() and 'config' not in globals(),
|
||||||
|
"The config should not be set in the global context, only module-level.",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
os.chdir(os.path.dirname(__file__))
|
os.chdir(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user