From 7163f36a5e9f159def223a76953505ffff9a56c7 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Thu, 18 Nov 2021 12:37:29 -0800 Subject: polish editgroup diff view Still not as great as it could be, but useful in this state. --- python/fatcat_web/entity_helpers.py | 53 +++++++++++---------- python/fatcat_web/templates/editgroup_diff.html | 52 ++++++--------------- python/fatcat_web/templates/editgroup_view.html | 62 +++++++++++++------------ python/tests/web_editgroup.py | 8 ++++ 4 files changed, 83 insertions(+), 92 deletions(-) diff --git a/python/fatcat_web/entity_helpers.py b/python/fatcat_web/entity_helpers.py index bf81dfce..24f380c8 100644 --- a/python/fatcat_web/entity_helpers.py +++ b/python/fatcat_web/entity_helpers.py @@ -1,5 +1,5 @@ import difflib -from typing import Any, Dict, Tuple +from typing import Any, Dict, List, Tuple from fatcat_openapi_client import ( ContainerEntity, @@ -262,47 +262,52 @@ def generic_get_editgroup_entity( return entity, edit -def _entity_edit_diff(entity_type: str, entity_edit: EntityEdit) -> Dict[str, Any]: +def _entity_edit_diff(entity_type: str, entity_edit: EntityEdit) -> List[str]: """ - entity_edit - ident - revision - prev_revision - redirect_ident + Helper to generate diff lines for a single entity edit. + + Schema of entity_edit (as a reminder): + + entity_edit + ident + revision + prev_revision + redirect_ident """ pop_fields = ["revision", "state"] new_rev = generic_get_entity_revision(entity_type, entity_edit.revision) - new_toml = entity_to_toml(new_rev, pop_fields=pop_fields) + new_toml = entity_to_toml(new_rev, pop_fields=pop_fields).split("\n") + if len(new_toml) == 1 and not new_toml[0].strip(): + new_toml = [] if entity_edit.prev_revision: old_rev = generic_get_entity_revision(entity_type, entity_edit.prev_revision) - old_toml = entity_to_toml(old_rev, pop_fields=pop_fields) + old_toml = entity_to_toml(old_rev, pop_fields=pop_fields).split("\n") fromdesc = f"/{entity_type}/rev/{entity_edit.prev_revision}.toml" else: - old_toml = "" + old_toml = [] fromdesc = "(created)" - # differ = difflib.HtmlDiff(tabsize=4) - # html_table = differ.make_table( - # old_toml.split('\n'), - # new_toml.split('\n'), - # fromdesc=fromdesc, - # todesc=entity_edit.revision, - # context=True, - # numlines=3, - # ) - # return dict(html_table=html_table) diff_lines = list( difflib.unified_diff( - old_toml.split("\n"), - new_toml.split("\n"), + old_toml, + new_toml, fromfile=fromdesc, tofile=f"/{entity_type}/rev/{entity_edit.revision}.toml", ) ) - return dict(diff_lines=diff_lines) + return diff_lines def editgroup_get_diffs(editgroup: Editgroup) -> Dict[str, Any]: + """ + Fetches before/after entity revisions, and computes "diffs" of TOML representations. + + Returns a dict with entity type (pluralized, like "files"), then within + that a dict with entity ident (without prefix) containing a list of + strings, one per line of the "unified diff" format. If there is no diff for + an edited entity (eg, it was or redirected), instead `None` is returned for + that entity. + """ diffs: Dict[str, Any] = {} for entity_type in [ @@ -322,6 +327,4 @@ def editgroup_get_diffs(editgroup: Editgroup) -> Dict[str, Any]: diffs[entity_type][ed.ident] = _entity_edit_diff(entity_type, ed) else: diffs[entity_type][ed.ident] = None - # XXX: - print(diffs.keys()) return diffs diff --git a/python/fatcat_web/templates/editgroup_diff.html b/python/fatcat_web/templates/editgroup_diff.html index de6a800d..4b32fbf5 100644 --- a/python/fatcat_web/templates/editgroup_diff.html +++ b/python/fatcat_web/templates/editgroup_diff.html @@ -2,56 +2,31 @@ {% macro edit_diff_list(auth_to, editgroup, edits, diffs, entity_type, entity_name) -%} {% if edits %} -

{{ entity_name }} Edits ({{ edits|count }})

+

{{ entity_name }} Edit Diffs ({{ edits|count }})


{% for edit in edits %} -
+
-
- [view] - {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %} -
[re-edit] -
-
- - -
- {% endif %} -
-
- {{ entity_type }}_{{ edit.ident }} - {% if edit.redirect_ident %} - => redirect to {{ entity_type }}/{{ edit.redirect_ident }} - {% elif not edit.revision %} - deleted - {% elif not edit.prev_revision %} - created - {% else %} - updated - {% endif %} -
- {% if edit.revision %} - Revision: {{ edit.revision }} - {% endif %} + {{ entity_edit_header(auth_to, editgroup, edit, entity_type, entity_name) }} {% if edit.extra %} {{ entity_macros.extra_metadata(edit.extra) }} {% endif %} - {% if edit.revision and not edit.redirect_ident and edit.ident in diffs %} -
- {% for line in diffs[edit.ident]['diff_lines'] %} + {% if edit.revision and not edit.redirect_ident and edit.ident in diffs and diffs[edit.ident] != None %} +
+ {% for line in diffs[edit.ident] %} {% set line_space = false %} {% if line.startswith('@@') or line.startswith('---') or line.startswith('+++') %} - {% set line_color = "lightblue" %} + {% set line_color = "lightblue" %}{# a light blue #} {% elif line.startswith('+') %} - {% set line_color = "lightgreen" %} + {% set line_color = "#a4efa4" %}{# a light green #} {% elif line.startswith('-') %} - {% set line_color = "#ffa3a3" %} + {% set line_color = "#ffa3a3" %}{# a light red #} {% else %} - {% set line_color = "#ddd" %} + {% set line_color = "#eee" %}{# almost white #} {% set line_space = true %} {% endif %} -
{% if line_space %} {% endif %}{{ line.strip() }}
+
{% if line_space %} {% endif %}{{ line.strip() }}
{% endfor %}
{% endif %} @@ -62,10 +37,11 @@ {% endif %} {%- endmacro %} -{% block title %}Editgroup diff{% endblock %} +{% block title %}Editgroup Diff{% endblock %} + +{% block pagetitle %}Editgroup Diff{% endblock %} {% block editgroupedits %} -

All Entity Change Diffs

{{ edit_diff_list(auth_to, editgroup, editgroup.edits.releases, editgroup_diffs.release, "release", "Release") }} {{ edit_diff_list(auth_to, editgroup, editgroup.edits.works, editgroup_diffs.work, "work", "Work") }} {{ edit_diff_list(auth_to, editgroup, editgroup.edits.containers, editgroup_diffs.container, "container", "Container") }} diff --git a/python/fatcat_web/templates/editgroup_view.html b/python/fatcat_web/templates/editgroup_view.html index de904c2a..0142a46b 100644 --- a/python/fatcat_web/templates/editgroup_view.html +++ b/python/fatcat_web/templates/editgroup_view.html @@ -1,40 +1,45 @@ {% extends "base.html" %} {% import "entity_macros.html" as entity_macros %} +{% macro entity_edit_header(auth_to, editgroup, edit, entity_type, entity_name) -%} +
+ [view] + [diff] + {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %} +
[re-edit] +
+
+ + +
+ {% endif %} +
+
+ {{ entity_type }}_{{ edit.ident }} + {% if edit.redirect_ident %} + => redirect to {{ entity_type }}/{{ edit.redirect_ident }} + {% elif not edit.revision %} + deleted + {% elif not edit.prev_revision %} + created + {% else %} + updated + {% endif %} +
+ {% if edit.revision %} + Revision: {{ edit.revision }} + {% endif %} +{%- endmacro %} + {% macro edit_list(auth_to, editgroup, edits, entity_type, entity_name) -%}

{{ entity_name }} Edits ({{ edits|count }})

{% for edit in edits %} -
+
-
- [view] - {% if auth_to.edit and not editgroup.changelog_index and not editgroup.submitted %} -
[re-edit] -
-
- - -
- {% endif %} -
-
- {{ entity_type }}_{{ edit.ident }} - {% if edit.redirect_ident %} - => redirect to {{ entity_type }}/{{ edit.redirect_ident }} - {% elif not edit.revision %} - deleted - {% elif not edit.prev_revision %} - created - {% else %} - updated - {% endif %} -
- {% if edit.revision %} - Revision: {{ edit.revision }} - {% endif %} + {{ entity_edit_header(auth_to, editgroup, edit, entity_type, entity_name) }} {% if edit.extra %} {{ entity_macros.extra_metadata(edit.extra) }} {% endif %} @@ -51,11 +56,10 @@ {# extended by changelog_entry #} {% block editgroupheader %} -

Editgroup +

{% block pagetitle %}Editgroup{% endblock %} editgroup_{{ editgroup.editgroup_id }}

{% if not auth_to.submit %} -
What is an editgroup? diff --git a/python/tests/web_editgroup.py b/python/tests/web_editgroup.py index 62a5df2e..906c18e6 100644 --- a/python/tests/web_editgroup.py +++ b/python/tests/web_editgroup.py @@ -5,8 +5,16 @@ def test_editgroup_basics(app): rv = app.get("/editgroup/aaaaaaaaaaaabo53aaaaaaaaae") assert rv.status_code == 200 + rv = app.get("/editgroup/aaaaaaaaaaaabo53aaaaaaaaae/diff") + assert rv.status_code == 200 + rv = app.get("/editgroup/aaaaaaaaaaaabo53aaaaaaaaa4/diff") + assert rv.status_code == 200 + rv = app.get("/editgroup/aaaaaaaaaaaabo53aaaaaaaaaq/diff") + assert rv.status_code == 200 rv = app.get("/editgroup/ccccccccccccccccccccccccca") assert rv.status_code == 404 + rv = app.get("/editgroup/ccccccccccccccccccccccccca/diff") + assert rv.status_code == 404 rv = app.get("/editor/aaaaaaaaaaaabkvkaaaaaaaaae") assert rv.status_code == 200 -- cgit v1.2.3