Source code for dob.clickux.cmd_options

# This file exists within 'dob':
#
#   https://github.com/hotoffthehamster/dob
#
# Copyright © 2018-2020 Landon Bouma, © 2015-2016 Eric Goller.  All rights reserved.
#
# 'dob' is free software: you can redistribute it and/or modify it under the terms
# of the GNU General Public License  as  published by the Free Software Foundation,
# either version 3  of the License,  or  (at your option)  any   later    version.
#
# 'dob' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
# without even the implied warranty of MERCHANTABILITY  or  FITNESS FOR A PARTICULAR
# PURPOSE.  See  the  GNU General Public License  for  more details.
#
# You can find the GNU General Public License reprinted in the file titled 'LICENSE',
# or visit <http://www.gnu.org/licenses/>.

from gettext import gettext as _

import click_hotoffthehamster as click

__all__ = (
    'cmd_options_edit_item',
    'cmd_options_fact_add',
    'cmd_options_fact_dryable',
    'cmd_options_fact_edit',
    'cmd_options_fact_import',
    'cmd_options_factoid',
    'cmd_options_factoid_verify_none',
    'cmd_options_factoid_verify_start',
    'cmd_options_factoid_verify_end',
    'cmd_options_factoid_verify_both',
    'cmd_options_rule_name',
    'cmd_options_styles_internal',
    'cmd_options_styles_named',
)


# ***
# *** [ADD FACT/STOP FACT] Raw Factoid Option.
# ***

_option_factoid_text_parts = (
    '[<activity>[@<category>]]'
    ' [@<tag>...] [<description>]'
)


_cmd_options_factoid = [
    click.argument('factoid', nargs=-1, default=None,
                   metavar='[START_TIME] [to] [END_TIME] {}'.format(
                       _option_factoid_text_parts,
                   )),
]


[docs]def cmd_options_factoid(func): for option in reversed(_cmd_options_factoid): func = option(func) return func
_cmd_options_factoid_verify_none = [ click.argument('factoid', nargs=-1, default=None, metavar=_option_factoid_text_parts, ), ]
[docs]def cmd_options_factoid_verify_none(func): for option in reversed(_cmd_options_factoid_verify_none): func = option(func) return func
_cmd_options_factoid_verify_start = [ click.argument('factoid', nargs=-1, default=None, metavar='[START_TIME] {}'.format( _option_factoid_text_parts, )), ]
[docs]def cmd_options_factoid_verify_start(func): for option in reversed(_cmd_options_factoid_verify_start): func = option(func) return func
_cmd_options_factoid_verify_end = [ click.argument('factoid', nargs=-1, default=None, metavar='[END_TIME] {}'.format( _option_factoid_text_parts, )), ]
[docs]def cmd_options_factoid_verify_end(func): for option in reversed(_cmd_options_factoid_verify_end): func = option(func) return func
_cmd_options_factoid_verify_both = [ click.argument('factoid', nargs=-1, default=None, metavar='START_TIME to END_TIME {}'.format( _option_factoid_text_parts, )), ]
[docs]def cmd_options_factoid_verify_both(func): for option in reversed(_cmd_options_factoid_verify_both): func = option(func) return func
# *** # *** [ADD FACT] Options. # *** _cmd_options_fact_add_prefix = [ click.option( '-e', '--editor', is_flag=True, help=_('Edit new Fact before saving, using Carousel, and Awesome Prompt.'), ), ] _cmd_options_fact_add_and_edit = [ click.option( '-d', '--edit-text', is_flag=True, help=_('Edit description using user’s preferred $EDITOR.'), ), click.option( '-a', '--edit-meta', is_flag=True, help=_('Ask for act@gory and tags using Awesome Prompt.'), ), ] _cmd_options_fact_add_postfix = [ # (lb): 2019-02-01: Current thinking is that conflicts are only okay # on add-fact, and only outside the context of the Carousel. So applies # to dob-add commands, but not to dob-import. click.option( '-y', '--yes', is_flag=True, help=_('Save conflicts automatically, otherwise ask for confirmation.'), ), ]
[docs]def cmd_options_fact_add(func): for option in reversed( _cmd_options_fact_add_prefix + _cmd_options_fact_add_and_edit + _cmd_options_fact_add_postfix ): func = option(func) return func
# *** # *** [IMPORT FACTS] Options. # *** _cmd_options_fact_import = [ # (lb): This is similar to dob-add's --edit, except the default is reversed. # - On dob-add, default is to not run Carousel; but on dob-import, it is. click.option( # Option skips carousel, opens Content in EDITOR, saves Fact on EDITOR exit. '-E', '--no-editor', is_flag=True, help=_('Skip interactive editor after import. Save Facts and exit.'), ), ]
[docs]def cmd_options_fact_import(func): for option in reversed(_cmd_options_fact_import): func = option(func) return func
# *** # *** [EDIT FACT] Options. # *** _cmd_options_fact_no_editor_edit = [ click.option( '-E', '--no-editor', is_flag=True, help=_('Skip interactive editor. Use $EDITOR and Awesome Prompt.'), ), ]
[docs]def cmd_options_fact_edit(func): for option in reversed( _cmd_options_fact_add_and_edit + _cmd_options_fact_no_editor_edit ): func = option(func) return func
# *** # *** [ADD FACT/IMPORT FACT(S)] Shared Options. # *** _cmd_options_fact_dryable = [ # (lb): The --dry option is not super useful if you have your store under # git control, because you can easily revert any changes; or if you setup a # test store under /tmp (i.e., `export XDG_DATA_HOME=/tmp/xxx/.local/share`). # It's really just more code to test! # MAYBE/2019-02-01: Remove the --dry option, and save a unittest? click.option( '--dry', is_flag=True, help=_('Dry run: do not make changes.'), ), ]
[docs]def cmd_options_fact_dryable(func): for option in reversed(_cmd_options_fact_dryable): func = option(func) return func
# *** # *** [EDIT ITEM] Options. # *** _cmd_options_edit_item = [ # User can indicate specific item to edit via its PK, otherwise default to latest. # FIXME/BACKLOG/2019-01-31: Could allow user to specify datetime instead of PK, # e.g., `dob edit 2019-01-31` could bring up Fact at Noon on specific day (or # midnight). click.argument('key', nargs=1, type=int, required=False), # (lb): User can specify specific Fact PK, a positive integer, or user # can specify an index relative to the last Fact, e.g., `dob edit -1` # (or even `dob edit -2`, though anything other than `dob edit -1` seems # useless, i.e., would a user ever really run `dob edit -5`?). In any case, # because the negative relative index starts with the dash '-' character, # Click will complain if it parses the argument as an option, e.g., # $ dob edit -1 # Error: no such option: -1 # The user can double-dash to tell Click to stop option processing, e.g., # $ dob edit -- -1 # The latter is somewhat clunky, so we can make '-1' an option. # Note that this doesn't solve the issue for -2, -3, etc., but really, who cares. click.option( '-1', 'latest_1', is_flag=True, help=_('Edit most recent Fact (latest complete, or active).'), ), ]
[docs]def cmd_options_edit_item(func): for option in reversed(_cmd_options_edit_item): func = option(func) return func
# *** # *** [STYLES] Options. # *** _cmd_options_styles_internal = [ click.option( '-i', '--internal', is_flag=True, help=_( 'Print pristine or internal style settings, not raw styles.conf section. ' 'If the named style is also a section in styles.conf, ' 'this exclude comments, and it reorders the settings. ' 'Otherwise, if not in styles.conf, the matching internal style is located.' ) ), ]
[docs]def cmd_options_styles_internal(func): for option in reversed(_cmd_options_styles_internal): func = option(func) return func
_cmd_options_styles_named = [ click.argument('name', nargs=1, default='', metavar=_('[STYLE_NAME]')), ]
[docs]def cmd_options_styles_named(func): for option in reversed(_cmd_options_styles_named): func = option(func) return func
# *** # *** [RULES] Options. # *** _cmd_options_rule_name = [ click.argument('name', nargs=1, default='', metavar=_('[RULE_NAME]')), ]
[docs]def cmd_options_rule_name(func): for option in reversed(_cmd_options_rule_name): func = option(func) return func