Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix filepath handling in Get command #277

Merged
merged 2 commits into from
Feb 22, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 16 additions & 16 deletions tabcmd/commands/datasources_and_workbooks/get_url_command.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import inspect
import os

import tableauserverclient as TSC
from tableauserverclient import ServerResponseError
Expand Down Expand Up @@ -80,7 +81,7 @@ def explain_expected_url(logger, url: str, command: str):
def get_file_type_from_filename(logger, url, file_name):
logger.debug("Choosing between {}, {}".format(file_name, url))
file_name = file_name or url
logger.debug(_("get.options.file") + ": {}".format(file_name))
logger.debug(_("get.options.file") + ": {}".format(file_name)) # Name to save the file as
type_of_file = GetUrl.get_file_extension(file_name)

if not type_of_file and file_name is not None:
Expand All @@ -98,25 +99,24 @@ def get_file_type_from_filename(logger, url, file_name):
Errors.exit_with_error(logger, _("tabcmd.get.extension.not_found").format(file_name))

@staticmethod
def get_file_extension(filename):
parts = filename.split(".")
if len(parts) < 2:
return None
extension = parts[1]
def get_file_extension(path):
path_segments = os.path.split(path)
filename = path_segments[-1]
filename_segments = filename.split(".")
extension = filename_segments[-1]
extension = GetUrl.strip_query_params(extension)
return extension

@staticmethod
def strip_query_params(filename):
if filename.find("?") > 0:
filename = filename.split("?")[0]
return filename
if "?" in filename:
return filename.split("?")[0]
else:
return filename

@staticmethod
def get_name_without_possible_extension(filename):
if filename.find(".") > 0:
filename = filename.split(".")[0]
return filename
return filename.split(".")[0]

@staticmethod
def get_resource_name(url: str, logger): # workbooks/wb-name" -> "wb-name", datasource/ds-name -> ds-name
Expand Down Expand Up @@ -181,7 +181,7 @@ def generate_pdf(logger, server, args, view_url):
filename = GetUrl.filename_from_args(args.filename, view_item.name, "pdf")
DatasourcesAndWorkbooks.save_to_file(logger, view_item.pdf, filename)
except Exception as e:
Errors.exit_with_error(logger, e)
Errors.exit_with_error(logger, exception=e)

@staticmethod
def generate_png(logger, server, args, view_url):
Expand All @@ -195,7 +195,7 @@ def generate_png(logger, server, args, view_url):
filename = GetUrl.filename_from_args(args.filename, view_item.name, "png")
DatasourcesAndWorkbooks.save_to_file(logger, view_item.image, filename)
except Exception as e:
Errors.exit_with_error(logger, e)
Errors.exit_with_error(logger, exception=e)

@staticmethod
def generate_csv(logger, server, args, view_url):
Expand Down Expand Up @@ -226,7 +226,7 @@ def generate_twb(logger, server, args, file_extension, url):
server.workbooks.download(target_workbook.id, filepath=file_name_with_path, no_extract=False)
logger.info(_("export.success").format(target_workbook.name, file_name_with_ext))
except Exception as e:
Errors.exit_with_error(logger, e)
Errors.exit_with_error(logger, exception=e)

@staticmethod
def generate_tds(logger, server, args, file_extension):
Expand All @@ -243,4 +243,4 @@ def generate_tds(logger, server, args, file_extension):
server.datasources.download(target_datasource.id, filepath=file_name_with_path, no_extract=False)
logger.info(_("export.success").format(target_datasource.name, file_name_with_ext))
except Exception as e:
Errors.exit_with_error(logger, e)
Errors.exit_with_error(logger, exception=e)
2 changes: 0 additions & 2 deletions tabcmd/commands/datasources_and_workbooks/publish_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,6 @@ def run_command(args):

new_workbook = TSC.WorkbookItem(project_id, name=args.name, show_tabs=args.tabbed)
try:
if creds:
logger.debug("Workbook credentials object: " + str(creds))
new_workbook = server.workbooks.publish(
new_workbook,
args.filename,
Expand Down
3 changes: 1 addition & 2 deletions tests/commands/test_execution.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import argparse
import sys
import unittest
import mock
import unittest.mock as mock
from tabcmd.execution.logger_config import *
from tabcmd.execution.tabcmd_controller import TabcmdController

Expand Down
26 changes: 24 additions & 2 deletions tests/commands/test_geturl_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,23 @@
fake_item.id = "fake-id"


class GeturlTests(unittest.TestCase):
class FileHandling(unittest.TestCase):

# get_file_type_from_filename(logger, url, filename)
# get_file_extension(filepath)
# evaluate_content_type(logger, url)
# strip_query_params(filename)
# get_name_without_possible_extension(fileanme)
# get_resource_name(url, logger)
# get_view_url(url, logger)
# filename_from_args(file_arg, item_name, filetype)

def test_get_view_with_chars_in_save_name(self):
filename = "C:\\chase.culver\\docs\\downloaded.twbx" # W-13757625 fails if file path contains .
url = None
filetype = GetUrl.get_file_type_from_filename(mock_logger, filename, url)
assert filetype == "twbx", filetype

def test_evaluate_file_name_pdf(self):
filename = "filename.pdf"
url = None
Expand Down Expand Up @@ -59,6 +75,9 @@ def test_get_view_without_extension_that_doesnt_have_one(self):
filename = "viewname"
assert GetUrl.get_name_without_possible_extension(filename) == filename


# handling our specific url-ish identifiers: /workbook/wb-name, etc
class GeturlTests(unittest.TestCase):
def test_get_workbook_name(self):
assert GetUrl.get_resource_name("workbooks/wbname", mock_logger) == "wbname"

Expand All @@ -69,9 +88,12 @@ def test_view_name_with_url_params(self):
assert GetUrl.get_view_url("views/wb-name/view-name?:refresh=y", None) == "wb-name/sheets/view-name"

"""
GetUrl.get_view_without_extension(view_name)
GetUrl.get_view(url)
GetUrl.get_view_without_extension(view_name)
GetUrl.get_workbook(url)
"""

"""
GetUrl.generate_twb(logger, server, args)
GetUrl.generate_pdf(logger, server, args)
GetUrl.generate_png(logger, server, args)
Expand Down
2 changes: 2 additions & 0 deletions tests/commands/test_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def _set_mocks_for_json_file_exists(mock_path, mock_json_lib, does_it_exist=True
mock_json_lib.load.return_value = None
return path


def _set_mock_file_content(mock_load, expected_content):
mock_load.return_value = expected_content
return mock_load
Expand Down Expand Up @@ -120,6 +121,7 @@ def test_json_invalid(self, mock_open, mock_path, mock_json):
test_session = Session()
assert test_session.username is None


@mock.patch("getpass.getpass")
class BuildCredentialsTests(unittest.TestCase):
@classmethod
Expand Down
10 changes: 7 additions & 3 deletions tests/e2e/online_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
site_admin = True
project_admin = True
extract_encryption_enabled = False
use_tabcmd_classic = False # toggle between testing using tabcmd 2 or tabcmd classic
use_tabcmd_classic = False # toggle between testing using tabcmd 2 or tabcmd classic


def _test_command(test_args: list[str]):
Expand All @@ -49,7 +49,11 @@ def _test_command(test_args: list[str]):

# call the executable directly: lets us drop in classic tabcmd
if use_tabcmd_classic:
calling_args = ["C:\\Program Files\\Tableau\\Tableau Server\\2023.3\\extras\\Command Line Utility\\tabcmd.exe"] + test_args + ["--no-certcheck"]
calling_args = (
["C:\\Program Files\\Tableau\\Tableau Server\\2023.3\\extras\\Command Line Utility\\tabcmd.exe"]
+ test_args
+ ["--no-certcheck"]
)
if database_password not in calling_args:
print(calling_args)
return subprocess.check_call(calling_args)
Expand Down Expand Up @@ -312,7 +316,7 @@ def test_list_workbooks(self):
self._list("workbooks")

@pytest.mark.order(8)
def test_list_workbooks(self):
def test_list_datasources(self):
if use_tabcmd_classic:
pytest.skip("not for tabcmd classic")
self._list("datasources")
Expand Down