import argparse
import json
import sys
-from difflib import SequenceMatcher
-from enum import Enum, auto
-from typing import List, Optional
+from typing import List
from termcolor import cprint # python3-termcolor
import jsonschema
+from wrpylib.cli_tools import unified_diff, input_yes_no_quit, Choice
from wrpylib.mwapi import WikiSite
from wrpylib.wrmwmarkup import create_sledrun_wiki
-def _format_range_unified(start: int, stop: int) -> str:
- """Copied from difflib._format_range_unified"""
- beginning = start + 1 # lines start numbering with one
- length = stop - start
- if length == 1:
- return str(beginning)
- if not length:
- beginning -= 1 # empty ranges begin at line just before the range
- return f'{beginning},{length}'
-
-
-def unified_diff(a: str, b: str, context: int = 3):
- a_lines = a.splitlines()
- b_lines = b.splitlines()
- for group in SequenceMatcher(None, a_lines, b_lines).get_grouped_opcodes(context):
- first, last = group[0], group[-1]
- file1_range = _format_range_unified(first[1], last[2])
- file2_range = _format_range_unified(first[3], last[4])
- cprint(f'@@ -{file1_range} +{file2_range} @@', 'magenta')
-
- for tag, i1, i2, j1, j2 in group:
- if tag == 'equal':
- for line in a_lines[i1:i2]:
- print(f' {line}')
- continue
- if tag in {'replace', 'delete'}:
- for line in a_lines[i1:i2]:
- cprint(f'- {line}', 'red')
- if tag in {'replace', 'insert'}:
- for line in b_lines[j1:j2]:
- cprint(f'+ {line}', 'green')
-
-
-class Choice(Enum):
- yes = auto()
- no = auto()
- quit = auto()
-
-
-def input_yes_no_quit(text: str, default: Optional[Choice]) -> Choice:
- while True:
- result = input(text)
- if result in ['Y', 'y', 'yes']:
- return Choice.yes
- elif result in ['N', 'n', 'no']:
- return Choice.no
- elif result in ['Q', 'q', 'quit']:
- return Choice.quit
- elif result == '' and default is not None:
- return default
- cprint(f'Unrecognized input: "{result}"', 'red')
-
-
def update_sledrun(site: WikiSite, wiki_page: dict, json_page: dict, map_page: dict, impression_page: dict):
json_page_main_slot = json_page['revisions'][0]['slots']['main']
assert json_page_main_slot['contentmodel'] == 'json'
assert wikitext_page['title'] + '/Rodelbahn.json' == json_page['title']
if 'missing' in json_page:
continue
- if wikitext_page['revisions'][0]['timestamp'] < json_page['revisions'][0]['timestamp']:
+ if update_all or (wikitext_page['revisions'][0]['timestamp'] < json_page['revisions'][0]['timestamp']):
update_wikitext_title_list.append(wikitext_page['title'])
update_json_title_list.append(json_page['title'])