about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md16
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md23
-rw-r--r--.github/ISSUE_TEMPLATE/user_story.md8
-rw-r--r--.github/PULL_REQUEST_TEMPLATE.md9
-rw-r--r--jquery.qtip.css623
-rw-r--r--wqflask/tests/wqflask/show_trait/test_export_trait_data.py118
-rw-r--r--wqflask/utility/redis_tools.py10
-rw-r--r--wqflask/wqflask/correlation/show_corr_results.py19
-rw-r--r--wqflask/wqflask/marker_regression/display_mapping_results.py3
9 files changed, 172 insertions, 657 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 7d7e34a5..48bad39b 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -9,26 +9,26 @@ assignees: ''
 
 **Describe the bug**
 
-A clear and concise description of what the bug is.
+<!-- A clear and concise description of what the bug is. -->
 
 **To Reproduce**
 
-Steps to reproduce the behavior
+<!-- Steps to reproduce the behavior -->
 
 **Expected behavior**
 
-A clear and concise description of what you expected to happen.
+<!-- A clear and concise description of what you expected to happen. -->
 
 **Screenshots**
 
-If applicable, add screenshots to help explain your problem.
+<!-- If applicable, add screenshots to help explain your problem. -->
 
 **Environment setup (please complete the following information):**
 
-- OS: [e.g. Linux]
-- Guix Version (optional)
-- [Anything else you think is relevant]
+<!-- - OS: [e.g. Linux] -->
+<!-- - Guix Version (optional) -->
+<!-- - [Anything else you think is relevant] -->
 
 **Additional context**
 
-Add any other context about the problem here.
+<!-- Add any other context about the problem here. -->
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 254754c6..eb6c3e4b 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -9,26 +9,33 @@ assignees: ''
 
 ## Is your feature request related to a problem? Please describe.
 
-A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+<!-- A clear and concise description of what the problem is. -->
+
+<!-- Example: I'm always frustrated when [...] -->
 
 ## Describe the solution you'd like
 
-A clear and concise description of what you want to happen.
+<!-- A clear and concise description of what you want to happen. -->
 
 ## Describe alternatives you've considered
 
-A clear and concise description of any alternative solutions or features you've considered.
+<!-- A clear and concise description of any alternative solutions or features you've considered. -->
 
 ## User Stories (optional)
 
-As a _[role or persona]_, I want _[goal/ need]_ so that _[why]_
+<!-- Example: -->
+
+<!-- As a _[role or persona]_, I want _[goal/ need]_ so that _[why]_ -->
+
+<!-- **Feature:** _[Brief description of feature]_ -->
 
-**Feature:** _[Brief description of feature]_
+<!-- _[Any additional descriptions on feature]_ -->
 
-_[Any additional descriptions on feature]_
+<!-- **Scenario:**
 
-**Scenario:** Please use _[Gherkin](https://cucumber.io/docs/gherkin/reference/)_ here
+Please use _[Gherkin](https://cucumber.io/docs/gherkin/reference/)_
+here -->
 
 ## Additional context
 
-Add any other context or screenshots about the feature request here.
+<!-- Add any other context or screenshots about the feature request here. -->
diff --git a/.github/ISSUE_TEMPLATE/user_story.md b/.github/ISSUE_TEMPLATE/user_story.md
index 2682fc98..52ae775d 100644
--- a/.github/ISSUE_TEMPLATE/user_story.md
+++ b/.github/ISSUE_TEMPLATE/user_story.md
@@ -7,10 +7,10 @@ assignees: ''
 
 ---
 
-As a _[role or persona]_, I want _[goal/ need]_ so that _[why]_
+<!-- As a _[role or persona]_, I want _[goal/ need]_ so that _[why]_ -->
 
-**Feature:** _[Brief description of feature]_
+<!-- **Feature:** _[Brief description of feature]_ -->
 
-_[Any additional descriptions on feature]_
+<!-- _[Any additional descriptions on feature]_ -->
 
-**Scenario:** Please use _[Gherkin](https://cucumber.io/docs/gherkin/reference/)_ here
+<!-- **Scenario:** Please use _[Gherkin](https://cucumber.io/docs/gherkin/reference/)_ here -->
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 223e24ef..f3371183 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -1,11 +1,20 @@
 #### Description
+<!--Brief description of the PR. What does this PR do? -->
 
 #### How should this be tested?
+<!-- What should you do to test this PR? Is there any manual quality
+assurance checks that should be done. What are the expectations -->
 
 #### Any background context you want to provide?
 
+<!-- Anything the reviewer should be aware of ahead of testing -->
+
 #### What are the relevant pivotal tracker stories?
 
+<!-- Does this PR track anything anywhere? -->
+
 #### Screenshots (if appropriate)
 
 #### Questions
+
+<!-- Are there any questions for the reviewer -->
diff --git a/jquery.qtip.css b/jquery.qtip.css
deleted file mode 100644
index c2dcb306..00000000
--- a/jquery.qtip.css
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * qTip2 - Pretty powerful tooltips - v2.2.0
- * http://qtip2.com
- *
- * Copyright (c) 2013 Craig Michael Thompson
- * Released under the MIT, GPL licenses
- * http://jquery.org/license
- *
- * Date: Thu Nov 21 2013 08:34 GMT+0000
- * Plugins: tips modal viewport svg imagemap ie6
- * Styles: basic css3
- */
-.qtip{
-	position: absolute;
-	left: -28000px;
-	top: -28000px;
-	display: none;
-
-	max-width: 280px;
-	min-width: 50px;
-	
-	font-size: 10.5px;
-	line-height: 12px;
-
-	direction: ltr;
-
-	box-shadow: none;
-	padding: 0;
-}
-
-	.qtip-content{
-		position: relative;
-		padding: 5px 9px;
-		overflow: hidden;
-
-		text-align: left;
-		word-wrap: break-word;
-	}
-
-	.qtip-titlebar{
-		position: relative;
-		padding: 5px 35px 5px 10px;
-		overflow: hidden;
-
-		border-width: 0 0 1px;
-		font-weight: bold;
-	}
-
-	.qtip-titlebar + .qtip-content{ border-top-width: 0 !important; }
-
-	/* Default close button class */
-	.qtip-close{
-		position: absolute;
-		right: -9px; top: -9px;
-
-		cursor: pointer;
-		outline: medium none;
-
-		border-width: 1px;
-		border-style: solid;
-		border-color: transparent;
-	}
-
-		.qtip-titlebar .qtip-close{
-			right: 4px; top: 50%;
-			margin-top: -9px;
-		}
-	
-		* html .qtip-titlebar .qtip-close{ top: 16px; } /* IE fix */
-
-		.qtip-titlebar .ui-icon,
-		.qtip-icon .ui-icon{
-			display: block;
-			text-indent: -1000em;
-			direction: ltr;
-		}
-
-		.qtip-icon, .qtip-icon .ui-icon{
-			-moz-border-radius: 3px;
-			-webkit-border-radius: 3px;
-			border-radius: 3px;
-			text-decoration: none;
-		}
-
-			.qtip-icon .ui-icon{
-				width: 18px;
-				height: 14px;
-
-				line-height: 14px;
-				text-align: center;
-				text-indent: 0;
-				font: normal bold 10px/13px Tahoma,sans-serif;
-
-				color: inherit;
-				background: transparent none no-repeat -100em -100em;
-			}
-
-/* Applied to 'focused' tooltips e.g. most recently displayed/interacted with */
-.qtip-focus{}
-
-/* Applied on hover of tooltips i.e. added/removed on mouseenter/mouseleave respectively */
-.qtip-hover{}
-
-/* Default tooltip style */
-.qtip-default{
-	border-width: 1px;
-	border-style: solid;
-	border-color: #F1D031;
-
-	background-color: #FFFFA3;
-	color: #555;
-}
-
-	.qtip-default .qtip-titlebar{
-		background-color: #FFEF93;
-	}
-
-	.qtip-default .qtip-icon{
-		border-color: #CCC;
-		background: #F1F1F1;
-		color: #777;
-	}
-	
-	.qtip-default .qtip-titlebar .qtip-close{
-		border-color: #AAA;
-		color: #111;
-	}
-
-
-
-/*! Light tooltip style */
-.qtip-light{
-	background-color: white;
-	border-color: #E2E2E2;
-	color: #454545;
-}
-
-	.qtip-light .qtip-titlebar{
-		background-color: #f1f1f1;
-	}
-
-
-/*! Dark tooltip style */
-.qtip-dark{
-	background-color: #505050;
-	border-color: #303030;
-	color: #f3f3f3;
-}
-
-	.qtip-dark .qtip-titlebar{
-		background-color: #404040;
-	}
-
-	.qtip-dark .qtip-icon{
-		border-color: #444;
-	}
-
-	.qtip-dark .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/*! Cream tooltip style */
-.qtip-cream{
-	background-color: #FBF7AA;
-	border-color: #F9E98E;
-	color: #A27D35;
-}
-
-	.qtip-cream .qtip-titlebar{
-		background-color: #F0DE7D;
-	}
-
-	.qtip-cream .qtip-close .qtip-icon{
-		background-position: -82px 0;
-	}
-
-
-/*! Red tooltip style */
-.qtip-red{
-	background-color: #F78B83;
-	border-color: #D95252;
-	color: #912323;
-}
-
-	.qtip-red .qtip-titlebar{
-		background-color: #F06D65;
-	}
-
-	.qtip-red .qtip-close .qtip-icon{
-		background-position: -102px 0;
-	}
-
-	.qtip-red .qtip-icon{
-		border-color: #D95252;
-	}
-
-	.qtip-red .qtip-titlebar .ui-state-hover{
-		border-color: #D95252;
-	}
-
-
-/*! Green tooltip style */
-.qtip-green{
-	background-color: #CAED9E;
-	border-color: #90D93F;
-	color: #3F6219;
-}
-
-	.qtip-green .qtip-titlebar{
-		background-color: #B0DE78;
-	}
-
-	.qtip-green .qtip-close .qtip-icon{
-		background-position: -42px 0;
-	}
-
-
-/*! Blue tooltip style */
-.qtip-blue{
-	background-color: #E5F6FE;
-	border-color: #ADD9ED;
-	color: #5E99BD;
-}
-
-	.qtip-blue .qtip-titlebar{
-		background-color: #D0E9F5;
-	}
-
-	.qtip-blue .qtip-close .qtip-icon{
-		background-position: -2px 0;
-	}
-
-
-
-.qtip-shadow{
-	-webkit-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-	-moz-box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-	box-shadow: 1px 1px 3px 1px rgba(0, 0, 0, 0.15);
-}
-
-/* Add rounded corners to your tooltips in: FF3+, Chrome 2+, Opera 10.6+, IE9+, Safari 2+ */
-.qtip-rounded,
-.qtip-tipsy,
-.qtip-bootstrap{
-	-moz-border-radius: 5px;
-	-webkit-border-radius: 5px;
-	border-radius: 5px;
-}
-
-.qtip-rounded .qtip-titlebar{
-	-moz-border-radius: 4px 4px 0 0;
-	-webkit-border-radius: 4px 4px 0 0;
-	border-radius: 4px 4px 0 0;
-}
-
-/* Youtube tooltip style */
-.qtip-youtube{
-	-moz-border-radius: 2px;
-	-webkit-border-radius: 2px;
-	border-radius: 2px;
-	
-	-webkit-box-shadow: 0 0 3px #333;
-	-moz-box-shadow: 0 0 3px #333;
-	box-shadow: 0 0 3px #333;
-
-	color: white;
-	border-width: 0;
-
-	background: #4A4A4A;
-	background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0,#4A4A4A),color-stop(100%,black));
-	background-image: -webkit-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -moz-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -ms-linear-gradient(top,#4A4A4A 0,black 100%);
-	background-image: -o-linear-gradient(top,#4A4A4A 0,black 100%);
-}
-
-	.qtip-youtube .qtip-titlebar{
-		background-color: #4A4A4A;
-		background-color: rgba(0,0,0,0);
-	}
-	
-	.qtip-youtube .qtip-content{
-		padding: .75em;
-		font: 12px arial,sans-serif;
-		
-		filter: progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);
-		-ms-filter: "progid:DXImageTransform.Microsoft.Gradient(GradientType=0,StartColorStr=#4a4a4a,EndColorStr=#000000);";
-	}
-
-	.qtip-youtube .qtip-icon{
-		border-color: #222;
-	}
-
-	.qtip-youtube .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/* jQuery TOOLS Tooltip style */
-.qtip-jtools{
-	background: #232323;
-	background: rgba(0, 0, 0, 0.7);
-	background-image: -webkit-gradient(linear, left top, left bottom, from(#717171), to(#232323));
-	background-image: -moz-linear-gradient(top, #717171, #232323);
-	background-image: -webkit-linear-gradient(top, #717171, #232323);
-	background-image: -ms-linear-gradient(top, #717171, #232323);
-	background-image: -o-linear-gradient(top, #717171, #232323);
-
-	border: 2px solid #ddd;
-	border: 2px solid rgba(241,241,241,1);
-
-	-moz-border-radius: 2px;
-	-webkit-border-radius: 2px;
-	border-radius: 2px;
-
-	-webkit-box-shadow: 0 0 12px #333;
-	-moz-box-shadow: 0 0 12px #333;
-	box-shadow: 0 0 12px #333;
-}
-
-	/* IE Specific */
-	.qtip-jtools .qtip-titlebar{
-		background-color: transparent;
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#717171,endColorstr=#4A4A4A)";
-	}
-	.qtip-jtools .qtip-content{
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#4A4A4A,endColorstr=#232323)";
-	}
-
-	.qtip-jtools .qtip-titlebar,
-	.qtip-jtools .qtip-content{
-		background: transparent;
-		color: white;
-		border: 0 dashed transparent;
-	}
-
-	.qtip-jtools .qtip-icon{
-		border-color: #555;
-	}
-
-	.qtip-jtools .qtip-titlebar .ui-state-hover{
-		border-color: #333;
-	}
-
-
-/* Cluetip style */
-.qtip-cluetip{
-	-webkit-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-	-moz-box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-	box-shadow: 4px 4px 5px rgba(0, 0, 0, 0.4);
-
-	background-color: #D9D9C2;
-	color: #111;
-	border: 0 dashed transparent;
-}
-
-	.qtip-cluetip .qtip-titlebar{
-		background-color: #87876A;
-		color: white;
-		border: 0 dashed transparent;
-	}
-	
-	.qtip-cluetip .qtip-icon{
-		border-color: #808064;
-	}
-	
-	.qtip-cluetip .qtip-titlebar .ui-state-hover{
-		border-color: #696952;
-		color: #696952;
-	}
-
-
-/* Tipsy style */
-.qtip-tipsy{
-	background: black;
-	background: rgba(0, 0, 0, .87);
-
-	color: white;
-	border: 0 solid transparent;
-
-	font-size: 11px;
-	font-family: 'Lucida Grande', sans-serif;
-	font-weight: bold;
-	line-height: 16px;
-	text-shadow: 0 1px black;
-}
-
-	.qtip-tipsy .qtip-titlebar{
-		padding: 6px 35px 0 10px;
-		background-color: transparent;
-	}
-
-	.qtip-tipsy .qtip-content{
-		padding: 6px 10px;
-	}
-	
-	.qtip-tipsy .qtip-icon{
-		border-color: #222;
-		text-shadow: none;
-	}
-
-	.qtip-tipsy .qtip-titlebar .ui-state-hover{
-		border-color: #303030;
-	}
-
-
-/* Tipped style */
-.qtip-tipped{
-	border: 3px solid #959FA9;
-
-	-moz-border-radius: 3px;
-	-webkit-border-radius: 3px;
-	border-radius: 3px;
-
-	background-color: #F9F9F9;
-	color: #454545;
-
-	font-weight: normal;
-	font-family: serif;
-}
-
-	.qtip-tipped .qtip-titlebar{
-		border-bottom-width: 0;
-
-		color: white;
-		background: #3A79B8;
-		background-image: -webkit-gradient(linear, left top, left bottom, from(#3A79B8), to(#2E629D));
-		background-image: -webkit-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -moz-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -ms-linear-gradient(top, #3A79B8, #2E629D);
-		background-image: -o-linear-gradient(top, #3A79B8, #2E629D);
-		filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D);
-		-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#3A79B8,endColorstr=#2E629D)";
-	}
-
-	.qtip-tipped .qtip-icon{
-		border: 2px solid #285589;
-		background: #285589;
-	}
-
-		.qtip-tipped .qtip-icon .ui-icon{
-			background-color: #FBFBFB;
-			color: #555;
-		}
-
-
-/**
- * Twitter Bootstrap style.
- *
- * Tested with IE 8, IE 9, Chrome 18, Firefox 9, Opera 11.
- * Does not work with IE 7.
- */
-.qtip-bootstrap{
-	/** Taken from Bootstrap body */
-	font-size: 14px;
-	line-height: 20px;
-	color: #333333;
-
-	/** Taken from Bootstrap .popover */
-	padding: 1px;
-	background-color: #ffffff;
-	border: 1px solid #ccc;
-	border: 1px solid rgba(0, 0, 0, 0.2);
-	-webkit-border-radius: 6px;
-	-moz-border-radius: 6px;
-	border-radius: 6px;
-	-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	-moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-	-webkit-background-clip: padding-box;
-	-moz-background-clip: padding;
-	background-clip: padding-box;
-}
-
-	.qtip-bootstrap .qtip-titlebar{
-		/** Taken from Bootstrap .popover-title */
-		padding: 8px 14px;
-		margin: 0;
-		font-size: 14px;
-		font-weight: normal;
-		line-height: 18px;
-		background-color: #f7f7f7;
-		border-bottom: 1px solid #ebebeb;
-		-webkit-border-radius: 5px 5px 0 0;
-		-moz-border-radius: 5px 5px 0 0;
-		border-radius: 5px 5px 0 0;
-	}
-
-		.qtip-bootstrap .qtip-titlebar .qtip-close{
-			/**
-			 * Overrides qTip2:
-			 * .qtip-titlebar .qtip-close{
-			 *   [...]
-			 *   right: 4px;
-			 *   top: 50%;
-			 *   [...]
-			 *   border-style: solid;
-			 * }
-			 */
-			right: 11px;
-			top: 45%;
-			border-style: none;
-		}
-
-	.qtip-bootstrap .qtip-content{
-		/** Taken from Bootstrap .popover-content */
-		padding: 9px 14px;
-	}
-
-	.qtip-bootstrap .qtip-icon{
-		/**
-		 * Overrides qTip2:
-		 * .qtip-default .qtip-icon {
-		 *   border-color: #CCC;
-		 *   background: #F1F1F1;
-		 *   color: #777;
-		 * }
-		 */
-		background: transparent;
-	}
-
-		.qtip-bootstrap .qtip-icon .ui-icon{
-			/**
-			 * Overrides qTip2:
-			 * .qtip-icon .ui-icon{
-			 *   width: 18px;
-			 *   height: 14px;
-			 * }
-			 */
-			width: auto;
-			height: auto;
-
-			/* Taken from Bootstrap .close */
-			float: right;
-			font-size: 20px;
-			font-weight: bold;
-			line-height: 18px;
-			color: #000000;
-			text-shadow: 0 1px 0 #ffffff;
-			opacity: 0.2;
-			filter: alpha(opacity=20);
-		}
-
-		.qtip-bootstrap .qtip-icon .ui-icon:hover{
-			/* Taken from Bootstrap .close:hover */
-			color: #000000;
-			text-decoration: none;
-			cursor: pointer;
-			opacity: 0.4;
-			filter: alpha(opacity=40);
-		}
-
-
-/* IE9 fix - removes all filters */
-.qtip:not(.ie9haxors) div.qtip-content,
-.qtip:not(.ie9haxors) div.qtip-titlebar{
-	filter: none;
-	-ms-filter: none;
-}
-
-
-
-.qtip .qtip-tip{
-	margin: 0 auto;
-	overflow: hidden;
-	z-index: 10;
-	
-}
-
-	/* Opera bug #357 - Incorrect tip position
-	https://github.com/Craga89/qTip2/issues/367 */
-	x:-o-prefocus, .qtip .qtip-tip{
-		visibility: hidden;
-	}
-
-	.qtip .qtip-tip,
-	.qtip .qtip-tip .qtip-vml,
-	.qtip .qtip-tip canvas{
-		position: absolute;
-
-		color: #123456;
-		background: transparent;
-		border: 0 dashed transparent;
-	}
-	
-	.qtip .qtip-tip canvas{ top: 0; left: 0; }
-
-	.qtip .qtip-tip .qtip-vml{
-		behavior: url(#default#VML);
-		display: inline-block;
-		visibility: visible;
-	}
-
-#qtip-overlay{
-	position: fixed;
-	left: 0; top: 0;
-	width: 100%; height: 100%;
-}
-
-	/* Applied to modals with show.modal.blur set to true */
-	#qtip-overlay.blurs{ cursor: pointer; }
-
-	/* Change opacity of overlay here */
-	#qtip-overlay div{
-		position: absolute;
-		left: 0; top: 0;
-		width: 100%; height: 100%;
-
-		background-color: black;
-
-		opacity: 0.7;
-		filter:alpha(opacity=70);
-		-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)";
-	}
-
-
-
-.qtipmodal-ie6fix{
-	position: absolute !important;
-}
\ No newline at end of file
diff --git a/wqflask/tests/wqflask/show_trait/test_export_trait_data.py b/wqflask/tests/wqflask/show_trait/test_export_trait_data.py
index 98d599b1..41761944 100644
--- a/wqflask/tests/wqflask/show_trait/test_export_trait_data.py
+++ b/wqflask/tests/wqflask/show_trait/test_export_trait_data.py
@@ -1,10 +1,128 @@
 import unittest
+from unittest import mock
 from wqflask.show_trait.export_trait_data import dict_to_sorted_list
 from wqflask.show_trait.export_trait_data import cmp_samples
+from wqflask.show_trait.export_trait_data import export_sample_table
+from wqflask.show_trait.export_trait_data import get_export_metadata
+
+
+class AttributesSetter:
+    def __init__(self, obj):
+        for key, value in obj.items():
+            setattr(self, key, value)
 
 
 class TestExportTraits(unittest.TestCase):
     """Test methods related to converting dict to sortedlist"""
+    @mock.patch("wqflask.show_trait.export_trait_data.create_trait")
+    @mock.patch("wqflask.show_trait.export_trait_data.data_set")
+    def test_get_export_metadata_no_publish(self, mock_dataset, mock_trait):
+        """test for exporting metadata with no publish"""
+        mock_dataset_attributes = AttributesSetter(
+            {"type": "no_publish", "dataset_name": "Temp", "name": "Temp"})
+
+        mock_nested_attributes = AttributesSetter({"name": "name"})
+        mock_dataset_attributes.group = mock_nested_attributes
+        mock_dataset.create_dataset.return_value = mock_dataset_attributes
+        mock_trait.return_value = AttributesSetter({"symbol": "", "description_display": "Description",
+                                                    "title": "research1", "journal": "", "authors": ""})
+
+        results = get_export_metadata("random_id", "Temp")
+        expected = [["Record ID: random_id"],
+                    ["Trait URL: http://genenetwork.org/show_trait?trait_id=random_id&dataset=Temp"],
+                    ["Dataset: Temp"],
+                    ["Group: name"], []]
+
+        mock_dataset.create_dataset.assert_called_with("Temp")
+        mock_trait.assert_called_with(
+            dataset=mock_dataset_attributes, name="random_id", cellid=None, get_qtl_info=False)
+        self.assertEqual(results, expected)
+
+    @mock.patch("wqflask.show_trait.export_trait_data.create_trait")
+    @mock.patch("wqflask.show_trait.export_trait_data.data_set")
+    def test_get_export_metadata_with_publish(self, data_mock, trait_mock):
+        """test for exporting metadata with dataset.type=Publish"""
+        mock_dataset_attributes = AttributesSetter({"type": "Publish", "dataset_name": "Temp",
+                                                    "name": "Temp", "description_display": "Description goes here"})
+
+        mock_nested_attributes = AttributesSetter({"name": "name"})
+        mock_dataset_attributes.group = mock_nested_attributes
+        data_mock.create_dataset.return_value = mock_dataset_attributes
+        trait_instance = AttributesSetter({"symbol": "", "description_display": "Description",
+                                           "title": "research1", "journal": "", "authors": ""})
+        trait_mock.return_value = trait_instance
+
+        results = get_export_metadata(
+            "29ae0615-0d77-4814-97c7-c9e91f6bfd7b", "Temp")
+
+        expected = [['Phenotype ID: 29ae0615-0d77-4814-97c7-c9e91f6bfd7b'],
+                    ['Phenotype URL: http://genenetwork.org/show_trait?trait_id=29ae0615-0d77-4814-97c7-c9e91f6bfd7b&dataset=Temp'], [
+                        'Group: name'], ['Phenotype: Description'],
+                    ['Authors: N/A'], ['Title: research1'],
+                    ['Journal: N/A'], ['Dataset Link: http://gn1.genenetwork.org/webqtl/main.py?FormID=sharinginfo&InfoPageName=Temp'], []]
+
+        self.assertEqual(results, expected)
+
+    @mock.patch("wqflask.show_trait.export_trait_data.dict_to_sorted_list")
+    @mock.patch("wqflask.show_trait.export_trait_data.get_export_metadata")
+    def test_export_sample_table(self, exp_metadata, dict_list):
+        """test for  exporting sample table"""
+        targs_obj = {
+            "export_data": """{
+                "primary_samples": [
+                    {
+                        "other": "germanotta",
+                        "name": "Sauroniops",
+                        "se":{
+                        "name":"S2"
+                        },
+                        "num_cases":{
+                        "k1":"value"
+
+                        }
+                    }
+                ],
+                "other_samples": [
+                    {
+                        "se": 1,
+                        "num_cases": 4,
+                        "value": 6,
+                        "name": 3
+                    }
+                ]
+            }""",
+            "trait_display_name": "Hair_color",
+            "trait_id": "23177fdc-312e-4084-ad0c-f3eae785fff5",
+            "dataset": {
+            }
+        }
+        exp_metadata.return_value = [
+            ["Phenotype ID:0a2be192-57f5-400b-bbbd-0cf50135995f"], ['Group:gp1'],
+            ["Phenotype:p1"], [
+                "Authors:N/A"],
+            ["Title:research1"],
+            ["Journal:N/A"],
+            ["Dataset Link: http://gn1.genenetwork.org/webqtl/main.py?FormID=sharinginfo&InfoPageName=name1"], []]
+        expected = ('Hair_color',
+                    [['Phenotype ID:0a2be192-57f5-400b-bbbd-0cf50135995f'],
+                     ['Group:gp1'],
+                     ['Phenotype:p1'],
+                     ['Authors:N/A'],
+                     ['Title:research1'],
+                     ['Journal:N/A'],
+                     ['Dataset Link: '
+                      'http://gn1.genenetwork.org/webqtl/main.py?FormID=sharinginfo&InfoPageName=name1'],
+                     [],
+                     ['Name', 'Value', 'SE', 'N'],
+                     ['Sauroniops', 'germanotta'],
+                     [3, 6, 1, 4]])
+
+        dict_list.side_effect = [['Sauroniops', 'germanotta'], [3, 6, 1, 4]]
+
+        self.assertEqual(export_sample_table(targs_obj), expected)
+        exp_metadata.assert_called_with(
+            "23177fdc-312e-4084-ad0c-f3eae785fff5", {})
+        self.assertEqual(dict_list.call_count, 2)
 
     def test_dict_to_sortedlist(self):
         """test for conversion of dict to sorted list"""
diff --git a/wqflask/utility/redis_tools.py b/wqflask/utility/redis_tools.py
index d855a7fa..236cc755 100644
--- a/wqflask/utility/redis_tools.py
+++ b/wqflask/utility/redis_tools.py
@@ -25,6 +25,10 @@ def is_redis_available():
     return True
 
 
+def load_json_from_redis(item_list, column_value):
+    return json.loads(item_list[str.encode(column_value)])
+
+
 def get_user_id(column_name, column_value):
     user_list = Redis.hgetall("users")
     key_list = []
@@ -46,7 +50,7 @@ def get_user_by_unique_column(column_name, column_value):
             if column_name in user_ob and user_ob[column_name] == column_value:
                 item_details = user_ob
     else:
-        item_details = json.loads(user_list[column_value])
+        item_details = load_json_from_redis(user_list, column_value)
 
     return item_details
 
@@ -70,7 +74,7 @@ def get_users_like_unique_column(column_name, column_value):
                     if column_value in user_ob[column_name]:
                         matched_users.append(user_ob)
         else:
-            matched_users.append(json.loads(user_list[column_value]))
+            matched_users.append(load_json_from_redis(user_list, column_value))
 
     return matched_users
 
@@ -199,7 +203,7 @@ def get_groups_like_unique_column(column_name, column_value):
                         if column_value in group_info[column_name]:
                             matched_groups.append(group_info)
         else:
-            matched_groups.append(json.loads(group_list[column_value]))
+            matched_groups.append(load_json_from_redis(group_list, column_value))
 
     return matched_groups
 
diff --git a/wqflask/wqflask/correlation/show_corr_results.py b/wqflask/wqflask/correlation/show_corr_results.py
index e710bacd..4c2b64ba 100644
--- a/wqflask/wqflask/correlation/show_corr_results.py
+++ b/wqflask/wqflask/correlation/show_corr_results.py
@@ -184,6 +184,8 @@ class CorrelationResults(object):
 
             for _trait_counter, trait in enumerate(list(self.correlation_data.keys())[:self.return_number]):
                 trait_object = create_trait(dataset=self.target_dataset, name=trait, get_qtl_info=True, get_sample_info=False)
+                if not trait_object:
+                    continue
 
                 if self.target_dataset.type == "ProbeSet" or self.target_dataset.type == "Geno":
                     #ZS: Convert trait chromosome to an int for the location range option
@@ -434,15 +436,15 @@ class CorrelationResults(object):
 
         self.this_trait_vals, target_vals, num_overlap = corr_result_helpers.normalize_values(self.this_trait_vals, target_vals)
 
-        #ZS: 2015 could add biweight correlation, see http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3465711/
-        if self.corr_method == 'bicor':
-            sample_r, sample_p = do_bicor(self.this_trait_vals, target_vals)
-        elif self.corr_method == 'pearson':
-            sample_r, sample_p = scipy.stats.pearsonr(self.this_trait_vals, target_vals)
-        else:
-            sample_r, sample_p = scipy.stats.spearmanr(self.this_trait_vals, target_vals)
-
         if num_overlap > 5:
+            #ZS: 2015 could add biweight correlation, see http://www.ncbi.nlm.nih.gov/pmc/articles/PMC3465711/
+            if self.corr_method == 'bicor':
+                sample_r, sample_p = do_bicor(self.this_trait_vals, target_vals)
+            elif self.corr_method == 'pearson':
+                sample_r, sample_p = scipy.stats.pearsonr(self.this_trait_vals, target_vals)
+            else:
+                sample_r, sample_p = scipy.stats.spearmanr(self.this_trait_vals, target_vals)
+
             if numpy.isnan(sample_r):
                 pass
             else:
@@ -635,3 +637,4 @@ def get_header_fields(data_type, corr_method):
                                 'Sample p(r)']
 
     return header_fields
+
diff --git a/wqflask/wqflask/marker_regression/display_mapping_results.py b/wqflask/wqflask/marker_regression/display_mapping_results.py
index 7e43f6bd..04d47624 100644
--- a/wqflask/wqflask/marker_regression/display_mapping_results.py
+++ b/wqflask/wqflask/marker_regression/display_mapping_results.py
@@ -2146,9 +2146,6 @@ class DisplayMappingResults(object):
             LRSScale = 1.0
 
         LRSAxisList = Plot.frange(LRSScale, LRS_LOD_Max, LRSScale)
-        #make sure the user's value appears on the y-axis
-        #update by NL 6-21-2011: round the LOD value to 100 when LRS_LOD_Max is equal to 460
-        LRSAxisList.append(ceil(LRS_LOD_Max))
 
         #ZS: Convert to int if all axis values are whole numbers
         all_int = True