tableau / document-api-python

Create and modify Tableau workbook and datasource files
https://tableau.github.io/document-api-python/
MIT License
326 stars 178 forks source link

Add None check for xml data #166

Closed kgoedecke closed 3 years ago

kgoedecke commented 5 years ago

I ran into some issues while parsing bigger tableau files and received this error:

  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/workbook.py", line 30, in __init__
    self._workbookRoot, self._datasource_index
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/workbook.py", line 115, in _prepare_worksheets
    if column_name in datasource.fields:
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 228, in fields
    self._fields = self._get_all_fields()
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 239, in _get_all_fields
    return FieldDictionary({k: v for k, v in field_objects})
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 239, in <dictcomp>
    return FieldDictionary({k: v for k, v in field_objects})
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 236, in <genexpr>
    metadata_only_field_objects = (x for x in self._get_metadata_objects() if x.id not in existing_column_fields)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 243, in <genexpr>
    for x in self._datasourceTree.findall(".//metadata-record[@class='column']"))
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/datasource.py", line 59, in _column_object_from_metadata_xml
    field_object = Field.from_metadata_xml(metadata_xml)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/field.py", line 86, in from_metadata_xml
    return cls(metadata_xml=xmldata)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/field.py", line 54, in __init__
    self._initialize_from_metadata_xml(metadata_xml)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/field.py", line 66, in _initialize_from_metadata_xml
    read_name=metadata_name)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/field.py", line 94, in _apply_attribute
    value = default_func(attrib)
  File "/Users/kevin/.local/share/virtualenvs/tableaudiff-backend-gX1urzmf/lib/python3.7/site-packages/tableaudocumentapi/field.py", line 65, in <lambda>
    self._apply_attribute(xmldata, field_name, lambda x: xmldata.find('.//{}'.format(metadata_name)).text,
AttributeError: 'NoneType' object has no attribute 'text'

This PR adds a check for empty (None) and fixes the issue.

jacalata commented 4 years ago

Hi kgoedecke - have you signed our contributes CLA? http://tableau.github.io/contributing.html

kgoedecke commented 3 years ago

Closing since not interesting in signing CLA