Update tox to run htmllint and csslint 83/65383/10
authorStamatis Katsaounis <mokats@intracom-telecom.com>
Mon, 26 Nov 2018 09:25:29 +0000 (11:25 +0200)
committerStamatis Katsaounis <mokats@intracom-telecom.com>
Mon, 26 Nov 2018 14:19:26 +0000 (16:19 +0200)
JIRA: DOVETAIL-753

This patch adds a new tox environment to run htmllint and csslint.
Furthermore, it fixes any leftover html and css errors.

Change-Id: Ie3fda8d89b3d52851debe1a4271ffd0ac8fbee68
Signed-off-by: Stamatis Katsaounis <mokats@intracom-telecom.com>
28 files changed:
.coveragerc [new file with mode: 0644]
.csslintrc [new file with mode: 0644]
.htmllintrc [new file with mode: 0644]
3rd_party/static/swagger/css/hightlight.default.css [deleted file]
3rd_party/static/swagger/css/screen.css
3rd_party/static/swagger/index.html
3rd_party/static/swagger/o2c.html
3rd_party/static/testapi-ui/assets/css/ascend.css
3rd_party/static/testapi-ui/assets/css/combine.css
3rd_party/static/testapi-ui/assets/css/home/home.css
3rd_party/static/testapi-ui/components/about/templates/README.html
3rd_party/static/testapi-ui/components/application/application.html
3rd_party/static/testapi-ui/components/auth/authPortal.html
3rd_party/static/testapi-ui/components/directory/directory.html
3rd_party/static/testapi-ui/components/guidelines/guidelines.html
3rd_party/static/testapi-ui/components/guidelines/partials/guidelineDetails.html
3rd_party/static/testapi-ui/components/guidelines/partials/testListModal.html
3rd_party/static/testapi-ui/components/home/home.html
3rd_party/static/testapi-ui/components/results-report/partials/editTestModal.html
3rd_party/static/testapi-ui/components/results-report/partials/reportDetails.html
3rd_party/static/testapi-ui/components/results-report/resultsReport.html
3rd_party/static/testapi-ui/components/results/modal/sharedModal.html
3rd_party/static/testapi-ui/components/results/results.html
3rd_party/static/testapi-ui/components/sut/sut.html
3rd_party/static/testapi-ui/index.html
3rd_party/static/testapi-ui/shared/header/header.html
node-requirements.txt [new file with mode: 0644]
tox.ini

diff --git a/.coveragerc b/.coveragerc
new file mode 100644 (file)
index 0000000..c6af317
--- /dev/null
@@ -0,0 +1,6 @@
+[run]
+omit = opnfv_testapi/tests/*
+[report]
+exclude_lines =
+    pass
+    main()
diff --git a/.csslintrc b/.csslintrc
new file mode 100644 (file)
index 0000000..3252905
--- /dev/null
@@ -0,0 +1,22 @@
+{
+  "ignore": [
+    "order-alphabetical",
+    "zero-units",
+    "box-model",
+    "adjoining-classes",
+    "ids",
+    "important",
+    "floats",
+    "unique-headings",
+    "qualified-headings",
+    "outline-none",
+    "overqualified-elements",
+    "font-sizes",
+    "universal-selector",
+    "box-sizing",
+    "text-indent",
+    "regex-selectors",
+    "gradients",
+    "fallback-colors"
+  ]
+}
diff --git a/.htmllintrc b/.htmllintrc
new file mode 100644 (file)
index 0000000..155294b
--- /dev/null
@@ -0,0 +1,69 @@
+{
+    "plugins": [],  // npm modules to load
+
+    "maxerr": false,
+    "raw-ignore-regex": false,
+    "attr-bans": [
+        "align",
+        "background",
+        "bgcolor",
+        "border",
+        "frameborder",
+        "longdesc",
+        "marginwidth",
+        "marginheight",
+        "scrolling",
+        "width"
+    ],
+    "indent-delta": false,
+    "indent-style": "spaces",
+    "indent-width": 2,
+    "indent-width-cont": true,
+    "spec-char-escape": false,
+    "text-ignore-regex": false,
+    "tag-bans": [
+        "b"
+    ],
+    "tag-close": true,
+    "tag-name-lowercase": true,
+    "tag-name-match": true,
+    "tag-self-close": "never",
+    "doctype-first": "smart",
+    "doctype-html5": true,
+    "attr-name-style": "dash",
+    "attr-name-ignore-regex": false,
+    "attr-no-dup": true,
+    "attr-no-unsafe-char": true,
+    "attr-order": false,
+    "attr-quote-style": false,
+    "attr-req-value": false,
+    "attr-new-line": false,
+    "attr-validate": false,
+    "id-no-dup": true,
+    "id-class-no-ad": false,
+    "id-class-style": false,
+    "class-no-dup": true,
+    "class-style": false,
+    "id-class-ignore-regex": false,
+    "img-req-alt": true,
+    "img-req-src": false,
+    "html-valid-content-model": true,
+    "head-valid-content-model": true,
+    "href-style": false,
+    "label-req-for": false,
+    "line-end-style": "lf",
+    "line-no-trailing-whitespace": true,
+    "line-max-len": 240,
+    "line-max-len-ignore-regex": false,
+    "head-req-title": true,
+    "title-no-dup": true,
+    "title-max-len": 70,
+    "html-req-lang": false,
+    "lang-style": "case",
+    "fig-req-figcaption": false,
+    "focusable-tabindex-style": false,
+    "input-radio-req-name": true,
+    "input-req-label": false,
+    "table-req-caption": false,
+    "table-req-header": false
+}
diff --git a/3rd_party/static/swagger/css/hightlight.default.css b/3rd_party/static/swagger/css/hightlight.default.css
deleted file mode 100644 (file)
index e417fc1..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-
-Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org>
-
-*/
-
-pre code {
-  display: block; padding: 0.5em;
-  background: #F0F0F0;
-}
-
-pre code,
-pre .subst,
-pre .tag .title,
-pre .lisp .title,
-pre .clojure .built_in,
-pre .nginx .title {
-  color: black;
-}
-
-pre .string,
-pre .title,
-pre .constant,
-pre .parent,
-pre .tag .value,
-pre .rules .value,
-pre .rules .value .number,
-pre .preprocessor,
-pre .ruby .symbol,
-pre .ruby .symbol .string,
-pre .aggregate,
-pre .template_tag,
-pre .django .variable,
-pre .smalltalk .class,
-pre .addition,
-pre .flow,
-pre .stream,
-pre .bash .variable,
-pre .apache .tag,
-pre .apache .cbracket,
-pre .tex .command,
-pre .tex .special,
-pre .erlang_repl .function_or_atom,
-pre .markdown .header {
-  color: #800;
-}
-
-pre .comment,
-pre .annotation,
-pre .template_comment,
-pre .diff .header,
-pre .chunk,
-pre .markdown .blockquote {
-  color: #888;
-}
-
-pre .number,
-pre .date,
-pre .regexp,
-pre .literal,
-pre .smalltalk .symbol,
-pre .smalltalk .char,
-pre .go .constant,
-pre .change,
-pre .markdown .bullet,
-pre .markdown .link_url {
-  color: #080;
-}
-
-pre .label,
-pre .javadoc,
-pre .ruby .string,
-pre .decorator,
-pre .filter .argument,
-pre .localvars,
-pre .array,
-pre .attr_selector,
-pre .important,
-pre .pseudo,
-pre .pi,
-pre .doctype,
-pre .deletion,
-pre .envvar,
-pre .shebang,
-pre .apache .sqbracket,
-pre .nginx .built_in,
-pre .tex .formula,
-pre .erlang_repl .reserved,
-pre .prompt,
-pre .markdown .link_label,
-pre .vhdl .attribute,
-pre .clojure .attribute,
-pre .coffeescript .property {
-  color: #88F
-}
-
-pre .keyword,
-pre .id,
-pre .phpdoc,
-pre .title,
-pre .built_in,
-pre .aggregate,
-pre .css .tag,
-pre .javadoctag,
-pre .phpdoc,
-pre .yardoctag,
-pre .smalltalk .class,
-pre .winutils,
-pre .bash .variable,
-pre .apache .tag,
-pre .go .typename,
-pre .tex .command,
-pre .markdown .strong,
-pre .request,
-pre .status {
-  font-weight: bold;
-}
-
-pre .markdown .emphasis {
-  font-style: italic;
-}
-
-pre .nginx .built_in {
-  font-weight: normal;
-}
-
-pre .coffeescript .javascript,
-pre .javascript .xml,
-pre .tex .formula,
-pre .xml .javascript,
-pre .xml .vbscript,
-pre .xml .css,
-pre .xml .cdata {
-  opacity: 0.5;
-}
index 2882b8d..1f22ecb 100644 (file)
@@ -1035,7 +1035,7 @@ table {
   color: black;
 }
 .title {
-  font-style: bold;
+  font-weight: bold;
 }
 .secondary_form {
   display: none;
index db209f4..521a375 100644 (file)
@@ -2,9 +2,9 @@
 <html>
 <head>
   <title>Swagger UI</title>
-  <link href='https://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'/>
-  <link href='css/highlight.default.css' media='screen' rel='stylesheet' type='text/css'/>
-  <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'/>
+  <link href='https://fonts.googleapis.com/css?family=Droid+Sans:400,700' rel='stylesheet' type='text/css'>
+  <link href='css/highlight.default.css' media='screen' rel='stylesheet' type='text/css'>
+  <link href='css/screen.css' media='screen' rel='stylesheet' type='text/css'>
   <script type="text/javascript" src="lib/shred.bundle.js"></script>
   <script src='lib/jquery-1.8.0.min.js' type='text/javascript'></script>
   <script src='lib/jquery.slideto.min.js' type='text/javascript'></script>
     <a id="logo" href="http://swagger.wordnik.com">swagger</a>
     <form id='api_selector'>
       <div class='input icon-btn'>
-        <img id="show-pet-store-icon" src="images/pet_store_api.png" title="Show Swagger Petstore Example Apis">
+        <img id="show-pet-store-icon" src="images/pet_store_api.png" title="Show Swagger Petstore Example Apis" alt="Petstore">
       </div>
       <div class='input icon-btn'>
-        <img id="show-wordnik-dev-icon" src="images/wordnik_api.png" title="Show Wordnik Developer Apis">
+        <img id="show-wordnik-dev-icon" src="images/wordnik_api.png" title="Show Wordnik Developer Apis" alt="Wordnik">
       </div>
-      <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"/></div>
-      <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"/></div>
+      <div class='input'><input placeholder="http://example.com/api" id="input_baseUrl" name="baseUrl" type="text"></div>
+      <div class='input'><input placeholder="api_key" id="input_apiKey" name="apiKey" type="text"></div>
       <div class='input'><a id="explore" href="#">Explore</a></div>
     </form>
   </div>
index d32d130..2f8a6a5 100644 (file)
@@ -12,4 +12,4 @@ qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
   ):{}
 window.opener.onOAuthComplete(qp);
 window.close();
-</script>
\ No newline at end of file
+</script>
index 258cf0b..0c1bbe6 100644 (file)
@@ -88,12 +88,12 @@ body .vc_text_separator div,
 \r
 .ascend .nectar-progress-bar .bar-wrap,\r
 .ascend .nectar-progress-bar span {\r
-  box-shadow: none;\r
   -webkit-box-shadow: none;\r
   -o-box-shadow: none;\r
-  border-radius: 0;\r
+  box-shadow: none;\r
   -webkit-border-radius: 0;\r
   -o-border-radius: 0;\r
+  border-radius: 0;\r
 }\r
 \r
 body .carousel-wrap[data-full-width="false"] .control-wrap {\r
@@ -494,8 +494,9 @@ body.ascend #search-outer #search input[type="text"] {
 }\r
 \r
 #search-outer #search #close a:hover {\r
-  transform: rotate(90deg) translateZ(0);\r
+  -ms-transform: rotate(90deg) translateZ(0);\r
   -webkit-transform: rotate(90deg) translateZ(0);\r
+  transform: rotate(90deg) translateZ(0);\r
 }\r
 \r
 #search-outer #search .span_12 span {\r
@@ -755,10 +756,10 @@ article.post .more-link span,
 \r
 .ascend .col.boxed,\r
 .ascend .wpb_column.boxed {\r
-  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r
   -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r
   -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r
   -o-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r
+  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);\r
   background-color: #fff;\r
   padding: 25px 15px 15px;\r
   position: relative;\r
@@ -770,12 +771,13 @@ article.post .more-link span,
 \r
 .ascend .col.boxed:hover,\r
 .ascend .wpb_column.boxed:hover {\r
-  transform: translateY(-4px) !important;\r
+  -ms-transform: translateY(-4px) !important;\r
   -webkit-transform: translateY(-4px) !important;\r
-  box-shadow: 0 17px 25px rgba(0, 0, 0, 0.13) !important;\r
+  transform: translateY(-4px) !important;\r
   -webkit-box-shadow: 0 17px 25px rgba(0, 0, 0, 0.13);\r
   -moz-box-shadow: 0 17px 25px rgba(0, 0, 0, 0.13);\r
   -o-box-shadow: 0 17px 25px rgba(0, 0, 0, 0.13);\r
+  box-shadow: 0 17px 25px rgba(0, 0, 0, 0.13) !important;\r
 }\r
 \r
 .ascend a.pp_arrow_previous,\r
@@ -895,8 +897,9 @@ a.pp_arrow_next {
 .woocommerce .pswp__button--arrow--right:after,\r
 .woocommerce .pswp__button--arrow--left:after {\r
   top: 17px;\r
-  transform: translateX(-27px);\r
+  -ms-transform: translateX(-27px);\r
   -webkit-transform: translateX(-27px);\r
+  transform: translateX(-27px);\r
 }\r
 \r
 .ascend .mfp-arrow-left:after,\r
@@ -946,50 +949,58 @@ a.pp_arrow_next {
 .mfp-arrow-right:hover:after,\r
 .woocommerce .pswp__button--arrow--right:hover:after {\r
   opacity: 1;\r
-  transform: translateX(-18px);\r
+  -ms-transform: translateX(-18px);\r
   -webkit-transform: translateX(-18px);\r
+  transform: translateX(-18px);\r
 }\r
 \r
 .mfp-arrow-right:hover:before,\r
 .woocommerce .pswp__button--arrow--right:hover:before {\r
-  transform: translateX(9px);\r
+  -ms-transform: translateX(9px);\r
   -webkit-transform: translateX(9px);\r
+  transform: translateX(9px);\r
 }\r
 \r
 .mfp-arrow-left:hover:before,\r
 .woocommerce .pswp__button--arrow--left:hover:before {\r
-  transform: translateX(-9px);\r
+  -ms-transform: translateX(-9px);\r
   -webkit-transform: translateX(-9px);\r
+  transform: translateX(-9px);\r
 }\r
 \r
 .mfp-arrow-right:hover:after,\r
 .woocommerce .pswp__button--arrow--right:hover:after {\r
-  transform: translateX(-1px);\r
+  -ms-transform: translateX(-1px);\r
   -webkit-transform: translateX(-1px);\r
+  transform: translateX(-1px);\r
 }\r
 \r
 .ascend a.pp_arrow_next:hover .icon-default-style {\r
-  transform: translateX(7px);\r
+  -ms-transform: translateX(7px);\r
   -webkit-transform: translateX(7px);\r
+  transform: translateX(7px);\r
 }\r
 \r
 .ascend a.pp_arrow_previous:hover .icon-default-style:after,\r
 .mfp-arrow-left:hover:after,\r
 .woocommerce .pswp__button--arrow--left:hover:after {\r
   opacity: 1;\r
-  transform: translateX(-51px);\r
+  -ms-transform: translateX(-51px);\r
   -webkit-transform: translateX(-51px);\r
+  transform: translateX(-51px);\r
 }\r
 \r
 .mfp-arrow-left:hover:after,\r
 .woocommerce .pswp__button--arrow--left:hover:after {\r
-  transform: translateX(-58px);\r
+  -ms-transform: translateX(-58px);\r
   -webkit-transform: translateX(-58px);\r
+  transform: translateX(-58px);\r
 }\r
 \r
 .ascend a.pp_arrow_previous:hover .icon-default-style {\r
-  transform: translateX(-7px);\r
+  -ms-transform: translateX(-7px);\r
   -webkit-transform: translateX(-7px);\r
+  transform: translateX(-7px);\r
 }\r
 \r
 .container-wrap input[type="text"],\r
@@ -1002,10 +1013,10 @@ a.pp_arrow_next {
 .container-wrap input[type="date"] {\r
   background-color: transparent !important;\r
   border: 1px solid #ccc !important;\r
-  box-shadow: none !important;\r
   -webkit-box-shadow: none !important;\r
-  font-size: 16px !important;\r
   -o-box-shadow: none !important;\r
+  box-shadow: none !important;\r
+  font-size: 16px !important;\r
   padding: 16px !important;\r
 }\r
 \r
index 7d29159..5b3ed96 100644 (file)
@@ -216,6 +216,7 @@ ul.tabs {
   margin: auto;
   background-color: #f5f5f5;
   -webkit-border-radius: 3px;
+  border-radius: 3px;
   border: 1px solid #d8d8d8;
   border-top: 1px solid #bcbcbc;
 }
@@ -239,7 +240,6 @@ ul.tabs {
 .tabs li a {
   margin: 0px;
   display: inline-block;
-  text-align: left;
   color: #41728d;
   font-size: 13px;
   font-family: 'PT Sans', serif;
@@ -284,13 +284,12 @@ a.button {
   text-decoration: none;
   font-size: 14px;
   line-height: 3em;
-  background: #ddd;
-  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
   -webkit-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
   -moz-box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
+  box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
   text-shadow: #fff 0px 1px 1px;
   background: -webkit-gradient(linear, left top, left bottom, from(#eeeeee), to(#bebebe));
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#bebebe');
+  background: #ddd;
 }
 
 a.button:hover {
@@ -299,12 +298,12 @@ a.button:hover {
 }
 
 a.button:active {
-  background: #ababab;
-  box-shadow: none;
   -webkit-box-shadow: none;
   -moz-box-shadow: none;
+  box-shadow: none;
   border-color: #ababab;
   border-top-color: #636363;
+  background: #ababab;
   background: -webkit-gradient(linear, left top, left bottom, from(#bebebe), to(#dddddd));
   -webkit-transition: none;
   padding: 4px 29px 2px 31px !important;
@@ -326,15 +325,13 @@ input.action {
   /* firefox */
   background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #FFFFFF), color-stop(50%, #F3F3F3), color-stop(100%, #EBEBEB));
   /* webkit */
-  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#FFFFFF', endColorstr='#EBEBEB',GradientType=0 );
-  /* ie */
-  box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);
   -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
   -moz-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);
+  box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);
   text-shadow: #fff 0px 1px 1px;
-  border-radius: 3px;
   -moz-border-radius: 3px;
   -webkit-border-radius: 3px;
+  border-radius: 3px;
   border-bottom-color: #a0a0a0;
   border-right-color: #bababa;
   border-left-color: #bababa;
@@ -349,12 +346,12 @@ input.action:hover {
 
 a.roundedButton:active,
 input.action:active {
-  background: #ababab;
-  box-shadow: none;
   -webkit-box-shadow: none;
   -moz-box-shadow: none;
+  box-shadow: none;
   border-color: #ababab;
   border-top-color: #636363;
+  background: #ababab;
   background: -webkit-gradient(linear, left top, left bottom, from(#bebebe), to(#dddddd));
   -webkit-transition: none;
   padding: 4px 15px;
@@ -593,6 +590,7 @@ a.downloadLink {
   padding-right: 7px;
   -moz-border-radius: 3px;
   -webkit-border-radius: 3px;
+  border-radius: 3px;
   color: #757575;
   font-size: 0.7em;
   text-decoration: none;
@@ -717,9 +715,9 @@ ul#quotes p.name strong {
   background: rgba(0, 0, 0, 0.8);
   padding: 1px 8px;
   color: white;
-  border-radius: 4px;
   -moz-border-radius: 4px;
   -webkit-border-radius: 4px;
+  border-radius: 4px;
 }
 
 a.Datasheet {
@@ -809,6 +807,7 @@ ul.user-project-list li {
   background-color: #e2f1f5;
   border: 1px solid #89c6d6;
   -webkit-border-radius: 3px;
+  border-radius: 3px;
   padding: 2px 8px;
   margin-bottom: 5px;
   color: #1a4b6b;
@@ -870,10 +869,12 @@ ul.user-project-list li {
 .user-photo img {
   border: 5px solid white;
   -webkit-box-shadow: 3px 2px 2px rgba(0, 0, 0, 0.3);
+  box-shadow: 3px 2px 2px rgba(0, 0, 0, 0.3);
 }
 
 .siteMessage {
   -webkit-border-radius: 4px;
+  border-radius: 4px;
   border: 1px solid;
   margin-bottom: 10px;
   margin-top: 20px;
@@ -1790,6 +1791,7 @@ a.featured-link:hover {
 
 .news-section .news-wrapper ul {
   margin: 30px 0;
+  -moz-padding-start: 0;
   -webkit-padding-start: 0;
 }
 
@@ -1977,6 +1979,7 @@ a.featured-link:hover {
 
 .footer-links ul {
   margin-left: 0;
+  -moz-padding-start: 0;
   -webkit-padding-start: 0;
 }
 
@@ -2660,8 +2663,7 @@ ul.marketplace-nav li:last-child {
 
 @media (max-width: 680px) {
   ul.marketplace-nav li {
-    display: block;
-    float: left;
+    display: table-cell;
     border-right: none;
     text-align: left;
     border-bottom: 1px solid #e8e8e8;
@@ -2708,7 +2710,6 @@ ul.marketplace-nav a span {
   ul.marketplace-nav a span {
     display: table-cell;
     vertical-align: middle;
-    float: left;
   }
 }
 
@@ -3428,7 +3429,6 @@ i.mobile-expand {
   i.mobile-expand {
     position: relative;
     display: inline-block;
-    float: right;
     cursor: pointer;
   }
 
@@ -3448,7 +3448,6 @@ i.mobile-expand {
   .navbar-nav > li.open i.mobile-expand {
     position: relative;
     display: inline-block;
-    float: right;
     cursor: pointer;
   }
 
index b806151..66b3a8e 100644 (file)
@@ -38,7 +38,7 @@
 }
 
 #directory_inner tr {
-  vertical-align: center;
+  vertical-align: middle;
 }
 
 #directory_inner {
 }
 
 .company_logo {
-  padding-right: 30px;
-  padding-left: 20px;
-  padding-top: 20px;
-  padding-bottom: 20px;
+  padding: 20px 30px 20px 20px;
 }
 
 .company_row:hover {
index 538ffb8..4be7c8d 100644 (file)
@@ -38,12 +38,12 @@ defined by the community under the oversight of the Technical Steering Committee
 <p>Please note that these sources are subject to further revisions and may be updated at some future time.
 The current compliance verification procedures are published by OPNFV.</p>
 
-<h2>Program Management & Maintenance</h2>
+<h2>Program Management &amp; Maintenance</h2>
 
-<h3>Role of C&C Committee</h3>
-<p>The OPNFV Certification & Compliance (C&C) Committee, hereafter referred to as the Committee, serves as the CVP
-administrator on behalf of the OPNFV Board of Directors. The Committee is responsible for defining program governance,
-compliance verification strategy, and the overall scope of the compliance verification procedures.</p>
+<h3>Role of C&amp;C Committee</h3>
+<p>The OPNFV Certification &amp; Compliance (C&amp;C) Committee, hereafter referred to as the Committee, serves as the
+CVP administrator on behalf of the OPNFV Board of Directors. The Committee is responsible for defining program
+governance, compliance verification strategy, and the overall scope of the compliance verification procedures.</p>
 
 <h3>Maintenance of Program Documents</h3>
 <p>Program documents, such as this document, produced by the Committee will be labeled using semantic versioning.
@@ -90,9 +90,9 @@ endorse any products or appear to endorse any products.</p>
     <li>Readiness for commercial deployment</li>
   </ul>
 </ul>
-<p>The OPNFV C&C Committee on behalf of the Board of Directors can award a product “OPNFV Ready” status. “OPNFV Ready”,
-therefore, may not be used in relation to a vendor’s product without first having met the requirements outlined in this
-document.</p>
+<p>The OPNFV C&amp;C Committee on behalf of the Board of Directors can award a product “OPNFV Ready” status.
+“OPNFV Ready”, therefore, may not be used in relation to a vendor’s product without first having met the requirements
+outlined in this document.</p>
 <p>Use of “Ready” must be used in conjunction with the OPNFV release name under which the product was verified
 (e.g., “OPNFV Colorado Ready”). This allows the OPNFV compliance/qualification standard to evolve over time as the
 OPNFV platform matures.</p>
@@ -125,7 +125,7 @@ respect to the confirmed category.</p>
 Logo/Trademark, program documents, or compliance verification procedures.</p>
 
 
-<h2>Compliance Verification & Application Requirements</h2>
+<h2>Compliance Verification &amp; Application Requirements</h2>
 <h3>Compliance Verification Procedures Requirements</h3>
 <p>CVP compliance verification procedures leverage tests, compliance verification tools, test infrastructure and
 compliance verification program infrastructure defined and maintained by OPNFV projects which are included in an OPNFV
@@ -170,8 +170,8 @@ and validity. Based on the determination of the Committee, a recommendation will
 regarding the approval of the granting of permission to use an OPNFV Logo/Trademark.</p>
 <p>The Committee may request additional information regarding the application for use of an OPNFV Logo/Trademark.</p>
 <p>OPNFV may charge a reasonable fee for reviewing results. Reviews will be conducted by OPNFV member companies
-participating in the review committee (a C&C subcommittee). No member company may review its own compliance verification
-results.</p>
+participating in the review committee (a C&amp;C subcommittee). No member company may review its own compliance
+verification results.</p>
 <p>In the event of a dispute, the submitting organization has a right to appeal the decision with the OPNFV Board of
 Directors. An appeals process is documented in the Escalation Process below.</p>
 
@@ -180,7 +180,7 @@ Directors. An appeals process is documented in the Escalation Process below.</p>
 
 <h3>Similarity Policy</h3>
 <p>Hardware platforms identified as similar to platforms that have passed CVP compliance verification procedures may
-apply to use the OPNFV Ready trademark. The C&C Committee can decide to grant “OPNFV Ready” to products designated
+apply to use the OPNFV Ready trademark. The C&amp;C Committee can decide to grant “OPNFV Ready” to products designated
 “under similarity”. The Committee will consider similarity in the following areas (for example):</p>
 <ul>
   <li>Compute</li>
index 6bd62f4..28b15ab 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE html>
 <head>
   <meta charset="utf-8">
-  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
   <title>Logo Request &raquo; OpenStack Open Source Cloud Computing Software</title>
-  <link rel="stylesheet" href="testapi-ui/assets/css/combine.css" />
+  <link rel="stylesheet" href="testapi-ui/assets/css/combine.css">
 </head>
 <body id="logo-request">
   <div class="container-fluid common-main-container">
@@ -24,7 +24,7 @@
               <i uib-tooltip="Organization name" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.organization_name" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -33,7 +33,7 @@
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.organization_web" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="col-md-4"></div>
@@ -42,7 +42,7 @@
               <i uib-tooltip="Product name and/or identifier" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="email text form-control" ng-model="ctrl.product_name" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -51,7 +51,7 @@
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.product_spec" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -60,7 +60,7 @@
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.product_documentation" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -78,7 +78,7 @@
               <i uib-tooltip="Primary contact name" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.prim_name" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -87,7 +87,7 @@
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.prim_email" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
@@ -95,7 +95,7 @@
               <i uib-tooltip="Primary postal address" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.prim_address" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
               <i uib-tooltip="Primary phone number" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
                 <input type="text" class="text form-control" ng-model="ctrl.prim_phone" required="required"
-                       aria-required="true" />
+                       aria-required="true">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">User ID for CVP web portal</label>
               <i uib-tooltip="User ID for CVP web portal" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.user_id" />
+                <input type="text" class="text form-control" ng-model="ctrl.user_id">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">Description</label>
               <i uib-tooltip="Product Description" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.description" />
+                <input type="text" class="text form-control" ng-model="ctrl.description">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">SUT Version</label>
               <i uib-tooltip="SUT Version" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.sut_version" />
+                <input type="text" class="text form-control" ng-model="ctrl.sut_version">
               </div>
             </div>
             <div class="field text col-md-4">
               <i uib-tooltip="SUT HW Version - leave blank if not applicable"
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.sut_hw_version" />
+                <input type="text" class="text form-control" ng-model="ctrl.sut_hw_version">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">OVP Version</label>
               <i uib-tooltip="OVP Version" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.ovp_version" />
+                <input type="text" class="text form-control" ng-model="ctrl.ovp_version">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">OVP Category</label>
               <i uib-tooltip="OVP Category" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.ovp_category" />
+                <input type="text" class="text form-control" ng-model="ctrl.ovp_category">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">Company Logo</label>
               <i uib-tooltip="Company Logo" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.company_logo" />
+                <input type="text" class="text form-control" ng-model="ctrl.company_logo">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">Approve Date</label>
               <i uib-tooltip="Approve Date - YYYY-MM-DD" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.approve_date" />
+                <input type="text" class="text form-control" ng-model="ctrl.approve_date">
               </div>
             </div>
             <div class="field text col-md-4">
               <label class="left">Approved</label>
               <i uib-tooltip="Approved - insert true or false" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.approved" />
+                <input type="text" class="text form-control" ng-model="ctrl.approved">
               </div>
             </div>
             <div class="field text col-md-4">
               <i uib-tooltip="Test ID - enter approved test_id"
                  class="glyphicon glyphicon-question-sign opnfv-blue"></i>
               <div class="middleColumn">
-                <input type="text" class="text form-control" ng-model="ctrl.test_id" />
+                <input type="text" class="text form-control" ng-model="ctrl.test_id">
               </div>
             </div>
             <div class="field text col-md-4">
               <div class="field text col-md-4">
                 <label class="left">Lab Name</label>
                 <i uib-tooltip="Lab Name" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
-                <input type="text" class="text form-control" ng-model="ctrl.lab_name"/>
+                <input type="text" class="text form-control" ng-model="ctrl.lab_name">
               </div>
               <div class="field text col-md-4">
                 <label class="left">Lab Email</label>
                 <i uib-tooltip="Lab Email" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
-                <input type="text" class="text form-control" ng-model="ctrl.lab_email"/>
+                <input type="text" class="text form-control" ng-model="ctrl.lab_email">
               </div>
               <div class="field text col-md-4">
                 <label class="left">Lab Address</label>
                 <i uib-tooltip="Lab Address" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
-                <input type="text" class="text form-control" ng-model="ctrl.lab_address"/>
+                <input type="text" class="text form-control" ng-model="ctrl.lab_address">
               </div>
               <div class="field text col-md-4">
                 <label class="left">Lab Phone Number</label>
                 <i uib-tooltip="Lab Phone Number" class="glyphicon glyphicon-question-sign opnfv-blue"></i>
-                <input type="text" class="text form-control" ng-model="ctrl.lab_phone"/>
+                <input type="text" class="text form-control" ng-model="ctrl.lab_phone">
               </div>
             </div>
           </fieldset>
index 86d3d35..f3aab41 100644 (file)
@@ -1,5 +1,5 @@
 <h3>Sign In</h3>
-<b>Please choose your account provider:</b>
+<strong>Please choose your account provider:</strong>
 <div class="row">
   <div class="col-xs-6 col-md-3">
     <a ng-click="auth.doSignIn('cas')" class="thumbnail">
index 535110e..3be13d4 100644 (file)
@@ -2,7 +2,7 @@
   <h3>OPNFV Verified Product Directory</h3>
   <div>
     <h4>Compliance Marks Granted to {{ctrl.companyID}}</h4>
-    <img src="api/v1/cvp/applications/getlogo/{{ctrl.company_logo}}" />
+    <img src="api/v1/cvp/applications/getlogo/{{ctrl.company_logo}}" alt="Company Logo">
     <table class="table table-striped table-hover">
       <thead>
         <tr>
         <tbody class="directory_inner" style="overflow: hidden; text-overflow: ellipsis;">
           <tr style="vertical-align: center;" ng-repeat="prod in ctrl.directory"
               ng-if="prod.organization_name==ctrl.companyID && prod.approved=='true'">
-            <td width="250">{{ prod.product_name}}</td>
-            <td width="350">{{ prod.description}}</td>
-            <td width="150">{{ prod.ovp_category}}</td>
-            <td width="150">{{ prod.ovp_version}}</td>
+            <td style="width: 250px;">{{ prod.product_name}}</td>
+            <td style="width: 350px;">{{ prod.description}}</td>
+            <td style="width: 150px;">{{ prod.ovp_category}}</td>
+            <td style="width: 150px;">{{ prod.ovp_version}}</td>
             <td><a href="{{ prod.product_documentation}}" target="_blank">{{ prod.product_documentation}}</a></td>
-            <td width="150">{{ prod.sut_version}}</td>
-            <td width="150">{{ prod.sut_hw_version}}</td>
+            <td style="width: 150px;">{{ prod.sut_version}}</td>
+            <td style="width: 150px;">{{ prod.sut_hw_version}}</td>
           </tr>
         </tbody>
     </table>
index bf65a38..385fafe 100644 (file)
@@ -9,9 +9,9 @@ variable 'guidelines'.
   <h4>{{area.area_name}}</h4>
   <ol class="capabilities">
     <li class="capability-list-item" ng-repeat="api in area.value">
-      <span class="capability-name">{{api.api_name}}</span><br />
-      Area: <em>{{area.area_name}}</em><br />
-      Status: <span>Mandatory</span><br />
+      <span class="capability-name">{{api.api_name}}</span><br>
+      Area: <em>{{area.area_name}}</em><br>
+      Status: <span>Mandatory</span><br>
 
       <a ng-click="showTests = !showTests">Tests ({{api.value.length}})</a>
       <ul uib-collapse="!showTests">
@@ -29,8 +29,8 @@ variable 'guidelines'.
   <h4>{{area.area_name}}</h4>
   <ol class="capabilities">
     <li class="capability-list-item" ng-repeat="api in area.value">
-      <span class="capability-name">{{api.api_name}}</span><br />
-      Status: <span>Optional</span><br />
+      <span class="capability-name">{{api.api_name}}</span><br>
+      Status: <span>Optional</span><br>
 
       <a ng-click="showTests = !showTests">Tests ({{api.value.length}})</a>
       <ul uib-collapse="!showTests">
index 8e4a37d..0b572c5 100644 (file)
@@ -3,9 +3,9 @@
     <button type="button" class="close" aria-hidden="true" ng-click="modal.close()">&times;</button>
     <h4>Test List ({{modal.testListCount}})</h4>
     <p>Use this test list with
-       <a title="testapi-client" target="_blank"href="https://github.com/openstack/testapi-client">testapi-client</a>
-       to run only tests in the {{modal.version}} OpenStack Powered&#8482; guideline from capabilities with the
-       following statuses:
+      <a title="testapi-client" target="_blank" href="https://github.com/openstack/testapi-client">testapi-client</a>
+      to run only tests in the {{modal.version}} OpenStack Powered&#8482; guideline from capabilities with the
+      following statuses:
     </p>
     <ul class="list-inline">
       <li class="required" ng-if="modal.status.required"> Required</li>
index fd5ca36..1c5eeed 100644 (file)
             <div class="panel-body">
                 <div>
                   <a href="https://www.opnfv.org/verified"
-                     target="_blank">Overview&nbsp;>
+                     target="_blank">Overview&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
                 <div>
                   <a href="https://www.opnfv.org/wp-content/uploads/sites/12/2018/09/LFN_CVP_Guidelines-1.0.0.pdf"
-                     target="_blank">Governance Guidelines&nbsp;>
+                     target="_blank">Governance Guidelines&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
                 <div>
                   <a href="https://www.opnfv.org/wp-content/uploads/sites/12/2018/09/OVP-Terms-and-Conditions-092418.pdf"
-                     target="_blank">Terms &amp; Conditions&nbsp;>
+                     target="_blank">Terms &amp; Conditions&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
                 <div>
                   <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/certificationworkflow/index.html"
-                     target="_blank">Process Workflow&nbsp;>
+                     target="_blank">Process Workflow&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
                 <div>
                   <a href="https://na3.docusign.net/Member/PowerFormSigning.aspx?PowerFormId=dc24bf38-ea41-40d4-9e58-9babc6eec778"
-                     target="_blank">Participation Form&nbsp;>
+                     target="_blank">Participation Form&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
                 <div>
                   <a href="https://www.opnfv.org/wp-content/uploads/sites/12/2018/05/OPNFV_Verified_BrandGuide_021618.pdf"
-                     target="_blank">OPNFV Verified Brand Guidelines&nbsp;>
+                     target="_blank">OPNFV Verified Brand Guidelines&nbsp;
                     <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                   </a>
                 </div>
             <div class="panel-body">
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/userguide/testing_guide.html"
-                   target="_blank">OVP / Dovetail User Guide&nbsp;>
+                   target="_blank">OVP / Dovetail User Guide&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/userguide/cli_reference.html"
-                   target="_blank">Dovetail CLI&nbsp;>
+                   target="_blank">Dovetail CLI&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/testspecification"
-                   target="_blank">Test Specifications&nbsp;>
+                   target="_blank">Test Specifications&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/release/release-notes/index.html"
-                   target="_blank">Release Notes&nbsp;>
+                   target="_blank">Release Notes&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/reviewerguide/index.html"
-                   target="_blank">Reviewer Guide&nbsp;>
+                   target="_blank">Reviewer Guide&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-fraser/submodules/dovetail/docs/testing/user/ovpaddendum/index.html"
-                   target="_blank">Guidelines Addendum&nbsp;>
+                   target="_blank">Guidelines Addendum&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
             <div class="panel-body">
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/testing/user/userguide/testing_guide.html"
-                   target="_blank">OVP / Dovetail User Guide&nbsp;>
+                   target="_blank">OVP / Dovetail User Guide&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/testing/user/userguide/cli_reference.html"
-                   target="_blank">Dovetail CLI&nbsp;>
+                   target="_blank">Dovetail CLI&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/testing/user/testspecification"
-                   target="_blank">Test Specifications&nbsp;>
+                   target="_blank">Test Specifications&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/release/release-notes/index.html"
-                   target="_blank">Release Notes&nbsp;>
+                   target="_blank">Release Notes&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/testing/user/reviewerguide/index.html"
-                   target="_blank">Reviewer Guide&nbsp;>
+                   target="_blank">Reviewer Guide&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
               <div>
                 <a href="http://docs.opnfv.org/en/stable-danube/submodules/dovetail/docs/testing/user/ovpaddendum/index.html"
-                   target="_blank">Guidelines Addendum&nbsp;>
+                   target="_blank">Guidelines Addendum&nbsp;
                   <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
                 </a>
               </div>
         </div>
         <div class="home-content">
           <div class="col-md-2">
-            <img class="home-content-img" src="testapi-ui/assets/img/icon.png" />
+            <img class="home-content-img" src="testapi-ui/assets/img/icon.png" alt="OPNFV">
           </div>
           <div class="col-md-10">
             <p class="home-content-text" style="padding-bottom: 40px;">
             <tbody style="overflow: hidden; text-overflow: ellipsis;">
               <tr class="company_row" ng-click="ctrl.getCompany(app)"
                   ng-repeat="app in ctrl.applications | filter:{approved:true} | orderBy : '-approve_date'">
-                <td width="400">
-                  <img class="company_logo" ng-src="api/v1/cvp/applications/getlogo/{{app.company_logo}}" />
+                <td style="width: 400px;">
+                  <img class="company_logo" ng-src="api/v1/cvp/applications/getlogo/{{app.company_logo}}" alt="OPNFV">
                   {{ app.organization_name}}
                 </td>
-                <td width="300">{{ app.product_name}}</td>
-                <td width="150">{{ app.ovp_category}}</td>
-                <td width="150">{{ app.ovp_version}}</td>
+                <td style="width: 300px;">{{ app.product_name}}</td>
+                <td style="width: 150px;">{{ app.ovp_category}}</td>
+                <td style="width: 150px;">{{ app.ovp_version}}</td>
               </tr>
             </tbody>
           </table>
index 9a147f4..d9758fe 100644 (file)
         <option value="true">Yes</option>
         <option value="">No</option>
       </select>
-      <br />
+      <br>
       <strong>Associated Guideline:</strong>
       <select ng-model="modal.metaCopy.guideline"
               ng-options="o as o.slice(0, -5) for o in modal.versionList"
               class="form-control">
         <option value="">None</option>
       </select>
-      <br />
+      <br>
       <strong>Associated Target Program:</strong>
       <select ng-model="modal.metaCopy.target"
               class="form-control">
@@ -28,7 +28,7 @@
         <option value="compute">OpenStack Powered Compute</option>
         <option value="object">OpenStack Powered Object Storage</option>
       </select>
-      <hr />
+      <hr>
       <strong>Associated Product:</strong>
       <select ng-options="product as product.name for product in modal.products | arrayConverter | orderBy: 'name' track by product.id"
               ng-model="modal.selectedProduct"
index d58f1be..3f3e9c9 100644 (file)
@@ -3,22 +3,22 @@ HTML for each accordion group that separates the status types on the results
 report page.
 -->
 
-Test Filters:<br />
+Test Filters:<br>
 <div class="btn-toolbar" role="toolbar">
   <div class="btn-group button-margin" data-toggle="buttons">
     <label class="btn btn-default" ng-click="ctrl.changeStatus('total')"
            ng-class="{'active': ctrl.testStatus === 'total'}">
-      <input type="radio" ng-model="ctrl.testStatus" value="total">
+      <input type="radio" ng-model="ctrl.testStatus" value="total" name="total">
       <span class="text-primary">All</span>
     </label>
     <label class="btn btn-default" ng-click="ctrl.changeStatus('passed')"
            ng-class="{'active': ctrl.testStatus === 'passed'}">
-      <input type="radio" ng-model="ctrl.testStatus" value="passed">
+      <input type="radio" ng-model="ctrl.testStatus" value="passed" name="passed">
       <span class="text-success">Passed</span>
     </label>
     <label class="btn btn-default" ng-click="ctrl.changeStatus('not passed')"
            ng-class="{'active': ctrl.testStatus === 'not passed'}">
-      <input type="radio" ng-model="ctrl.testStatus" value="not passed">
+      <input type="radio" ng-model="ctrl.testStatus" value="not passed" name="not passed">
       <span class="text-danger">Not Passed</span>
     </label>
   </div>
@@ -35,10 +35,14 @@ Test Filters:<br />
        ng-class="{'glyphicon-chevron-down': isOpen, 'glyphicon-chevron-right': !isOpen}"></i>
   </uib-accordion-heading>
   <ol class="capabilities">
-    <li ng-repeat="(area, value) in data" ng-show="(ctrl.testStatus == 'passed' && value.pass != 0) || (ctrl.testStatus == 'not passed' && value.fail != 0) || ctrl.testStatus == 'total'">
+    <li ng-repeat="(area, value) in data"
+        ng-show="(ctrl.testStatus == 'passed' && value.pass != 0) || (ctrl.testStatus == 'not passed' && value.fail != 0) || ctrl.testStatus == 'total'">
       <a ng-click="value.folder = !value.folder">
         {{ area }}
-        <span ng-if="ctrl.testStatus == 'total'" ng-class="{'text-success': value.total == value.pass, 'text-warning': (value.pass < value.total && value.pass > 0), 'text-danger': value.pass == 0}">[{{ value.pass }}/{{ value.total }}]</span>
+        <span ng-if="ctrl.testStatus == 'total'"
+              ng-class="{'text-success': value.total == value.pass, 'text-warning': (value.pass < value.total && value.pass > 0), 'text-danger': value.pass == 0}">
+          [{{ value.pass }}/{{ value.total }}]
+        </span>
         <span ng-if="ctrl.testStatus == 'passed'" class="text-success">[{{ value.pass }}]</span>
         <span ng-if="ctrl.testStatus == 'not passed'" class="text-danger">[{{ value.fail }}]</span>
       </a>
index 576f23e..0d85875 100644 (file)
@@ -5,21 +5,21 @@
     <div class="row">
       <div class="pull-left">
         <div class="test-report">
-          <strong>OVP version:</strong> {{ctrl.version}}<br />
-          <strong>Test ID:</strong> {{ctrl.testId}}<br />
+          <strong>OVP version:</strong> {{ctrl.version}}<br>
+          <strong>Test ID:</strong> {{ctrl.testId}}<br>
         </div>
       </div>
     </div>
   </div>
 
-  <strong>Total: {{ctrl.statistics.total}}, Pass: {{ ctrl.statistics.pass}}, Rate: {{ ctrl.statistics.pass / ctrl.statistics.total * 100 | number:2 }}%</strong><br />
-  <strong>Mandatory Total: {{ctrl.statistics.mandatory.total}}, Pass: {{ ctrl.statistics.mandatory.pass }}, Rate: {{ ctrl.statistics.mandatory.pass / ctrl.statistics.mandatory.total * 100 | number:2 }}%</strong><br />
-  <strong>Optional Total: {{ctrl.statistics.optional.total}}, Pass: {{ ctrl.statistics.optional.pass }}, Rate: {{ ctrl.statistics.optional.pass / ctrl.statistics.optional.total * 100 | number:2 }}%</strong><br />
+  <strong>Total: {{ctrl.statistics.total}}, Pass: {{ ctrl.statistics.pass}}, Rate: {{ ctrl.statistics.pass / ctrl.statistics.total * 100 | number:2 }}%</strong><br>
+  <strong>Mandatory Total: {{ctrl.statistics.mandatory.total}}, Pass: {{ ctrl.statistics.mandatory.pass }}, Rate: {{ ctrl.statistics.mandatory.pass / ctrl.statistics.mandatory.total * 100 | number:2 }}%</strong><br>
+  <strong>Optional Total: {{ctrl.statistics.optional.total}}, Pass: {{ ctrl.statistics.optional.pass }}, Rate: {{ ctrl.statistics.optional.pass / ctrl.statistics.optional.total * 100 | number:2 }}%</strong><br>
   <hr>
-  <strong>{{ ctrl.validation }}</strong><br />
+  <strong>{{ ctrl.validation }}</strong><br>
 
   <div>
-    <hr />
+    <hr>
     <h4>Test Result Overview</h4>
     <uib-accordion close-others=false>
       <!-- The ng-repeat is used to pass in a local variable to the template. -->
@@ -27,7 +27,7 @@
         src="ctrl.detailsTemplate"
         onload="isOpen = true">
       </ng-include>
-      <br />
+      <br>
     </uib-accordion>
   </div>
 </div>
index 5717b54..021a355 100644 (file)
@@ -1,6 +1,6 @@
 <div>
   <h4>Enter user name or email</h4>
-  <input type="text" ng-model="ctrl.userName" />
+  <input type="text" ng-model="ctrl.userName">
   <div style="text-align: center; margin-top: 20px;">
     <button class="btn btn-default" ng-disabled="ctrl.userName==null || ctrl.userName==''"
             ng-click="ctrl.addSharedUser(ctrl.tempResult, ctrl.userName)">Commit</button>
index 913d882..bc15169 100644 (file)
@@ -8,7 +8,7 @@
     </h4>
     <div class="form-group col-m-3">
       <input class="form-contrl btn btn-success cvp-btn medium accent-color regular-button" type="file"
-             file-model="resultFile"/>
+             file-model="resultFile">
     </div>
     <div class="form-group col-m-3">
       <a class="btn btn-success cvp-btn medium accent-color regular-button" ng-click="ctrl.uploadFile()">
           </td>
           <td>
             <div class="btn-group" uib-dropdown>
-              <a id="single-button" type="button"
+              <a id="single-button-two" type="button"
                  class="btn btn-success cvp-btn medium accent-color regular-button" style="width: 130px;"
                  uib-dropdown-toggle>
                 Share List<span class="caret"></span>
               </a>
-              <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button"
+              <ul class="dropdown-menu" uib-dropdown-menu role="menu" aria-labelledby="single-button-two"
                   style="min-width: 200%;">
                 <li class="menu-item menu-item-type-post_type menu-item-object-page" role="menuitem"
                     ng-repeat="share in result.shared track by $index">
index ec6b20c..f707662 100644 (file)
@@ -1,7 +1,8 @@
 <!DOCTYPE html>
 <head>
-  <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
-  <link rel="stylesheet" href="testapi-ui/assets/css/combine.css" />
+  <title>OVP</title>
+  <meta http-equiv="Content-type" content="text/html; charset=utf-8">
+  <link rel="stylesheet" href="testapi-ui/assets/css/combine.css">
 </head>
 <body>
   <div class="container-fluid common-main-container">
index 22a2525..f42166a 100644 (file)
@@ -1,18 +1,18 @@
 <!DOCTYPE html>
 <!--
- Copyright (c) 2015 IBM Corp.
 Copyright (c) 2015 IBM Corp.
 
- Licensed under the Apache License, Version 2.0 (the "License"); you may
- not use this file except in compliance with the License. You may obtain
- a copy of the License at
 Licensed under the Apache License, Version 2.0 (the "License"); you may
 not use this file except in compliance with the License. You may obtain
 a copy of the License at
 
-    http://www.apache.org/licenses/LICENSE-2.0
+  http://www.apache.org/licenses/LICENSE-2.0
 
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- License for the specific language governing permissions and limitations
- under the License.
 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 License for the specific language governing permissions and limitations
 under the License.
 -->
 <html id="ng-app">
   <head>
     <meta name="viewport" content="width=device-width">
     <title>OVP</title>
 
-    <link rel="icon" type="image/png" href="testapi-ui/favicon.ico" sizes="16x16" />
-    <link rel="icon" type="image/png" href="testapi-ui/favicon.ico" sizes="32x32" />
+    <link rel="icon" type="image/png" href="testapi-ui/favicon.ico" sizes="16x16">
+    <link rel="icon" type="image/png" href="testapi-ui/favicon.ico" sizes="32x32">
 
     <!-- CSS Libraries -->
-    <link rel="stylesheet" href="testapi-ui/node_modules/bootstrap/dist/css/bootstrap.min.css" />
-    <link rel="stylesheet" href="testapi-ui/node_modules/angular-busy/dist/angular-busy.min.css" />
-    <link rel="stylesheet" href="testapi-ui/node_modules/ng-dialog/css/ngDialog.min.css" />
-    <link rel="stylesheet" href="testapi-ui/node_modules/ng-dialog/css/ngDialog-theme-default.min.css" />
-    <link rel="stylesheet" href="testapi-ui/node_modules/angular-xeditable/dist/css/xeditable.min.css" />
+    <link rel="stylesheet" href="testapi-ui/node_modules/bootstrap/dist/css/bootstrap.min.css">
+    <link rel="stylesheet" href="testapi-ui/node_modules/angular-busy/dist/angular-busy.min.css">
+    <link rel="stylesheet" href="testapi-ui/node_modules/ng-dialog/css/ngDialog.min.css">
+    <link rel="stylesheet" href="testapi-ui/node_modules/ng-dialog/css/ngDialog-theme-default.min.css">
+    <link rel="stylesheet" href="testapi-ui/node_modules/angular-xeditable/dist/css/xeditable.min.css">
 
     <!-- CSS Internal Code -->
-    <link rel="stylesheet" href="testapi-ui/assets/css/cvp-style.css" />
-    <link rel="stylesheet" href="testapi-ui/assets/css/ascend.css" />
-    <link rel="stylesheet" href="testapi-ui/assets/css/index.css" />
-    <link rel="stylesheet" href="testapi-ui/assets/css/header.css" />
-    <link rel="stylesheet" href="testapi-ui/assets/css/home/home.css" />
+    <link rel="stylesheet" href="testapi-ui/assets/css/cvp-style.css">
+    <link rel="stylesheet" href="testapi-ui/assets/css/ascend.css">
+    <link rel="stylesheet" href="testapi-ui/assets/css/index.css">
+    <link rel="stylesheet" href="testapi-ui/assets/css/header.css">
+    <link rel="stylesheet" href="testapi-ui/assets/css/home/home.css">
 
     <!-- JS Libraries -->
     <script src="testapi-ui/node_modules/jquery/dist/jquery.min.js"></script>
index f0ede3a..7a12cc7 100644 (file)
@@ -1,8 +1,8 @@
 <div class="header-container-1">
   <div class="row header-container-row">
     <div class="col-md-3">
-      <a href="/#/" >
-        <img class="stnd  dark-version header-logo" alt="OPNFV" src="testapi-ui/assets/img/logo.png"  />
+      <a href="/#/">
+        <img class="stnd dark-version header-logo" alt="OPNFV" src="testapi-ui/assets/img/logo.png">
       </a>
     </div>
     <div class="col-md-offset-1 header-title">
diff --git a/node-requirements.txt b/node-requirements.txt
new file mode 100644 (file)
index 0000000..69473dc
--- /dev/null
@@ -0,0 +1,2 @@
+htmllint-cli
+csslint
diff --git a/tox.ini b/tox.ini
index 6b1fb5d..404e32e 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = pep8,py27
+envlist = weblint,pep8,py27
 skipsdist = True
 sitepackages = True
 
@@ -18,7 +18,7 @@ deps =
 commands=
   py.test \
   --basetemp={envtmpdir} \
-  --cov \
+  --cov=opnfv_testapi \
   --cov-report term-missing \
   --cov-report xml \
   {posargs}
@@ -26,9 +26,18 @@ setenv=
   HOME = {envtmpdir}
   PYTHONPATH = {toxinidir}
 
+[testenv:weblint]
+deps = nodeenv
+commands =
+  nodeenv --force -r node-requirements.txt {envdir}/npmenv
+  bash -c 'ln -f -s {envdir}/npmenv/bin/node {envdir}/bin/node'
+  {envdir}/npmenv/bin/htmllint --cwd {toxinidir}/3rd_party/
+  {envdir}/npmenv/bin/csslint {toxinidir}/3rd_party/
+whitelist_externals = bash
+
 [testenv:pep8]
 deps = flake8
-commands = flake8 {toxinidir}
+commands = flake8 opnfv_testapi
 
 [flake8]
 # H803 skipped on purpose per list discussion.