mirror of
https://github.com/ihabunek/toot.git
synced 2024-09-22 04:25:55 -04:00
Add --json option to lists commands
This commit is contained in:
parent
438a8ab206
commit
1dac093be7
@ -19,7 +19,6 @@ noted below please report any issues.
|
|||||||
* Enable passing params via environment variables, see:
|
* Enable passing params via environment variables, see:
|
||||||
https://toot.bezdomni.net/environment_variables.html
|
https://toot.bezdomni.net/environment_variables.html
|
||||||
* Add shell completion, see: https://toot.bezdomni.net/shell_completion.html
|
* Add shell completion, see: https://toot.bezdomni.net/shell_completion.html
|
||||||
* Add `--json` option to tag commands
|
|
||||||
* Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature`
|
* Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature`
|
||||||
commands
|
commands
|
||||||
* Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands,
|
* Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands,
|
||||||
@ -27,6 +26,8 @@ noted below please report any issues.
|
|||||||
* Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists
|
* Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists
|
||||||
list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`,
|
list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`,
|
||||||
`lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands.
|
`lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands.
|
||||||
|
* Add `--json` option to tags commands
|
||||||
|
* Add `--json` option to lists commands
|
||||||
* Add `toot --width` option for setting your prefered terminal width
|
* Add `toot --width` option for setting your prefered terminal width
|
||||||
* Add `--media-viewer` and `--colors` options to `toot tui`. These were
|
* Add `--media-viewer` and `--colors` options to `toot tui`. These were
|
||||||
previously accessible only via settings.
|
previously accessible only via settings.
|
||||||
|
@ -11,10 +11,11 @@
|
|||||||
- "BREAKING: Options `--debug`, `--color`, `--quiet` must be specified after `toot` but before the command"
|
- "BREAKING: Options `--debug`, `--color`, `--quiet` must be specified after `toot` but before the command"
|
||||||
- "Enable passing params via environment variables, see: https://toot.bezdomni.net/environment_variables.html"
|
- "Enable passing params via environment variables, see: https://toot.bezdomni.net/environment_variables.html"
|
||||||
- "Add shell completion, see: https://toot.bezdomni.net/shell_completion.html"
|
- "Add shell completion, see: https://toot.bezdomni.net/shell_completion.html"
|
||||||
- "Add `--json` option to tag commands"
|
|
||||||
- "Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature` commands"
|
- "Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature` commands"
|
||||||
- "Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands, deprecate `tags_followed`, `tags_follow`, and `tags tags_unfollow`"
|
- "Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands, deprecate `tags_followed`, `tags_follow`, and `tags tags_unfollow`"
|
||||||
- "Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`, `lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands."
|
- "Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`, `lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands."
|
||||||
|
- "Add `--json` option to tags commands"
|
||||||
|
- "Add `--json` option to lists commands"
|
||||||
- "Add `toot --width` option for setting your prefered terminal width"
|
- "Add `toot --width` option for setting your prefered terminal width"
|
||||||
- "Add `--media-viewer` and `--colors` options to `toot tui`. These were previously accessible only via settings."
|
- "Add `--media-viewer` and `--colors` options to `toot tui`. These were previously accessible only via settings."
|
||||||
|
|
||||||
|
@ -19,7 +19,6 @@ noted below please report any issues.
|
|||||||
* Enable passing params via environment variables, see:
|
* Enable passing params via environment variables, see:
|
||||||
https://toot.bezdomni.net/environment_variables.html
|
https://toot.bezdomni.net/environment_variables.html
|
||||||
* Add shell completion, see: https://toot.bezdomni.net/shell_completion.html
|
* Add shell completion, see: https://toot.bezdomni.net/shell_completion.html
|
||||||
* Add `--json` option to tag commands
|
|
||||||
* Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature`
|
* Add `tags info`, `tags featured`, `tags feature`, and `tags unfeature`
|
||||||
commands
|
commands
|
||||||
* Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands,
|
* Add `tags followed`, `tags follow`, and `tags unfollow` sub-commands,
|
||||||
@ -27,6 +26,8 @@ noted below please report any issues.
|
|||||||
* Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists
|
* Add `lists accounts`, `lists add`, `lists create`, `lists delete`, `lists
|
||||||
list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`,
|
list`, `lists remove` subcommands, deprecate `lists`, `lists_accounts`,
|
||||||
`lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands.
|
`lists_add`, `lists_create`, `lists_delete`, `lists_remove` commands.
|
||||||
|
* Add `--json` option to tags commands
|
||||||
|
* Add `--json` option to lists commands
|
||||||
* Add `toot --width` option for setting your prefered terminal width
|
* Add `toot --width` option for setting your prefered terminal width
|
||||||
* Add `--media-viewer` and `--colors` options to `toot tui`. These were
|
* Add `--media-viewer` and `--colors` options to `toot tui`. These were
|
||||||
previously accessible only via settings.
|
previously accessible only via settings.
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from uuid import uuid4
|
||||||
from toot import cli
|
from toot import cli
|
||||||
|
|
||||||
from tests.integration.conftest import register_account
|
from tests.integration.conftest import register_account
|
||||||
@ -9,6 +10,11 @@ def test_lists_empty(run):
|
|||||||
assert result.stdout.strip() == "You have no lists defined."
|
assert result.stdout.strip() == "You have no lists defined."
|
||||||
|
|
||||||
|
|
||||||
|
def test_lists_empty_json(run_json):
|
||||||
|
lists = run_json(cli.lists.list, "--json")
|
||||||
|
assert lists == []
|
||||||
|
|
||||||
|
|
||||||
def test_list_create_delete(run):
|
def test_list_create_delete(run):
|
||||||
result = run(cli.lists.create, "banana")
|
result = run(cli.lists.create, "banana")
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
@ -49,26 +55,62 @@ def test_list_create_delete(run):
|
|||||||
assert result.stderr.strip() == "Error: List not found"
|
assert result.stderr.strip() == "Error: List not found"
|
||||||
|
|
||||||
|
|
||||||
def test_list_add_remove(run, app):
|
def test_list_create_delete_json(run, run_json):
|
||||||
acc = register_account(app)
|
result = run_json(cli.lists.list, "--json")
|
||||||
run(cli.lists.create, "foo")
|
assert result == []
|
||||||
|
|
||||||
result = run(cli.lists.add, "foo", acc.username)
|
list = run_json(cli.lists.create, "banana", "--json")
|
||||||
|
assert list["title"] == "banana"
|
||||||
|
|
||||||
|
[list] = run_json(cli.lists.list, "--json")
|
||||||
|
assert list["title"] == "banana"
|
||||||
|
|
||||||
|
list = run_json(cli.lists.create, "mango", "--json")
|
||||||
|
assert list["title"] == "mango"
|
||||||
|
|
||||||
|
lists = run_json(cli.lists.list, "--json")
|
||||||
|
[list1, list2] = sorted(lists, key=lambda l: l["title"])
|
||||||
|
assert list1["title"] == "banana"
|
||||||
|
assert list2["title"] == "mango"
|
||||||
|
|
||||||
|
result = run_json(cli.lists.delete, "banana", "--json")
|
||||||
|
assert result == {}
|
||||||
|
|
||||||
|
[list] = run_json(cli.lists.list, "--json")
|
||||||
|
assert list["title"] == "mango"
|
||||||
|
|
||||||
|
result = run_json(cli.lists.delete, "mango", "--json")
|
||||||
|
assert result == {}
|
||||||
|
|
||||||
|
result = run_json(cli.lists.list, "--json")
|
||||||
|
assert result == []
|
||||||
|
|
||||||
|
result = run(cli.lists.delete, "mango", "--json")
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert result.stderr.strip() == "Error: List not found"
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_add_remove(run, app):
|
||||||
|
list_name = str(uuid4())
|
||||||
|
acc = register_account(app)
|
||||||
|
run(cli.lists.create, list_name)
|
||||||
|
|
||||||
|
result = run(cli.lists.add, list_name, acc.username)
|
||||||
assert result.exit_code == 1
|
assert result.exit_code == 1
|
||||||
assert result.stderr.strip() == f"Error: You must follow @{acc.username} before adding this account to a list."
|
assert result.stderr.strip() == f"Error: You must follow @{acc.username} before adding this account to a list."
|
||||||
|
|
||||||
run(cli.accounts.follow, acc.username)
|
run(cli.accounts.follow, acc.username)
|
||||||
|
|
||||||
result = run(cli.lists.add, "foo", acc.username)
|
result = run(cli.lists.add, list_name, acc.username)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert result.stdout.strip() == f'✓ Added account "{acc.username}"'
|
assert result.stdout.strip() == f'✓ Added account "{acc.username}"'
|
||||||
|
|
||||||
result = run(cli.lists.accounts, "foo")
|
result = run(cli.lists.accounts, list_name)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert acc.username in result.stdout
|
assert acc.username in result.stdout
|
||||||
|
|
||||||
# Account doesn't exist
|
# Account doesn't exist
|
||||||
result = run(cli.lists.add, "foo", "does_not_exist")
|
result = run(cli.lists.add, list_name, "does_not_exist")
|
||||||
assert result.exit_code == 1
|
assert result.exit_code == 1
|
||||||
assert result.stderr.strip() == "Error: Account not found"
|
assert result.stderr.strip() == "Error: Account not found"
|
||||||
|
|
||||||
@ -77,10 +119,44 @@ def test_list_add_remove(run, app):
|
|||||||
assert result.exit_code == 1
|
assert result.exit_code == 1
|
||||||
assert result.stderr.strip() == "Error: List not found"
|
assert result.stderr.strip() == "Error: List not found"
|
||||||
|
|
||||||
result = run(cli.lists.remove, "foo", acc.username)
|
result = run(cli.lists.remove, list_name, acc.username)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert result.stdout.strip() == f'✓ Removed account "{acc.username}"'
|
assert result.stdout.strip() == f'✓ Removed account "{acc.username}"'
|
||||||
|
|
||||||
result = run(cli.lists.accounts, "foo")
|
result = run(cli.lists.accounts, list_name)
|
||||||
assert result.exit_code == 0
|
assert result.exit_code == 0
|
||||||
assert result.stdout.strip() == "This list has no accounts."
|
assert result.stdout.strip() == "This list has no accounts."
|
||||||
|
|
||||||
|
|
||||||
|
def test_list_add_remove_json(run, run_json, app):
|
||||||
|
list_name = str(uuid4())
|
||||||
|
acc = register_account(app)
|
||||||
|
run(cli.lists.create, list_name)
|
||||||
|
|
||||||
|
result = run(cli.lists.add, list_name, acc.username, "--json")
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert result.stderr.strip() == f"Error: You must follow @{acc.username} before adding this account to a list."
|
||||||
|
|
||||||
|
run(cli.accounts.follow, acc.username)
|
||||||
|
|
||||||
|
result = run_json(cli.lists.add, list_name, acc.username, "--json")
|
||||||
|
assert result == {}
|
||||||
|
|
||||||
|
[account] = run_json(cli.lists.accounts, list_name, "--json")
|
||||||
|
assert account["username"] == acc.username
|
||||||
|
|
||||||
|
# Account doesn't exist
|
||||||
|
result = run(cli.lists.add, list_name, "does_not_exist", "--json")
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert result.stderr.strip() == "Error: Account not found"
|
||||||
|
|
||||||
|
# List doesn't exist
|
||||||
|
result = run(cli.lists.add, "does_not_exist", acc.username, "--json")
|
||||||
|
assert result.exit_code == 1
|
||||||
|
assert result.stderr.strip() == "Error: List not found"
|
||||||
|
|
||||||
|
result = run_json(cli.lists.remove, list_name, acc.username, "--json")
|
||||||
|
assert result == {}
|
||||||
|
|
||||||
|
result = run_json(cli.lists.accounts, list_name, "--json")
|
||||||
|
assert result == []
|
||||||
|
@ -30,7 +30,7 @@ def friend_user(app, user):
|
|||||||
@pytest.fixture(scope="module")
|
@pytest.fixture(scope="module")
|
||||||
def friend_list(app, user, friend_user):
|
def friend_list(app, user, friend_user):
|
||||||
friend_account = api.find_account(app, user, friend_user.username)
|
friend_account = api.find_account(app, user, friend_user.username)
|
||||||
list = api.create_list(app, user, str(uuid4()))
|
list = api.create_list(app, user, str(uuid4())).json()
|
||||||
api.add_accounts_to_list(app, user, list["id"], account_ids=[friend_account["id"]])
|
api.add_accounts_to_list(app, user, list["id"], account_ids=[friend_account["id"]])
|
||||||
return list
|
return list
|
||||||
|
|
||||||
|
@ -639,7 +639,7 @@ def create_list(app, user, title, replies_policy="none"):
|
|||||||
json = {'title': title}
|
json = {'title': title}
|
||||||
if replies_policy:
|
if replies_policy:
|
||||||
json['replies_policy'] = replies_policy
|
json['replies_policy'] = replies_policy
|
||||||
return http.post(app, user, url, json=json).json()
|
return http.post(app, user, url, json=json)
|
||||||
|
|
||||||
|
|
||||||
def delete_list(app, user, id):
|
def delete_list(app, user, id):
|
||||||
@ -649,7 +649,7 @@ def delete_list(app, user, id):
|
|||||||
def add_accounts_to_list(app, user, list_id, account_ids):
|
def add_accounts_to_list(app, user, list_id, account_ids):
|
||||||
url = f"/api/v1/lists/{list_id}/accounts"
|
url = f"/api/v1/lists/{list_id}/accounts"
|
||||||
json = {'account_ids': account_ids}
|
json = {'account_ids': account_ids}
|
||||||
return http.post(app, user, url, json=json).json()
|
return http.post(app, user, url, json=json)
|
||||||
|
|
||||||
|
|
||||||
def remove_accounts_from_list(app, user, list_id, account_ids):
|
def remove_accounts_from_list(app, user, list_id, account_ids):
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import click
|
import click
|
||||||
|
import json as pyjson
|
||||||
|
|
||||||
from toot import api, config
|
from toot import api, config
|
||||||
from toot.cli import Context, cli, pass_context
|
from toot.cli import Context, cli, pass_context, json_option
|
||||||
from toot.output import print_list_accounts, print_lists, print_warning
|
from toot.output import print_list_accounts, print_lists, print_warning
|
||||||
|
|
||||||
|
|
||||||
@ -24,26 +25,35 @@ def lists(ctx: click.Context):
|
|||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def list(ctx: Context):
|
def list(ctx: Context, json: bool):
|
||||||
"""List all your lists"""
|
"""List all your lists"""
|
||||||
lists = api.get_lists(ctx.app, ctx.user)
|
lists = api.get_lists(ctx.app, ctx.user)
|
||||||
|
|
||||||
if lists:
|
if json:
|
||||||
print_lists(lists)
|
click.echo(pyjson.dumps(lists))
|
||||||
else:
|
else:
|
||||||
click.echo("You have no lists defined.")
|
if lists:
|
||||||
|
print_lists(lists)
|
||||||
|
else:
|
||||||
|
click.echo("You have no lists defined.")
|
||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
@click.argument("title", required=False)
|
@click.argument("title", required=False)
|
||||||
@click.option("--id", help="List ID if not title is given")
|
@click.option("--id", help="List ID if not title is given")
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def accounts(ctx: Context, title: str, id: str):
|
def accounts(ctx: Context, title: str, id: str, json: bool):
|
||||||
"""List the accounts in a list"""
|
"""List the accounts in a list"""
|
||||||
list_id = _get_list_id(ctx, title, id)
|
list_id = _get_list_id(ctx, title, id)
|
||||||
response = api.get_list_accounts(ctx.app, ctx.user, list_id)
|
response = api.get_list_accounts(ctx.app, ctx.user, list_id)
|
||||||
print_list_accounts(response)
|
|
||||||
|
if json:
|
||||||
|
click.echo(pyjson.dumps(response))
|
||||||
|
else:
|
||||||
|
print_list_accounts(response)
|
||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
@ -54,36 +64,49 @@ def accounts(ctx: Context, title: str, id: str):
|
|||||||
default="none",
|
default="none",
|
||||||
help="Replies policy"
|
help="Replies policy"
|
||||||
)
|
)
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def create(ctx: Context, title: str, replies_policy: str):
|
def create(ctx: Context, title: str, replies_policy: str, json: bool):
|
||||||
"""Create a list"""
|
"""Create a list"""
|
||||||
api.create_list(ctx.app, ctx.user, title=title, replies_policy=replies_policy)
|
response = api.create_list(ctx.app, ctx.user, title=title, replies_policy=replies_policy)
|
||||||
click.secho(f"✓ List \"{title}\" created.", fg="green")
|
if json:
|
||||||
|
print(response.text)
|
||||||
|
else:
|
||||||
|
click.secho(f"✓ List \"{title}\" created.", fg="green")
|
||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
@click.argument("title", required=False)
|
@click.argument("title", required=False)
|
||||||
@click.option("--id", help="List ID if not title is given")
|
@click.option("--id", help="List ID if not title is given")
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def delete(ctx: Context, title: str, id: str):
|
def delete(ctx: Context, title: str, id: str, json: bool):
|
||||||
"""Delete a list"""
|
"""Delete a list"""
|
||||||
list_id = _get_list_id(ctx, title, id)
|
list_id = _get_list_id(ctx, title, id)
|
||||||
api.delete_list(ctx.app, ctx.user, list_id)
|
response = api.delete_list(ctx.app, ctx.user, list_id)
|
||||||
click.secho(f"✓ List \"{title if title else id}\" deleted.", fg="green")
|
if json:
|
||||||
|
click.echo(response.text)
|
||||||
|
else:
|
||||||
|
click.secho(f"✓ List \"{title if title else id}\" deleted.", fg="green")
|
||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
@click.argument("title", required=False)
|
@click.argument("title", required=False)
|
||||||
@click.argument("account")
|
@click.argument("account")
|
||||||
@click.option("--id", help="List ID if not title is given")
|
@click.option("--id", help="List ID if not title is given")
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def add(ctx: Context, title: str, account: str, id: str):
|
def add(ctx: Context, title: str, account: str, id: str, json: bool):
|
||||||
"""Add an account to a list"""
|
"""Add an account to a list"""
|
||||||
list_id = _get_list_id(ctx, title, id)
|
list_id = _get_list_id(ctx, title, id)
|
||||||
found_account = api.find_account(ctx.app, ctx.user, account)
|
found_account = api.find_account(ctx.app, ctx.user, account)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
api.add_accounts_to_list(ctx.app, ctx.user, list_id, [found_account["id"]])
|
response = api.add_accounts_to_list(ctx.app, ctx.user, list_id, [found_account["id"]])
|
||||||
|
if json:
|
||||||
|
click.echo(response.text)
|
||||||
|
else:
|
||||||
|
click.secho(f"✓ Added account \"{account}\"", fg="green")
|
||||||
except Exception:
|
except Exception:
|
||||||
# TODO: this is slow, improve
|
# TODO: this is slow, improve
|
||||||
# if we failed to add the account, try to give a
|
# if we failed to add the account, try to give a
|
||||||
@ -99,20 +122,25 @@ def add(ctx: Context, title: str, account: str, id: str):
|
|||||||
raise click.ClickException(f"You must follow @{account} before adding this account to a list.")
|
raise click.ClickException(f"You must follow @{account} before adding this account to a list.")
|
||||||
raise
|
raise
|
||||||
|
|
||||||
click.secho(f"✓ Added account \"{account}\"", fg="green")
|
|
||||||
|
|
||||||
|
|
||||||
@lists.command()
|
@lists.command()
|
||||||
@click.argument("title", required=False)
|
@click.argument("title", required=False)
|
||||||
@click.argument("account")
|
@click.argument("account")
|
||||||
@click.option("--id", help="List ID if not title is given")
|
@click.option("--id", help="List ID if not title is given")
|
||||||
|
@json_option
|
||||||
@pass_context
|
@pass_context
|
||||||
def remove(ctx: Context, title: str, account: str, id: str):
|
def remove(ctx: Context, title: str, account: str, id: str, json: bool):
|
||||||
"""Remove an account from a list"""
|
"""Remove an account from a list"""
|
||||||
list_id = _get_list_id(ctx, title, id)
|
list_id = _get_list_id(ctx, title, id)
|
||||||
found_account = api.find_account(ctx.app, ctx.user, account)
|
found_account = api.find_account(ctx.app, ctx.user, account)
|
||||||
api.remove_accounts_from_list(ctx.app, ctx.user, list_id, [found_account["id"]])
|
response = api.remove_accounts_from_list(ctx.app, ctx.user, list_id, [found_account["id"]])
|
||||||
click.secho(f"✓ Removed account \"{account}\"", fg="green")
|
if json:
|
||||||
|
click.echo(response.text)
|
||||||
|
else:
|
||||||
|
click.secho(f"✓ Removed account \"{account}\"", fg="green")
|
||||||
|
|
||||||
|
|
||||||
|
# -- Deprecated commands -------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@cli.command(name="list_accounts", hidden=True)
|
@cli.command(name="list_accounts", hidden=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user