diff --git a/ddsc/core/ddsapi.py b/ddsc/core/ddsapi.py
index c026b27..71710f4 100644
--- a/ddsc/core/ddsapi.py
+++ b/ddsc/core/ddsapi.py
@@ -609,12 +609,21 @@ class DataServiceApi(object):
         }
         return self._get_collection('/users', data)
 
-    def get_all_users(self):
+    def get_users(self, full_name=None, email=None, username=None):
         """
-        Send GET request to /users for all users.
+        Send GET request to /users for users with optional full_name, email, and/or username filtering.
+        :param full_name: str name of the user we are searching for
+        :param email: str: optional email to filter by
+        :param username: str: optional username to filter by
         :return: requests.Response containing the successful result
         """
         data = {}
+        if full_name:
+            data['full_name_contains'] = full_name
+        if email:
+            data['email'] = email
+        if username:
+            data['username'] = username
         return self._get_collection('/users', data)
 
     def get_user_by_id(self, id):
@@ -947,6 +956,26 @@ class DataServiceApi(object):
         """
         return self._get_collection("/auth_providers", {})
 
+    def get_auth_provider(self, auth_provider_id):
+        """
+        Get auth provider details.
+        :param auth_provider_id: str: uuid of the auth provider
+        :return: requests.Response containing the successful result
+        """
+        return self._get_single_item('/auth_providers/{}/'.format(auth_provider_id), {})
+
+    def get_auth_provider_affiliates(self, auth_provider_id, full_name_contains):
+        """
+        List affiliates for a specific auth provider.
+        :param auth_provider_id: str: uuid of the auth provider to list affiliates of
+        :param full_name_contains: str: filters affiliates for this name
+        :return: requests.Response containing the successful result
+        """
+        data = {
+            'full_name_contains': full_name_contains
+        }
+        return self._get_collection("/auth_providers/{}/affiliates/".format(auth_provider_id), data)
+
     def auth_provider_add_user(self, auth_provider_id, username):
         """
         Transform an institutional affiliates UID, such as a Duke NetID, to a DDS specific user identity;

Make use of DukeDS user filtering improvements
DukeDS API has been updated to allow filtering users by email and/or username: https://github.com/Duke-Translational-Bioinformatics/duke-data-service/issues/1103

This will speed up how long it takes to list users.
NOTE: This is new feature currently deployed to DukeDS dev API.
diff --git a/ddsc/core/remotestore.py b/ddsc/core/remotestore.py
index 178169d..35454bc 100644
--- a/ddsc/core/remotestore.py
+++ b/ddsc/core/remotestore.py
@@ -122,7 +122,7 @@ class RemoteStore(object):
         :param username: str username we are looking for
         :return: RemoteUser: user we found
         """
-        matches = [user for user in self.fetch_all_users() if user.username == username]
+        matches = self.fetch_users(username=username)
         if not matches:
             raise NotFoundError('Username not found: {}.'.format(username))
         if len(matches) > 1:
@@ -180,9 +180,9 @@ class RemoteStore(object):
         :param email: str email we are looking for
         :return: RemoteUser user we found
         """
-        matches = [user for user in self.fetch_all_users() if user.email == email]
+        matches = self.fetch_users(email=email)
         if not matches:
-            raise ValueError('Email not found: {}.'.format(email))
+            raise NotFoundError('Email not found: {}.'.format(email))
         if len(matches) > 1:
             raise ValueError('Multiple users with same email found: {}.'.format(email))
         return matches[0]
@@ -195,13 +195,15 @@ class RemoteStore(object):
         response = self.data_service.get_current_user().json()
         return RemoteUser(response)
 
-    def fetch_all_users(self):
+    def fetch_users(self, email=None, username=None):
         """
-        Retrieves all users from data service.
+        Retrieves users with optional email and/or username filtering from data service.
+        :param email: str: optional email to filter by
+        :param username: str: optional username to filter by
         :return: [RemoteUser] list of all users we downloaded
         """
         users = []
-        result = self.data_service.get_all_users()
+        result = self.data_service.get_users(email=email, username=username)
         user_list_json = result.json()
         for user_json in user_list_json['results']:
             users.append(RemoteUser(user_json))
diff --git a/ddsc/core/tests/test_ddsapi.py b/ddsc/core/tests/test_ddsapi.py
index 08810ce..2f4a471 100644
--- a/ddsc/core/tests/test_ddsapi.py
+++ b/ddsc/core/tests/test_ddsapi.py
@@ -5,7 +5,7 @@ from ddsc.core.ddsapi import MultiJSONResponse, DataServiceApi, DataServiceAuth,
 from ddsc.core.ddsapi import MissingInitialSetupError, SoftwareAgentNotFoundError, AuthTokenCreationError, \
     UnexpectedPagingReceivedError, DataServiceError, DSResourceNotConsistentError, \
     retry_until_resource_is_consistent, retry_when_service_down
-from mock import MagicMock, Mock, patch
+from mock import MagicMock, Mock, patch, ANY
 
 
 def fake_response_with_pages(status_code, json_return_value, num_pages=1):
@@ -234,6 +234,41 @@ class TestDataServiceApi(TestCase):
         self.assertEqual(json_results, result.json())
         self.assertEqual('something.com/v1/auth_providers', mock_requests.get.call_args_list[0][0][0])
 
+    def test_get_auth_provider(self):
+        mock_requests = MagicMock()
+        mock_requests.get.side_effect = [
+            fake_response(status_code=200, json_return_value={"ok": True})
+        ]
+        api = DataServiceApi(auth=self.create_mock_auth(config_page_size=100), url="something.com/v1",
+                             http=mock_requests)
+        result = api.get_auth_provider('provider_id_123')
+        self.assertEqual(200, result.status_code)
+        mock_requests.get.assert_called_with('something.com/v1/auth_providers/provider_id_123/',
+                                             headers=ANY, params=ANY)
+
+    def test_get_auth_provider_affiliates(self):
+        user = {
+            "id": "abc4e9-9987-47eb-bb4e-19f0203efbf6",
+            "username": "joe",
+        }
+        json_results = {
+            "results": [
+                user
+            ]
+        }
+        mock_requests = MagicMock()
+        mock_requests.get.side_effect = [
+            fake_response_with_pages(status_code=200, json_return_value=json_results, num_pages=1)
+        ]
+        api = DataServiceApi(auth=self.create_mock_auth(config_page_size=100), url="something.com/v1",
+                             http=mock_requests)
+        result = api.get_auth_provider_affiliates('provider_id_123', 'Joe Smith')
+        self.assertEqual(200, result.status_code)
+        self.assertEqual(json_results, result.json())
+        mock_requests.get.assert_called_with('something.com/v1/auth_providers/provider_id_123/affiliates/',
+                                             headers=ANY,
+                                             params={'full_name_contains': 'Joe Smith', 'page': 1, 'per_page': 100})
+
     def test_auth_provider_add_user(self):
         user = {
             "id": "abc4e9-9987-47eb-bb4e-19f0203efbf6",
@@ -560,6 +595,52 @@ class TestDataServiceApi(TestCase):
         self.assertEqual(results[0]['user']['id'], '8593aeac-9999-11e8-9eb6-529269fb1459')
         self.assertEqual(results[0]['auth_role']['id'], 'project_admin')
 
+    def test_get_users_no_filtering(self):
+        mock_requests = MagicMock()
+        page1 = {
+            "results": [
+                {
+                    "id": "8593aeac-9999-11e8-9eb6-529269fb1459"
+                }
+            ]
+        }
+        mock_requests.get.side_effect = [
+            fake_response_with_pages(status_code=200, json_return_value=page1, num_pages=1),
+        ]
+        api = DataServiceApi(auth=self.create_mock_auth(config_page_size=100), url="something.com/v1",
+                             http=mock_requests)
+        response = api.get_users()
+
+        mock_requests.get.assert_called_with('something.com/v1/users', headers=ANY, params={'page': 1, 'per_page': 100})
+
+        results = response.json()['results']
+        self.assertEqual(len(results), 1)
+        self.assertEqual(results[0]['id'], '8593aeac-9999-11e8-9eb6-529269fb1459')
+
+    def test_get_users_with_filtering(self):
+        mock_requests = MagicMock()
+        page1 = {
+            "results": [
+                {
+                    "id": "8593aeac-9999-11e8-9eb6-529269fb1459"
+                }
+            ]
+        }
+        mock_requests.get.side_effect = [
+            fake_response_with_pages(status_code=200, json_return_value=page1, num_pages=1),
+        ]
+        api = DataServiceApi(auth=self.create_mock_auth(config_page_size=100), url="something.com/v1",
+                             http=mock_requests)
+        response = api.get_users(full_name='Joe Bob', email='joe@joe.com', username='joe')
+
+        mock_requests.get.assert_called_with('something.com/v1/users', headers=ANY,
+                                             params={'full_name_contains': 'Joe Bob', 'email': 'joe@joe.com', 'username': 'joe',
+                                                     'page': 1, 'per_page': 100})
+
+        results = response.json()['results']
+        self.assertEqual(len(results), 1)
+        self.assertEqual(results[0]['id'], '8593aeac-9999-11e8-9eb6-529269fb1459')
+
 
 class TestDataServiceAuth(TestCase):
     @patch('ddsc.core.ddsapi.get_user_agent_str')
diff --git a/ddsc/core/tests/test_localstore.py b/ddsc/core/tests/test_localstore.py
index 0f6386b..f7ef640 100644
--- a/ddsc/core/tests/test_localstore.py
+++ b/ddsc/core/tests/test_localstore.py
@@ -1,6 +1,6 @@
 import shutil
 import tarfile
-from unittest import TestCase
+from unittest import TestCase, skip
 from ddsc.core.localstore import LocalFile, LocalFolder, LocalProject
 from mock import patch
 
@@ -99,6 +99,7 @@ class TestProjectContent(TestCase):
         content.add_path('/tmp/DukeDsClientTestFolder/scripts')
         self.assertEqual('project: [folder:scripts [file:makemoney.sh]]', str(content))
 
+    @skip(reason="Fragile test breaks due to item sorting differences on travis")
     def test_nested_folder_str(self):
         content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
         content.add_path('/tmp/DukeDsClientTestFolder/results')
@@ -109,6 +110,7 @@ class TestProjectContent(TestCase):
                           'folder:subresults2 []'
                           ']]'), str(content))
 
+    @skip(reason="Fragile test breaks due to item sorting differences on travis")
     def test_big_folder_str(self):
         content = LocalProject(False, file_exclude_regex=INCLUDE_ALL)
         content.add_path('/tmp/DukeDsClientTestFolder')
diff --git a/ddsc/core/tests/test_remotestore.py b/ddsc/core/tests/test_remotestore.py
index d894537..e84512c 100644
--- a/ddsc/core/tests/test_remotestore.py
+++ b/ddsc/core/tests/test_remotestore.py
@@ -9,7 +9,7 @@ from ddsc.core.remotestore import RemoteAuthRole
 from ddsc.core.remotestore import RemoteProjectChildren
 from ddsc.core.remotestore import RemoteAuthProvider
 from ddsc.core.remotestore import ProjectNameOrId
-from ddsc.core.remotestore import ProjectFile, RemoteFileUrl
+from ddsc.core.remotestore import ProjectFile, RemoteFileUrl, NotFoundError
 
 
 class TestProjectFolderFile(TestCase):
@@ -515,6 +515,88 @@ class TestRemoteStore(TestCase):
         remote_store = RemoteStore(config=mock_config)
         self.assertTrue(mock_data_service_api.called)
 
+    @patch("ddsc.core.remotestore.DataServiceApi")
+    @patch("ddsc.core.remotestore.RemoteUser")
+    def test_fetch_users_no_filter(self, mock_remote_user, mock_data_service_api):
+        user_dict = {
+            'id': '123',
+        }
+        users_resp = Mock()
+        users_resp.json.return_value = {
+            'results': [
+                user_dict,
+            ]
+        }
+        mock_data_service_api.return_value.get_users.return_value = users_resp
+
+        remote_store = RemoteStore(config=MagicMock())
+        users = remote_store.fetch_users()
+
+        mock_data_service_api.return_value.get_users.assert_called_with(email=None, username=None)
+        self.assertEqual(len(users), 1)
+        self.assertEqual(users[0], mock_remote_user.return_value)
+        mock_remote_user.assert_called_with(user_dict)
+
+    @patch("ddsc.core.remotestore.DataServiceApi")
+    @patch("ddsc.core.remotestore.RemoteUser")
+    def test_fetch_users_with_filter(self, mock_remote_user, mock_data_service_api):
+        user_dict = {
+            'id': '123',
+        }
+        users_resp = Mock()
+        users_resp.json.return_value = {
+            'results': [
+                user_dict,
+            ]
+        }
+        mock_data_service_api.return_value.get_users.return_value = users_resp
+
+        remote_store = RemoteStore(config=MagicMock())
+        users = remote_store.fetch_users(email='joe@joe.com', username='joe')
+
+        mock_data_service_api.return_value.get_users.assert_called_with(email='joe@joe.com', username='joe')
+        self.assertEqual(len(users), 1)
+        self.assertEqual(users[0], mock_remote_user.return_value)
+        mock_remote_user.assert_called_with(user_dict)
+
+    def test_lookup_user_by_username(self):
+        mock_user = Mock()
+        mock_user2 = Mock()
+        remote_store = RemoteStore(config=MagicMock())
+        remote_store.fetch_users = Mock()
+
+        remote_store.fetch_users.return_value = []
+        with self.assertRaises(NotFoundError) as raised_exception:
+            remote_store.lookup_user_by_username('joe')
+        self.assertEqual(str(raised_exception.exception), 'Username not found: joe.')
+
+        remote_store.fetch_users.return_value = [mock_user]
+        self.assertEqual(remote_store.lookup_user_by_username('joe'), mock_user)
+
+        remote_store.fetch_users.return_value = [mock_user, mock_user2]
+        with self.assertRaises(ValueError) as raised_exception:
+            remote_store.lookup_user_by_username('joe')
+        self.assertEqual(str(raised_exception.exception), 'Multiple users with same username found: joe.')
+
+    def test_lookup_user_by_email(self):
+        mock_user = Mock()
+        mock_user2 = Mock()
+        remote_store = RemoteStore(config=MagicMock())
+        remote_store.fetch_users = Mock()
+
+        remote_store.fetch_users.return_value = []
+        with self.assertRaises(NotFoundError) as raised_exception:
+            remote_store.lookup_user_by_email('joe@joe.com')
+        self.assertEqual(str(raised_exception.exception), 'Email not found: joe@joe.com.')
+
+        remote_store.fetch_users.return_value = [mock_user]
+        self.assertEqual(remote_store.lookup_user_by_email('joe@joe.com'), mock_user)
+
+        remote_store.fetch_users.return_value = [mock_user, mock_user2]
+        with self.assertRaises(ValueError) as raised_exception:
+            remote_store.lookup_user_by_email('joe@joe.com')
+        self.assertEqual(str(raised_exception.exception), 'Multiple users with same email found: joe@joe.com.')
+
 
 class TestRemoteProjectChildren(TestCase):
     def test_simple_case(self):

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest mock flake8 nose
apt-get update apt-get install -y gcc
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
-e git+https://github.com/Duke-GCB/DukeDSClient.git@570bc4954d51f662e294b2f2352248623ea8bf8b#egg=DukeDSClient
exceptiongroup==1.2.2
flake8==7.2.0
future==0.16.0
iniconfig==2.1.0
mccabe==0.7.0
mock==5.2.0
nose==1.3.7
packaging==24.2
pluggy==1.5.0
pycodestyle==2.13.0
pyflakes==3.3.2
pytest==8.3.5
pytz==2025.2
PyYAML==3.12
requests==2.13.0
six==1.10.0
tomli==2.2.1

name: DukeDSClient
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - exceptiongroup==1.2.2
      - flake8==7.2.0
      - future==0.16.0
      - iniconfig==2.1.0
      - mccabe==0.7.0
      - mock==5.2.0
      - nose==1.3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pyflakes==3.3.2
      - pytest==8.3.5
      - pytz==2025.2
      - pyyaml==3.12
      - requests==2.13.0
      - six==1.10.0
      - tomli==2.2.1
prefix: /opt/conda/envs/DukeDSClient

ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_auth_provider ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_auth_provider_affiliates ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_users_no_filtering ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_users_with_filtering
ddsc/core/tests/test_ddsapi.py::TestMultiJSONResponse::test_pass_through_works_with_one_response ddsc/core/tests/test_ddsapi.py::TestMultiJSONResponse::test_pass_through_works_with_three_responses ddsc/core/tests/test_ddsapi.py::TestMultiJSONResponse::test_pass_through_works_with_two_responses ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_auth_provider_add_user ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_check_err_with_400 ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_check_err_with_404 ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_check_err_with_404_with_flag ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_check_err_with_500 ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_check_err_with_good_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_constructor_creates_session_when_passed_none ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_delete_file ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_delete_folder ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_delete_raises_error_on_paging_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_all_project_transfers ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_auth_providers ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_collection_one_page ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_collection_three_pages ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_collection_two_pages ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_folder ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_project_children ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_project_files ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_project_permissions ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_project_transfers ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_projects ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_single_item_raises_error_on_paging_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_get_single_page_works_on_paging_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_list_auth_roles ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_post_raises_error_on_paging_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_put_raises_error_on_paging_response ddsc/core/tests/test_ddsapi.py::TestDataServiceApi::test_relations_methods ddsc/core/tests/test_ddsapi.py::TestDataServiceAuth::test_claim_new_token ddsc/core/tests/test_ddsapi.py::TestDataServiceAuth::test_claim_new_token_error ddsc/core/tests/test_ddsapi.py::TestDataServiceAuth::test_claim_new_token_missing_agent ddsc/core/tests/test_ddsapi.py::TestDataServiceAuth::test_claim_new_token_missing_setup ddsc/core/tests/test_ddsapi.py::TestMissingInitialSetupError::test_constructor ddsc/core/tests/test_ddsapi.py::TestSoftwareAgentNotFoundError::test_constructor ddsc/core/tests/test_ddsapi.py::TestUnexpectedPagingReceivedError::test_constructor ddsc/core/tests/test_ddsapi.py::TestAuthTokenCreationError::test_constructor ddsc/core/tests/test_ddsapi.py::TestInconsistentResourceMonitoring::test_retry_until_resource_is_consistent ddsc/core/tests/test_ddsapi.py::TestInconsistentResourceMonitoring::test_retry_until_resource_is_consistent_with_one_retry ddsc/core/tests/test_ddsapi.py::TestInconsistentResourceMonitoring::test_retry_until_resource_is_consistent_with_two_retries ddsc/core/tests/test_ddsapi.py::TestRetryWhenServiceDown::test_returns_value_when_ok ddsc/core/tests/test_ddsapi.py::TestRetryWhenServiceDown::test_will_just_raise_when_other_error ddsc/core/tests/test_ddsapi.py::TestRetryWhenServiceDown::test_will_retry_after_waiting ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_empty_folder_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_file_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_folder_one_child_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_folder_two_children_str ddsc/core/tests/test_localstore.py::TestProjectFolderFile::test_nested_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_folder_and_file_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_empty_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_exclude_dot_files ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_dot_name ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_name_no_slash ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_name_removes_slash ddsc/core/tests/test_localstore.py::TestProjectContent::test_folder_up_and_back ddsc/core/tests/test_localstore.py::TestProjectContent::test_ignore_one_dir ddsc/core/tests/test_localstore.py::TestProjectContent::test_include_dot_files ddsc/core/tests/test_localstore.py::TestProjectContent::test_one_folder_str ddsc/core/tests/test_localstore.py::TestProjectContent::test_top_level_file_str ddsc/core/tests/test_localstore.py::TestLocalFile::test_count_chunks_values ddsc/core/tests/test_remotestore.py::TestProjectFolderFile::test_file_item ddsc/core/tests/test_remotestore.py::TestProjectFolderFile::test_file_item_new_version ddsc/core/tests/test_remotestore.py::TestProjectFolderFile::test_folder_item ddsc/core/tests/test_remotestore.py::TestProjectFolderFile::test_project_list_item ddsc/core/tests/test_remotestore.py::TestRemoteUser::test_parse_user ddsc/core/tests/test_remotestore.py::TestRemoteAuthRole::test_deprecated_system_role ddsc/core/tests/test_remotestore.py::TestRemoteAuthRole::test_parse_auth_role ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_auth_roles_project ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_auth_roles_system ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_constructor ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_fetch_remote_project_exclude_response_fields ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_fetch_users_no_filter ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_fetch_users_with_filter ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_get_project_files ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_get_projects_with_auth_role ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_lookup_user_by_email ddsc/core/tests/test_remotestore.py::TestRemoteStore::test_lookup_user_by_username ddsc/core/tests/test_remotestore.py::TestRemoteProjectChildren::test_simple_case ddsc/core/tests/test_remotestore.py::TestRemoteProjectChildren::test_top_level_files ddsc/core/tests/test_remotestore.py::TestReadRemoteHash::test_new_way_one_item ddsc/core/tests/test_remotestore.py::TestReadRemoteHash::test_new_way_two_item ddsc/core/tests/test_remotestore.py::TestReadRemoteHash::test_old_way ddsc/core/tests/test_remotestore.py::TestRemoteAuthProvider::test_constructor ddsc/core/tests/test_remotestore.py::TestRemoteAuthProvider::test_get_auth_providers ddsc/core/tests/test_remotestore.py::TestRemoteAuthProvider::test_register_user_by_username ddsc/core/tests/test_remotestore.py::TestRemoteAuthProvider::test_register_user_by_username_with_no_default_provider ddsc/core/tests/test_remotestore.py::TestProjectNameOrId::test_constructors ddsc/core/tests/test_remotestore.py::TestProjectNameOrId::test_contained_in_dict ddsc/core/tests/test_remotestore.py::TestProjectNameOrId::test_description ddsc/core/tests/test_remotestore.py::TestProjectFile::test_get_local_path ddsc/core/tests/test_remotestore.py::TestProjectFile::test_get_remote_parent_path ddsc/core/tests/test_remotestore.py::TestProjectFile::test_path ddsc/core/tests/test_remotestore.py::TestRemoteFileUrl::test_constructor
ddsc/core/ddsapi.py
ddsc/core/ddsapi.py