Skip to content

Commit ad34bb5

Browse files
authored
Merge pull request #982 from Sage-Bionetworks/develop_fix_my_messup
Revert "Merge branch 'linglp/synpy-967-linglp' to develop" I made a mistake when I was pushing to origin - I meant to push to a new branch, but it pushed the merge commit directly into origin/develop branch
2 parents 432feca + 52ac983 commit ad34bb5

4 files changed

Lines changed: 28 additions & 7 deletions

File tree

synapseclient/client.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@
9393
id_of,
9494
get_properties,
9595
MB,
96+
memoize,
9697
is_json,
9798
extract_synapse_id_from_query,
9899
find_data_file_handle,
@@ -497,7 +498,7 @@ def login(
497498
cached_sessions.set_most_recent_user(self.credentials.username)
498499

499500
if not silent:
500-
profile = self.getUserProfile()
501+
profile = self.getUserProfile(refresh=True)
501502
# TODO-PY3: in Python2, do we need to ensure that this is encoded in utf-8
502503
self.logger.info(
503504
"Welcome, %s!\n"
@@ -611,23 +612,26 @@ def invalidateAPIKey(self):
611612
if self._is_logged_in():
612613
self.restDELETE("/secretKey", endpoint=self.authEndpoint)
613614

614-
@functools.lru_cache()
615+
@memoize
615616
def getUserProfile(
616617
self,
617618
id: Union[str, int, UserProfile, TeamMember] = None,
618619
sessionToken: str = None,
620+
refresh: bool = False,
619621
) -> UserProfile:
620622
"""
621623
Get the details about a Synapse user.
622624
Retrieves information on the current user if 'id' is omitted.
623625
:param id: The 'userId' (aka 'ownerId') of a user or the userName
624626
:param sessionToken: The session token to use to find the user profile
627+
:param refresh: If set to True will always fetch the data from Synape otherwise will use cached information
625628
:returns: The user profile for the user of interest.
626629
627630
Example::
628631
my_profile = syn.getUserProfile()
629632
freds_profile = syn.getUserProfile('fredcommo')
630633
"""
634+
631635
try:
632636
# if id is unset or a userID, this will succeed
633637
id = "" if id is None else int(id)
@@ -648,6 +652,7 @@ def getUserProfile(
648652
else: # no break
649653
raise ValueError('Can\'t find user "%s": ' % id)
650654
uri = "/userProfile/%s" % id
655+
651656
return UserProfile(
652657
**self.restGET(
653658
uri, headers={"sessionToken": sessionToken} if sessionToken else None
@@ -2644,7 +2649,7 @@ def _download_from_URL(
26442649
else:
26452650
mode = "wb"
26462651
previouslyTransferred = 0
2647-
sig = hashlib.new("md5", usedforsecurity=False)
2652+
sig = hashlib.md5()
26482653

26492654
try:
26502655
with open(temp_destination, mode) as fd:
@@ -4766,6 +4771,7 @@ def _generate_headers(self, headers=None):
47664771

47674772
if headers is None:
47684773
headers = dict(self.default_headers)
4774+
47694775
headers.update(synapseclient.USER_AGENT)
47704776

47714777
return headers
@@ -4801,7 +4807,6 @@ def _rest_call(
48014807
uri, headers = self._build_uri_and_headers(
48024808
uri, endpoint=endpoint, headers=headers
48034809
)
4804-
48054810
retryPolicy = self._build_retry_policy(retryPolicy)
48064811
requests_session = requests_session or self._requests_session
48074812

@@ -4818,7 +4823,6 @@ def _rest_call(
48184823
verbose=self.debug,
48194824
**retryPolicy,
48204825
)
4821-
48224826
self._handle_synapse_http_error(response)
48234827
return response
48244828

synapseclient/core/utils.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import collections.abc
77
import datetime
88
import errno
9+
import functools
910
import hashlib
1011
import importlib
1112
import inspect
@@ -45,7 +46,7 @@ def md5_for_file(filename, block_size=2 * MB, callback=None):
4546
:returns: The MD5
4647
"""
4748

48-
md5 = hashlib.new("md5", usedforsecurity=False)
49+
md5 = hashlib.md5()
4950
with open(filename, "rb") as f:
5051
while True:
5152
if callback:
@@ -638,6 +639,21 @@ def extract_synapse_id_from_query(query):
638639
raise ValueError('Couldn\'t extract synapse ID from query: "%s"' % query)
639640

640641

642+
# Derived from https://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
643+
def memoize(obj):
644+
cache = obj._memoize_cache = {}
645+
646+
@functools.wraps(obj)
647+
def memoizer(*args, **kwargs):
648+
refresh = kwargs.pop("refresh", False)
649+
key = str(args) + str(kwargs)
650+
if refresh or key not in cache:
651+
cache[key] = obj(*args, **kwargs)
652+
return cache[key]
653+
654+
return memoizer
655+
656+
641657
def printTransferProgress(
642658
transferred,
643659
toBeTransferred,

tests/unit/synapseclient/core/unit_test_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,7 @@ def test_md5_for_file(mock_hashlib):
483483
file_name = "/home/foo/bar/test.txt"
484484
mock_callback = Mock()
485485
mock_md5 = Mock()
486-
mock_hashlib.new.return_value = mock_md5
486+
mock_hashlib.md5.return_value = mock_md5
487487
with patch.object(utils, "open", mock_open(), create=True) as mocked_open:
488488
mocked_open.return_value.read.side_effect = ["data1", "data2", None]
489489
utils.md5_for_file(file_name, callback=mock_callback)

tests/unit/synapseclient/unit_test_client.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def test_login__silentIsFalse(self):
141141
# method under test
142142
self.syn.login(silent=False, **self.login_args)
143143

144+
mocked_get_user_profile.assert_called_once_with(refresh=True)
144145
mocked_logger.info.assert_called_once()
145146

146147
def test_login__rememberMeIsTrue(self, mocker):

0 commit comments

Comments
 (0)