yage
a739d3b5a2
===================================================================== Big day! V4 is finally live. This INCLUDES some BREAKING CHANGES to ZSH TYPE scwrypts! Please refer to the readme for upgrade details (more specifically docs/upgrade/v3-to-v4.md) Upgrade is SUPER EASY, so please take the time to do so. --- New Features ---------------------------------------------------- - zsh type scwrypts have an upgraded runstring to improve context setup and simplicity to the scwrypt-writer - scwrypts now publishes the package (scwrypts) to PyPi; this provides a simple way to invoke scwrypts from python-based environments as well as the entire scwrypts python library suite pip install scwrypts - scwrypts now publishes the package (scwrypts) to npm; this provides a simple way to invoke scwrypts from nodesjs environments npm install scwrypts --- Bug Fixes ------------------------------------------------------- - scwrypts runner prompts which use the zshbuiltin "read" now appropriately read input from tty, pipe, files, and user input - virtualenv refresh now loads and prepares the scwrypts virtual environments correctly --- Changes --------------------------------------------------------- - created the (-v, --log-level) scwrypts arguments as improvements of and replacements to the --verbose and --no-log flags - (-n) is now an alias for (--log-level 0) - (--no-log) is the same as (-n) for compatibility, but will be removed in 4.2 - zsh/lib/utils/io print functions now *interact with log-level* various log levels will now only display the appropriate console prints for the specified log level - zsh/lib/utils/io:INFO has been renamed to DEBUG to align with log-level output; please use DEBUG for debug messages and REMINDER for important user messages - created zsh/lib/utils/io:FZF_USER_INPUT as a *drop-in replacement* for the confusing FZF_HEAD and FZF_TAIL commands. Update by literally changing any instances of FZF_HEAD or FZF_TAIL with FZF_USER_INPUT - FZF_HEAD and FZF_TAIL will be removed in 4.2 - zsh/lib/utils/io:READ (and other zshbuiltin/read-based prompts) now accept a --force-user-input flag in case important checks should require an admin's approval. This flag will ensure that piped input and the `scwrypts -y` flag are ignored for the single prompt. - zsh/lib/utils/color has been updated to use color names which match the ANSI color names - zsh/hello-world has been reduced to a minimal example; this is to emphasize ease-of-use with v4 - zsh/sanity-check is a scwrypts/run testing helper and detailed starting reference (helpful since hello-world is now minimal) - various refactor, updates, and improvements to the scwrypts runner - migrated all zsh scwrypts and plugins to use v4 runner syntax - zsh - plugins/kubectl - plugins/ci - refactored py/lib into py/lib/scwrypts (PyPi)
141 lines
4.3 KiB
Python
Executable File
141 lines
4.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
from scwrypts import execute
|
|
#####################################################################
|
|
from json import dumps
|
|
|
|
from scwrypts.fzf import fzf, fzf_tail
|
|
from scwrypts.http import directus
|
|
|
|
|
|
description = 'interactive CLI to get data from directus'
|
|
|
|
parse_args = [
|
|
( ['-c', '--collection'], {
|
|
"dest" : 'collection',
|
|
"default" : None,
|
|
"help" : 'the name of the collection',
|
|
"required" : False,
|
|
}),
|
|
( ['-f', '--filters'], {
|
|
"dest" : 'filters',
|
|
"default" : None,
|
|
"help" : 'as a URL-suffix, filters for the query',
|
|
"required" : False,
|
|
}),
|
|
( ['-d', '--fields'], {
|
|
"dest" : 'fields',
|
|
"default" : None,
|
|
"help" : 'comma-separated list of fields to include',
|
|
"required" : False,
|
|
}),
|
|
( ['-p', '--interactive-prompt'], {
|
|
"action" : 'store_true',
|
|
"dest" : 'interactive',
|
|
"default" : False,
|
|
"help" : 'interactively generate filter prompts; implied if no flags are provided',
|
|
"required" : False,
|
|
}),
|
|
( ['--prompt-filters'], {
|
|
"action" : 'store_true',
|
|
"dest" : 'generate_filters_prompt',
|
|
"default" : False,
|
|
"help" : '(superceded by -p) only generate filters interactively',
|
|
"required" : False,
|
|
}),
|
|
( ['--prompt-fields'], {
|
|
"action" : 'store_true',
|
|
"dest" : 'generate_fields_prompt',
|
|
"default" : False,
|
|
"help" : '(superceded by -p) only generate filters interactively',
|
|
"required" : False,
|
|
}),
|
|
]
|
|
|
|
def main(args, stream):
|
|
if {None} == { args.collection, args.filters, args.fields }:
|
|
args.interactive = True
|
|
|
|
if args.interactive:
|
|
args.generate_filters_prompt = True
|
|
args.generate_fields_prompt = True
|
|
|
|
collection = _get_or_select_collection(args)
|
|
filters = _get_or_select_filters(args, collection)
|
|
fields = _get_or_select_fields(args, collection)
|
|
|
|
query = '&'.join([
|
|
param for param in [
|
|
fields,
|
|
filters,
|
|
]
|
|
if param
|
|
])
|
|
|
|
endpoint = f'items/{collection}?{query}'
|
|
|
|
response = directus.request('GET', endpoint)
|
|
|
|
stream.writeline(dumps({
|
|
**response.json(),
|
|
'scwrypts_metadata': {
|
|
'endpoint': endpoint,
|
|
'repeat_with': f'scwrypts -n py/directus/get-items -- -c {collection} -f \'{query}\'',
|
|
},
|
|
}))
|
|
|
|
def _get_or_select_collection(args):
|
|
collection = args.collection
|
|
|
|
if collection is None:
|
|
collection = fzf(
|
|
prompt = 'select a collection',
|
|
choices = directus.get_collections(),
|
|
)
|
|
|
|
if not collection:
|
|
raise ValueError('collection required for query')
|
|
|
|
return collection
|
|
|
|
def _get_or_select_filters(args, collection):
|
|
filters = args.filters or ''
|
|
|
|
if filters == '' and args.generate_filters_prompt:
|
|
filters = '&'.join([
|
|
f'filter[{filter}][' + (
|
|
operator := fzf(
|
|
prompt = f'select operator for {filter}',
|
|
choices = directus.FILTER_OPERATORS,
|
|
)
|
|
) + ']=' + fzf_tail(prompt = f'filter[{filter}][{operator}]')
|
|
|
|
for filter in fzf(
|
|
prompt = 'select filter(s) [C^c to skip]',
|
|
fzf_options = '--multi',
|
|
force_list = True,
|
|
choices = directus.get_fields(collection),
|
|
)
|
|
])
|
|
|
|
return filters
|
|
|
|
def _get_or_select_fields(args, collection):
|
|
fields = args.fields or ''
|
|
|
|
if fields == '' and args.generate_fields_prompt:
|
|
fields = ','.join(fzf(
|
|
prompt = 'select return field(s) [C^c to get all]',
|
|
fzf_options = '--multi',
|
|
choices = directus.get_fields(collection),
|
|
force_list = True,
|
|
))
|
|
|
|
if fields:
|
|
fields = f'fields[]={fields}'
|
|
|
|
return fields
|
|
|
|
#####################################################################
|
|
if __name__ == '__main__':
|
|
execute(main, description, parse_args)
|