diff --git a/CHANGES.txt b/CHANGES.txt index fb8f86469..0e5970a70 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,9 +1,3 @@ -2.0b2 (TBD) - -Added: -- The Session class can now construct clients by name with its client method - (#858). - 2.0.0-beta.1 (2022-12-07) Changed: diff --git a/docs/get-started/upgrading.md b/docs/get-started/upgrading.md index a82fafa2d..7edf21f66 100644 --- a/docs/get-started/upgrading.md +++ b/docs/get-started/upgrading.md @@ -24,7 +24,7 @@ The best way of doing this is wrapping any code that invokes a client class in a ```python async with Session() as session: - client = session.client('orders') + client = OrdersClient(session) result = await client.create_order(order) # Process result ``` @@ -40,12 +40,12 @@ In V2, all `*Client` methods (for example, `DataClient().search`, `OrderClient() ```python import asyncio from datetime import datetime -from planet import Session +from planet import Session, DataClient from planet import data_filter as filters async def do_search(): async with Session() as session: - client = session.client('data') + client = DataClient(session) date_filter = filters.date_range_filter('acquired', gte=datetime.fromisoformat("2022-11-18"), lte=datetime.fromisoformat("2022-11-21")) cloud_filter = filters.range_filter('cloud_cover', lte=0.1) download_filter = filters.permission_filter() @@ -74,11 +74,11 @@ Is now ```python async with Session() as session: - items = [i async for i in session.client('data').search(["PSScene"], all_filters)] + items = [i async for i in planet.DataClient(session).search(["PSScene"], all_filters)] ``` ## Orders API -The Orders API capabilities in V1 were quite primitive, but those that did exist have been retained in much the same form; `ClientV1().create_order` becomes `OrdersClient(session).create_order`. (As with the `DataClient`, you must also use `async` and `Session` with `OrdersClient`.) +The Orders API capabilities in V1 were quite primitive, but those that did exist have been retained in much the same form; `ClientV1().create_order` becomes `OrderClient(session).create_order`. (As with the `DataClient`, you must also use `async` and `Session` with `OrderClient`.) Additionally, there is now also an order builder in `planet.order_request`, similar to the preexisting search filter builder. For more details on this, refer to the [Creating an Order](../../python/sdk-guide/#creating-an-order). diff --git a/docs/python/sdk-guide.md b/docs/python/sdk-guide.md index ba7a0e07e..4e1ac2c02 100644 --- a/docs/python/sdk-guide.md +++ b/docs/python/sdk-guide.md @@ -116,7 +116,7 @@ from planet import OrdersClient async def main(): async with Session() as sess: - client = sess.client('orders') + client = OrdersClient(sess) # perform operations here asyncio.run(main()) @@ -198,7 +198,7 @@ the context of a `Session` with the `OrdersClient`: ```python async def main(): async with Session() as sess: - cl = sess.client('orders') + cl = OrdersClient(sess) order = await cl.create_order(request) asyncio.run(main()) @@ -222,7 +222,7 @@ from planet import reporting async def create_wait_and_download(): async with Session() as sess: - cl = sess.client('orders') + cl = OrdersClient(sess) with reporting.StateBar(state='creating') as bar: # create order order = await cl.create_order(request) @@ -272,7 +272,7 @@ from planet import collect, OrdersClient, Session async def main(): async with Session() as sess: - client = sess.client('orders') + client = OrdersClient(sess) orders_list = collect(client.list_orders()) asyncio.run(main()) @@ -297,7 +297,7 @@ from planet import DataClient async def main(): async with Session() as sess: - client = sess.client('data') + client = DataClient(sess) # perform operations here asyncio.run(main()) @@ -344,7 +344,7 @@ the context of a `Session` with the `DataClient`: ```python async def main(): async with Session() as sess: - cl = sess.client('data') + cl = DataClient(sess) items = [i async for i in cl.search(['PSScene'], sfilter)] asyncio.run(main()) @@ -364,7 +364,7 @@ print command to report wait status. `download_asset` has reporting built in. ```python async def download_and_validate(): async with Session() as sess: - cl = sess.client('data') + cl = DataClient(sess) # get asset description item_type_id = 'PSScene' diff --git a/planet/__init__.py b/planet/__init__.py index fcaf68200..6f081a6e8 100644 --- a/planet/__init__.py +++ b/planet/__init__.py @@ -16,7 +16,7 @@ from . import order_request, reporting from .__version__ import __version__ # NOQA from .auth import Auth -from .clients import DataClient, OrdersClient, SubscriptionsClient # NOQA +from .clients import DataClient, OrdersClient # NOQA from .io import collect __all__ = [ @@ -24,7 +24,6 @@ 'collect', 'DataClient' 'OrdersClient', - 'SubscriptionsClient', 'order_request', 'reporting', 'Session', diff --git a/planet/clients/__init__.py b/planet/clients/__init__.py index 138726a7e..9fb246c9f 100644 --- a/planet/clients/__init__.py +++ b/planet/clients/__init__.py @@ -12,20 +12,10 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - from .data import DataClient from .orders import OrdersClient -from .subscriptions import SubscriptionsClient __all__ = [ 'DataClient', 'OrdersClient', - 'SubscriptionsClient', ] - -# Organize client classes by their module name to allow concise lookup. -_client_directory = { - 'data': DataClient, - 'orders': OrdersClient, - 'subscriptions': SubscriptionsClient -} diff --git a/planet/http.py b/planet/http.py index 0f649ea5e..97983c07d 100644 --- a/planet/http.py +++ b/planet/http.py @@ -22,9 +22,7 @@ import random import time from typing import AsyncGenerator, Optional - import httpx -from typing_extensions import Literal from .auth import Auth, AuthType from . import exceptions, models @@ -415,29 +413,6 @@ async def stream( finally: await response.aclose() - def client(self, - name: Literal['data', 'orders', 'subscriptions'], - base_url: Optional[str] = None) -> object: - """Get a client by its module name. - - Parameters: - name: one of 'data', 'orders', or 'subscriptions'. - - Returns: - A client instance. - - Raises: - ClientError when no such client can be had. - - """ - # To avoid circular dependency. - from planet.clients import _client_directory - - try: - return _client_directory[name](self, base_url=base_url) - except KeyError: - raise exceptions.ClientError("No such client.") - class AuthSession(BaseSession): """Synchronous connection to the Planet Auth service.""" diff --git a/setup.py b/setup.py index 85b94f932..125515461 100644 --- a/setup.py +++ b/setup.py @@ -30,7 +30,6 @@ 'jsonschema', 'pyjwt>=2.1', 'tqdm>=4.56', - 'typing-extensions', ] test_requires = ['pytest', 'pytest-asyncio==0.16', 'pytest-cov', 'respx==0.19'] diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py deleted file mode 100644 index bf5baca2c..000000000 --- a/tests/unit/test_session.py +++ /dev/null @@ -1,23 +0,0 @@ -"""Session module tests.""" - -import pytest - -from planet import DataClient, OrdersClient, SubscriptionsClient, Session -from planet.exceptions import ClientError - - -@pytest.mark.parametrize("client_name,client_class", - [('data', DataClient), ('orders', OrdersClient), - ('subscriptions', SubscriptionsClient)]) -def test_session_get_client(client_name, client_class): - """Get a client from a session.""" - session = Session() - client = session.client(client_name) - assert isinstance(client, client_class) - - -def test_session_get_client_error(): - """Get an exception when no such client exists.""" - session = Session() - with pytest.raises(ClientError): - _ = session.client('bogus')