<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Cradicle Explorer</title>
    <link href="/css/bootstrap/bootstrap.min.css" rel="stylesheet">
    <style>
      .form-control-dark::placeholder {
          color: #aaa;
          opacity: 1;
      }
    </style>
    <link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
    <link rel="icon" type="image/png" href="/favicon.png">


                <link href="/css/dashboard.css" rel="stylesheet">
                </head>
                <body>
                <header class="navbar navbar-dark sticky-top bg-dark flex-md-nowrap p-0 shadow">
                  <a class="navbar-brand col-md-3 col-lg-2 me-0 px-3 fs-6" href="/">Cradicle Explorer</a>
                  <button class="navbar-toggler position-absolute d-md-none collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#sidebarMenu" aria-controls="sidebarMenu" aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                  </button>
                  <form method="get" action="/cgi-bin/main" style="width:100%;"><input class="form-control form-control-dark w-100 rounded-0 border-0" type="text" name="q" placeholder="Search repos" aria-label="Search"></form>
                  <div class="navbar-nav flex-row">
                    <div class="nav-item text-nowrap">
                      <a class="nav-link px-3 active" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS">aria2p</a>
                    </div>
                  </div>
                </header>
                <div class="container-fluid">
                  <div class="row">
                    <nav id="sidebarMenu" class="col-md-3 col-lg-2 d-md-block bg-dark sidebar collapse">
                      <div class="position-sticky pt-3 sidebar-sticky">
                        <ul class="nav flex-column">
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS">
                              <i class="align-text-bottom fa-solid fa-info"></i>
                              Info
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&issue=list">
                              <i class="align-text-bottom fa-solid fa-layer-group"></i>
                              Issues
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&patch=list">
                              <i class="align-text-bottom fa-solid fa-vest-patches"></i>
                              Patches
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&wallet=list">
                              <i class="align-text-bottom fa-solid fa-wallet"></i>
                              Wallets
                            </a>
                          </li>
                          <li class="nav-item">
                            <a class="nav-link active" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=.">
                              <i class="align-text-bottom fa-solid fa-code"></i>
                              Source
                            </a>
                          </li>
                        <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-4 mb-1 text-muted text-uppercase">
                          <span></span>
                        </h6>
                        <ul class="nav flex-column mb-2">
                        
    <h6 class="sidebar-heading d-flex justify-content-between align-items-center px-3 mt-1 mb-1 text-muted text-uppercase">
      <span>Source</span>
    </h6>
    <li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=.github"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> .github</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=config"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> config</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=docs"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> docs</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=scripts"><i class="fa-solid fa-folder-open" style="color:#f0c040;"></i> scripts</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=scripts%2Ftemplates"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> templates</a></li><li><a class="nav-link py-0 active" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fgen_credits.py"><i class="fa-solid fa-file" style="color:#888;"></i> gen_credits.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fgen_ref_nav.py"><i class="fa-solid fa-file" style="color:#888;"></i> gen_ref_nav.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fget_version.py"><i class="fa-solid fa-file" style="color:#888;"></i> get_version.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fmake"><i class="fa-solid fa-file" style="color:#888;"></i> make</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fmake.py"><i class="fa-solid fa-file" style="color:#888;"></i> make.py</a></li><li><a class="nav-link py-0" style="padding-left:32px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=scripts%2Fports.py"><i class="fa-solid fa-file" style="color:#888;"></i> ports.py</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=src"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> src</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=tests"><i class="fa-solid fa-folder" style="color:#f0c040;"></i> tests</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=.copier-answers.yml"><i class="fa-solid fa-file" style="color:#888;"></i> .copier-answers.yml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=.envrc"><i class="fa-solid fa-file" style="color:#888;"></i> .envrc</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=.gitignore"><i class="fa-solid fa-file" style="color:#888;"></i> .gitignore</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=CHANGELOG.md"><i class="fa-solid fa-file" style="color:#888;"></i> CHANGELOG.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=CODE_OF_CONDUCT.md"><i class="fa-solid fa-file" style="color:#888;"></i> CODE_OF_CONDUCT.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=CONTRIBUTING.md"><i class="fa-solid fa-file" style="color:#888;"></i> CONTRIBUTING.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=LICENSE"><i class="fa-solid fa-file" style="color:#888;"></i> LICENSE</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=Makefile"><i class="fa-solid fa-file" style="color:#888;"></i> Makefile</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=README.md"><i class="fa-solid fa-file" style="color:#888;"></i> README.md</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=duties.py"><i class="fa-solid fa-file" style="color:#888;"></i> duties.py</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=mkdocs.yml"><i class="fa-solid fa-file" style="color:#888;"></i> mkdocs.yml</a></li><li><a class="nav-link py-0" style="padding-left:16px;" href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&file=pyproject.toml"><i class="fa-solid fa-file" style="color:#888;"></i> pyproject.toml</a></li>
    
                        </ul>
                      </div>
                    </nav>
                <main class="col-md-9 ms-sm-auto col-lg-10">
                  <div class="container px-1 py-3">
        
<div class="mb-2" style="font-size:1.1rem;"><a href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=.">/</a> <a href="/cgi-bin/repo?id=zVYwt41FidsayUNmaboNi7wp1FDS&source=scripts">scripts</a> / gen_credits.py</div>
        <div class="list-group">
        <div class="list-group-item">
        <div class="mb-2" style="font-weight:bold;"><i class="fa-solid fa-file"></i> gen_credits.py</div>
        <pre style="margin:0; font-size:0.85rem; overflow-x:auto; color:#fafafa;"><span style="color:#666; user-select:none;">  1</span>  &quot;&quot;&quot;Script to generate the project&#x27;s credits.&quot;&quot;&quot;
<span style="color:#666; user-select:none;">  2</span>  
<span style="color:#666; user-select:none;">  3</span>  from __future__ import annotations
<span style="color:#666; user-select:none;">  4</span>  
<span style="color:#666; user-select:none;">  5</span>  import os
<span style="color:#666; user-select:none;">  6</span>  import sys
<span style="color:#666; user-select:none;">  7</span>  from collections import defaultdict
<span style="color:#666; user-select:none;">  8</span>  from collections.abc import Iterable
<span style="color:#666; user-select:none;">  9</span>  from importlib.metadata import distributions
<span style="color:#666; user-select:none;"> 10</span>  from itertools import chain
<span style="color:#666; user-select:none;"> 11</span>  from pathlib import Path
<span style="color:#666; user-select:none;"> 12</span>  from textwrap import dedent
<span style="color:#666; user-select:none;"> 13</span>  from typing import Union
<span style="color:#666; user-select:none;"> 14</span>  
<span style="color:#666; user-select:none;"> 15</span>  from jinja2 import StrictUndefined
<span style="color:#666; user-select:none;"> 16</span>  from jinja2.sandbox import SandboxedEnvironment
<span style="color:#666; user-select:none;"> 17</span>  from packaging.requirements import Requirement
<span style="color:#666; user-select:none;"> 18</span>  
<span style="color:#666; user-select:none;"> 19</span>  # YORE: EOL 3.10: Replace block with line 2.
<span style="color:#666; user-select:none;"> 20</span>  if sys.version_info &gt;= (3, 11):
<span style="color:#666; user-select:none;"> 21</span>      import tomllib
<span style="color:#666; user-select:none;"> 22</span>  else:
<span style="color:#666; user-select:none;"> 23</span>      import tomli as tomllib
<span style="color:#666; user-select:none;"> 24</span>  
<span style="color:#666; user-select:none;"> 25</span>  project_dir = Path(os.getenv(&quot;MKDOCS_CONFIG_DIR&quot;, &quot;.&quot;))
<span style="color:#666; user-select:none;"> 26</span>  with project_dir.joinpath(&quot;pyproject.toml&quot;).open(&quot;rb&quot;) as pyproject_file:
<span style="color:#666; user-select:none;"> 27</span>      pyproject = tomllib.load(pyproject_file)
<span style="color:#666; user-select:none;"> 28</span>  project = pyproject[&quot;project&quot;]
<span style="color:#666; user-select:none;"> 29</span>  project_name = project[&quot;name&quot;]
<span style="color:#666; user-select:none;"> 30</span>  devdeps = [dep for dep in pyproject[&quot;dependency-groups&quot;][&quot;dev&quot;] if not dep.startswith(&quot;-e&quot;)]
<span style="color:#666; user-select:none;"> 31</span>  
<span style="color:#666; user-select:none;"> 32</span>  PackageMetadata = dict[str, Union[str, Iterable[str]]]
<span style="color:#666; user-select:none;"> 33</span>  Metadata = dict[str, PackageMetadata]
<span style="color:#666; user-select:none;"> 34</span>  
<span style="color:#666; user-select:none;"> 35</span>  
<span style="color:#666; user-select:none;"> 36</span>  def _merge_fields(metadata: dict) -&gt; PackageMetadata:
<span style="color:#666; user-select:none;"> 37</span>      fields = defaultdict(list)
<span style="color:#666; user-select:none;"> 38</span>      for header, value in metadata.items():
<span style="color:#666; user-select:none;"> 39</span>          fields[header.lower()].append(value.strip())
<span style="color:#666; user-select:none;"> 40</span>      return {
<span style="color:#666; user-select:none;"> 41</span>          field: value if len(value) &gt; 1 or field in (&quot;classifier&quot;, &quot;requires-dist&quot;) else value[0]
<span style="color:#666; user-select:none;"> 42</span>          for field, value in fields.items()
<span style="color:#666; user-select:none;"> 43</span>      }
<span style="color:#666; user-select:none;"> 44</span>  
<span style="color:#666; user-select:none;"> 45</span>  
<span style="color:#666; user-select:none;"> 46</span>  def _norm_name(name: str) -&gt; str:
<span style="color:#666; user-select:none;"> 47</span>      return name.replace(&quot;_&quot;, &quot;-&quot;).replace(&quot;.&quot;, &quot;-&quot;).lower()
<span style="color:#666; user-select:none;"> 48</span>  
<span style="color:#666; user-select:none;"> 49</span>  
<span style="color:#666; user-select:none;"> 50</span>  def _requirements(deps: list[str]) -&gt; dict[str, Requirement]:
<span style="color:#666; user-select:none;"> 51</span>      return {_norm_name((req := Requirement(dep)).name): req for dep in deps}
<span style="color:#666; user-select:none;"> 52</span>  
<span style="color:#666; user-select:none;"> 53</span>  
<span style="color:#666; user-select:none;"> 54</span>  def _extra_marker(req: Requirement) -&gt; str | None:
<span style="color:#666; user-select:none;"> 55</span>      if not req.marker:
<span style="color:#666; user-select:none;"> 56</span>          return None
<span style="color:#666; user-select:none;"> 57</span>      try:
<span style="color:#666; user-select:none;"> 58</span>          return next(marker[2].value for marker in req.marker._markers if getattr(marker[0], &quot;value&quot;, None) == &quot;extra&quot;)
<span style="color:#666; user-select:none;"> 59</span>      except StopIteration:
<span style="color:#666; user-select:none;"> 60</span>          return None
<span style="color:#666; user-select:none;"> 61</span>  
<span style="color:#666; user-select:none;"> 62</span>  
<span style="color:#666; user-select:none;"> 63</span>  def _get_metadata() -&gt; Metadata:
<span style="color:#666; user-select:none;"> 64</span>      metadata = {}
<span style="color:#666; user-select:none;"> 65</span>      for pkg in distributions():
<span style="color:#666; user-select:none;"> 66</span>          name = _norm_name(pkg.name)  # type: ignore[attr-defined,unused-ignore]
<span style="color:#666; user-select:none;"> 67</span>          metadata[name] = _merge_fields(pkg.metadata)  # type: ignore[arg-type]
<span style="color:#666; user-select:none;"> 68</span>          metadata[name][&quot;spec&quot;] = set()
<span style="color:#666; user-select:none;"> 69</span>          metadata[name][&quot;extras&quot;] = set()
<span style="color:#666; user-select:none;"> 70</span>          metadata[name].setdefault(&quot;summary&quot;, &quot;&quot;)
<span style="color:#666; user-select:none;"> 71</span>          _set_license(metadata[name])
<span style="color:#666; user-select:none;"> 72</span>      return metadata
<span style="color:#666; user-select:none;"> 73</span>  
<span style="color:#666; user-select:none;"> 74</span>  
<span style="color:#666; user-select:none;"> 75</span>  def _set_license(metadata: PackageMetadata) -&gt; None:
<span style="color:#666; user-select:none;"> 76</span>      license_field = metadata.get(&quot;license-expression&quot;, metadata.get(&quot;license&quot;, &quot;&quot;))
<span style="color:#666; user-select:none;"> 77</span>      license_name = license_field if isinstance(license_field, str) else &quot; + &quot;.join(license_field)
<span style="color:#666; user-select:none;"> 78</span>      check_classifiers = license_name in (&quot;UNKNOWN&quot;, &quot;Dual License&quot;, &quot;&quot;) or license_name.count(&quot;\n&quot;)
<span style="color:#666; user-select:none;"> 79</span>      if check_classifiers:
<span style="color:#666; user-select:none;"> 80</span>          license_names = []
<span style="color:#666; user-select:none;"> 81</span>          for classifier in metadata[&quot;classifier&quot;]:
<span style="color:#666; user-select:none;"> 82</span>              if classifier.startswith(&quot;License ::&quot;):
<span style="color:#666; user-select:none;"> 83</span>                  license_names.append(classifier.rsplit(&quot;::&quot;, 1)[1].strip())
<span style="color:#666; user-select:none;"> 84</span>          license_name = &quot; + &quot;.join(license_names)
<span style="color:#666; user-select:none;"> 85</span>      metadata[&quot;license&quot;] = license_name or &quot;?&quot;
<span style="color:#666; user-select:none;"> 86</span>  
<span style="color:#666; user-select:none;"> 87</span>  
<span style="color:#666; user-select:none;"> 88</span>  def _get_deps(base_deps: dict[str, Requirement], metadata: Metadata) -&gt; Metadata:
<span style="color:#666; user-select:none;"> 89</span>      deps = {}
<span style="color:#666; user-select:none;"> 90</span>      for dep_name, dep_req in base_deps.items():
<span style="color:#666; user-select:none;"> 91</span>          if dep_name not in metadata or dep_name == &quot;aria2p&quot;:
<span style="color:#666; user-select:none;"> 92</span>              continue
<span style="color:#666; user-select:none;"> 93</span>          metadata[dep_name][&quot;spec&quot;] |= {str(spec) for spec in dep_req.specifier}  # type: ignore[operator]
<span style="color:#666; user-select:none;"> 94</span>          metadata[dep_name][&quot;extras&quot;] |= dep_req.extras  # type: ignore[operator]
<span style="color:#666; user-select:none;"> 95</span>          deps[dep_name] = metadata[dep_name]
<span style="color:#666; user-select:none;"> 96</span>  
<span style="color:#666; user-select:none;"> 97</span>      again = True
<span style="color:#666; user-select:none;"> 98</span>      while again:
<span style="color:#666; user-select:none;"> 99</span>          again = False
<span style="color:#666; user-select:none;">100</span>          for pkg_name in metadata:
<span style="color:#666; user-select:none;">101</span>              if pkg_name in deps:
<span style="color:#666; user-select:none;">102</span>                  for pkg_dependency in metadata[pkg_name].get(&quot;requires-dist&quot;, []):
<span style="color:#666; user-select:none;">103</span>                      requirement = Requirement(pkg_dependency)
<span style="color:#666; user-select:none;">104</span>                      dep_name = _norm_name(requirement.name)
<span style="color:#666; user-select:none;">105</span>                      extra_marker = _extra_marker(requirement)
<span style="color:#666; user-select:none;">106</span>                      if (
<span style="color:#666; user-select:none;">107</span>                          dep_name in metadata
<span style="color:#666; user-select:none;">108</span>                          and dep_name not in deps
<span style="color:#666; user-select:none;">109</span>                          and dep_name != project[&quot;name&quot;]
<span style="color:#666; user-select:none;">110</span>                          and (not extra_marker or extra_marker in deps[pkg_name][&quot;extras&quot;])
<span style="color:#666; user-select:none;">111</span>                      ):
<span style="color:#666; user-select:none;">112</span>                          metadata[dep_name][&quot;spec&quot;] |= {str(spec) for spec in requirement.specifier}  # type: ignore[operator]
<span style="color:#666; user-select:none;">113</span>                          deps[dep_name] = metadata[dep_name]
<span style="color:#666; user-select:none;">114</span>                          again = True
<span style="color:#666; user-select:none;">115</span>  
<span style="color:#666; user-select:none;">116</span>      return deps
<span style="color:#666; user-select:none;">117</span>  
<span style="color:#666; user-select:none;">118</span>  
<span style="color:#666; user-select:none;">119</span>  def _render_credits() -&gt; str:
<span style="color:#666; user-select:none;">120</span>      metadata = _get_metadata()
<span style="color:#666; user-select:none;">121</span>      dev_dependencies = _get_deps(_requirements(devdeps), metadata)
<span style="color:#666; user-select:none;">122</span>      prod_dependencies = _get_deps(
<span style="color:#666; user-select:none;">123</span>          _requirements(
<span style="color:#666; user-select:none;">124</span>              chain(  # type: ignore[arg-type]
<span style="color:#666; user-select:none;">125</span>                  project.get(&quot;dependencies&quot;, []),
<span style="color:#666; user-select:none;">126</span>                  chain(*project.get(&quot;optional-dependencies&quot;, {}).values()),
<span style="color:#666; user-select:none;">127</span>              ),
<span style="color:#666; user-select:none;">128</span>          ),
<span style="color:#666; user-select:none;">129</span>          metadata,
<span style="color:#666; user-select:none;">130</span>      )
<span style="color:#666; user-select:none;">131</span>  
<span style="color:#666; user-select:none;">132</span>      template_data = {
<span style="color:#666; user-select:none;">133</span>          &quot;project_name&quot;: project_name,
<span style="color:#666; user-select:none;">134</span>          &quot;prod_dependencies&quot;: sorted(prod_dependencies.values(), key=lambda dep: str(dep[&quot;name&quot;]).lower()),
<span style="color:#666; user-select:none;">135</span>          &quot;dev_dependencies&quot;: sorted(dev_dependencies.values(), key=lambda dep: str(dep[&quot;name&quot;]).lower()),
<span style="color:#666; user-select:none;">136</span>          &quot;more_credits&quot;: &quot;http://pawamoy.github.io/credits/&quot;,
<span style="color:#666; user-select:none;">137</span>      }
<span style="color:#666; user-select:none;">138</span>      template_text = dedent(
<span style="color:#666; user-select:none;">139</span>          &quot;&quot;&quot;
<span style="color:#666; user-select:none;">140</span>          # Credits
<span style="color:#666; user-select:none;">141</span>  
<span style="color:#666; user-select:none;">142</span>          These projects were used to build *{{ project_name }}*. **Thank you!**
<span style="color:#666; user-select:none;">143</span>  
<span style="color:#666; user-select:none;">144</span>          [Python](https://www.python.org/) |
<span style="color:#666; user-select:none;">145</span>          [uv](https://github.com/astral-sh/uv) |
<span style="color:#666; user-select:none;">146</span>          [copier-uv](https://github.com/pawamoy/copier-uv)
<span style="color:#666; user-select:none;">147</span>  
<span style="color:#666; user-select:none;">148</span>          {% macro dep_line(dep) -%}
<span style="color:#666; user-select:none;">149</span>          [{{ dep.name }}](https://pypi.org/project/{{ dep.name }}/) | {{ dep.summary }} | {{ (&quot;`&quot; ~ dep.spec|sort(reverse=True)|join(&quot;, &quot;) ~ &quot;`&quot;) if dep.spec else &quot;&quot; }} | `{{ dep.version }}` | {{ dep.license }}
<span style="color:#666; user-select:none;">150</span>          {%- endmacro %}
<span style="color:#666; user-select:none;">151</span>  
<span style="color:#666; user-select:none;">152</span>          {% if prod_dependencies -%}
<span style="color:#666; user-select:none;">153</span>          ### Runtime dependencies
<span style="color:#666; user-select:none;">154</span>  
<span style="color:#666; user-select:none;">155</span>          Project | Summary | Version (accepted) | Version (last resolved) | License
<span style="color:#666; user-select:none;">156</span>          ------- | ------- | ------------------ | ----------------------- | -------
<span style="color:#666; user-select:none;">157</span>          {% for dep in prod_dependencies -%}
<span style="color:#666; user-select:none;">158</span>          {{ dep_line(dep) }}
<span style="color:#666; user-select:none;">159</span>          {% endfor %}
<span style="color:#666; user-select:none;">160</span>  
<span style="color:#666; user-select:none;">161</span>          {% endif -%}
<span style="color:#666; user-select:none;">162</span>          {% if dev_dependencies -%}
<span style="color:#666; user-select:none;">163</span>          ### Development dependencies
<span style="color:#666; user-select:none;">164</span>  
<span style="color:#666; user-select:none;">165</span>          Project | Summary | Version (accepted) | Version (last resolved) | License
<span style="color:#666; user-select:none;">166</span>          ------- | ------- | ------------------ | ----------------------- | -------
<span style="color:#666; user-select:none;">167</span>          {% for dep in dev_dependencies -%}
<span style="color:#666; user-select:none;">168</span>          {{ dep_line(dep) }}
<span style="color:#666; user-select:none;">169</span>          {% endfor %}
<span style="color:#666; user-select:none;">170</span>  
<span style="color:#666; user-select:none;">171</span>          {% endif -%}
<span style="color:#666; user-select:none;">172</span>          {% if more_credits %}**[More credits from the author]({{ more_credits }})**{% endif %}
<span style="color:#666; user-select:none;">173</span>          &quot;&quot;&quot;,
<span style="color:#666; user-select:none;">174</span>      )
<span style="color:#666; user-select:none;">175</span>      jinja_env = SandboxedEnvironment(undefined=StrictUndefined)
<span style="color:#666; user-select:none;">176</span>      return jinja_env.from_string(template_text).render(**template_data)
<span style="color:#666; user-select:none;">177</span>  
<span style="color:#666; user-select:none;">178</span>  
<span style="color:#666; user-select:none;">179</span>  print(_render_credits())
</pre>
        </div>
        </div>

</div>
</main>
</div>
</div>


</body>
</html>

