Repository navigation
Conversation
…esiteusers, removeusers - listsites: show site content_url instead of internal UUID for SITEID - deletegroup: log group name instead of UUID in delete status message - export/save_to_file: pass filename as content name to fix double-space in "Saved to '...'" message - createsiteusers: append str(e) to error_list instead of e.__class__.__name__ so error details show readable messages - removeusers: use new tabcmd.removeusers.group string key that includes the group name in the status message Fixes #429 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ebug noise - logger_config.py: add ===== prefix to INFO format so all action lines match tabcmd 1 style in one place - session.py: remove hardcoded ===== from _print_server_info lines (now added by formatter); demote "Fetched user details from server" to debug - constants.py: demote tabcmd.debug.error_message log call from info to debug so it no longer appears in normal output - delete_command.py: default content_type to "workbook" in status message to fix double-space when type is undetected - tabcmd_messages_en.properties: remove hardcoded ===== from tabcmd.listing.header (would double-prefix with formatter) Closes remaining items from #429 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Avoids the ===== prefix being applied to the version/help display. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Plain output is the default. Set TABCMD_CLASSIC_OUTPUT=true (or 1/yes) to restore the ===== prefix on all INFO-level messages for backward compatibility with tabcmd 1 output style. Also moves the version banner in tabcmd_controller to print() so it is never prefixed regardless of mode. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The condition compared logging_level string 'INFO' to the integer logging.INFO (20), which was always True, causing the print to fire on every invocation. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
session.login string already existed; add logger.info call at the start of _sign_in() to surface it as a distinct step after connecting. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
@jacalata looks good - my only question, do we need |
Two follow-up fixes for parity with tabcmd Classic output:
- save_to_file/save_to_data_file previously passed filename twice into
the "Saved {0} to '{1}'" template, so both slots rendered the same
path. Classic output was "Saved <content-name> to '<destination>'"
where the two are distinct. Add a content_name parameter and thread
export_item.name / get_url_item.name from all four callers.
- TABCMD_CLASSIC_OUTPUT default flipped to true. The stated goal of
this PR is parity with tabcmd 1 output, and issue #429 item 8 lists
the missing "=====" prefix as a bug. Users who prefer the plainer
tabcmd 2 style can opt out with TABCMD_CLASSIC_OUTPUT=false.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Localization catalogs and delete/list output handling remain incomplete or incorrect.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 3
Open (4)
What changed in this PR
This PR standardizes tabcmd 2 output to match tabcmd 1, including classic prefixes, corrected identifiers, messages, logging levels, and export naming.
Changes:
- Added configurable classic INFO formatting.
- Corrected site, group, user, delete, login, and export messages.
- Added export filename/content-name tests and localization updates.
| File | Description |
|---|---|
tests/commands/test_geturl_utils.py |
Tests export success-message naming. |
tabcmd/locales/en/tabcmd_messages_en.properties |
Updates listing and remove-users messages. |
tabcmd/execution/tabcmd_controller.py |
Removes spurious logging output. |
tabcmd/execution/parent_parser.py |
Prints help directly. |
tabcmd/execution/logger_config.py |
Adds configurable classic prefixes. |
tabcmd/commands/user/remove_users_command.py |
Uses group-specific message key. |
tabcmd/commands/user/create_site_users.py |
Reports readable exceptions. |
tabcmd/commands/site/list_sites_command.py |
Displays site content URLs. |
tabcmd/commands/group/delete_group_command.py |
Displays group names. |
tabcmd/commands/datasources_and_workbooks/get_url_command.py |
Passes content names to save helpers. |
tabcmd/commands/datasources_and_workbooks/export_command.py |
Tracks exported content names. |
tabcmd/commands/datasources_and_workbooks/delete_command.py |
Avoids empty delete content types. |
tabcmd/commands/datasources_and_workbooks/datasources_and_workbooks_command.py |
Supports content-aware save messages. |
tabcmd/commands/constants.py |
Demotes error details to DEBUG. |
tabcmd/commands/auth/session.py |
Adjusts login and session output. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| tabcmd.refresh.options.bridge=Refresh datasource through Tableau Bridge | ||
| tabcmd.removeusers.help.group_name=The group to remove users from | ||
| tabcmd.removeusers.server=Removing users listed in {0} from the server... | ||
| tabcmd.removeusers.group=Removing users listed in {0} from the group ''{1}''... |
- delete_command.py: initialize item_to_delete before conditional; move delete.status log after item resolution so content_type/name are populated. - dodo.py: fix NameError in uniquify_file - reference unique_lines (the sorted list actually printed) instead of undefined uniques. - en properties: strip stray leading space in tabcmd.listing.header format string. - locales: regenerated .mo/.properties for all languages.
|
@copilot resolve the merge conflicts in this pull request |
…-messages # Conflicts: # tabcmd/locales/de/LC_MESSAGES/tabcmd.mo # tabcmd/locales/en/LC_MESSAGES/tabcmd.mo # tabcmd/locales/es/LC_MESSAGES/tabcmd.mo # tabcmd/locales/fr/LC_MESSAGES/tabcmd.mo # tabcmd/locales/ga/LC_MESSAGES/tabcmd.mo # tabcmd/locales/it/LC_MESSAGES/tabcmd.mo # tabcmd/locales/ja/LC_MESSAGES/tabcmd.mo # tabcmd/locales/ko/LC_MESSAGES/tabcmd.mo # tabcmd/locales/pt/LC_MESSAGES/tabcmd.mo # tabcmd/locales/sv/LC_MESSAGES/tabcmd.mo # tabcmd/locales/zh/LC_MESSAGES/tabcmd.mo Co-authored-by: bcantoni <58372+bcantoni@users.noreply.github.com>
Merged |
| logging.ERROR: "%(asctime)s %(levelname)-5s:(%(name)-10s %(filename)-10s: %(lineno)d): %(message)-30s", | ||
| logging.WARN: "%(asctime)s %(levelname)-5s: (%(name)-10s %(filename)-10s: %(lineno)d): %(message)-30s", | ||
| logging.INFO: "%(message)-30s", | ||
| logging.INFO: _INFO_FORMAT, |
There was a problem hiding this comment.
@jacalata please check this, I'm not sure the right answer
Co-authored-by: bcantoni <58372+bcantoni@users.noreply.github.com>


Closes items 1-9 in #429 (item #10, logout redirect, is not applicable with PAT auth).
Motivation
#429 catalogued a set of output-message bugs where tabcmd 2 diverged from tabcmd 1. Fixing them one at a time would be nine small PRs; the changes all touch the same formatter or locale-key wiring, so a single PR is fine.
Behavior change
For users:
=====prefix by default(item Creategroup command #8 in the issue). Users who prefer the plainer tabcmd 2 style can
opt out with
TABCMD_CLASSIC_OUTPUT=false.listsitesoutput shows human-readable SITEID instead of the site UUID.deletegroupstatus message uses the group name, not a UUID.createsiteuserserror list shows human-readable messages, not theraw exception class name.
removeusersuses the correct locale key (removeusers.group).double-space when content type is empty.
Signing in...status line, matching tabcmd 1.Saved X to 'Y'rendersX = content name,Y = destination path(previously both slots rendered the destination).
Fetched user details, error-message detail)demoted from INFO to DEBUG.
logging: INFOline no longer appears before everycommand (type mismatch:
namespace.logging_levelis the string"INFO"but was compared againstlogging.INFO, integer 20; alwaystruthy).
The
=====prefix is implemented via a singlelogger_config.pyformatter change so we don't have to edit every locale string.
Test plan
covering the
content_nameparametertabcmd login/tabcmd logoutwith default settingsproduce
=====-prefixed outputTABCMD_CLASSIC_OUTPUT=false tabcmd loginproduces plainoutput without the prefix
tabcmd listsitesshows human-readable SITEIDlogging: INFOline appears before command output🤖 Generated with Claude Code