Skip to content

Commit

Permalink
Fixes #1033: Ensure unsupported TSV format (from underlying frictionl…
Browse files Browse the repository at this point in the history
…ess library) is ignored to allow successful export of TSV formatted packages.
  • Loading branch information
mattRedBox committed Jul 24, 2020
1 parent 01a7aa7 commit 651b62d
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 20 deletions.
30 changes: 18 additions & 12 deletions src/renderer/frictionlessDataPackage.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ import tabStore from '@/store/modules/tabs.js'
import hotStore from '@/store/modules/hots.js'
import path from 'path'
import { createJsonFile, createZipFile } from '@/exportPackage.js'
import { getValidNames, hasAllColumnNames, addCauseToErrorMessage } from '@/frictionlessUtilities.js'
import {
getValidNames,
hasAllColumnNames,
addErrorCauseToMessage,
handleFrictionlessError
} from './frictionlessUtilities'
import _ from 'lodash'

export async function createDataPackageAsZippedResources () {
Expand All @@ -25,7 +30,7 @@ export async function createDataPackage (postCreateFunc) {
try {
let dataPackage = await buildDataPackage(errorMessages)
if (_.isEmpty(errorMessages) && dataPackage) {
dataPackage.commit()
commitPackage(dataPackage)
if (dataPackage.valid) {
postCreateFunc(dataPackage.descriptor)
} else {
Expand All @@ -34,20 +39,27 @@ export async function createDataPackage (postCreateFunc) {
}
} catch (err) {
let errorMessage = 'There was an error creating the data package.'
let errorMessageAndCause = addCauseToErrorMessage(err, errorMessage)
errorMessages.push(errorMessageAndCause)
errorMessages.push(addErrorCauseToMessage(err, errorMessage))
console.error(errorMessage, err)
}
return errorMessages
}

export function commitPackage (dataPackage) {
try {
dataPackage.commit()
} catch (err) {
handleFrictionlessError(err)
}
}

export function haveAllTabsGotFilenames () {
return tabStore.getters.getTabFilenames(tabStore.state).length === tabStore.state.tabs.length
}

async function buildDataPackage (errorMessages) {
auditPackageRequirements(errorMessages)
let dataPackage = await initPackage()
let dataPackage = await Package.load()
await buildAllResourcesForDataPackage(dataPackage, errorMessages)
// adding package properties for validation only
addPackageProperties(dataPackage.descriptor)
Expand All @@ -72,11 +84,6 @@ function auditPackageRequirements (requiredMessages) {
}
}

async function initPackage () {
const dataPackage = await Package.load()
return dataPackage
}

function addPackageProperties (descriptor) {
let packageProperties = _.cloneDeep(hotStore.state.packageProperties)
_.merge(descriptor, packageProperties)
Expand All @@ -102,8 +109,7 @@ async function buildAllResourcesForDataPackage (dataPackage, errorMessages) {
dataPackage.addResource(resource.descriptor)
} catch (err) {
let errorMessage = 'There was an error creating a resource.'
let errorMessageAndCause = addCauseToErrorMessage(err, errorMessage)
errorMessages.push(errorMessageAndCause)
errorMessages.push(addErrorCauseToMessage(err, errorMessage))
console.error(errorMessage, err)
break
}
Expand Down
59 changes: 51 additions & 8 deletions src/renderer/frictionlessUtilities.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import store from '@/store/modules/hots.js'
import { DEFAULT_DIALECT } from 'datapackage/lib/config.js'
import { TableSchemaError } from 'datapackage'
import _ from 'lodash'

const errorMatchMappings = [
{
errorClass: TableSchemaError,
messagePatterns: [/Tabular format.*tsv.*is not supported/gi]
}
]

export function includeHeadersInData (hot) {
let allData = hot.getData()
if (hot.hasColHeaders()) {
Expand Down Expand Up @@ -46,16 +54,51 @@ export function isCaseSensitive (hotId) {
return caseSensitiveHeader
}

export function addCauseToErrorMessage (err, errorMessage) {
let extraErrorMessage = _.trim(_.get(err, 'message', ''))
if (_.isEmpty(extraErrorMessage)) {
if (_.isArray(err) && !_.isEmpty(err)) {
extraErrorMessage = _.trim(_.get(err[0], 'message', ''))
}
export function handleFrictionlessError (error) {
if (!isErrorWhitelisted(error)) {
throw error
} else {
console.warn('Recovered from frictionless library problem.', error)
}
}

export function isErrorWhitelisted (error) {
let isWhiteListed = false
let extraErrorMessage = extractMessageFromFrictionlessError(error)
if (!_.isEmpty(extraErrorMessage)) {
errorMessage = `${errorMessage}\n (${extraErrorMessage})`
_.each(errorMatchMappings, function (next) {
if (error instanceof next.errorClass) {
for (const messagePattern of next.messagePatterns) {
let indexFound = extraErrorMessage.search(messagePattern)
if (indexFound > -1) {
isWhiteListed = true
break
}
}
}
})
}
return isWhiteListed
}

export function addErrorCauseToMessage (error, errorMessage) {
let errorCauseMessage = extractMessageFromFrictionlessError(error)
return addExtraToErrorMessage(errorCauseMessage, errorMessage)
}

export function extractMessageFromFrictionlessError (error) {
let errorMessage = _.trim(_.get(error, 'message', ''))
if (_.isEmpty(errorMessage)) {
if (_.isArray(error) && !_.isEmpty(error)) {
errorMessage = _.trim(_.get(error[0], 'message', ''))
}
}
return errorMessage
}

export function addExtraToErrorMessage (extraMessage, errorMessage) {
if (!_.isEmpty(_.trim(extraMessage))) {
errorMessage = `${errorMessage}\n (${extraMessage})`
}
console.error(errorMessage, err)
return errorMessage
}

0 comments on commit 651b62d

Please sign in to comment.