Fix some style issues
This commit is contained in:
parent
4aa4b38617
commit
87789805fc
|
@ -1,20 +1,18 @@
|
||||||
import argparse
|
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
import base32_crockford
|
import base32_crockford as base32
|
||||||
|
|
||||||
import api.stories
|
import api.stories
|
||||||
from config import Config
|
from config import Config
|
||||||
from util import print_wrap
|
from util import print_wrap
|
||||||
|
|
||||||
from . import (COLOR_HEADER, COLOR_TITLE, COLOR_WHITE, _format_state,
|
from . import (COLOR_HEADER, COLOR_TITLE, COLOR_WHITE, _format_state,
|
||||||
_get_persons)
|
_get_persons)
|
||||||
|
|
||||||
|
|
||||||
def __print_story(story: Dict[str, Any], persons: Dict[int, Any]) -> None:
|
def __print_story(story: Dict[str, Any]) -> None:
|
||||||
"""
|
"""
|
||||||
Prints the title, the current state and the estimate of the story, if
|
Prints the title, the current state and the estimate of the story, if
|
||||||
available.
|
available.
|
||||||
|
@ -25,7 +23,12 @@ def __print_story(story: Dict[str, Any], persons: Dict[int, Any]) -> None:
|
||||||
|
|
||||||
if 'current_state' in story:
|
if 'current_state' in story:
|
||||||
state = _format_state(story['current_state'])
|
state = _format_state(story['current_state'])
|
||||||
COLOR_HEADER.print('State:', state, end='\n\n')
|
COLOR_HEADER.print('State:', state, end='')
|
||||||
|
|
||||||
|
if story['current_state'] == 'accepted':
|
||||||
|
print(f" (at {story['accepted_at']})", end='')
|
||||||
|
|
||||||
|
print(end='\n\n')
|
||||||
|
|
||||||
if 'estimate' in story:
|
if 'estimate' in story:
|
||||||
COLOR_HEADER.print('Estimate: ', end='')
|
COLOR_HEADER.print('Estimate: ', end='')
|
||||||
|
@ -84,7 +87,7 @@ def __print_tasks(token: str, project_id: int, story_id: int) -> None:
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
print(end=' ')
|
print(end=' ')
|
||||||
print('[X]' if task['complete'] else '[ ]', end=' \033[34m')
|
print('[X]' if task['complete'] else '[ ]', end=' \033[34m')
|
||||||
print(base32_crockford.encode(task['id']), end=':\033[0m ')
|
print(base32.encode(task['id']), end=':\033[0m ')
|
||||||
print(task['description'])
|
print(task['description'])
|
||||||
|
|
||||||
print()
|
print()
|
||||||
|
@ -120,7 +123,7 @@ def __print_blockers(token: str, project_id: int, story_id: int) -> None:
|
||||||
|
|
||||||
def blocker_repl(matchgroup: Any) -> str:
|
def blocker_repl(matchgroup: Any) -> str:
|
||||||
id = int(matchgroup.group(1))
|
id = int(matchgroup.group(1))
|
||||||
code = base32_crockford.encode(id)
|
code = base32.encode(id)
|
||||||
return COLOR_HEADER.format(code)
|
return COLOR_HEADER.format(code)
|
||||||
|
|
||||||
pattern = re.compile(r'#(\d+)')
|
pattern = re.compile(r'#(\d+)')
|
||||||
|
@ -130,19 +133,19 @@ def __print_blockers(token: str, project_id: int, story_id: int) -> None:
|
||||||
print(f' [{resolved}] {desc}')
|
print(f' [{resolved}] {desc}')
|
||||||
|
|
||||||
|
|
||||||
def _stories_info(story: str) -> None:
|
def stories_info(story: str) -> None:
|
||||||
try:
|
try:
|
||||||
token = Config['user']['api_token']
|
token = Config['user']['api_token']
|
||||||
except KeyError:
|
except KeyError:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
story_id = base32_crockford.decode(story)
|
story_id = base32.decode(story)
|
||||||
story = api.stories.get(token, story_id)
|
story = api.stories.get(token, story_id)
|
||||||
|
|
||||||
project_id = story['project_id']
|
project_id = story['project_id']
|
||||||
persons = _get_persons(token, project_id)
|
persons = _get_persons(token, project_id)
|
||||||
|
|
||||||
__print_story(story, persons)
|
__print_story(story)
|
||||||
__print_owners(story, persons)
|
__print_owners(story, persons)
|
||||||
__print_description(story)
|
__print_description(story)
|
||||||
__print_labels(story)
|
__print_labels(story)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import click
|
import click
|
||||||
|
|
||||||
|
|
||||||
@click.group()
|
@click.group()
|
||||||
def cli():
|
def cli():
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import sys
|
import sys
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
|
||||||
import base32_crockford
|
import base32_crockford as base32
|
||||||
import click
|
import click
|
||||||
import tabulate
|
import tabulate
|
||||||
|
|
||||||
|
@ -20,18 +20,18 @@ def projects(context: click.Context) -> None:
|
||||||
# invoked as well. In this case, do nothing.
|
# invoked as well. In this case, do nothing.
|
||||||
return
|
return
|
||||||
|
|
||||||
projects = api.projects.get(Config['user']['api_token'])
|
projects_ = api.projects.get(Config['user']['api_token'])
|
||||||
projects.sort(key=lambda project: project['name'])
|
projects_.sort(key=lambda project_: project_['name'])
|
||||||
|
|
||||||
aliases: Dict[int, str] = {}
|
aliases: Dict[int, str] = {}
|
||||||
for alias, alias_id in Config['project_aliases'].items():
|
for alias_, alias_id in Config['project_aliases'].items():
|
||||||
aliases[int(alias_id)] = alias
|
aliases[int(alias_id)] = alias_
|
||||||
|
|
||||||
table = []
|
table = []
|
||||||
for project in sorted(projects, key=lambda a: a['name']):
|
for project in sorted(projects_, key=lambda project_: project_['name']):
|
||||||
code = base32_crockford.encode(project['id'])
|
code = base32.encode(project['id'])
|
||||||
alias = aliases.get(project['id'])
|
alias_ = aliases.get(project['id'])
|
||||||
table.append((code, project['name'], alias))
|
table.append((code, project['name'], alias_))
|
||||||
|
|
||||||
print(tabulate.tabulate(table, headers=('Code', 'Name', 'Alias')))
|
print(tabulate.tabulate(table, headers=('Code', 'Name', 'Alias')))
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ def alias() -> None:
|
||||||
@click.argument('code')
|
@click.argument('code')
|
||||||
@click.argument('name')
|
@click.argument('name')
|
||||||
def alias_add(code: str, name: str) -> None:
|
def alias_add(code: str, name: str) -> None:
|
||||||
project_id = base32_crockford.decode(code)
|
project_id = base32.decode(code)
|
||||||
Config['project_aliases'][name] = str(project_id)
|
Config['project_aliases'][name] = str(project_id)
|
||||||
Config.write()
|
Config.write()
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ from collections import defaultdict
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Any, DefaultDict, Dict, List, Sequence, Tuple, Optional
|
from typing import Any, DefaultDict, Dict, List, Sequence, Tuple, Optional
|
||||||
|
|
||||||
import base32_crockford
|
import base32_crockford as base32
|
||||||
import tabulate
|
import tabulate
|
||||||
|
|
||||||
import api.projects
|
import api.projects
|
||||||
|
@ -13,7 +13,7 @@ from config import Config
|
||||||
from util import require_login
|
from util import require_login
|
||||||
|
|
||||||
from . import COLOR_HEADER, _format_state, _get_persons
|
from . import COLOR_HEADER, _format_state, _get_persons
|
||||||
from ._stories_info import _stories_info
|
from ._stories_info import stories_info
|
||||||
from .cli import cli
|
from .cli import cli
|
||||||
|
|
||||||
STATES = 'unstarted', 'planned', 'started', 'finished', 'delivered', 'accepted'
|
STATES = 'unstarted', 'planned', 'started', 'finished', 'delivered', 'accepted'
|
||||||
|
@ -23,7 +23,8 @@ Persons = Dict[int, Dict[str, Any]]
|
||||||
Totals = DefaultDict[int, Dict[str, int]]
|
Totals = DefaultDict[int, Dict[str, int]]
|
||||||
|
|
||||||
|
|
||||||
def __get_row(item: Tuple[int, Dict[str, int]], persons: Persons) -> Sequence:
|
def __get_row(item: Tuple[int, Dict[str, int]], persons: Persons,
|
||||||
|
show_accepted: bool) -> Sequence:
|
||||||
owner_id, points = item
|
owner_id, points = item
|
||||||
name = persons[owner_id]['name']
|
name = persons[owner_id]['name']
|
||||||
|
|
||||||
|
@ -34,15 +35,16 @@ def __get_row(item: Tuple[int, Dict[str, int]], persons: Persons) -> Sequence:
|
||||||
progress += f'\033[38;5;226m' + 'S' * round(points['started'])
|
progress += f'\033[38;5;226m' + 'S' * round(points['started'])
|
||||||
progress += f'\033[94m' + 'F' * round(points['finished'])
|
progress += f'\033[94m' + 'F' * round(points['finished'])
|
||||||
progress += f'\033[38;5;208m' + 'D' * round(points['delivered'])
|
progress += f'\033[38;5;208m' + 'D' * round(points['delivered'])
|
||||||
progress += f'\033[92m' + 'A' * round(points['accepted'])
|
if show_accepted:
|
||||||
|
progress += f'\033[92m' + 'A' * round(points['accepted'])
|
||||||
progress += '\033[0m]'
|
progress += '\033[0m]'
|
||||||
|
|
||||||
return (name, *estimates, sum(estimates), progress)
|
return name, (*estimates), sum(estimates), progress
|
||||||
|
|
||||||
|
|
||||||
def __format_story(story: Dict[str, Any], persons: Persons, totals: Totals) \
|
def __format_story(story: Dict[str, Any], persons: Persons, totals: Totals) \
|
||||||
-> Tuple[str, str, str, str, str, int]:
|
-> Tuple[str, str, str, str, str, int]:
|
||||||
code = base32_crockford.encode(story['id'])
|
code = base32.encode(story['id'])
|
||||||
|
|
||||||
is_owner = False
|
is_owner = False
|
||||||
initials = []
|
initials = []
|
||||||
|
@ -72,26 +74,29 @@ def __format_story(story: Dict[str, Any], persons: Persons, totals: Totals) \
|
||||||
return code, type_, story['name'], owners, state, estimate
|
return code, type_, story['name'], owners, state, estimate
|
||||||
|
|
||||||
|
|
||||||
def __print_stories(stories: List[Dict[str, Any]], persons: Persons,
|
def __print_stories(stories_: List[Dict[str, Any]], persons: Persons,
|
||||||
totals: Totals) -> None:
|
totals: Totals, show_accepted: bool) -> None:
|
||||||
table = [__format_story(story, persons, totals) for story in stories]
|
table = (__format_story(story, persons, totals) for story in stories_
|
||||||
|
if show_accepted or story['current_state'] != 'accepted')
|
||||||
headers = 'Code', 'Type', 'Story name', 'Owners', 'State', 'Pts'
|
headers = 'Code', 'Type', 'Story name', 'Owners', 'State', 'Pts'
|
||||||
print(tabulate.tabulate(table, headers=headers), end='\n\n')
|
print(tabulate.tabulate(table, headers=headers), end='\n\n')
|
||||||
|
|
||||||
|
|
||||||
def __print_totals(totals: Totals, persons: Persons) -> None:
|
def __print_totals(totals: Totals, persons: Persons, show_accepted: bool) \
|
||||||
|
-> None:
|
||||||
COLOR_HEADER.print('Point totals:', end='\n\n')
|
COLOR_HEADER.print('Point totals:', end='\n\n')
|
||||||
|
|
||||||
state_headers = [_format_state(state) for state in STATES]
|
state_headers = [_format_state(state) for state in STATES]
|
||||||
headers = ('Owner', *state_headers, 'Total', 'Progress')
|
headers = ('Owner', *state_headers, 'Total', 'Progress')
|
||||||
|
|
||||||
data = [__get_row(item, persons) for item in totals.items()]
|
data = sorted((__get_row(item, persons, show_accepted)
|
||||||
data.sort(key=lambda row: row[-2], reverse=True)
|
for item in totals.items()),
|
||||||
|
key=lambda row: row[-2], reverse=True)
|
||||||
print(tabulate.tabulate(data, headers), end='\n\n')
|
print(tabulate.tabulate(data, headers), end='\n\n')
|
||||||
|
|
||||||
|
|
||||||
def __print_burndown(token: str, iteration: Dict[str, Any], persons: Persons,
|
def __print_burndown(token: str, iteration: Dict[str, Any],
|
||||||
hide_accepted: bool = False) -> None:
|
show_accepted: bool) -> None:
|
||||||
COLOR_HEADER.print('Burndown:', end='\n\n')
|
COLOR_HEADER.print('Burndown:', end='\n\n')
|
||||||
|
|
||||||
start = datetime.strptime(iteration['start'], '%Y-%m-%dT%H:%M:%SZ')
|
start = datetime.strptime(iteration['start'], '%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
@ -114,7 +119,7 @@ def __print_burndown(token: str, iteration: Dict[str, Any], persons: Persons,
|
||||||
|
|
||||||
progress = ''
|
progress = ''
|
||||||
|
|
||||||
if not hide_accepted:
|
if show_accepted:
|
||||||
progress += '\033[92m' + 'A' * round(counts[0] - accepted_points)
|
progress += '\033[92m' + 'A' * round(counts[0] - accepted_points)
|
||||||
|
|
||||||
progress += '\033[38;5;208m' + 'D' * round(counts[1])
|
progress += '\033[38;5;208m' + 'D' * round(counts[1])
|
||||||
|
@ -132,7 +137,7 @@ def _stories_current(project: str, scope: str, show_accepted: bool) -> None:
|
||||||
try:
|
try:
|
||||||
project_id = int(Config['project_aliases'][project])
|
project_id = int(Config['project_aliases'][project])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
project_id = base32_crockford.decode(project)
|
project_id = base32.decode(project)
|
||||||
|
|
||||||
token = Config['user']['api_token']
|
token = Config['user']['api_token']
|
||||||
|
|
||||||
|
@ -147,14 +152,14 @@ def _stories_current(project: str, scope: str, show_accepted: bool) -> None:
|
||||||
totals: DefaultDict[int, Dict[str, int]] = \
|
totals: DefaultDict[int, Dict[str, int]] = \
|
||||||
defaultdict(lambda: dict((state, 0) for state in STATES))
|
defaultdict(lambda: dict((state, 0) for state in STATES))
|
||||||
|
|
||||||
__print_stories(iteration['stories'], persons, totals)
|
__print_stories(iteration['stories'], persons, totals, show_accepted)
|
||||||
__print_totals(totals, persons)
|
__print_totals(totals, persons, show_accepted)
|
||||||
__print_burndown(token, iteration, persons, not show_accepted)
|
__print_burndown(token, iteration, show_accepted)
|
||||||
|
|
||||||
|
|
||||||
def _set_story_state(story: str, state: str) -> None:
|
def _set_story_state(story: str, state: str) -> None:
|
||||||
token = Config['user']['api_token']
|
token = Config['user']['api_token']
|
||||||
story_id = base32_crockford.decode(story)
|
story_id = base32.decode(story)
|
||||||
api.stories.put_story(token, story_id, current_state=state)
|
api.stories.put_story(token, story_id, current_state=state)
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,6 +177,6 @@ def stories(project: str, story: Optional[str], scope: str,
|
||||||
if set_state is not None:
|
if set_state is not None:
|
||||||
_set_story_state(story, set_state)
|
_set_story_state(story, set_state)
|
||||||
else:
|
else:
|
||||||
_stories_info(story)
|
stories_info(story)
|
||||||
else:
|
else:
|
||||||
_stories_current(project, scope, show_accepted)
|
_stories_current(project, scope, show_accepted)
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
click=6.7
|
||||||
appnope==0.1.0
|
appnope==0.1.0
|
||||||
astroid==1.6.1
|
astroid==1.6.1
|
||||||
autopep8==1.3.4
|
autopep8==1.3.4
|
||||||
|
@ -35,4 +36,3 @@ urllib3==1.22
|
||||||
urwid==2.0.1
|
urwid==2.0.1
|
||||||
wcwidth==0.1.7
|
wcwidth==0.1.7
|
||||||
wrapt==1.10.11
|
wrapt==1.10.11
|
||||||
click=6.7
|
|
||||||
|
|
Loading…
Reference in New Issue