-
Notifications
You must be signed in to change notification settings - Fork 98
Fix errors reported by mypy #490
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 6 commits
3b1e53f
2f6ec47
2efe536
2e81249
278ecd7
fa4a9b1
0d187df
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -30,12 +30,14 @@ | |
| BASE_URL = f'{PLANET_BASE_URL}/v0/auth' | ||
| ENV_API_KEY = 'PL_API_KEY' | ||
|
|
||
| AuthType = httpx.Auth | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Resolves |
||
|
|
||
|
|
||
| class Auth(metaclass=abc.ABCMeta): | ||
| '''Handle authentication information for use with Planet APIs.''' | ||
|
|
||
| @staticmethod | ||
| def from_key(key: str) -> Auth: | ||
| def from_key(key: str) -> AuthType: | ||
| '''Obtain authentication from api key. | ||
|
|
||
| Parameters: | ||
|
|
@@ -46,7 +48,7 @@ def from_key(key: str) -> Auth: | |
| return auth | ||
|
|
||
| @staticmethod | ||
| def from_file(filename: str = None) -> Auth: | ||
| def from_file(filename: str = None) -> AuthType: | ||
| '''Create authentication from secret file. | ||
|
|
||
| The secret file is named `.planet.json` and is stored in the user | ||
|
|
@@ -71,7 +73,7 @@ def from_file(filename: str = None) -> Auth: | |
| return auth | ||
|
|
||
| @staticmethod | ||
| def from_env(variable_name: str = None) -> Auth: | ||
| def from_env(variable_name: str = None) -> AuthType: | ||
| '''Create authentication from environment variable. | ||
|
|
||
| Reads the `PL_API_KEY` environment variable | ||
|
|
@@ -80,7 +82,7 @@ def from_env(variable_name: str = None) -> Auth: | |
| variable_name: Alternate environment variable. | ||
| ''' | ||
| variable_name = variable_name or ENV_API_KEY | ||
| api_key = os.getenv(variable_name) | ||
| api_key = os.getenv(variable_name, '') | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Resolves The APIKeyAuth constructor does not take None as an argument ( There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a nice catch |
||
| try: | ||
| auth = APIKeyAuth(api_key) | ||
| LOGGER.debug(f'Auth set from environment variable {variable_name}') | ||
|
|
@@ -91,7 +93,9 @@ def from_env(variable_name: str = None) -> Auth: | |
| return auth | ||
|
|
||
| @staticmethod | ||
| def from_login(email: str, password: str, base_url: str = None) -> Auth: | ||
| def from_login(email: str, | ||
| password: str, | ||
| base_url: str = None) -> AuthType: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Carried over formatting. |
||
| '''Create authentication from login email and password. | ||
|
|
||
| Note: To keep your password secure, the use of `getpass` is | ||
|
|
@@ -113,14 +117,18 @@ def from_login(email: str, password: str, base_url: str = None) -> Auth: | |
|
|
||
| @classmethod | ||
| @abc.abstractmethod | ||
| def from_dict(cls, data: dict) -> Auth: | ||
| def from_dict(cls, data: dict) -> AuthType: | ||
| pass | ||
|
|
||
| @property | ||
| @abc.abstractmethod | ||
| def value(self): | ||
| pass | ||
|
|
||
| @abc.abstractmethod | ||
| def to_dict(self) -> dict: | ||
| pass | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Resolves |
||
|
|
||
| def write(self, filename: str = None): | ||
| '''Write authentication information. | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,6 +15,6 @@ | |
| from .orders import OrdersClient | ||
|
|
||
| __all__ = [ | ||
| DataClient, | ||
| OrdersClient, | ||
| 'DataClient', | ||
| 'OrdersClient', | ||
| ] | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -175,11 +175,12 @@ async def create_search(self, | |
| url = self._searches_url() | ||
|
|
||
| # TODO: validate item_types | ||
| request_json = { | ||
| request_json: typing.Dict[str, typing.Any] = { | ||
|
||
| 'name': name, 'filter': search_filter, 'item_types': item_types | ||
| } | ||
| # QUESTION: can we just set the value to True or False above? | ||
|
||
| if enable_email: | ||
| request_json['__daily_email_enabled'] = True | ||
| request_json['__daily_email_enabled'] = enable_email | ||
sgillies marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| request = self._request(url, method='POST', json=request_json) | ||
| response = await self._do_request(request) | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,7 +14,7 @@ | |
| """Functionality for preparing order details for use in creating an order""" | ||
| from __future__ import annotations # https://stackoverflow.com/a/33533514 | ||
| import logging | ||
| from typing import List | ||
| from typing import Any, Dict, List | ||
|
|
||
| from . import geojson, specs | ||
|
|
||
|
|
@@ -67,7 +67,7 @@ def build_request(name: str, | |
| planet.specs.SpecificationException: If order_type is not a valid | ||
| order type. | ||
| ''' | ||
| details = {'name': name, 'products': products} | ||
| details: Dict[str, Any] = {'name': name, 'products': products} | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. mypy requires us to be more careful about dict typing. |
||
|
|
||
| if subscription_id: | ||
| details['subscription_id'] = subscription_id | ||
|
|
@@ -79,8 +79,8 @@ def build_request(name: str, | |
| details['notifications'] = notifications | ||
|
|
||
| if order_type: | ||
| order_type = specs.validate_order_type(order_type) | ||
| details['order_type'] = order_type | ||
| validated_order_type = specs.validate_order_type(order_type) | ||
| details['order_type'] = validated_order_type | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In general, mypy discourages reassigning names, and not without reason because it can be a source of bugs. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh! yeah, I can see that. nice catch. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I reassign names a lot and it's a hard habit to break 😆 |
||
|
|
||
| if tools: | ||
| details['tools'] = tools | ||
|
|
@@ -108,18 +108,19 @@ def product(item_ids: List[str], | |
| are not valid bundles or if item_type is not valid for the given | ||
| bundle or fallback bundle. | ||
| ''' | ||
| product_bundle = specs.validate_bundle(product_bundle) | ||
| item_type = specs.validate_item_type(item_type, product_bundle) | ||
| validated_product_bundle = specs.validate_bundle(product_bundle) | ||
| item_type = specs.validate_item_type(item_type, validated_product_bundle) | ||
|
|
||
| if fallback_bundle is not None: | ||
| fallback_bundle = specs.validate_bundle(fallback_bundle) | ||
| specs.validate_item_type(item_type, fallback_bundle) | ||
| product_bundle = ','.join([product_bundle, fallback_bundle]) | ||
| validated_fallback_bundle = specs.validate_bundle(fallback_bundle) | ||
| specs.validate_item_type(item_type, validated_fallback_bundle) | ||
| validated_product_bundle = ','.join( | ||
| [validated_product_bundle, validated_fallback_bundle]) | ||
|
|
||
| product_dict = { | ||
| 'item_ids': item_ids, | ||
| 'item_type': item_type, | ||
| 'product_bundle': product_bundle | ||
| 'product_bundle': validated_product_bundle | ||
| } | ||
| return product_dict | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -90,15 +90,19 @@ def update_state(self, state: str): | |
| def update(self, state: str = None, order_id: str = None): | ||
| if state: | ||
| self.state = state | ||
| try: | ||
| self.bar.postfix[1] = self.state | ||
| except AttributeError: | ||
| # If the bar is disabled, attempting to access self.bar.postfix | ||
| # will result in an error. In this case, just skip it. | ||
| pass | ||
| if self.bar is not None: | ||
| try: | ||
| self.bar.postfix[1] = self.state | ||
| except AttributeError: | ||
| # If the bar is disabled, attempting to access | ||
| # self.bar.postfix will result in an error. In this | ||
| # case, just skip it. | ||
| pass | ||
|
|
||
| if order_id: | ||
| self.order_id = order_id | ||
| self.bar.set_description_str(self.desc, refresh=False) | ||
| if self.bar is not None: | ||
| self.bar.set_description_str(self.desc, refresh=False) | ||
|
|
||
| self.bar.refresh() | ||
| if self.bar is not None: | ||
| self.bar.refresh() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. mypy noticed some cases where self.bar could be None and we would try to call its methods. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That is cool as heck. I should try mypy There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. awesome catch. this would probably have bubbled up as a bug eventually. |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
__all__requires strings, not objects.