rack-contrib
rack-contrib copied to clipboard
Tests fails (Ruby 3.1.2)
> rake test
WARN: Skipping Rack::MailExceptions tests (mail not installed)
Run options: --seed 60240
# Running:
...................................F..../home/alex/Projects/ruby/rack-contrib/lib/rack/contrib/backstage.rb:13: warning: File.exists? is deprecated; use File.exist? instead
./home/alex/Projects/ruby/rack-contrib/lib/rack/contrib/backstage.rb:13: warning: File.exists? is deprecated; use File.exist? instead
..[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
..................................................[DEPRECATION] `PostBodyContentTypeParser` is deprecated. Use `JSONBodyParser` as a drop-in replacement.
.....................................................................................................................
Finished in 0.112627s, 1908.9515 runs/s, 4403.9067 assertions/s.
1) Failure:
Rack::Profiler#test_0002_called multiple times via query params [/home/alex/Projects/ruby/rack-contrib/test/spec_rack_profiler.rb:26]:
Expected /Time#initialize \[4 calls, 4 total\]/ to match "<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">\n<title>ruby-prof call tree</title>\n<style type=\"text/css\">\r\n<!--\r\n body {\r\n font-size:70%;\r\n padding:0;\r\n margin:5px;\r\n margin-right:0px;\r\n margin-left:0px;\r\n background: #ffffff;\r\n }\r\n ul {\r\n margin-left:0px;\r\n margin-top:0px;\r\n margin-bottom:0px;\r\n padding-left:0px;\r\n list-style-type:none;\r\n }\r\n li {\r\n margin-left:11px;\r\n padding:0px;\r\n white-space:nowrap;\r\n border-top:1px solid #cccccc;\r\n border-left:1px solid #cccccc;\r\n border-bottom:none;\r\n }\r\n .thread {\r\n margin-left:11px;\r\n background:#708090;\r\n padding-top:3px;\r\n padding-left:12px;\r\n padding-bottom:2px;\r\n border-left:1px solid #CCCCCC;\r\n border-top:1px solid #CCCCCC;\r\n font-weight:bold;\r\n }\r\n .hidden {\r\n display:none;\r\n width:0px;\r\n height:0px;\r\n margin:0px;\r\n padding:0px;\r\n border-style:none;\r\n }\r\n .color01 { background:#adbdeb }\r\n .color05 { background:#9daddb }\r\n .color0 { background:#8d9dcb }\r\n .color1 { background:#89bccb }\r\n .color2 { background:#56e3e7 }\r\n .color3 { background:#32cd70 }\r\n .color4 { background:#a3d53c }\r\n .color5 { background:#c4cb34 }\r\n .color6 { background:#dcb66d }\r\n .color7 { background:#cda59e }\r\n .color8 { background:#be9d9c }\r\n .color9 { background:#cf947a }\r\n #commands {\r\n font-size:10pt;\r\n padding:10px;\r\n margin-left:11px;\r\n margin-bottom:0px;\r\n margin-top:0px;\r\n background:#708090;\r\n border-top:1px solid #cccccc;\r\n border-left:1px solid #cccccc;\r\n border-bottom:none;\r\n }\r\n #titlebar {\r\n font-size:10pt;\r\n padding:10px;\r\n margin-left:11px;\r\n margin-bottom:0px;\r\n margin-top:10px;\r\n background:#8090a0;\r\n border-top:1px solid #cccccc;\r\n border-left:1px solid #cccccc;\r\n border-bottom:none;\r\n }\r\n #help {\r\n font-size:10pt;\r\n padding:10px;\r\n margin-left:11px;\r\n margin-bottom:0px;\r\n margin-top:0px;\r\n background:#8090a0;\r\n display:none;\r\n border-top:1px solid #cccccc;\r\n border-left:1px solid #cccccc;\r\n border-bottom:none;\r\n }\r\n #sentinel {\r\n height: 400px;\r\n margin-left:11px;\r\n background:#8090a0;\r\n border-top:1px solid #cccccc;\r\n border-left:1px solid #cccccc;\r\n border-bottom:none;\r\n }\r\n input { margin-left:10px; }\r\n\r\n .toggle {\r\n background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAJCAMAAAD0FKf3AAAAA3NCSVQICAjb4U/gAAAAb1BMVEX///98jcR8jMV4jMB7jcR7jcR8jcT////7/f/3/P/0+vzx+v7s9vzq9Pzm8Prk7vzi7fnj5/Pc5vTb5vbg5PHW4fHV3/XS3fLM1+3K1e/G0e3EzuzCzey8x+m8xuystuSqtt98jsR8jcR7jcQAAADWswcWAAAAJXRSTlMAVVVV3e7u////////////////////////////////////////Vv4VOQAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAACVSURBVAiZPc/hDoIwDATgobCWgZsWgSGidOz9n9F1CPfrki+5tIqPXHSQVMVZFH8/sx/Is16X9zR2vtQPAMC6LxVnco5Dpvtt40QRGrspnueBqDUcdmrEMILtknkiQkQOU5RAsn9RPGRKNkLOxiibIEauNSYZy2CNyerGRngtsilkiLXP9Cx1bzuAZU13Himq/a3rWX4VVRPEuDWiLQAAAABJRU5ErkJggg==) no-repeat left center;\r\n float:left;\r\n width:9px;\r\n height:9px;\r\n margin:2px 1px 1px 1px;\r\n }\r\n\r\n .toggle.minus {\r\n background-position: -9px 0;\r\n }\r\n\r\n .toggle.plus {\r\n background-position: -18px 0;\r\n }\r\n\r\n-->\r\n</style>\n<script type=\"text/javascript\">\r\n /*\r\n Copyright (C) 2005,2009 Stefan Kaes\r\n [email protected]\r\n */\r\n\r\n function rootNode() {\r\n return currentThread;\r\n }\r\n\r\n function showUL(node, show) {\r\n var lis = node.childNodes;\r\n var l = lis.length;\r\n for (var i=0; i < l ; i++ ) {\r\n toggle(lis[i], show);\r\n }\r\n }\r\n\r\n function findUlChild(li){\r\n var ul = li.childNodes[2];\r\n while (ul && ul.nodeName != \"UL\") {\r\n ul = ul.nextSibling;\r\n }\r\n return ul;\r\n }\r\n\r\n function isLeafNode(li) {\r\n var img = li.firstChild;\r\n return (img.className.indexOf('empty') > -1);\r\n }\r\n\r\n function toggle(li, show) {\r\n if (isLeafNode(li))\r\n return;\r\n\r\n var img = li.firstChild;\r\n img.className = 'toggle ';\r\n img.className += show ? 'minus' : 'plus';\r\n\r\n var ul = findUlChild(li);\r\n if (ul) {\r\n ul.style.display = show ? 'block' : 'none';\r\n showUL(ul, true);\r\n }\r\n }\r\n\r\n function toggleLI(li) {\r\n var img = li.firstChild;\r\n if (img.className.indexOf(\"minus\")>-1)\r\n toggle(li, false);\r\n else {\r\n if (img.className.indexOf(\"plus\")>-1)\r\n toggle(li, true);\r\n }\r\n }\r\n\r\n function aboveThreshold(text, threshold) {\r\n var match = text.match(/\\d+[.,]\\d+/);\r\n return (match && parseFloat(match[0].replace(/,/, '.'))>=threshold);\r\n }\r\n\r\n function setThresholdLI(li, threshold) {\r\n var img = li.firstChild;\r\n var text = img.nextSibling.firstChild;\r\n var ul = findUlChild(li);\r\n\r\n var visible = aboveThreshold(text.nodeValue, threshold) ? 1 : 0;\r\n\r\n var count = 0;\r\n if (ul) {\r\n count = setThresholdUL(ul, threshold);\r\n }\r\n if (count>0) {\r\n img.className = 'toggle minus';\r\n }\r\n else {\r\n img.className = 'toggle empty';\r\n }\r\n if (visible) {\r\n li.style.display = 'block'\r\n }\r\n else {\r\n li.style.display = 'none'\r\n }\r\n return visible;\r\n }\r\n\r\n function setThresholdUL(node, threshold) {\r\n var lis = node.childNodes;\r\n var l = lis.length;\r\n\r\n var count = 0;\r\n for ( var i = 0; i < l ; i++ ) {\r\n count = count + setThresholdLI(lis[i], threshold);\r\n }\r\n\r\n var visible = (count > 0) ? 1 : 0;\r\n if (visible) {\r\n node.style.display = 'block';\r\n }\r\n else {\r\n node.style.display = 'none';\r\n }\r\n return visible;\r\n }\r\n\r\n function toggleChildren(img, event) {\r\n event.cancelBubble=true;\r\n if (img.className.indexOf('empty') > -1)\r\n return;\r\n\r\n var minus = (img.className.indexOf('minus') > -1);\r\n\r\n if (minus) {\r\n img.className = 'toggle plus';\r\n }\r\n else\r\n img.className = 'toggle minus';\r\n\r\n var li = img.parentNode;\r\n var ul = findUlChild(li);\r\n if (ul) {\r\n if (minus)\r\n ul.style.display = 'none';\r\n else\r\n ul.style.display = 'block';\r\n }\r\n if (minus)\r\n moveSelectionIfNecessary(li);\r\n }\r\n\r\n function showChildren(li) {\r\n var img = li.firstChild;\r\n if (img.className.indexOf('empty') > -1)\r\n return;\r\n img.className = 'toggle minus';\r\n\r\n var ul = findUlChild(li);\r\n if (ul) {\r\n ul.style.display = 'block';\r\n }\r\n }\r\n\r\n function setThreshold() {\r\n var tv = document.getElementById(\"threshold\").value;\r\n if (tv.match(/[0-9]+([.,][0-9]+)?/)) {\r\n var f = parseFloat(tv.replace(/,/, '.'));\r\n var threads = document.getElementsByName(\"thread\");\r\n var l = threads.length;\r\n for ( var i = 0; i < l ; i++ ) {\r\n setThresholdUL(threads[i], f);\r\n }\r\n var p = selectedNode;\r\n while (p && p.style.display=='none')\r\n p=p.parentNode.parentNode;\r\n if (p && p.nodeName==\"LI\")\r\n selectNode(p);\r\n }\r\n else {\r\n alert(\"Please specify a decimal number as threshold value!\");\r\n }\r\n }\r\n\r\n function expandAll(event) {\r\n toggleAll(event, true);\r\n }\r\n\r\n function collapseAll(event) {\r\n toggleAll(event, false);\r\n selectNode(rootNode(), null);\r\n }\r\n\r\n function toggleAll(event, show) {\r\n event.cancelBubble=true;\r\n var threads = document.getElementsByName(\"thread\");\r\n var l = threads.length;\r\n for ( var i = 0; i < l ; i++ ) {\r\n showUL(threads[i], show);\r\n }\r\n }\r\n\r\n function toggleHelp(node) {\r\n var help = document.getElementById(\"help\");\r\n if (node.value == \"Show Help\") {\r\n node.value = \"Hide Help\";\r\n help.style.display = 'block';\r\n }\r\n else {\r\n node.value = \"Show Help\";\r\n help.style.display = 'none';\r\n }\r\n }\r\n\r\n var selectedNode = null;\r\n var selectedColor = null;\r\n var selectedThread = null;\r\n\r\n function descendentOf(a,b){\r\n while (a!=b && b!=null)\r\n b=b.parentNode;\r\n return (a==b);\r\n }\r\n\r\n function moveSelectionIfNecessary(node){\r\n if (descendentOf(node, selectedNode))\r\n selectNode(node, null);\r\n }\r\n\r\n function selectNode(node, event) {\r\n if (event) {\r\n event.cancelBubble = true;\r\n thread = findThread(node);\r\n selectThread(thread);\r\n }\r\n if (selectedNode) {\r\n selectedNode.style.background = selectedColor;\r\n }\r\n selectedNode = node;\r\n selectedColor = node.style.background;\r\n selectedNode.style.background = \"red\";\r\n selectedNode.scrollIntoView();\r\n window.scrollBy(0,-400);\r\n }\r\n\r\n function moveUp(){\r\n move(selectedNode.previousSibling);\r\n }\r\n\r\n function moveDown(){\r\n move(selectedNode.nextSibling);\r\n }\r\n\r\n function move(p) {\r\n while (p && p.style.display == 'none')\r\n p = p.nextSibling;\r\n if (p && p.nodeName == \"LI\") {\r\n selectNode(p, null);\r\n }\r\n }\r\n\r\n function moveLeft(){\r\n var p = selectedNode.parentNode.parentNode;\r\n if (p && p.nodeName==\"LI\") {\r\n selectNode(p, null);\r\n }\r\n }\r\n\r\n function moveRight(){\r\n if (!isLeafNode(selectedNode)) {\r\n showChildren(selectedNode);\r\n var ul = findUlChild(selectedNode);\r\n if (ul) {\r\n selectNode(ul.firstChild, null);\r\n }\r\n }\r\n }\r\n\r\n function moveForward(){\r\n if (isLeafNode(selectedNode)) {\r\n var p = selectedNode;\r\n while ((p.nextSibling == null || p.nextSibling.style.display=='none') && p.nodeName==\"LI\") {\r\n p = p.parentNode.parentNode;\r\n }\r\n if (p.nodeName==\"LI\")\r\n selectNode(p.nextSibling, null);\r\n }\r\n else {\r\n moveRight();\r\n }\r\n }\r\n\r\n function isExpandedNode(li){\r\n var img = li.firstChild;\r\n return(img.className.indexOf('minus')>-1);\r\n }\r\n\r\n function moveBackward(){\r\n var p = selectedNode;\r\n var q = p.previousSibling;\r\n while (q != null && q.style.display=='none')\r\n q = q.previousSibling;\r\n if (q == null) {\r\n p = p.parentNode.parentNode;\r\n } else {\r\n while (!isLeafNode(q) && isExpandedNode(q)) {\r\n q = findUlChild(q).lastChild;\r\n while (q.style.display=='none')\r\n q = q.previousSibling;\r\n }\r\n p = q;\r\n }\r\n if (p.nodeName==\"LI\")\r\n selectNode(p, null);\r\n }\r\n\r\n function moveHome() {\r\n selectNode(currentThread);\r\n }\r\n\r\n var currentThreadIndex = null;\r\n\r\n function findThread(node){\r\n while (node && !node.parentNode.nodeName.match(/BODY|DIV/g)) {\r\n node = node.parentNode;\r\n }\r\n return node.firstChild;\r\n }\r\n\r\n function selectThread(node){\r\n var threads = document.getElementsByName(\"thread\");\r\n currentThread = node;\r\n for (var i=0; i<threads.length; i++) {\r\n if (threads[i]==currentThread.parentNode)\r\n currentThreadIndex = i;\r\n }\r\n }\r\n\r\n function nextThread(){\r\n var threads = document.getElementsByName(\"thread\");\r\n if (currentThreadIndex==threads.length-1)\r\n currentThreadIndex = 0;\r\n else\r\n currentThreadIndex += 1\r\n currentThread = threads[currentThreadIndex].firstChild;\r\n selectNode(currentThread, null);\r\n }\r\n\r\n function previousThread(){\r\n var threads = document.getElementsByName(\"thread\");\r\n if (currentThreadIndex==0)\r\n currentThreadIndex = threads.length-1;\r\n else\r\n currentThreadIndex -= 1\r\n currentThread = threads[currentThreadIndex].firstChild;\r\n selectNode(currentThread, null);\r\n }\r\n\r\n function switchThread(node, event){\r\n event.cancelBubble = true;\r\n selectThread(node.nextSibling.firstChild);\r\n selectNode(currentThread, null);\r\n }\r\n\r\n function handleKeyEvent(event){\r\n var code = event.charCode ? event.charCode : event.keyCode;\r\n var str = String.fromCharCode(code);\r\n switch (str) {\r\n case \"a\": moveLeft(); break;\r\n case \"s\": moveDown(); break;\r\n case \"d\": moveRight(); break;\r\n case \"w\": moveUp(); break;\r\n case \"f\": moveForward(); break;\r\n case \"b\": moveBackward(); break;\r\n case \"x\": toggleChildren(selectedNode.firstChild, event); break;\r\n case \"*\": toggleLI(selectedNode); break;\r\n case \"n\": nextThread(); break;\r\n case \"h\": moveHome(); break;\r\n case \"p\": previousThread(); break;\r\n }\r\n }\r\n document.onkeypress=function(event){ handleKeyEvent(event) };\r\n\r\n window.onload=function(){\r\n var images = document.querySelectorAll(\".toggle\");\r\n for (var i=0; i<images.length; i++) {\r\n var img = images[i];\r\n img.onclick = function(event){ toggleChildren(this, event); return false; };\r\n }\r\n var divs = document.getElementsByTagName(\"div\");\r\n for (i=0; i<divs.length; i++) {\r\n var div = divs[i];\r\n if (div.className == \"thread\")\r\n div.onclick = function(event){ switchThread(this, event) };\r\n }\r\n var lis = document.getElementsByTagName(\"li\");\r\n for (var i=0; i<lis.length; i++) {\r\n lis[i].onclick = function(event){ selectNode(this, event); };\r\n }\r\n var threads = document.getElementsByName(\"thread\");;\r\n currentThreadIndex = 0;\r\n currentThread = threads[0].firstChild;\r\n selectNode(currentThread, null);\r\n };\r\n\r\n</script>\n</head><body><div style=\"display: inline-block;\">\n<div id=\"titlebar\">\nCall tree for application <b>/home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/rake-10.5.0/lib/rake/rake_test_loader.rb </b><br/>\nGenerated on 2022-09-24 15:37:23 +0300 with options {:min_percent=>0.01}<br/>\n</div>\n<div id=\"commands\">\n<span style=\"font-size: 11pt; font-weight: bold;\">Threshold:</span>\n<input value=\"1.0\" size=\"3\" id=\"threshold\" type=\"text\">\n<input value=\"Apply\" onclick=\"setThreshold();\" type=\"submit\">\n<input value=\"Expand All\" onclick=\"expandAll(event);\" type=\"submit\">\n<input value=\"Collapse All\" onclick=\"collapseAll(event);\" type=\"submit\">\n<input value=\"Show Help\" onclick=\"toggleHelp(this);\" type=\"submit\">\n</div>\n<div style=\"display: none;\" id=\"help\">\n• Enter a decimal value <i>d</i> into the threshold field and click \"Apply\"\n to hide all nodes marked with time values lower than <i>d</i>.<br>\n• Click on \"Expand All\" for full tree expansion.<br>\n• Click on \"Collapse All\" to show only top level nodes.<br>\n• Use a, s, d, w as in Quake or Urban Terror to navigate the tree.<br>\n• Use f and b to navigate the tree in preorder forward and backwards.<br>\n• Use x to toggle visibility of a subtree.<br>\n• Use * to expand/collapse a whole subtree.<br>\n• Use h to navigate to thread root.<br>\n• Use n and p to navigate between threads.<br>\n• Click on background to move focus to a subtree.<br>\n</div>\n<div class=\"thread\">Thread: 1600, Fiber: 1620 (100.00% ~ 0.0001081729999999892)</div><ul name=\"thread\"><li class=\"color9\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 100.00% (100.00%) <a href=\"file:///home/alex/Projects/ruby/rack-contrib/lib/rack/contrib/profiler.rb#70\">Rack::Profiler#profile</a> [1 calls, 1 total]</span>\n<ul><li class=\"color9\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 96.51% (96.51%) Integer#times [1 calls, 1 total]</span>\n<ul><li class=\"color8\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 88.10% (91.29%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/time_extensions.rb#22\"><Class::Time>#new_with_mock_time</a> [4 calls, 8 total]</span>\n<ul><li class=\"color6\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 67.44% (76.56%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/time_extensions.rb#14\"><Class::Time>#now_with_mock_time</a> [4 calls, 4 total]</span>\n<ul><li class=\"color3\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 32.25% (47.81%) <a href=\"file:///home/alex/Projects/ruby/rack-contrib/<internal:timev>#224\"><Class::Time>#now</a> [4 calls, 4 total]</span>\n<ul><li class=\"color2\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 26.43% (81.94%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/time_extensions.rb#22\"><Class::Time>#new_with_mock_time</a> [4 calls, 8 total]</span>\n<ul><li class=\"color1\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 15.03% (56.88%) <Class::Time>#new [4 calls, 4 total]</span>\n<ul><li class=\"color05\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 7.96% (52.98%) <a href=\"file:///home/alex/Projects/ruby/rack-contrib/<internal:timev>#298\">Time#initialize</a> [4 calls, 4 total]</span>\n</li></ul></li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 1.74% (6.59%) Integer#<= [4 calls, 8 total]</span>\n</li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 1.60% (6.06%) Array#size [4 calls, 8 total]</span>\n</li></ul></li></ul></li><li class=\"color2\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 28.63% (42.45%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/time_extensions.rb#7\"><Class::Time>#mock_time</a> [4 calls, 4 total]</span>\n<ul><li class=\"color1\" style=\"display:block\"><a href=\"#\" class=\"toggle minus\" ></a><span> 18.63% (65.09%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/timecop.rb#105\"><Class::Timecop>#top_stack_item</a> [4 calls, 4 total]</span>\n<ul><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 4.62% (24.80%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/timecop-0.9.5/lib/timecop/timecop.rb#158\">Timecop#stack</a> [4 calls, 4 total]</span>\n</li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 3.82% (20.47%) <a href=\"file:///home/alex/.rbenv/versions/3.1.2/lib/ruby/3.1.0/singleton.rb#124\">Singleton::SingletonClassMethods#instance</a> [4 calls, 4 total]</span>\n</li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 1.98% (10.64%) Array#last [4 calls, 4 total]</span>\n</li></ul></li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 1.88% (6.57%) NilClass#nil? [4 calls, 4 total]</span>\n</li></ul></li></ul></li><li class=\"color05\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 10.42% (11.83%) Array#size [4 calls, 8 total]</span>\n</li><li class=\"color01\" style=\"display:block\"><a href=\"#\" class=\"toggle empty\" ></a><span> 2.03% (2.30%) Integer#<= [4 calls, 8 total]</span>\n</li></ul></li></ul></li></ul></li></ul><div id=\"sentinel\"></div></div></body></html>\n".
215 runs, 496 assertions, 1 failures, 0 errors, 0 skips
rake aborted!
Command failed with status (1): [ruby -I"lib:test" -I"/home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/rake-10.5.0/lib" "/home/alex/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/rake-10.5.0/lib/rake/rake_test_loader.rb" "test/spec_rack_access.rb" "test/spec_rack_backstage.rb" "test/spec_rack_bounce_favicon.rb" "test/spec_rack_callbacks.rb" "test/spec_rack_common_cookies.rb" "test/spec_rack_config.rb" "test/spec_rack_contrib.rb" "test/spec_rack_cookies.rb" "test/spec_rack_csshttprequest.rb" "test/spec_rack_deflect.rb" "test/spec_rack_enforce_valid_encoding.rb" "test/spec_rack_evil.rb" "test/spec_rack_expectation_cascade.rb" "test/spec_rack_garbagecollector.rb" "test/spec_rack_host_meta.rb" "test/spec_rack_json_body_parser_spec.rb" "test/spec_rack_jsonp.rb" "test/spec_rack_lazy_conditional_get.rb" "test/spec_rack_lighttpd_script_name_fix.rb" "test/spec_rack_locale.rb" "test/spec_rack_mailexceptions.rb" "test/spec_rack_nested_params.rb" "test/spec_rack_not_found.rb" "test/spec_rack_post_body_content_type_parser.rb" "test/spec_rack_proctitle.rb" "test/spec_rack_profiler.rb" "test/spec_rack_relative_redirect.rb" "test/spec_rack_response_cache.rb" "test/spec_rack_response_headers.rb" "test/spec_rack_runtime.rb" "test/spec_rack_simple_endpoint.rb" "test/spec_rack_static_cache.rb" "test/spec_rack_try_static.rb" ]
/home/alex/.rbenv/versions/3.1.2/bin/bundle:25:in `load'
/home/alex/.rbenv/versions/3.1.2/bin/bundle:25:in `<main>'
Tasks: TOP => test
(See full trace by running task with --trace)
I guess we need to spend some time fixing these issues.
I guess we need to spend some time fixing these issues.
I did 😄