Skip to content

Commit

Permalink
Merge pull request #72 from fishtown-analytics/fix/custom-data-tests
Browse files Browse the repository at this point in the history
support docs for data tests, view in DAG (optional)
  • Loading branch information
drewbanin authored Mar 2, 2020
2 parents d8bbc40 + 56185bf commit b50b835
Show file tree
Hide file tree
Showing 8 changed files with 202 additions and 5 deletions.
29 changes: 29 additions & 0 deletions src/app/components/graph/graph-launcher.html
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,35 @@ <h6>
<form class="fields fields-flush launcher-hide-sidebar"
ng-class="{visible: filters_visible}"
ng-submit="onUpdateSelector()">
<label class="field">
<div class="dropdown dropup"
ng-class="{'open': isVisible('resource_types')}"
data-form-type="resource_types">
<select
data-toggle="dropdown"
class='field-input form-control input-dark'
ng-click="onSelectClick('resource_types')"
ng-blur="onSelectBlur('resource_types')">
<option selected disabled hidden>
<span>{{ selectionLabel('resource_types') }}</span>
</option>
</select>
<ul
class="dropdown-menu"
ng-show="isVisible('resource_types')">
<li
class='text-dark'
ng-repeat="item in selectorService.options.resource_types"
ng-click="onItemSelect('resource_types', item, $event)">
{{ resourceTypeTitle(item) }}
<span ng-show="isSelected('resource_types', item)">
<svg class="checked" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M20.285 2l-11.285 11.567-5.286-5.011-3.714 3.716 9 8.728 15-15.285z"/></svg>
</span>
</li>
</ul>
<div class="field-label">resources</div>
</div>
</label>
<label class="field">
<div class="dropdown dropup"
ng-class="{'open': isVisible('packages')}"
Expand Down
11 changes: 11 additions & 0 deletions src/app/components/graph/graph-launcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ angular
},
packages: {
visible: false,
},
resource_types: {
visible: false,
}
};

Expand Down Expand Up @@ -99,6 +102,14 @@ angular
}
}

scope.resourceTypeTitle = function(item) {
if (item == 'analysis') {
return 'Analyses';
} else {
return item[0].toUpperCase() + item.slice(1) + 's'
}
}

scope.selectionLabel = function(form, fallback_string) {
var model = selectorService.selection.dirty[form];
var all = selectorService.options[form];
Expand Down
1 change: 1 addition & 0 deletions src/app/docs/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ require('./model');
require('./source');
require('./seed');
require('./snapshot');
require('./test');
require('./macro');
81 changes: 81 additions & 0 deletions src/app/docs/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
<style>
/* TODO */
.section-target {
top: -8em;
}

.noflex {
flex: 0 0 160px !important;
}

.highlight {
color: #24292e;
background-color: white;
}

</style>

<div class='app-scroll'>
<div class="app-links app-sticky">
<div class="app-title">
<div class="app-frame app-pad app-flush-bottom">
<h1>
<span class="break">{{ model.name }}</span>
<small>test</small>
</h1>
</div>
</div>
<div class="app-frame app-pad-h">
<ul class="nav nav-tabs">
<li ui-sref-active='active'><a ui-sref="dbt.test({'#': 'description'})">Description</a></li>
<li ui-sref-active='active'><a ui-sref="dbt.test({'#': 'sql'})">SQL</a></li>
</ul>
</div>
</div>
<div class="app-details">
<div class="app-frame app-pad">
<section class="section">
<div class="section-target" id="description"></div>
<div class="section-content">
<h6>Description</h6>
<div class="panel">
<div class="panel-body">
<div ng-if="model.description" class="model-markdown" marked="model.description"></div>
<div ng-if="!model.description">This {{ model.resource_type }} is not currently documented</div>
</div>
</div>
</div>
</section>

<section class="section">
<div class="section-target" id="sql"></div>
<div class="section-content">
<h6>SQL</h6>
<div class="panel">
<div class="panel-body">
<ul class="nav nav-tabs">
<li ng-class="{active: !view_compiled_sql}"><a ng-click="view_compiled_sql=false">Source</a></li>
<li ng-class="{active: view_compiled_sql}"><a ng-click="view_compiled_sql=true">Compiled</a></li>
<li class='nav-pull-right'></li>
<li>
<a class='unselectable'
ng-click="copy_to_clipboard(view_compiled_sql ? model.injected_sql : model.raw_sql)">{{ copied ? 'copied' : 'copy to clipboard' }}</a>
</li>
</ul>
<div style="margin-top: 1px" ng-show="!view_compiled_sql">
<pre
class="source-code highlight sql"
ng-bind-html="highlighted.source"></pre>
</div>
<div style="margin-top: 1px" ng-show="view_compiled_sql">
<pre
class="source-code highlight sql"
ng-bind-html="highlighted.compiled"></pre>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
56 changes: 56 additions & 0 deletions src/app/docs/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
'use strict';

const angular = require('angular');
const hljs = require('highlight.js/lib/highlight.js');
const $ = require("jquery");

hljs.initHighlightingOnLoad();
hljs.initLineNumbersOnLoad();

require("./styles.css");

const _ = require('underscore');

angular
.module('dbt')
.controller('TestCtrl', ['$scope', '$state', 'project', 'code', '$anchorScroll', '$location',
function($scope, $state, projectService, codeService, $anchorScroll, $location) {

$scope.model_uid = $state.params.unique_id;
$scope.tab = $state.params.tab;
$scope.project = projectService;
$scope.codeService = codeService;

$scope.highlighted = {
source: '',
compiled: ''
}

$scope.copied = false;
$scope.copy_to_clipboard = function(sql) {
codeService.copy_to_clipboard(sql)
$scope.copied = true;
setTimeout(function() {
$scope.$apply(function() {
$scope.copied = false;
})
}, 1000);
}

$scope.model = {};
projectService.ready(function(project) {
$scope.model = project.nodes[$scope.model_uid];

var default_compiled = '\n-- compiled SQL not found for this model\n';
$scope.highlighted.source = codeService.highlightSql($scope.model.raw_sql);
$scope.highlighted.compiled = codeService.highlightSql($scope.model.injected_sql || default_compiled);

$(".source-code").each(function(i, el) {
hljs.lineNumbersBlock(el);
});

setTimeout(function() {
$anchorScroll();
}, 0);
})
}]);
9 changes: 9 additions & 0 deletions src/app/index.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const templates = {
source: require('./docs/source.html'),
snapshot: require('./docs/snapshot.html'),
seed: require('./docs/seed.html'),
test: require('./docs/test.html'),
macro: require('./docs/macro.html'),
}

Expand Down Expand Up @@ -64,6 +65,14 @@ angular
unique_id: {type: 'string'}
},
})
.state('dbt.test', {
url: 'test/:unique_id?section&' + graph_params,
controller: 'TestCtrl',
templateUrl: templates.test,
params: {
unique_id: {type: 'string'}
},
})
.state('dbt.source', {
url: 'source/:unique_id?section&' + graph_params,
controller: 'SourceCtrl',
Expand Down
8 changes: 5 additions & 3 deletions src/app/services/graph.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,9 @@ angular


_.each(_.filter(service.manifest.nodes, function(node) {
return _.includes(['model', 'seed', 'source', 'snapshot'], node.resource_type);
var is_graph_type = _.includes(['model', 'seed', 'source', 'snapshot'], node.resource_type);
var is_data_test = node.resource_type == 'test' && _.includes(node.tags, 'data');
return is_graph_type || is_data_test;
}), function(node) {
var node_obj = {
group: "nodes",
Expand All @@ -343,9 +345,9 @@ angular

if (!_.includes(['model', 'source', 'seed', 'snapshot'], parent_node.resource_type)) {
return;
} else if (child_node.resource_type != 'model' && child_node.resource_type != 'snapshot') {
} else if (child_node.resource_type == 'test' && _.includes(child_node.tags, 'schema')) {
return;
};
}

var unique_id = parent_node.unique_id + "|" + child_node.unique_id;

Expand Down
12 changes: 10 additions & 2 deletions src/app/services/node_selection_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ angular
exclude: '',
packages: [],
tags: [null],
resource_types: [
'model',
'seed',
'snapshot',
'source'
],
depth: 1,
};

Expand All @@ -35,6 +41,7 @@ angular
options: {
packages: [],
tags: [null],
resource_types: ['model', 'seed', 'snapshot', 'source', 'test'],
}
};

Expand Down Expand Up @@ -108,7 +115,7 @@ angular
}

service.isDirty = function() {
var keys = ['include', 'exclude', 'packages', 'tags']
var keys = ['include', 'exclude', 'packages', 'tags', 'resource_types']
var res = _.isEqual(service.selection.clean, service.selection.dirty);
return !res
}
Expand Down Expand Up @@ -397,8 +404,9 @@ angular
var matched_package = _.includes(selected_spec.packages, node.data.package_name);
var matched_tags = _.intersection(selected_spec.tags, node.data.tags).length > 0;
var matched_untagged = _.includes(selected_spec.tags, null) && (node.data.tags.length == 0);
var matched_types = _.includes(selected_spec.resource_types, node.data.resource_type);

if (!matched_package || (!matched_tags && !matched_untagged)) {
if (!matched_package || (!matched_tags && !matched_untagged) || !matched_types) {
nodes_to_prune.push(node.data.unique_id);
}
})
Expand Down

0 comments on commit b50b835

Please sign in to comment.