<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <title>Measure Testing Dashboard </title> <!-- Bootstrap core CSS --> <link href="css/bootstrap.min.css" rel="stylesheet"> <!-- Custom styles for this template --> <link href="css/dashboard.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0"> <a class="navbar-brand col-sm-5 col-md-4 mr-0" href="#">OpenStudio Measure Testing Dashboard</a> </nav> <div class="container-fluid"> <div class="row"> <main role="main" class="col-md-12 ml-sm-auto col-lg-12 pt-3 px-4"> <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pb-2 mb-3 border-bottom"> <h1 class="h2">Overview</h1> </div> <div class="row"> <div class="col-sm"> <div class="card"> <div class="card-block"> <div class="card-body"> <h5 class="card-title">Tests</h5> <div class="row pt-5"> <div class="col-sm-4 offset-sm-1 badge-height badge badge-success"><span class='large-text'>0</span></div> <div class="col-sm-4 offset-sm-2 badge-height badge badge-success"><span class='large-text'>0</span></div> </div> <div class="row"> <div class="col-sm-4 offset-sm-1 center-text"><span class="badge-text">Failures</span></div> <div class="col-sm-4 offset-sm-2 center-text"><span class="badge-text">Errors</span></div> </div> </div> </div> </div> </div> <div class="col-sm"> <div class="card"> <div class="card-block"> <div class="card-body"> <h5 class="card-title">OpenStudio Style</h5> <div> <div class="row pt-5"> <div class="col-sm-4 offset-sm-4 badge-height badge badge-danger"><span class='large-text'>34</span></div> </div> <div class="row"> <div class="col-sm-4 offset-sm-4 center-text"><span class="badge-text">Errors</span></div> </div> </div> </div> </div> </div> </div> <div class="col-sm"> <div class="card"> <div class="card-block"> <div class="card-body"> <h5 class="card-title">RuboCop</h5> </div> </div> </div> </div> <div class="col-sm"> <div class="card donut"> <div class="card-block"> <div class="card-body"> <h5 class="card-title">Coverage</h5> <div class="canvas-container"> <canvas id="cov"></canvas> <span id="covPercent" class="status">%</span> </div> </div> </div> </div> </div> </div> <div class="py-5"> <h2>Measures</h2> <div class="table-responsive"> <table class="table table-striped table-sm table-text"> <thead> <tr> <th>Measure Name</th> <th>Tests</th> <th>OS Style Errors</th> <th>RuboCop</th> <th>Coverage</th> </tr> </thead> <tbody> <tr> <td>ChangeBuildingLocation</td> <td> <span class="badge badge-danger">0</span> <span class="badge badge-warning">0</span> </td> <td> <span class="badge badge-danger">6</span> </td> <td></td> <td>79.69 %</td> </tr> <tr> <td>RotateBuilding</td> <td> <span class="badge badge-danger">0</span> <span class="badge badge-warning">0</span> </td> <td> <span class="badge badge-danger">7</span> </td> <td></td> <td>91.67 %</td> </tr> <tr> <td>SetGasBurnerEfficiency</td> <td> <span class="badge badge-danger">0</span> <span class="badge badge-warning">0</span> </td> <td> <span class="badge badge-danger">21</span> </td> <td></td> <td>81.55 %</td> </tr> <tr> <td>Pristine</td> <td> <span class="badge badge-danger">0</span> <span class="badge badge-warning">0</span> </td> <td> <span class="badge badge-success">0</span> </td> <td></td> <td>86.21 %</td> </tr> </tbody> </table> </div> </div> </main> </div> </div> <!-- Bootstrap core JavaScript ================================================== --> <!-- Placed at the end of the document so the pages load faster --> <script src="js/jquery-3.3.1.min.js"></script> <script src="js/bootstrap.min.js"></script> <!-- Icons --> <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> <script> feather.replace() </script> <!-- Graphs --> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script> <script> (function(){ var t; function size(animate){ if (animate == undefined){ animate = false; } clearTimeout(t); t = setTimeout(function(){ $("canvas").each(function(i,el){ $(el).attr({ "width":$(el).parent().width(), "height":$(el).parent().outerHeight() }); }); redraw(animate); var m = 0; $(".card").height(""); $(".card").each(function(i,el){ m = Math.max(m,$(el).height()); }); $(".card").height(m); }, 30); } $(window).on('resize', function(){ size(false); }); function redraw(animation){ var data = { "repo_name": null, "current_branch": "master", "coverage": { "total_percent_coverage": 82.27, "total_lines": 678, "total_relevant_lines": 361, "total_covered_lines": 297, "total_missed_lines": 64, "by_measure": { "ChangeBuildingLocation": { "name": "ChangeBuildingLocation", "total_lines": 210, "percent_coverage": 79.69, "missed_lines": 26, "relevant_lines": 128, "covered_lines": 102 }, "RotateBuilding": { "name": "RotateBuilding", "total_lines": 80, "percent_coverage": 91.67, "missed_lines": 3, "relevant_lines": 36, "covered_lines": 33 }, "SetGasBurnerEfficiency": { "name": "SetGasBurnerEfficiency", "total_lines": 314, "percent_coverage": 81.55, "missed_lines": 31, "relevant_lines": 168, "covered_lines": 137 }, "Pristine": { "name": "Pristine", "total_lines": 74, "percent_coverage": 86.21, "missed_lines": 4, "relevant_lines": 29, "covered_lines": 25 } } }, "minitest": { "test_directory": "/Users/kflemin/repos/OpenStudio-measure-tester-gem/test_results/minitest", "total_tests": 11, "total_assertions": 79, "total_errors": 0, "total_failures": 0, "total_skipped": 0, "by_measure": { "ChangeBuildingLocation": { "tested_class": "ChangeBuildingLocation", "measure_tests": 4, "measure_assertions": 13, "measure_errors": 0, "measure_failures": 0, "measure_skipped": 0 }, "Pristine": { "tested_class": "Pristine", "measure_tests": 3, "measure_assertions": 10, "measure_errors": 0, "measure_failures": 0, "measure_skipped": 0 }, "RotateBuilding": { "tested_class": "RotateBuilding", "measure_tests": 2, "measure_assertions": 10, "measure_errors": 0, "measure_failures": 0, "measure_skipped": 0 }, "SetGasBurnerEfficiency": { "tested_class": "SetGasBurnerEfficiency", "measure_tests": 2, "measure_assertions": 46, "measure_errors": 0, "measure_failures": 0, "measure_skipped": 0 } } }, "openstudio_style": { "by_measure": { "ChangeBuildingLocation": { "errors": 6, "issues": [ { "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.", "type": "deprecated", "severity": "error" }, { "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.", "type": "deprecated", "severity": "error" }, { "message": "'def description' is missing.", "type": "syntax", "severity": "error" }, { "message": "'def modeler_description' is missing.", "type": "syntax", "severity": "error" }, { "message": "Measure directory name 'ChangeBuildingLocation' is not snake_case.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Climate Zone.' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" } ] }, "Pristine": { "errors": 0, "issues": [ ] }, "RotateBuilding": { "errors": 7, "issues": [ { "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.", "type": "deprecated", "severity": "error" }, { "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.", "type": "deprecated", "severity": "error" }, { "message": "'def description' is missing.", "type": "syntax", "severity": "error" }, { "message": "'def modeler_description' is missing.", "type": "syntax", "severity": "error" }, { "message": "Measure directory name 'RotateBuilding' is not snake_case.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Number of Degrees to Rotate Building (positive value is clockwise).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Number of Degrees to Rotate Building (positive value is clockwise).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" } ] }, "SetGasBurnerEfficiency": { "errors": 21, "issues": [ { "message": "OpenStudio::Ruleset::ModelUserScript is deprecated, use OpenStudio::Measure::ModelMeasure instead.", "type": "deprecated", "severity": "error" }, { "message": "OpenStudio::Ruleset::OSArgumentVector is deprecated, use OpenStudio::Measure::OSArgumentVector instead.", "type": "deprecated", "severity": "error" }, { "message": "'def description' is missing.", "type": "syntax", "severity": "error" }, { "message": "'def modeler_description' is missing.", "type": "syntax", "severity": "error" }, { "message": "Measure directory name 'SetGasBurnerEfficiency' is not snake_case.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Choose an Air Loop with a two speed DX Cooling Unit to Alter.' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Burner Efficiency (fractional)' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Remove Baseline Costs From Effected Cooling Coil DX Two Speed Units?' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Material and Installation Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Material and Installation Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Demolition Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Demolition Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Years Until Costs Start (whole years).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Years Until Costs Start (whole years).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Demolition Costs Occur During Initial Construction?' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'Expected Life (whole years).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'Expected Life (whole years).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'O & M Costs per Cooling Coil DX Two Speed Unit ($).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'O & M Costs per Cooling Coil DX Two Speed Unit ($).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" }, { "message": "Argument display name 'O & M Frequency (whole years).' appears to have units. Set units in the setUnits method.", "type": "syntax", "severity": "info" }, { "message": "Argument display name 'O & M Frequency (whole years).' cannot contain ?#.[] characters.", "type": "syntax", "severity": "error" } ] } }, "total_errors": 34 } }; console.log('DATA: ', data); var covData = data['coverage']; // set % coverage document.getElementById("covPercent").innerHTML = covData['total_percent_coverage'] + '%'; var options = {animation:{}}; if (!animation){ options.animation.animateRotate = false; } else { options.animation.animateRotate = true; } var data = { datasets:[{ data: [ covData['total_covered_lines'], covData['total_missed_lines'], ], backgroundColor: [ "#50AE54", "#F2453D" ] }], labels: [ "lines covered", "lines missed", ] }; var config = {type: 'doughnut', data: data, options: options}; var canvas = document.getElementById("cov"); var ctx = canvas.getContext("2d"); var doughnut = new Chart(ctx, config); } size(true); }()); </script> </body> </html>