mirror of
				https://github.com/f-droid/fdroidserver.git
				synced 2025-11-04 14:30:30 +03:00 
			
		
		
		
	clarify that config/options can be global or module-level variable
This commit is contained in:
		
							parent
							
								
									92a3f4b191
								
							
						
					
					
						commit
						717df09be0
					
				
					 2 changed files with 75 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -374,7 +374,27 @@ def fill_config_defaults(thisconfig):
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
    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__":
 | 
			
		||||
    os.chdir(os.path.dirname(__file__))
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue