Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
59bd1db
Updade HTU snippets for custom tests in Catalog
henchaves Aug 7, 2023
ddbc319
Fix defaultValue as null
henchaves Aug 7, 2023
a112c3b
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 7, 2023
6758ac3
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 9, 2023
132e589
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 17, 2023
ff3ec53
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 25, 2023
3195b65
Make it possible to import TransformationFunction directly from giskard
henchaves Aug 25, 2023
10cd868
Add instructions to download sf and tf in test how to use code
henchaves Aug 25, 2023
1e6bfc7
Small changes to TestsCatalog selectedTestUsage content
henchaves Aug 25, 2023
ff24dda
Remove unused imported in TestsCatalog
henchaves Aug 25, 2023
9b80879
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 25, 2023
d193fea
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 25, 2023
47188b4
Ignore Python primitive types
henchaves Aug 28, 2023
0ac87b8
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 28, 2023
63d4e12
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
kevinmessiaen Aug 30, 2023
f805055
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 30, 2023
95605a7
Merge branch 'main' into feature/gsk-1506-code-snippet-for-pickled-fu…
henchaves Aug 30, 2023
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
92 changes: 66 additions & 26 deletions frontend/src/views/main/project/TestsCatalog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
</div>
</v-list-item-title>
<v-list-item-subtitle v-if='test.tags'>
<v-chip v-for='tag in alphabeticallySorted(test.tags)' :color='pasterColor(tag)' class='mr-2'
x-small>
<v-chip v-for='tag in alphabeticallySorted(test.tags)' :color='pasterColor(tag)' class='mr-2' x-small>
{{ tag }}
</v-chip>
</v-list-item-subtitle>
Expand All @@ -53,9 +52,7 @@
</div>

<div class='vc overflow-x-hidden pr-5'>
<v-alert v-if='selected.potentiallyUnavailable' border='left' color='warning' colored-border
icon='warning'
outlined>
<v-alert v-if='selected.potentiallyUnavailable' border='left' color='warning' colored-border icon='warning' outlined>
<span>This test is potentially unavailable. Start your external ML worker to display available tests.</span>
<pre></pre>
<StartWorkerInstructions />
Expand Down Expand Up @@ -88,14 +85,12 @@
<span class='group-title'>Inputs</span>
<v-spacer></v-spacer>
</div>
<SuiteInputListSelector :doc='doc' :editing='true' :inputs='inputType'
:modelValue='testArguments' :project-id='props.projectId' :test='selected' />
<SuiteInputListSelector :doc='doc' :editing='true' :inputs='inputType' :modelValue='testArguments' :project-id='props.projectId' :test='selected' />
<div class='d-flex'>
<v-spacer></v-spacer>
<v-menu offset-y>
<template v-slot:activator='{ on, attrs }'>
<v-btn class='primaryLightBtn' v-bind='attrs' color='primaryLight' small width='100'
:loading='testRunning' @click='() => runTest(true)'>
<v-btn class='primaryLightBtn' v-bind='attrs' color='primaryLight' small width='100' :loading='testRunning' @click='() => runTest(true)'>
<v-icon>arrow_right</v-icon>
<span class='pe-2'>Run</span>
<v-icon class='ps-2 primary-left-border' v-on='on' @click.stop>mdi-menu-down</v-icon>
Expand All @@ -105,9 +100,7 @@
<v-list-item>
<v-tooltip bottom>
<template v-slot:activator='{ on, attrs }'>
<v-btn color='secondary' text v-bind='attrs'
@click='() => runTest(false)'
v-on='on' :loading='testRunning'>
<v-btn color='secondary' text v-bind='attrs' @click='() => runTest(false)' v-on='on' :loading='testRunning'>
<v-icon>science</v-icon>
Run on whole dataset
</v-btn>
Expand All @@ -126,17 +119,15 @@
<v-icon class='group-icon pb-1 mr-1' left>mdi-code-greater-than</v-icon>
<span class='group-title'>How to use with code</span>
</div>
<CodeSnippet :key="selected.name + '_usage'" :codeContent='selectedTestUsage' :language="'python'"
class='mt-2'></CodeSnippet>
<CodeSnippet :key="selected.name + '_usage'" :codeContent='selectedTestUsage' :language="'python'" class='mt-2'></CodeSnippet>
</div>

<div id='code-group' class='py-4'>
<div class='d-flex'>
<v-icon class='group-icon pb-1 mr-1' left>mdi-code-braces-box</v-icon>
<span class='group-title'>Source code</span>
</div>
<CodeSnippet :key="selected.name + '_source_code'" :codeContent='selected.code'
class='mt-2'></CodeSnippet>
<CodeSnippet :key="selected.name + '_source_code'" :codeContent='selected.code' class='mt-2'></CodeSnippet>
</div>
</div>
</v-col>
Expand All @@ -153,7 +144,7 @@
<script lang='ts' setup>
import { chain } from 'lodash';
import { api } from '@/api';
import { computed, onActivated, ref, watch } from 'vue';
import { computed, onActivated, onMounted, ref, watch } from 'vue';
import { anonymize, pasterColor } from '@/utils';
import TestExecutionResultBadge from '@/views/main/project/TestExecutionResultBadge.vue';
import { FunctionInputDTO, TestFunctionDTO, TestTemplateExecutionResultDTO } from '@/generated-sources';
Expand All @@ -162,17 +153,22 @@ import { $vfm } from 'vue-final-modal';
import StartWorkerInstructions from '@/components/StartWorkerInstructions.vue';
import { storeToRefs } from 'pinia';
import { useCatalogStore } from '@/stores/catalog';
import { useProjectStore } from "@/stores/project";
import SuiteInputListSelector from '@/components/SuiteInputListSelector.vue';
import { extractArgumentDocumentation } from '@/utils/python-doc.utils';
import { alphabeticallySorted } from '@/utils/comparators';
import CodeSnippet from '@/components/CodeSnippet.vue';
import mixpanel from 'mixpanel-browser';
import { generateGiskardClientSnippet } from "@/snippets";

const projectStore = useProjectStore();

const props = defineProps<{
projectId: number,
suiteId?: number
}>();

const pythonPrimitiveTypes = ['int', 'str', 'float', 'bool'];

const searchFilter = ref<string>('');
const { testFunctions } = storeToRefs(useCatalogStore());
Expand All @@ -182,8 +178,16 @@ const testRunning = ref<boolean>(false);
const testResult = ref<TestTemplateExecutionResultDTO | null>(null);

const panel = ref<number[]>([0]);
const giskardClientSnippet = ref<string | null>(null);

const project = computed(() => {
return projectStore.project(props.projectId)
});


const selectedTestUsage = computed(() => {
let isCustom = selected.value!.tags.includes('custom');
let customParams: { [name: string]: string } = {};

if (selected.value === null) {
return '';
Expand All @@ -197,12 +201,44 @@ const selectedTestUsage = computed(() => {
.map('type')
.uniq()
.value()
.filter(i => i !== 'str'),
selected.value.name
.filter(i => !pythonPrimitiveTypes.includes(i))
];

content += `from giskard import ${uniqueImports.join(', ')}`;
content += '\n\n';
if (isCustom) {
content += 'import giskard\n';
} else {
content += `from giskard.testing import ${selected.value.name}\n`;
}

if (uniqueImports.length > 0) {
content += `from giskard import ${uniqueImports.join(', ')}\n\n`;
}

if (isCustom) {
content += `${giskardClientSnippet.value}\n`;

const customSlicingFunctions = selected.value.args.filter(arg => {
return arg.type === "SlicingFunction" && arg.defaultValue !== null;
});

customSlicingFunctions.forEach((arg, index) => {
const sfName = `sf_${index + 1}`;
customParams[arg.name] = `${arg.name}=${sfName}`;
content += `${sfName} = giskard.SlicingFunction.download("${arg.defaultValue}", client, "${project.value!.key}")\n`;
})

const customTransformationFunctions = selected.value.args.filter(arg => {
return arg.type === "TransformationFunction" && arg.defaultValue !== null;
});

customTransformationFunctions.forEach((arg, index) => {
const tfName = `tf_${index + 1}`;
customParams[arg.name] = `${arg.name}=${tfName}`;
content += `${tfName} = giskard.TransformationFunction.download("${arg.defaultValue}", client, "${project.value!.key}")\n`;
})

content += `${selected.value.name} = giskard.GiskardTest.download("${selected.value.uuid}", client, "${project.value!.key}")\n\n`;
}

requiredArgs.forEach(arg => {
content += `${arg.name} = ${arg.type}(...)`;
Expand All @@ -211,14 +247,14 @@ const selectedTestUsage = computed(() => {
content += '\n';

const parametersWithDefaults = selected.value.args.map(arg => {
if (arg.name in customParams) return customParams[arg.name];
if (arg.name === 'kwargs') return '**kwargs';
if (arg.optional) return `${arg.name}=${arg.defaultValue}`;
if (arg.defaultValue === "true") return `${arg.name}=True`;
if (arg.defaultValue === "false") return `${arg.name}=False`;
if (arg.optional) return `${arg.name}=${arg.defaultValue ?? 'None'}`;
return arg.name;
});
content += `test_result, passed = ${selected.value.name}(${parametersWithDefaults.join(', ')})`;
content += '\n\n';

content += `print(f"TEST RESULT: {test_result} - PASSED: {passed}")`;
content += `${selected.value.name}(${parametersWithDefaults.join(', ')}).execute()`;

return content;
});
Expand Down Expand Up @@ -283,6 +319,10 @@ const filteredTestFunctions = computed(() => {
.value();
});

onMounted(async () => {
giskardClientSnippet.value = await generateGiskardClientSnippet();
})

onActivated(async () => {
if (testFunctions.value.length > 0) {
selected.value = testFunctions.value[0];
Expand Down
2 changes: 2 additions & 0 deletions python-client/giskard/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from giskard.ml_worker.testing.registry.decorators import test
from giskard.ml_worker.testing.registry.giskard_test import GiskardTest
from giskard.ml_worker.testing.registry.slicing_function import SlicingFunction
from giskard.ml_worker.testing.registry.transformation_function import TransformationFunction
from giskard.ml_worker.testing.registry.slicing_function import slicing_function
from giskard.ml_worker.testing.registry.transformation_function import transformation_function
from giskard.ml_worker.testing.test_result import TestResult
Expand Down Expand Up @@ -51,6 +52,7 @@ def get_version() -> str:
"transformation_function",
"SuiteInput",
"SlicingFunction",
"TransformationFunction",
"scan",
"explain_with_shap",
"TestResult",
Expand Down