Skip to content

Commit 419f2d9

Browse files
committed
Add version info to user agent + log versions in log file
Partially fixes MerginMaps/qgis-plugin#150 The log should now contain lines like this: --- version: Python-client/0.5.2 Plugin/2020.5.0 QGIS/3.15.0-Master (Linux/Ubuntu)
1 parent 9cef2b9 commit 419f2d9

File tree

6 files changed

+32
-14
lines changed

6 files changed

+32
-14
lines changed

mergin/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
from .client import MerginClient
44
from .common import ClientError, LoginError
55
from .merginproject import MerginProject, InvalidProject
6+
from .version import __version__

mergin/client.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from .client_pull import pull_project_async, pull_project_wait, pull_project_finalize
1717
from .client_push import push_project_async, push_project_wait, push_project_finalize
1818
from .utils import DateTimeEncoder
19+
from .version import __version__
1920

2021

2122
this_dir = os.path.dirname(os.path.realpath(__file__))
@@ -43,7 +44,9 @@ def __init__(self, url=None, auth_token=None, login=None, password=None, plugin_
4344
self._auth_params = None
4445
self._auth_session = None
4546
self._user_info = None
46-
self.client_version = plugin_version if plugin_version is not None else "Python-client/--"
47+
self.client_version = "Python-client/" + __version__
48+
if plugin_version is not None: # this could be e.g. "Plugin/2020.1 QGIS/3.14"
49+
self.client_version += " " + plugin_version
4750
if auth_token:
4851
token_data = decode_token_data(auth_token)
4952
self._auth_session = {
@@ -89,6 +92,21 @@ def default_url():
8992
""" Returns URL of the public instance of Mergin """
9093
return 'https://public.cloudmergin.com'
9194

95+
def user_agent_info(self):
96+
""" Returns string as it is sent as User-Agent http header to the server """
97+
system_version = "Unknown"
98+
if platform.system() == "Linux":
99+
try:
100+
from pip._vendor import distro
101+
system_version = distro.linux_distribution()[0]
102+
except ModuleNotFoundError: # pip may not be installed...
103+
system_version = "Linux"
104+
elif platform.system() == "Windows":
105+
system_version = platform.win32_ver()[0]
106+
elif platform.system() == "Mac":
107+
system_version = platform.mac_ver()[0]
108+
return f"{self.client_version} ({platform.system()}/{system_version})"
109+
92110
def _check_token(f):
93111
def wrapper(self, *args):
94112
if (not self._auth_session or self._auth_session['expire'] < datetime.now(timezone.utc)) and self._auth_params:
@@ -108,18 +126,7 @@ def _do_request(self, request):
108126

109127
if self._auth_session:
110128
request.add_header("Authorization", self._auth_session["token"])
111-
system_version = "Unknown"
112-
if platform.system() == "Linux":
113-
try:
114-
from pip._vendor import distro
115-
system_version = distro.linux_distribution()[0]
116-
except ModuleNotFoundError: # pip may not be installed...
117-
system_version = "Linux"
118-
elif platform.system() == "Windows":
119-
system_version = platform.win32_ver()[0]
120-
elif platform.system() == "Mac":
121-
system_version = platform.mac_ver()[0]
122-
request.add_header("User-Agent", f"{self.client_version} ({platform.system()}/{system_version})")
129+
request.add_header("User-Agent", self.user_agent_info())
123130
try:
124131
return self.opener.open(request)
125132
except urllib.error.HTTPError as e:
@@ -212,6 +219,7 @@ def login(self, login, password):
212219
url = urllib.parse.urljoin(self.url, urllib.parse.quote("/v1/auth/login"))
213220
data = json.dumps(self._auth_params, cls=DateTimeEncoder).encode("utf-8")
214221
request = urllib.request.Request(url, data, {"Content-Type": "application/json"}, method="POST")
222+
request.add_header("User-Agent", self.user_agent_info())
215223
resp = self.opener.open(request)
216224
data = json.load(resp)
217225
session = data["session"]

mergin/client_pull.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ def download_project_async(mc, project_path, directory):
110110
os.makedirs(directory)
111111
mp = MerginProject(directory)
112112

113+
mp.log.info("--- version: " + mc.user_agent_info())
113114
mp.log.info(f"--- start download {project_path}")
114115

115116
try:
@@ -320,6 +321,7 @@ def pull_project_async(mc, directory):
320321
project_path = mp.metadata["name"]
321322
local_version = mp.metadata["version"]
322323

324+
mp.log.info("--- version: " + mc.user_agent_info())
323325
mp.log.info(f"--- start pull {project_path}")
324326

325327
server_info = mc.project_info(project_path, since=local_version)

mergin/client_push.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def push_project_async(mc, directory):
8181
project_path = mp.metadata["name"]
8282
local_version = mp.metadata["version"]
8383

84+
mp.log.info("--- version: " + mc.user_agent_info())
8485
mp.log.info(f"--- start push {project_path}")
8586

8687
server_info = mc.project_info(project_path)

mergin/version.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
# The version is also stored in ../setup.py
3+
__version__ = '0.5.2'
4+
5+
# There seems to be no single nice way to keep version info just in one place:
6+
# https://packaging.python.org/guides/single-sourcing-package-version/

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
setup(
77
name='mergin-client',
8-
version='0.5.2',
8+
version='0.5.2', # The version is also stored in mergin/version.py
99
url='https://github.com/lutraconsulting/mergin-py-client',
1010
license='MIT',
1111
author='Lutra Consulting Ltd.',

0 commit comments

Comments
 (0)