Skip to content

Commit 9326ff9

Browse files
committed
File display page is basically styled
1 parent a93af47 commit 9326ff9

File tree

10 files changed

+103
-30
lines changed

10 files changed

+103
-30
lines changed

poetry.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pypi_view/app.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import packaging.version
1111
import pygments.lexers.special
1212
from identify import identify
13+
from markupsafe import Markup
1314
from starlette.applications import Starlette
1415
from starlette.middleware import Middleware
1516
from starlette.middleware.base import BaseHTTPMiddleware
@@ -261,6 +262,11 @@ async def package_file_archive_path(request: Request) -> Response:
261262
)
262263
entry = matching_entries[0]
263264
mimetype, _ = mimetypes.guess_type(archive_path)
265+
metadata = (
266+
('Size', _human_size(entry.size)),
267+
('Mimetype', Markup(f'<tt>{mimetype}</tt>') if mimetype else 'Unknown'),
268+
('Mode', Markup(f'<tt>{entry.mode}</tt>')),
269+
)
264270

265271
def _transfer_raw():
266272
"""Return the file verbatim."""
@@ -329,32 +335,35 @@ async def transfer_file():
329335
highlight_diff=False,
330336
),
331337
),
338+
'metadata': metadata,
332339
'extra_css': fluffy_code.code.get_global_css() + '\n' + style_config.css,
333340
'extra_js': fluffy_code.code.get_global_javascript(),
334341
},
335342
)
336343
else:
337344
# Case 2: too long to syntax highlight.
338345
return templates.TemplateResponse(
339-
'package_file_archive_path_cannot_render.html',
346+
'package_file_archive_path.html',
340347
{
341348
'request': request,
342349
'package': package_name,
343350
'filename': file_name,
344351
'archive_path': archive_path,
345-
'error': 'This file is too long to syntax highlight.',
352+
'metadata': metadata,
353+
'cannot_render_error': 'This file is too long to display inline with syntax highlighting.',
346354
},
347355
)
348356

349357
# Case 4: link to binary
350358
return templates.TemplateResponse(
351-
'package_file_archive_path_cannot_render.html',
359+
'package_file_archive_path.html',
352360
{
353361
'request': request,
354362
'package': package_name,
355363
'filename': file_name,
356364
'archive_path': archive_path,
357-
'error': 'This file appears to be a binary.',
365+
'metadata': metadata,
366+
'cannot_render_error': 'This file appears to be a binary.',
358367
},
359368
)
360369

pypi_view/packaging.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import enum
55
import os.path
66
import re
7+
import stat
78
import typing
89
import zipfile
910
from dataclasses import dataclass
@@ -32,6 +33,7 @@ class PackageFormat(enum.Enum):
3233
@dataclass(frozen=True)
3334
class PackageEntry:
3435
path: str
36+
mode: str
3537
size: int
3638

3739

@@ -41,6 +43,7 @@ def _package_entries_from_zipfile(path: str) -> typing.Set[PackageEntry]:
4143
PackageEntry(
4244
path=entry.filename,
4345
size=entry.file_size,
46+
mode=stat.filemode(entry.external_attr >> 16),
4447
)
4548
for entry in zf.infolist()
4649
}

pypi_view/static/site.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
.breadcrumb {
2+
--bs-breadcrumb-divider: '>';
3+
}
4+
15
.page-package-file .metadata {
26
width: auto;
37
}
8+
9+
.page-package-file-archive-path .codeview {
10+
border: solid 1px #ddd;
11+
}

pypi_view/templates/_base.html

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@
2323
/>
2424
<button class="btn btn-outline-success" type="submit">Go</button>
2525
</form>
26-
<div class="collapse navbar-collapse">
27-
foo
28-
</div>
2926
</div>
3027
</nav>
3128

pypi_view/templates/package.html

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@
55
{% block title %}{{package}} | PyPi View{% endblock %}
66

77
{% block content %}
8-
<h1>{{package}}</h1>
8+
<h1 class="font-monospace">{{package}}</h1>
9+
10+
<nav aria-label="breadcrumb">
11+
<ol class="breadcrumb">
12+
<li class="breadcrumb-item"><a href="{{url_for('home')}}">Browse</a></li>
13+
<li class="breadcrumb-item active">{{package}}</li>
14+
</ol>
15+
</nav>
16+
917
<p>
1018
<tt>{{package}}</tt> has {{version_to_files|length}} version{{version_to_files|length|pluralize}} and {{total_files}} file{{total_files|pluralize}}.
1119
Select a file below to explore it.

pypi_view/templates/package_file.html

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,22 @@
66
{% block title %}{{filename}} | {{package}} | PyPi View{% endblock %}
77

88
{% block content %}
9-
<h1><tt>{{filename}}</tt></h1>
9+
<h1 class="font-monospace">{{filename}}</h1>
10+
11+
<nav aria-label="breadcrumb">
12+
<ol class="breadcrumb">
13+
<li class="breadcrumb-item"><a href="{{url_for('home')}}">Browse</a></li>
14+
<li class="breadcrumb-item">
15+
<a
16+
href="{{url_for('package', package=package)}}"
17+
>
18+
{{package}}
19+
</a>
20+
</li>
21+
<li class="breadcrumb-item active">{{filename}}</li>
22+
</ol>
23+
</nav>
24+
1025
<h5>{{macros.package_type_pill(filename)}}</h5>
1126

1227
{% if metadata_path %}

pypi_view/templates/package_file_archive_path.html

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,59 @@
1717
{% endblock %}
1818

1919
{% block content %}
20-
<h1>{{package}}: {{filename}}</h1>
21-
<h2>{{archive_path}}</h2>
22-
<div class="font-monospace">
23-
{{rendered_text|safe}}
20+
<h1 class="font-monospace">{{archive_path}}</h1>
21+
22+
<nav aria-label="breadcrumb">
23+
<ol class="breadcrumb">
24+
<li class="breadcrumb-item"><a href="{{url_for('home')}}">Browse</a></li>
25+
<li class="breadcrumb-item">
26+
<a
27+
href="{{url_for('package', package=package)}}"
28+
>
29+
{{package}}
30+
</a>
31+
</li>
32+
<li class="breadcrumb-item">
33+
<a
34+
href="{{url_for('package_file', package=package, filename=filename)}}"
35+
>
36+
{{filename}}
37+
</a>
38+
</li>
39+
<li class="breadcrumb-item active" aria-current="page">{{archive_path}}</li>
40+
</ol>
41+
</nav>
42+
43+
<div class="row">
44+
<div class="col">
45+
{% if cannot_render_error %}
46+
<div class="card">
47+
<div class="card-body text-center">
48+
<h4>This file cannot be displayed.</h4>
49+
<p>{{cannot_render_error}}</p>
50+
<a href="?raw" class="btn btn-primary">View Raw File</a>
51+
</div>
52+
</div>
53+
{% else %}
54+
<div class="font-monospace codeview">
55+
{{rendered_text|safe}}
56+
</div>
57+
{% endif %}
58+
</div>
59+
60+
<div class="col col-sm-3">
61+
<h5>Metadata</h5>
62+
<table class="table table-bordered table-sm small metadata">
63+
{% for key, value in metadata %}
64+
<tr>
65+
<th>{{key}}</th>
66+
<td>{{value}}</td>
67+
</tr>
68+
{% endfor %}
69+
</table>
70+
<a href="?raw" class="btn btn-primary btn-sm">View Raw File</a>
71+
</div>
2472
</div>
25-
<p><a href="?raw">View Raw</a></p>
2673
{% endblock %}
2774

2875
{# vim: ft=jinja

pypi_view/templates/package_file_archive_path_cannot_render.html

Lines changed: 0 additions & 15 deletions
This file was deleted.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ httpx = "^0.23.0"
1616
aiofiles = "^22.1.0"
1717
identify = "^2.5.5"
1818
Pygments = "^2.13.0"
19+
MarkupSafe = "^2.1.1"
1920

2021

2122
[tool.poetry.group.dev.dependencies]

0 commit comments

Comments
 (0)