-
Notifications
You must be signed in to change notification settings - Fork 95
Open
Labels
2024-revisitSDK committee reviewed and marked for follow-upSDK committee reviewed and marked for follow-upCLI/SDK InterfaceUpdate the CLI and SDK to the finalized interfaceUpdate the CLI and SDK to the finalized interfaceproposal
Milestone
Description
To support the common use case of creating an order from a search, have planet orders request take in a series of item descriptions to create an order.
Usage:
planet data search --limit 5 PSScene | planet orders request - --name test --clip aoi.geojson --bundle analytic
Implementation notes: ids and item type are taken from the input. There is a check for more than one item type, which at this point results in a failure (the ability to order multiple types could come in a future improvement)
Changes required:
- planet order requests must now allow multiline input where each line is json in addition to ids as the argument
- item-type is only required if the input is IDs
Below is a working example of extracting item type and id from the output of planet data search
.
$> planet data search --limit 5 PSScene | python ml.py --items -
PSScene: 20230504_155548_86_24b9
PSScene: 20230504_134550_99_2251
PSScene: 20230504_052537_02_2465
PSScene: 20230504_043314_80_248b
PSScene: 20230504_161301_74_2405
Note: MultiJSON
is a hacked up version of JSON
, which is in the cli/types.py
module. There is more work here in defining a type that can handle both comma separated strings and multiple lines of json.
ml.py
import json
import click
class MultiJSON(click.ParamType):
name = 'MultiJSON'
def convert(self, value, param, ctx) -> list:
if isinstance(value, list):
conv = value
else:
# read from raw json
# skip this if value is a Path object or something else
if isinstance(value, str) and (value.startswith('{')
or value.startswith('[')):
print('hereh')
try:
conv = json.loads(value)
if isinstance(conv, dict):
conv = [conv]
except json.decoder.JSONDecodeError:
self.fail(
'JSON string is not valid JSON. Make sure the entire '
'JSON string is single-quoted and string entries are '
'double-quoted.')
# read from stdin or file
else:
try:
with click.open_file(value) as f:
conv = [json.loads(line) for line in f if line]
except FileNotFoundError:
self.fail('File not found.')
except json.decoder.JSONDecodeError:
stream = 'stdin' if value == '-' else 'JSON file'
self.fail(f'{stream} does not contain valid JSON.')
if not len(conv):
self.fail('JSON cannot be empty.')
return conv
@click.command()
@click.option('--items', type=MultiJSON(), required=True)
def hello(items):
for i in items:
click.echo(f"{i['properties']['item_type']}: {i['id']}")
if __name__ == '__main__':
hello()
Metadata
Metadata
Assignees
Labels
2024-revisitSDK committee reviewed and marked for follow-upSDK committee reviewed and marked for follow-upCLI/SDK InterfaceUpdate the CLI and SDK to the finalized interfaceUpdate the CLI and SDK to the finalized interfaceproposal