locust 2.33.3.dev17__tar.gz → 2.33.3.dev19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/PKG-INFO +1 -1
  2. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/_version.py +2 -2
  3. locust-2.33.3.dev17/locust/webui/dist/assets/index-CBHdqxi-.js → locust-2.33.3.dev19/locust/webui/dist/assets/index-B5kHPwXy.js +1 -1
  4. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/auth.html +1 -1
  5. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/index.html +1 -1
  6. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/report.html +1 -1
  7. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/.gitignore +0 -0
  8. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/LICENSE +0 -0
  9. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/README.md +0 -0
  10. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/hatch_build.py +0 -0
  11. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/__init__.py +0 -0
  12. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/__main__.py +0 -0
  13. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/argument_parser.py +0 -0
  14. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/clients.py +0 -0
  15. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/contrib/__init__.py +0 -0
  16. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/contrib/fasthttp.py +0 -0
  17. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/contrib/mongodb.py +0 -0
  18. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/contrib/oai.py +0 -0
  19. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/contrib/postgres.py +0 -0
  20. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/debug.py +0 -0
  21. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/dispatch.py +0 -0
  22. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/env.py +0 -0
  23. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/event.py +0 -0
  24. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/exception.py +0 -0
  25. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/html.py +0 -0
  26. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/input_events.py +0 -0
  27. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/log.py +0 -0
  28. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/main.py +0 -0
  29. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/py.typed +0 -0
  30. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/rpc/__init__.py +0 -0
  31. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/rpc/protocol.py +0 -0
  32. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/rpc/zmqrpc.py +0 -0
  33. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/runners.py +0 -0
  34. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/shape.py +0 -0
  35. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/stats.py +0 -0
  36. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/__init__.py +0 -0
  37. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/inspectuser.py +0 -0
  38. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/sequential_taskset.py +0 -0
  39. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/task.py +0 -0
  40. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/users.py +0 -0
  41. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/user/wait_time.py +0 -0
  42. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/__init__.py +0 -0
  43. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/cache.py +0 -0
  44. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/date.py +0 -0
  45. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/deprecation.py +0 -0
  46. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/directory.py +0 -0
  47. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/exception_handler.py +0 -0
  48. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/load_locustfile.py +0 -0
  49. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/rounding.py +0 -0
  50. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/timespan.py +0 -0
  51. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/util/url.py +0 -0
  52. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/web.py +0 -0
  53. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/favicon-dark.png +0 -0
  54. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/favicon-light.png +0 -0
  55. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/graphs-dark.png +0 -0
  56. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/graphs-light.png +0 -0
  57. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/testruns-dark.png +0 -0
  58. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/locust/webui/dist/assets/testruns-light.png +0 -0
  59. {locust-2.33.3.dev17 → locust-2.33.3.dev19}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: locust
3
- Version: 2.33.3.dev17
3
+ Version: 2.33.3.dev19
4
4
  Summary: Developer-friendly load testing framework
5
5
  Project-URL: homepage, https://locust.io/
6
6
  Project-URL: repository, https://github.com/locustio/locust
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.33.3.dev17'
21
- __version_tuple__ = version_tuple = (2, 33, 3, 'dev17')
20
+ __version__ = version = '2.33.3.dev19'
21
+ __version_tuple__ = version_tuple = (2, 33, 3, 'dev19')
@@ -218,7 +218,7 @@ PERFORMANCE OF THIS SOFTWARE.
218
218
  <span style="color:${h};">
219
219
  ${v}:&nbsp${URe({chartValueFormatter:i,value:g})}
220
220
  </span>
221
- `,""):"No data",borderWidth:0},xAxis:s||{type:"time",min:(e.time||[new Date().toISOString()])[0],startValue:(e.time||[])[0],axisLabel:{formatter:jRe}},grid:l||{left:60,right:40},yAxis:WRe({splitAxis:a,yAxisLabels:o}),series:G7({charts:e,lines:r,scatterplot:u}),color:n,toolbox:{right:10,feature:{dataZoom:{title:{zoom:"Zoom Select",back:"Zoom Reset"},yAxisIndex:!1},saveAsImage:{name:t.replace(/\s+/g,"_").toLowerCase()+"_"+new Date().getTime()/1e3,title:"Download as PNG",emphasis:{iconStyle:{textPosition:"left"}}}}}}),qRe=e=>({symbol:"none",label:{formatter:t=>`Run #${t.dataIndex+1}`,padding:[0,0,8,0]},data:(e.markers||[]).map(t=>({xAxis:t}))}),XRe=e=>t=>{const{batch:r}=t;if(!r)return;const[{start:n,startValue:i,end:a}]=r,o=n>0&&a<=100||i>0;e.setOption({dataZoom:[{type:"slider",show:o}]})};function ZRe({charts:e,title:t,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u,shouldReplaceMergeLines:c=!1}){const[f,d]=G.useState(null),h=fi(({theme:{isDarkMode:g}})=>g),v=G.useRef(null);return G.useEffect(()=>{if(!v.current)return;const g=L1e(v.current);g.setOption(YRe({charts:e,title:t,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u})),g.on("datazoom",XRe(g));const y=()=>g.resize();return window.addEventListener("resize",y),g.group="swarmCharts",O1e("swarmCharts"),d(g),()=>{N1e(g),window.removeEventListener("resize",y)}},[v]),G.useEffect(()=>{const g=r.every(({key:y})=>!!e[y]);f&&g&&f.setOption({series:r.map(({key:y,yAxisIndex:x,...S},b)=>({...S,data:e[y],...a?{yAxisIndex:x||b}:{},...b===0?{markLine:qRe(e)}:{}}))})},[e,f,r]),G.useEffect(()=>{if(f){const{textColor:g,axisColor:y,backgroundColor:x,splitLine:S}=h?tV.DARK:tV.LIGHT;f.setOption({backgroundColor:x,textStyle:{color:g},title:{textStyle:{color:g}},legend:{icon:"circle",inactiveColor:g,textStyle:{color:g}},tooltip:{backgroundColor:x,textStyle:{color:g}},xAxis:{axisLine:{lineStyle:{color:y}}},yAxis:{axisLine:{lineStyle:{color:y}},splitLine:{lineStyle:{color:S}}}})}},[f,h]),G.useEffect(()=>{f&&f.setOption({series:G7({charts:e,lines:r,scatterplot:u})},c?{replaceMerge:["series"]}:void 0)},[r]),N.jsx("div",{ref:v,style:{width:"100%",height:"300px"}})}function KRe(){const{data:e,refetch:t}=Ude(),r=Zo(av.setUi),n=fi(({swarm:a})=>a.state),i=n===bn.SPAWNING||n==bn.RUNNING;G.useEffect(()=>{e&&r({ratios:e})},[e]),qx(t,5e3,{shouldRunInterval:i,immediate:!0})}const QRe=2e3;function JRe(){const e=Zo(yk.setSwarm),t=Zo(av.setUi),r=Zo(av.updateCharts),n=Zo(av.updateChartMarkers),i=fi(({swarm:f})=>f),a=G.useRef(i.state),[o,s]=G.useState(!1),{data:l,refetch:u}=jde(),c=i.state===bn.SPAWNING||i.state==bn.RUNNING;G.useEffect(()=>{if(!l)return;const{state:f,currentResponseTimePercentiles:d,extendedStats:h,stats:v,errors:g,totalRps:y,totalFailPerSec:x,failRatio:S,workers:b,userCount:w,totalAvgResponseTime:T}=l,C=new Date().toISOString();o&&(s(!1),n(C));const A=Lp(y,2),k=Lp(x,2),I=Lp(S*100),R={...Object.entries(d).reduce((L,[O,z])=>({...L,[O]:[C,z||0]}),{}),currentRps:[C,A],currentFailPerSec:[C,k],totalAvgResponseTime:[C,Lp(T,2)],userCount:[C,w],time:C};t({extendedStats:h,stats:v,errors:g,totalRps:A,failRatio:I,workers:b,userCount:w}),r(R),e({state:f})},[l]),qx(u,QRe,{shouldRunInterval:c}),G.useEffect(()=>{i.state===bn.RUNNING&&a.current===bn.STOPPED&&s(!0),a.current=i.state},[i.state,a])}function eEe(){const{data:e,refetch:t}=Yde(),r=Zo(av.setUi),n=fi(({swarm:a})=>a.state),i=n===bn.SPAWNING||n==bn.RUNNING;G.useEffect(()=>{e&&r({exceptions:e.exceptions})},[e]),qx(t,5e3,{shouldRunInterval:i,immediate:!0})}function tEe(){return eEe(),N.jsx(Rhe,{})}const rEe=[{key:"occurrences",title:"# Failures"},{key:"method",title:"Method"},{key:"name",title:"Name"},{key:"error",title:"Message",markdown:!0}];function nEe({errors:e}){return N.jsx(Tg,{rows:e,structure:rEe})}const iEe=({ui:{errors:e}})=>({errors:e}),aEe=Ii(iEe)(nEe),oEe=`
221
+ `,""):"No data",borderWidth:0},xAxis:s||{type:"time",min:(e.time||[new Date().toISOString()])[0],startValue:(e.time||[])[0],splitNumber:window.innerWidth<900?2:7,minInterval:1,axisLabel:{formatter:jRe}},grid:l||{left:60,right:40},yAxis:WRe({splitAxis:a,yAxisLabels:o}),series:G7({charts:e,lines:r,scatterplot:u}),color:n,toolbox:{right:10,feature:{dataZoom:{title:{zoom:"Zoom Select",back:"Zoom Reset"},yAxisIndex:!1},saveAsImage:{name:t.replace(/\s+/g,"_").toLowerCase()+"_"+new Date().getTime()/1e3,title:"Download as PNG",emphasis:{iconStyle:{textPosition:"left"}}}}},legend:{top:25}}),qRe=e=>({symbol:"none",label:{formatter:t=>`Run #${t.dataIndex+1}`,padding:[0,0,8,0]},data:(e.markers||[]).map(t=>({xAxis:t}))}),XRe=e=>t=>{const{batch:r}=t;if(!r)return;const[{start:n,startValue:i,end:a}]=r,o=n>0&&a<=100||i>0;e.setOption({dataZoom:[{type:"slider",show:o}]})};function ZRe({charts:e,title:t,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u,shouldReplaceMergeLines:c=!1}){const[f,d]=G.useState(null),h=fi(({theme:{isDarkMode:g}})=>g),v=G.useRef(null);return G.useEffect(()=>{if(!v.current)return;const g=L1e(v.current);g.setOption(YRe({charts:e,title:t,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u})),g.on("datazoom",XRe(g));const y=()=>{g.resize(),g.setOption({xAxis:{splitNumber:window.innerWidth<900?2:7}})};return window.addEventListener("resize",y),g.group="swarmCharts",O1e("swarmCharts"),d(g),()=>{N1e(g),window.removeEventListener("resize",y)}},[v]),G.useEffect(()=>{const g=r.every(({key:y})=>!!e[y]);f&&g&&f.setOption({series:r.map(({key:y,yAxisIndex:x,...S},b)=>({...S,data:e[y],...a?{yAxisIndex:x||b}:{},...b===0?{markLine:qRe(e)}:{}}))})},[e,f,r]),G.useEffect(()=>{if(f){const{textColor:g,axisColor:y,backgroundColor:x,splitLine:S}=h?tV.DARK:tV.LIGHT;f.setOption({backgroundColor:x,textStyle:{color:g},title:{textStyle:{color:g}},legend:{icon:"circle",inactiveColor:g,textStyle:{color:g}},tooltip:{backgroundColor:x,textStyle:{color:g}},xAxis:{axisLine:{lineStyle:{color:y}}},yAxis:{axisLine:{lineStyle:{color:y}},splitLine:{lineStyle:{color:S}}}})}},[f,h]),G.useEffect(()=>{f&&f.setOption({series:G7({charts:e,lines:r,scatterplot:u})},c?{replaceMerge:["series"]}:void 0)},[r]),N.jsx("div",{ref:v,style:{width:"100%",height:"300px"}})}function KRe(){const{data:e,refetch:t}=Ude(),r=Zo(av.setUi),n=fi(({swarm:a})=>a.state),i=n===bn.SPAWNING||n==bn.RUNNING;G.useEffect(()=>{e&&r({ratios:e})},[e]),qx(t,5e3,{shouldRunInterval:i,immediate:!0})}const QRe=2e3;function JRe(){const e=Zo(yk.setSwarm),t=Zo(av.setUi),r=Zo(av.updateCharts),n=Zo(av.updateChartMarkers),i=fi(({swarm:f})=>f),a=G.useRef(i.state),[o,s]=G.useState(!1),{data:l,refetch:u}=jde(),c=i.state===bn.SPAWNING||i.state==bn.RUNNING;G.useEffect(()=>{if(!l)return;const{state:f,currentResponseTimePercentiles:d,extendedStats:h,stats:v,errors:g,totalRps:y,totalFailPerSec:x,failRatio:S,workers:b,userCount:w,totalAvgResponseTime:T}=l,C=new Date().toISOString();o&&(s(!1),n(C));const A=Lp(y,2),k=Lp(x,2),I=Lp(S*100),R={...Object.entries(d).reduce((L,[O,z])=>({...L,[O]:[C,z||0]}),{}),currentRps:[C,A],currentFailPerSec:[C,k],totalAvgResponseTime:[C,Lp(T,2)],userCount:[C,w],time:C};t({extendedStats:h,stats:v,errors:g,totalRps:A,failRatio:I,workers:b,userCount:w}),r(R),e({state:f})},[l]),qx(u,QRe,{shouldRunInterval:c}),G.useEffect(()=>{i.state===bn.RUNNING&&a.current===bn.STOPPED&&s(!0),a.current=i.state},[i.state,a])}function eEe(){const{data:e,refetch:t}=Yde(),r=Zo(av.setUi),n=fi(({swarm:a})=>a.state),i=n===bn.SPAWNING||n==bn.RUNNING;G.useEffect(()=>{e&&r({exceptions:e.exceptions})},[e]),qx(t,5e3,{shouldRunInterval:i,immediate:!0})}function tEe(){return eEe(),N.jsx(Rhe,{})}const rEe=[{key:"occurrences",title:"# Failures"},{key:"method",title:"Method"},{key:"name",title:"Name"},{key:"error",title:"Message",markdown:!0}];function nEe({errors:e}){return N.jsx(Tg,{rows:e,structure:rEe})}const iEe=({ui:{errors:e}})=>({errors:e}),aEe=Ii(iEe)(nEe),oEe=`
222
222
  Ready to take your load tests to the next level? With [Locust Cloud](https://locust.cloud), we take care of everything!
223
223
 
224
224
 
@@ -8,7 +8,7 @@
8
8
  <meta name="theme-color" content="#000000" />
9
9
 
10
10
  <title>{{ auth_title | default("Locust") }}</title>
11
- <script type="module" crossorigin src="./assets/index-CBHdqxi-.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-B5kHPwXy.js"></script>
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -8,7 +8,7 @@
8
8
  <meta name="theme-color" content="#000000" />
9
9
 
10
10
  <title>Locust</title>
11
- <script type="module" crossorigin src="./assets/index-CBHdqxi-.js"></script>
11
+ <script type="module" crossorigin src="./assets/index-B5kHPwXy.js"></script>
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -220,7 +220,7 @@ PERFORMANCE OF THIS SOFTWARE.
220
220
  <span style="color:${d};">
221
221
  ${v}:&nbsp${DSe({chartValueFormatter:i,value:y})}
222
222
  </span>
223
- `,""):"No data",borderWidth:0},xAxis:s||{type:"time",min:(t.time||[new Date().toISOString()])[0],startValue:(t.time||[])[0],axisLabel:{formatter:MSe}},grid:l||{left:60,right:40},yAxis:ASe({splitAxis:a,yAxisLabels:o}),series:y$({charts:t,lines:r,scatterplot:u}),color:n,toolbox:{right:10,feature:{dataZoom:{title:{zoom:"Zoom Select",back:"Zoom Reset"},yAxisIndex:!1},saveAsImage:{name:e.replace(/\s+/g,"_").toLowerCase()+"_"+new Date().getTime()/1e3,title:"Download as PNG",emphasis:{iconStyle:{textPosition:"left"}}}}}}),PSe=t=>({symbol:"none",label:{formatter:e=>`Run #${e.dataIndex+1}`,padding:[0,0,8,0]},data:(t.markers||[]).map(e=>({xAxis:e}))}),ISe=t=>e=>{const{batch:r}=e;if(!r)return;const[{start:n,startValue:i,end:a}]=r,o=n>0&&a<=100||i>0;t.setOption({dataZoom:[{type:"slider",show:o}]})},ESe=oq;function LSe({charts:t,title:e,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u,shouldReplaceMergeLines:c=!1}){const[f,h]=Q.useState(null),d=ESe(({theme:{isDarkMode:y}})=>y),v=Q.useRef(null);return Q.useEffect(()=>{if(!v.current)return;const y=yle(v.current);y.setOption(kSe({charts:t,title:e,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u})),y.on("datazoom",ISe(y));const m=()=>y.resize();return window.addEventListener("resize",m),y.group="swarmCharts",mle("swarmCharts"),h(y),()=>{_le(y),window.removeEventListener("resize",m)}},[v]),Q.useEffect(()=>{const y=r.every(({key:m})=>!!t[m]);f&&y&&f.setOption({series:r.map(({key:m,yAxisIndex:_,...S},w)=>({...S,data:t[m],...a?{yAxisIndex:_||w}:{},...w===0?{markLine:PSe(t)}:{}}))})},[t,f,r]),Q.useEffect(()=>{if(f){const{textColor:y,axisColor:m,backgroundColor:_,splitLine:S}=d?I5.DARK:I5.LIGHT;f.setOption({backgroundColor:_,textStyle:{color:y},title:{textStyle:{color:y}},legend:{icon:"circle",inactiveColor:y,textStyle:{color:y}},tooltip:{backgroundColor:_,textStyle:{color:y}},xAxis:{axisLine:{lineStyle:{color:m}}},yAxis:{axisLine:{lineStyle:{color:m}},splitLine:{lineStyle:{color:S}}}})}},[f,d]),Q.useEffect(()=>{f&&f.setOption({series:y$({charts:t,lines:r,scatterplot:u})},c?{replaceMerge:["series"]}:void 0)},[r]),ne.jsx("div",{ref:v,style:{width:"100%",height:"300px"}})}const RSe=zl.percentilesToChart?zl.percentilesToChart.map(t=>({name:`${t*100}th percentile`,key:`responseTimePercentile${t}`})):[],OSe=["#ff9f00","#9966CC","#8A2BE2","#8E4585","#E0B0FF","#C8A2C8","#E6E6FA"],NSe=[{title:"Total Requests per Second",lines:[{name:"RPS",key:"currentRps"},{name:"Failures/s",key:"currentFailPerSec"}],colors:["#00ca5a","#ff6d6d"]},{title:"Response Times (ms)",lines:RSe,colors:OSe},{title:"Number of Users",lines:[{name:"Number of Users",key:"userCount"}],colors:["#0099ff"]}];function m$({charts:t}){return NSe.map((e,r)=>ne.jsx(LSe,{...e,charts:t},`swarm-chart-${r}`))}const zSe=({ui:{charts:t}})=>({charts:t});Jd(zSe)(m$);function BSe(t){return(t*100).toFixed(1)+"%"}function KC({classRatio:t}){return ne.jsx("ul",{children:Object.entries(t).map(([e,{ratio:r,tasks:n}])=>ne.jsxs("li",{children:[`${BSe(r)} ${e}`,n&&ne.jsx(KC,{classRatio:n})]},`nested-ratio-${e}`))})}function _$({ratios:{perClass:t,total:e}}){return!t&&!e?null:ne.jsxs("div",{children:[t&&ne.jsxs(ne.Fragment,{children:[ne.jsx("h3",{children:"Ratio Per Class"}),ne.jsx(KC,{classRatio:t})]}),e&&ne.jsxs(ne.Fragment,{children:[ne.jsx("h3",{children:"Total Ratio"}),ne.jsx(KC,{classRatio:e})]})]})}const FSe=({ui:{ratios:t}})=>({ratios:t});Jd(FSe)(_$);const Ew={DARK:"dark",LIGHT:"light"},x$=localStorage.theme===Ew.DARK||!("theme"in localStorage)&&window.matchMedia("(prefers-color-scheme: dark)").matches?Ew.DARK:Ew.LIGHT,VSe={isDarkMode:!1},GSe=GZ({name:"theme",initialState:VSe,reducers:{setIsDarkMode:(t,{payload:e})=>{t.isDarkMode=e}}}),HSe=GSe.reducer,$Se=t=>gT({palette:{mode:t,primary:{main:"#15803d"},success:{main:"#00C853"}},components:{MuiCssBaseline:{styleOverrides:{":root":{"--footer-height":"40px"},p:{margin:0},ul:{paddingLeft:"16px"}}}}}),WSe=$Se(window.theme||x$),USe=(window.theme||x$)==="dark",jSe=[{key:"method",title:"Type"},{key:"name",title:"Name"},{key:"numRequests",title:"# Requests"},{key:"numFailures",title:"# Fails"},{key:"avgResponseTime",title:"Average (ms)",round:2},{key:"minResponseTime",title:"Min (ms)"},{key:"maxResponseTime",title:"Max (ms)"},{key:"avgContentLength",title:"Average size (bytes)",round:2},{key:"totalRps",title:"RPS",round:2},{key:"totalFailPerSec",title:"Failures/s",round:2}],YSe=EZ({reducer:kB({theme:HSe}),preloadedState:{theme:{isDarkMode:USe}}});function XSe({locustfile:t,showDownloadLink:e,startTime:r,endTime:n,duration:i,charts:a,host:o,exceptionsStatistics:s,requestsStatistics:l,failuresStatistics:u,responseTimeStatistics:c,tasks:f}){return ne.jsx(qq,{store:YSe,children:ne.jsxs(Z7,{theme:WSe,children:[ne.jsx(EY,{}),ne.jsxs(DY,{maxWidth:"lg",sx:{my:4},children:[ne.jsxs(Yn,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-end"},children:[ne.jsx(Qr,{component:"h1",noWrap:!0,sx:{fontWeight:700},variant:"h3",children:"Locust Test Report"}),e&&ne.jsx(AB,{href:`?download=1&theme=${window.theme}`,children:"Download the Report"})]}),ne.jsxs(Yn,{sx:{my:2},children:[ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"During:"}),ne.jsxs(Qr,{children:[qC(r)," - ",qC(n)," (",i,")"]})]}),ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"Target Host:"}),ne.jsx(Qr,{children:o||"None"})]}),ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"Script:"}),ne.jsx(Qr,{children:t})]})]}),ne.jsxs(Yn,{sx:{display:"flex",flexDirection:"column",rowGap:4},children:[ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Request Statistics"}),ne.jsx(R3,{stats:l,tableStructure:jSe})]}),!!c.length&&ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Response Time Statistics"}),ne.jsx(vte,{responseTimes:c})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Failures Statistics"}),ne.jsx(L3,{errors:u})]}),!!s.length&&ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Exceptions Statistics"}),ne.jsx(E3,{exceptions:s})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Charts"}),ne.jsx(m$,{charts:a})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Final ratio"}),ne.jsx(_$,{ratios:f})]})]})]})]})})}const ZSe=C8.createRoot(document.getElementById("root"));ZSe.render(ne.jsx(A8,{fallbackRender:D8,children:ne.jsx(XSe,{...E8})}));</script>
223
+ `,""):"No data",borderWidth:0},xAxis:s||{type:"time",min:(t.time||[new Date().toISOString()])[0],startValue:(t.time||[])[0],splitNumber:window.innerWidth<900?2:7,minInterval:1,axisLabel:{formatter:MSe}},grid:l||{left:60,right:40},yAxis:ASe({splitAxis:a,yAxisLabels:o}),series:y$({charts:t,lines:r,scatterplot:u}),color:n,toolbox:{right:10,feature:{dataZoom:{title:{zoom:"Zoom Select",back:"Zoom Reset"},yAxisIndex:!1},saveAsImage:{name:e.replace(/\s+/g,"_").toLowerCase()+"_"+new Date().getTime()/1e3,title:"Download as PNG",emphasis:{iconStyle:{textPosition:"left"}}}}},legend:{top:25}}),PSe=t=>({symbol:"none",label:{formatter:e=>`Run #${e.dataIndex+1}`,padding:[0,0,8,0]},data:(t.markers||[]).map(e=>({xAxis:e}))}),ISe=t=>e=>{const{batch:r}=e;if(!r)return;const[{start:n,startValue:i,end:a}]=r,o=n>0&&a<=100||i>0;t.setOption({dataZoom:[{type:"slider",show:o}]})},ESe=oq;function LSe({charts:t,title:e,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u,shouldReplaceMergeLines:c=!1}){const[f,h]=Q.useState(null),d=ESe(({theme:{isDarkMode:y}})=>y),v=Q.useRef(null);return Q.useEffect(()=>{if(!v.current)return;const y=yle(v.current);y.setOption(kSe({charts:t,title:e,lines:r,colors:n,chartValueFormatter:i,splitAxis:a,yAxisLabels:o,xAxis:s,grid:l,scatterplot:u})),y.on("datazoom",ISe(y));const m=()=>{y.resize(),y.setOption({xAxis:{splitNumber:window.innerWidth<900?2:7}})};return window.addEventListener("resize",m),y.group="swarmCharts",mle("swarmCharts"),h(y),()=>{_le(y),window.removeEventListener("resize",m)}},[v]),Q.useEffect(()=>{const y=r.every(({key:m})=>!!t[m]);f&&y&&f.setOption({series:r.map(({key:m,yAxisIndex:_,...S},w)=>({...S,data:t[m],...a?{yAxisIndex:_||w}:{},...w===0?{markLine:PSe(t)}:{}}))})},[t,f,r]),Q.useEffect(()=>{if(f){const{textColor:y,axisColor:m,backgroundColor:_,splitLine:S}=d?I5.DARK:I5.LIGHT;f.setOption({backgroundColor:_,textStyle:{color:y},title:{textStyle:{color:y}},legend:{icon:"circle",inactiveColor:y,textStyle:{color:y}},tooltip:{backgroundColor:_,textStyle:{color:y}},xAxis:{axisLine:{lineStyle:{color:m}}},yAxis:{axisLine:{lineStyle:{color:m}},splitLine:{lineStyle:{color:S}}}})}},[f,d]),Q.useEffect(()=>{f&&f.setOption({series:y$({charts:t,lines:r,scatterplot:u})},c?{replaceMerge:["series"]}:void 0)},[r]),ne.jsx("div",{ref:v,style:{width:"100%",height:"300px"}})}const RSe=zl.percentilesToChart?zl.percentilesToChart.map(t=>({name:`${t*100}th percentile`,key:`responseTimePercentile${t}`})):[],OSe=["#ff9f00","#9966CC","#8A2BE2","#8E4585","#E0B0FF","#C8A2C8","#E6E6FA"],NSe=[{title:"Total Requests per Second",lines:[{name:"RPS",key:"currentRps"},{name:"Failures/s",key:"currentFailPerSec"}],colors:["#00ca5a","#ff6d6d"]},{title:"Response Times (ms)",lines:RSe,colors:OSe},{title:"Number of Users",lines:[{name:"Number of Users",key:"userCount"}],colors:["#0099ff"]}];function m$({charts:t}){return NSe.map((e,r)=>ne.jsx(LSe,{...e,charts:t},`swarm-chart-${r}`))}const zSe=({ui:{charts:t}})=>({charts:t});Jd(zSe)(m$);function BSe(t){return(t*100).toFixed(1)+"%"}function KC({classRatio:t}){return ne.jsx("ul",{children:Object.entries(t).map(([e,{ratio:r,tasks:n}])=>ne.jsxs("li",{children:[`${BSe(r)} ${e}`,n&&ne.jsx(KC,{classRatio:n})]},`nested-ratio-${e}`))})}function _$({ratios:{perClass:t,total:e}}){return!t&&!e?null:ne.jsxs("div",{children:[t&&ne.jsxs(ne.Fragment,{children:[ne.jsx("h3",{children:"Ratio Per Class"}),ne.jsx(KC,{classRatio:t})]}),e&&ne.jsxs(ne.Fragment,{children:[ne.jsx("h3",{children:"Total Ratio"}),ne.jsx(KC,{classRatio:e})]})]})}const FSe=({ui:{ratios:t}})=>({ratios:t});Jd(FSe)(_$);const Ew={DARK:"dark",LIGHT:"light"},x$=localStorage.theme===Ew.DARK||!("theme"in localStorage)&&window.matchMedia("(prefers-color-scheme: dark)").matches?Ew.DARK:Ew.LIGHT,VSe={isDarkMode:!1},GSe=GZ({name:"theme",initialState:VSe,reducers:{setIsDarkMode:(t,{payload:e})=>{t.isDarkMode=e}}}),HSe=GSe.reducer,$Se=t=>gT({palette:{mode:t,primary:{main:"#15803d"},success:{main:"#00C853"}},components:{MuiCssBaseline:{styleOverrides:{":root":{"--footer-height":"40px"},p:{margin:0},ul:{paddingLeft:"16px"}}}}}),WSe=$Se(window.theme||x$),USe=(window.theme||x$)==="dark",jSe=[{key:"method",title:"Type"},{key:"name",title:"Name"},{key:"numRequests",title:"# Requests"},{key:"numFailures",title:"# Fails"},{key:"avgResponseTime",title:"Average (ms)",round:2},{key:"minResponseTime",title:"Min (ms)"},{key:"maxResponseTime",title:"Max (ms)"},{key:"avgContentLength",title:"Average size (bytes)",round:2},{key:"totalRps",title:"RPS",round:2},{key:"totalFailPerSec",title:"Failures/s",round:2}],YSe=EZ({reducer:kB({theme:HSe}),preloadedState:{theme:{isDarkMode:USe}}});function XSe({locustfile:t,showDownloadLink:e,startTime:r,endTime:n,duration:i,charts:a,host:o,exceptionsStatistics:s,requestsStatistics:l,failuresStatistics:u,responseTimeStatistics:c,tasks:f}){return ne.jsx(qq,{store:YSe,children:ne.jsxs(Z7,{theme:WSe,children:[ne.jsx(EY,{}),ne.jsxs(DY,{maxWidth:"lg",sx:{my:4},children:[ne.jsxs(Yn,{sx:{display:"flex",justifyContent:"space-between",alignItems:"flex-end"},children:[ne.jsx(Qr,{component:"h1",noWrap:!0,sx:{fontWeight:700},variant:"h3",children:"Locust Test Report"}),e&&ne.jsx(AB,{href:`?download=1&theme=${window.theme}`,children:"Download the Report"})]}),ne.jsxs(Yn,{sx:{my:2},children:[ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"During:"}),ne.jsxs(Qr,{children:[qC(r)," - ",qC(n)," (",i,")"]})]}),ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"Target Host:"}),ne.jsx(Qr,{children:o||"None"})]}),ne.jsxs(Yn,{sx:{display:"flex",columnGap:.5},children:[ne.jsx(Qr,{fontWeight:600,children:"Script:"}),ne.jsx(Qr,{children:t})]})]}),ne.jsxs(Yn,{sx:{display:"flex",flexDirection:"column",rowGap:4},children:[ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Request Statistics"}),ne.jsx(R3,{stats:l,tableStructure:jSe})]}),!!c.length&&ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Response Time Statistics"}),ne.jsx(vte,{responseTimes:c})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Failures Statistics"}),ne.jsx(L3,{errors:u})]}),!!s.length&&ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Exceptions Statistics"}),ne.jsx(E3,{exceptions:s})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Charts"}),ne.jsx(m$,{charts:a})]}),ne.jsxs(Yn,{children:[ne.jsx(Qr,{component:"h2",mb:1,noWrap:!0,variant:"h4",children:"Final ratio"}),ne.jsx(_$,{ratios:f})]})]})]})]})})}const ZSe=C8.createRoot(document.getElementById("root"));ZSe.render(ne.jsx(A8,{fallbackRender:D8,children:ne.jsx(XSe,{...E8})}));</script>
224
224
  </head>
225
225
  {% endraw %}
226
226
  <body>
File without changes
File without changes
File without changes