From 535c68b41544c84eab3926ba153c0b700c495316 Mon Sep 17 00:00:00 2001
From: Janis Streib <janis.streib@kit.edu>
Date: Mon, 17 Feb 2025 12:14:41 +0100
Subject: [PATCH] ADD: python: update check

---
 net_api_generator/generator.py | 24 +++++++++++++++++++++---
 net_api_generator/loader.py    |  2 +-
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/net_api_generator/generator.py b/net_api_generator/generator.py
index 26f8b4e..8ecb5d3 100644
--- a/net_api_generator/generator.py
+++ b/net_api_generator/generator.py
@@ -106,9 +106,12 @@ def python(strict, output_dir):
     with open(os.path.join(output_dir, '__init__.py'), 'w+') as initfile:
         initfile.write(f"""### AUTOGENERATED
 import requests
+import os
 from typing import Union
 from pprint import pformat
+import logging
 
+logger = logging.getLogger(__name__)
 
 # ExeccutionError is derived from ValueError to keep backward compatibility.
 class ExecutionError(ValueError):
@@ -138,13 +141,28 @@ class APIEndpoint(object):
 
 
 class APISession(object):
-\tdef __init__(self, endpoint: APIEndpoint):
+\tdef __init__(self, endpoint: APIEndpoint, protocol: str='https', update_check: bool='NETDB_CLIENT_DISABLE_UPDATE_CHECK' not in os.environ):
+\t\tself._build_version = '{loader.version_detail['numeric']}'
 \t\tself.session = requests.session()
 \t\tself.session.headers.update({{'Authorization': 'Bearer ' + endpoint.token}})
+\t\tself.api_root = f'{{protocol}}://{{endpoint.base_url}}'
 \t\tif 'www-net' in endpoint.base_url:
-\t\t\tself.base_url = f'https://{{endpoint.base_url}}/api/{{endpoint.version}}'
+\t\t\tself.base_url = f'{{self.api_root}}/api/{{endpoint.version}}'
 \t\telse:
-\t\t\tself.base_url = f'https://{{endpoint.base_url}}/{{endpoint.version}}'
+\t\t\tself.base_url = f'{{self.api_root}}/{{endpoint.version}}'
+\t\ttry:
+\t\t\tif update_check:
+\t\t\t\tversions = requests.get(self.api_root).json()[0]
+\t\t\t\tcur_v = None
+\t\t\t\tref = [int(r) for r in endpoint.version.split('.')]
+\t\t\t\tfor v in versions:
+\t\t\t\t\tif v['major'] == ref[0] and v['minor'] == ref[1]:
+\t\t\t\t\t\tif self._build_version != v['numeric']:
+\t\t\t\t\t\t\tlogger.warning(f"This library was built for NETDB API version {{self._build_version}}, but API reports {{v['numeric']}}. Please consider updating. "
+\t\t\t\t\t\t                "(You can disable this message by setting NETDB_CLIENT_DISABLE_UPDATE_CHECK in your environment or passing update_check=False to APISession)")
+\t\t\t\t\t\tbreak
+\t\texcept:
+\t\t\tpass
 
 \tdef execute_ta(self, ta: list, dry_mode: bool = False, dict_mode: bool = False, su_login_name: str = None) -> Union[list, dict]:
 \t\tres = self.session.post(f'{{self.base_url}}/wapi/transaction/execute?dry_mode={{str(dry_mode).lower()}}&dict_mode={{str(dict_mode).lower()}}{{"" if su_login_name is None else "&su_login_name="+su_login_name}}', json=ta)
diff --git a/net_api_generator/loader.py b/net_api_generator/loader.py
index d284739..4435958 100644
--- a/net_api_generator/loader.py
+++ b/net_api_generator/loader.py
@@ -13,7 +13,7 @@ class Loader(object):
     api_host: str = 'api.netdb.scc.kit.edu'
     doku_host: str = 'doku.netdb.scc.kit.edu'
     api_version: str = '4.0'
-    version_detail: str = None
+    version_detail: dict = None
     base_dir: str = ''
     _auth: str = None
     sess: requests.Session = requests.Session()
-- 
GitLab