Skip to content

Commit e90f633

Browse files
committed
TX-16599: Native push --verbose command group created, updated, skipped, failed strings
1 parent 82ac996 commit e90f633

File tree

1 file changed

+93
-34
lines changed
  • transifex/native/django/management/utils

1 file changed

+93
-34
lines changed

transifex/native/django/management/utils/push.py

Lines changed: 93 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import os
44
import sys
55
import time
6+
import json
67

78
from django import VERSION as DJANGO_VERSION
89
from django.conf import settings
@@ -295,59 +296,117 @@ def _show_collect_results(self):
295296
)
296297
Color.echo(file_list)
297298

299+
300+
def _print_verbose_group(self, label, items):
301+
"""Print one verbose group (Created/Updated/etc) in a readable format.
302+
303+
Accepts either:
304+
- list[dict] from API verbose payload, or
305+
- iterable[SourceString]-like objects (with .string, .key, .context,
306+
.occurrences)
307+
"""
308+
if not items:
309+
return
310+
311+
Color.echo(' [high]{label}:[end] [warn]{n}[end]'.format(
312+
label=label, n=len(items)
313+
))
314+
315+
for i, item in enumerate(items, 1):
316+
s = item.get('string', '')
317+
key = item.get('key', '')
318+
ctx = ', '.join(item.get('context', []) or [])
319+
occ = ', '.join(item.get('occurrences', []) or [])
320+
321+
Color.echo(f' [pink]{i}.[end] [green]"{s}"[end]')
322+
if key:
323+
Color.echo(f' [high]key:[end] "[yel]{key}[end]"')
324+
if ctx:
325+
Color.echo(f' [high]context:[end] {ctx}')
326+
if occ:
327+
Color.echo(f' [high]occurrences:[end] [file]{occ}[end]')
328+
298329
def _show_push_results(self, status_code, response_content):
299330
"""Display results of pushing the source strings to CDS.
300331
301332
:param int status_code: the HTTP status code
302333
:param dict response_content: the content of the response
303334
"""
304335
try:
305-
data = response_content.get('data')
336+
data = response_content.get('data', {})
306337
status = data.get('status')
307-
errors = data.get('errors', [])
338+
errors = data.get('errors', []) or []
308339
if status == 'completed':
309-
details = data.get('details')
310-
created = details.get('created')
311-
updated = details.get('updated')
312-
skipped = details.get('skipped')
313-
deleted = details.get('deleted')
314-
failed = details.get('failed')
340+
details = data.get('details', {}) or {}
341+
created = details.get('created', 0)
342+
updated = details.get('updated', 0)
343+
skipped = details.get('skipped', 0)
344+
deleted = details.get('deleted', 0)
345+
failed = details.get('failed', 0)
346+
verbose = details.get('verbose', {}) or {}
347+
315348
Color.echo(
316349
'[green]\nSuccessfully pushed strings to Transifex.[end]'
317350
)
318351

319-
if created > 0:
320-
Color.echo(
321-
'[high]Created strings:[end] '
322-
'[warn]{created}[end]'.format(created=created))
323-
324-
if updated > 0:
325-
Color.echo(
326-
'[high]Updated strings:[end] '
327-
'[warn]{updated}[end]'.format(updated=updated))
328-
329-
if skipped > 0:
330-
Color.echo(
331-
'[high]Skipped strings:[end] '
332-
'[warn]{skipped}[end]'.format(skipped=skipped))
333-
334-
if deleted > 0:
335-
Color.echo(
336-
'[high]Deleted strings:[end] '
337-
'[warn]{deleted}[end]'.format(deleted=deleted))
338-
339-
if failed > 0:
340-
Color.echo(
341-
'[high]Failed strings:[end] '
342-
'[warn]{failed}[end]'.format(failed=failed))
352+
if verbose and self.verbose_output:
353+
self._print_verbose_group(
354+
'Created strings',
355+
verbose.get('created')
356+
)
357+
self._print_verbose_group(
358+
'Updated strings',
359+
verbose.get('updated')
360+
)
361+
self._print_verbose_group(
362+
'Deleted strings',
363+
verbose.get('deleted')
364+
)
365+
self._print_verbose_group(
366+
'Skipped strings',
367+
verbose.get('skipped')
368+
)
369+
self._print_verbose_group(
370+
'Failed strings',
371+
verbose.get('failed')
372+
)
373+
else:
374+
375+
if created > 0:
376+
Color.echo(
377+
'[high]Created strings:[end] '
378+
'[warn]{created}[end]'.format(created=created))
379+
380+
if updated > 0:
381+
Color.echo(
382+
'[high]Updated strings:[end] '
383+
'[warn]{updated}[end]'.format(updated=updated))
384+
385+
if deleted > 0:
386+
Color.echo(
387+
'[high]Deleted strings:[end] '
388+
'[warn]{deleted}[end]'.format(deleted=deleted))
389+
390+
if skipped > 0:
391+
Color.echo(
392+
'[high]Skipped strings:[end] '
393+
'[warn]{skipped}[end]'.format(skipped=skipped))
394+
395+
if failed > 0:
396+
Color.echo(
397+
'[high]Failed strings:[end] '
398+
'[warn]{failed}[end]'.format(failed=failed))
399+
343400
else:
344401
Color.echo(
345402
'[error]\nCould not push strings to Transifex.[end]')
346403

347-
if len(errors) > 0:
404+
if errors:
348405
Color.echo(
349406
'[high]Errors:[end] {errors}[end]\n'.format(
350-
errors='\n'.join(errors)
407+
errors='\n'.join(
408+
[json.dumps(e) if not isinstance(e, str) else e for e in errors]
409+
)
351410
)
352411
)
353412
except Exception:

0 commit comments

Comments
 (0)