diff --git a/integrations/client/test_delphi_epidata.py b/integrations/client/test_delphi_epidata.py index d788cada2..e607781ba 100644 --- a/integrations/client/test_delphi_epidata.py +++ b/integrations/client/test_delphi_epidata.py @@ -317,19 +317,15 @@ def raise_for_status(self): pass def json(self): return json.loads(self.content) get.reset_mock() get.return_value = MockJson(b'{"info": {"version": "0.0.1"}}', 200) + Epidata._version_check() + captured = self.capsys.readouterr() output = captured.err.splitlines() self.assertEqual(len(output), 1) self.assertIn("Client version not up to date", output[0]) self.assertIn("\'latest_version\': \'0.0.1\'", output[0]) - @patch('delphi.epidata.client.delphi_epidata.Epidata._version_check') - def test_version_check_once(self, version_check): - """Test that the _version_check() function is only called once on initial module import.""" - from delphi.epidata.client.delphi_epidata import Epidata - version_check.assert_not_called() - def test_geo_value(self): """test different variants of geo types: single, *, multi.""" diff --git a/src/client/delphi_epidata.py b/src/client/delphi_epidata.py index 22fd9c1c8..ba6ad3805 100644 --- a/src/client/delphi_epidata.py +++ b/src/client/delphi_epidata.py @@ -52,23 +52,24 @@ def log(evt, **kwargs): kwargs['timestamp'] = time.strftime("%Y-%m-%d %H:%M:%S %z") return sys.stderr.write(str(kwargs) + "\n") - # Check that this client's version matches the most recent available, runs just once per program execution (on initial module load). + # Check that this client's version matches the most recent available. This + # is intended to run just once per program execution, on initial module load. + # See the bottom of this file for the ultimate call to this method. @staticmethod def _version_check(): try: - latest_version = requests.get('https://pypi.org/pypi/delphi-epidata/json').json()['info']['version'] - if latest_version != __version__: - Epidata.log( - "Client version not up to date", - client_version=__version__, - latest_version=latest_version - ) + request = requests.get('https://pypi.org/pypi/delphi-epidata/json', timeout=5) + latest_version = request.json()['info']['version'] except Exception as e: Epidata.log("Error getting latest client version", exception=str(e)) + return - # Run this once on module load. Use dunder method for Python <= 3.9 compatibility - # https://stackoverflow.com/a/12718272 - _version_check.__func__() + if latest_version != __version__: + Epidata.log( + "Client version not up to date", + client_version=__version__, + latest_version=latest_version + ) # Helper function to cast values and/or ranges to strings @staticmethod @@ -708,3 +709,10 @@ async def async_make_calls(param_combos): future = asyncio.ensure_future(async_make_calls(param_list)) responses = loop.run_until_complete(future) return responses + + + +# This should only run once per program execution, on initial module load, +# as a result of how Python's module system works: +# https://docs.python.org/3/reference/import.html#the-module-cache +Epidata._version_check()