From 37346015a013e4d717c24c18d1199c38c80a9dc9 Mon Sep 17 00:00:00 2001 From: Sijmen Schoon Date: Tue, 24 Apr 2018 02:32:22 +0200 Subject: [PATCH] Add start, finish, deliver and accept commands. Hacky for now, will clean up later. --- api/stories.py | 12 ++++++++++-- commands/stories.py | 6 ++++-- pivotalcli.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/api/stories.py b/api/stories.py index ba45c60..1ed8d08 100644 --- a/api/stories.py +++ b/api/stories.py @@ -9,6 +9,14 @@ def get(token: str, story_id: int = None) -> Dict[str, Any]: return r.json() +def put_story(token: str, story_id: int, **kwargs) -> Dict[str, Any]: + r = requests.put( + f'https://www.pivotaltracker.com/services/v5/stories/{story_id}', + headers={'X-TrackerToken': token}, json=kwargs) + print(r.text) + return r.json() + + def get_tasks(token: str, project_id: int, story_id: int) \ -> List[Dict[str, Any]]: r = requests.get( @@ -28,6 +36,6 @@ def get_comments(token: str, project_id: int, story_id: int) \ def get_blockers(token: str, project_id: int, story_id: int) \ -> List[Dict[str, Any]]: r = requests.get( - f'https://www.pivotaltracker.com/services/v5/projects/{project_id}' - f'/stories/{story_id}/blockers', headers={'X-TrackerToken': token}) + f'https://www.pivotaltracker.com/services/v5/projects/{project_id}' + f'/stories/{story_id}/blockers', headers={'X-TrackerToken': token}) return r.json() diff --git a/commands/stories.py b/commands/stories.py index 723079b..514cdf3 100644 --- a/commands/stories.py +++ b/commands/stories.py @@ -52,6 +52,8 @@ def __format_story(story: Dict[str, Any], persons: Persons, totals: Totals) \ value = f'\033[96m{value}\033[97m' initials.append(value) + type_ = story['story_type'] + estimate = story.get('estimate') if estimate: for owner_id in owner_ids: @@ -65,7 +67,7 @@ def __format_story(story: Dict[str, Any], persons: Persons, totals: Totals) \ owners = ', '.join(initials) state = _format_state(story['current_state']) - return code, story['story_type'], story['name'], owners, state, estimate + return code, type_, story['name'], owners, state, estimate def __print_stories(stories: List[Dict[str, Any]], persons: Persons, @@ -82,7 +84,7 @@ def __print_totals(totals: Totals, persons: Persons) -> None: headers = ('Owner', *state_headers, 'Total', 'Progress') data = [__get_row(item, persons) for item in totals.items()] - data.sort(key=lambda row: row[-2]) + data.sort(key=lambda row: row[-2], reverse=True) print(tabulate.tabulate(data, headers), end='\n\n') diff --git a/pivotalcli.py b/pivotalcli.py index 1ddb9b6..b6ab9dc 100755 --- a/pivotalcli.py +++ b/pivotalcli.py @@ -3,8 +3,32 @@ import argparse import commands.login as cmd_login import commands.projects as cmd_projects import commands.stories as cmd_stories +import api.stories from config import Config +from base32_crockford import decode as b32_decode + + +def start_story(args) -> None: + story_set_state(args.story, 'finished') + + +def finish_story(args) -> None: + story_set_state(args.story, 'finished') + + +def deliver_story(args) -> None: + story_set_state(args.story, 'delivered') + + +def accept_story(args) -> None: + story_set_state(args.story, 'accepted') + + +def story_set_state(args, state: str) -> None: + token = Config['user']['api_token'] + story_id = b32_decode(args.story) + api.stories.put_story(token, story_id, current_state=state) def parse_arguments() -> None: @@ -43,6 +67,26 @@ def parse_arguments() -> None: stories_parser.add_argument('--hide-accepted', nargs='?', type=bool, const=True, default=False) + story_start_parser = commands.add_parser('start') + story_start_parser.set_defaults( + func=lambda args: story_set_state(args, 'started')) + story_start_parser.add_argument('story', type=str) + + story_finish_parser = commands.add_parser('finish') + story_finish_parser.set_defaults( + func=lambda args: story_set_state(args, 'finished')) + story_finish_parser.add_argument('story', type=str) + + story_deliver_parser = commands.add_parser('deliver') + story_deliver_parser.set_defaults( + func=lambda args: story_set_state(args, 'delivered')) + story_deliver_parser.add_argument('story', type=str) + + story_accept_parser = commands.add_parser('accept') + story_accept_parser.set_defaults( + func=lambda args: story_set_state(args, 'accepted')) + story_accept_parser.add_argument('story', type=str) + args = parser.parse_args() args.func(args)