powder that makes you say yes

This commit is contained in:
Nadyr
2022-06-25 23:06:30 -04:00
committed by GitHub
parent 946e55aaed
commit 648bc73bc5

View File

@@ -1,22 +1,16 @@
<<<<<<< HEAD
''' '''
Usage: Usage:
$ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/ $ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/
ss13_genchangelog.py - Generate changelog from YAML. ss13_genchangelog.py - Generate changelog from YAML.
Copyright 2013 Rob "N3X15" Nelson <nexis@7chan.org> Copyright 2013 Rob "N3X15" Nelson <nexis@7chan.org>
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions: furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software. all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -26,8 +20,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
''' '''
'''//CHOMP Edit: I am tired of this thing not working. I am just removing it.
from __future__ import print_function from __future__ import print_function
import yaml, os, glob, sys, re, time, argparse import yaml, os, glob, sys, re, time, argparse
from datetime import datetime, date from datetime import datetime, date
@@ -72,7 +64,7 @@ if os.path.isfile(changelog_cache):
with open(changelog_cache) as f: with open(changelog_cache) as f:
(_, all_changelog_entries) = yaml.load_all(f) (_, all_changelog_entries) = yaml.load_all(f)
failed_cache_read = False failed_cache_read = False
# Convert old timestamps to newer format. # Convert old timestamps to newer format.
new_entries = {} new_entries = {}
for _date in all_changelog_entries.keys(): for _date in all_changelog_entries.keys():
@@ -88,10 +80,10 @@ if os.path.isfile(changelog_cache):
except Exception as e: except Exception as e:
print("Failed to read cache:") print("Failed to read cache:")
print(e, file=sys.stderr) print(e, file=sys.stderr)
if args.dryRun: if args.dryRun:
changelog_cache = os.path.join(args.ymlDir, '.dry_changelog.yml') changelog_cache = os.path.join(args.ymlDir, '.dry_changelog.yml')
if failed_cache_read and os.path.isfile(args.targetFile): if failed_cache_read and os.path.isfile(args.targetFile):
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from bs4.element import NavigableString from bs4.element import NavigableString
@@ -107,7 +99,7 @@ if failed_cache_read and os.path.isfile(args.targetFile):
if author.endswith('updated:'): if author.endswith('updated:'):
author = author[:-8] author = author[:-8]
author = author.strip() author = author.strip()
# Find <ul> # Find <ul>
ulT = authorT.next_sibling ulT = authorT.next_sibling
while(ulT.name != 'ul'): while(ulT.name != 'ul'):
@@ -120,14 +112,14 @@ if failed_cache_read and os.path.isfile(args.targetFile):
newdat = {changeT['class'][0] + '': val + ''} newdat = {changeT['class'][0] + '': val + ''}
if newdat not in changes: if newdat not in changes:
changes += [newdat] changes += [newdat]
if len(changes) > 0: if len(changes) > 0:
entry[author] = changes entry[author] = changes
if date in all_changelog_entries: if date in all_changelog_entries:
all_changelog_entries[date].update(entry) all_changelog_entries[date].update(entry)
else: else:
all_changelog_entries[date] = entry all_changelog_entries[date] = entry
del_after = [] del_after = []
errors = False errors = False
print('Reading changelogs...') print('Reading changelogs...')
@@ -154,30 +146,30 @@ for fileName in glob.glob(os.path.join(args.ymlDir, "*.yml")):
print(' {0}: Invalid prefix {1}'.format(fileName, change_type), file=sys.stderr) print(' {0}: Invalid prefix {1}'.format(fileName, change_type), file=sys.stderr)
author_entries += [change] author_entries += [change]
new += 1 new += 1
all_changelog_entries[today][cl['author']] = author_entries all_changelog_entries[today][cl['author']] = author_entries
if new > 0: if new > 0:
print(' Added {0} new changelog entries.'.format(new)) print(' Added {0} new changelog entries.'.format(new))
if cl.get('delete-after', False): if cl.get('delete-after', False):
if os.path.isfile(fileName): if os.path.isfile(fileName):
if args.dryRun: if args.dryRun:
print(' Would delete {0} (delete-after set)...'.format(fileName)) print(' Would delete {0} (delete-after set)...'.format(fileName))
else: else:
del_after += [fileName] del_after += [fileName]
if args.dryRun: continue if args.dryRun: continue
cl['changes'] = [] cl['changes'] = []
with open(fileName, 'w') as f: with open(fileName, 'w') as f:
yaml.dump(cl, f, default_flow_style=False) yaml.dump(cl, f, default_flow_style=False)
targetDir = os.path.dirname(args.targetFile) targetDir = os.path.dirname(args.targetFile)
with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.targetFile, 'w') as changelog: with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.targetFile, 'w') as changelog:
with open(os.path.join(targetDir, 'templates', 'header.html'), 'r') as h: with open(os.path.join(targetDir, 'templates', 'header.html'), 'r') as h:
for line in h: for line in h:
changelog.write(line) changelog.write(line)
for _date in reversed(sorted(all_changelog_entries.keys())): for _date in reversed(sorted(all_changelog_entries.keys())):
entry_htm = '\n' entry_htm = '\n'
entry_htm += '\t\t\t<h2 class="date">{date}</h2>\n'.format(date=_date.strftime(dateformat)) entry_htm += '\t\t\t<h2 class="date">{date}</h2>\n'.format(date=_date.strftime(dateformat))
@@ -190,18 +182,18 @@ with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.t
for (css_class, change) in (dictToTuples(e)[0] for e in all_changelog_entries[_date][author]): for (css_class, change) in (dictToTuples(e)[0] for e in all_changelog_entries[_date][author]):
if change in changes_added: continue if change in changes_added: continue
write_entry = True write_entry = True
changes_added += [change] changes_added += [change]
author_htm += '\t\t\t\t<li class="{css_class}">{change}</li>\n'.format(css_class=css_class, change=change.strip()) author_htm += '\t\t\t\t<li class="{css_class}">{change}</li>\n'.format(css_class=css_class, change=change.strip())
author_htm += '\t\t\t</ul>\n' author_htm += '\t\t\t</ul>\n'
if len(changes_added) > 0: if len(changes_added) > 0:
entry_htm += author_htm entry_htm += author_htm
if write_entry: if write_entry:
changelog.write(entry_htm) changelog.write(entry_htm)
with open(os.path.join(targetDir, 'templates', 'footer.html'), 'r') as h: with open(os.path.join(targetDir, 'templates', 'footer.html'), 'r') as h:
for line in h: for line in h:
changelog.write(line) changelog.write(line)
with open(changelog_cache, 'w') as f: with open(changelog_cache, 'w') as f:
cache_head = 'DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.' cache_head = 'DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.'
@@ -216,221 +208,3 @@ if len(del_after):
if errors: if errors:
sys.exit(1) sys.exit(1)
'''
=======
'''
Usage:
$ python ss13_genchangelog.py [--dry-run] html/changelog.html html/changelogs/
ss13_genchangelog.py - Generate changelog from YAML.
Copyright 2013 Rob "N3X15" Nelson <nexis@7chan.org>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
'''
from __future__ import print_function
import yaml, os, glob, sys, re, time, argparse
from datetime import datetime, date
from time import time
today = date.today()
dateformat = "%d %B %Y"
opt = argparse.ArgumentParser()
opt.add_argument('-d', '--dry-run', dest='dryRun', default=False, action='store_true', help='Only parse changelogs and, if needed, the targetFile. (A .dry_changelog.yml will be output for debugging purposes.)')
opt.add_argument('targetFile', help='The HTML changelog we wish to update.')
opt.add_argument('ymlDir', help='The directory of YAML changelogs we will use.')
args = opt.parse_args()
all_changelog_entries = {}
validPrefixes = [
'bugfix',
'wip',
'tweak',
'soundadd',
'sounddel',
'rscdel',
'rscadd',
'imageadd',
'imagedel',
'maptweak',
'spellcheck',
'experiment'
]
def dictToTuples(inp):
return [(k, v) for k, v in inp.items()]
changelog_cache = os.path.join(args.ymlDir, '.all_changelog.yml')
failed_cache_read = True
if os.path.isfile(changelog_cache):
try:
with open(changelog_cache) as f:
(_, all_changelog_entries) = yaml.load_all(f)
failed_cache_read = False
# Convert old timestamps to newer format.
new_entries = {}
for _date in all_changelog_entries.keys():
ty = type(_date).__name__
# print(ty)
if ty in ['str', 'unicode']:
temp_data = all_changelog_entries[_date]
_date = datetime.strptime(_date, dateformat).date()
new_entries[_date] = temp_data
else:
new_entries[_date] = all_changelog_entries[_date]
all_changelog_entries = new_entries
except Exception as e:
print("Failed to read cache:")
print(e, file=sys.stderr)
if args.dryRun:
changelog_cache = os.path.join(args.ymlDir, '.dry_changelog.yml')
if failed_cache_read and os.path.isfile(args.targetFile):
from bs4 import BeautifulSoup
from bs4.element import NavigableString
print(' Generating cache...')
with open(args.targetFile, 'r') as f:
soup = BeautifulSoup(f)
for e in soup.find_all('div', {'class':'commit'}):
entry = {}
date = datetime.strptime(e.h2.string.strip(), dateformat).date() # key
for authorT in e.find_all('h3', {'class':'author'}):
author = authorT.string
# Strip suffix
if author.endswith('updated:'):
author = author[:-8]
author = author.strip()
# Find <ul>
ulT = authorT.next_sibling
while(ulT.name != 'ul'):
ulT = ulT.next_sibling
changes = []
for changeT in ulT.children:
if changeT.name != 'li': continue
val = changeT.decode_contents(formatter="html")
newdat = {changeT['class'][0] + '': val + ''}
if newdat not in changes:
changes += [newdat]
if len(changes) > 0:
entry[author] = changes
if date in all_changelog_entries:
all_changelog_entries[date].update(entry)
else:
all_changelog_entries[date] = entry
del_after = []
errors = False
print('Reading changelogs...')
for fileName in glob.glob(os.path.join(args.ymlDir, "*.yml")):
name, ext = os.path.splitext(os.path.basename(fileName))
if name.startswith('.'): continue
if name == 'example': continue
fileName = os.path.abspath(fileName)
print(' Reading {}...'.format(fileName))
cl = {}
with open(fileName, 'r') as f:
cl = yaml.load(f)
f.close()
if today not in all_changelog_entries:
all_changelog_entries[today] = {}
author_entries = all_changelog_entries[today].get(cl['author'], [])
if len(cl['changes']):
new = 0
for change in cl['changes']:
if change not in author_entries:
(change_type, _) = dictToTuples(change)[0]
if change_type not in validPrefixes:
errors = True
print(' {0}: Invalid prefix {1}'.format(fileName, change_type), file=sys.stderr)
author_entries += [change]
new += 1
all_changelog_entries[today][cl['author']] = author_entries
if new > 0:
print(' Added {0} new changelog entries.'.format(new))
if cl.get('delete-after', False):
if os.path.isfile(fileName):
if args.dryRun:
print(' Would delete {0} (delete-after set)...'.format(fileName))
else:
del_after += [fileName]
if args.dryRun: continue
cl['changes'] = []
with open(fileName, 'w') as f:
yaml.dump(cl, f, default_flow_style=False)
targetDir = os.path.dirname(args.targetFile)
with open(args.targetFile.replace('.htm', '.dry.htm') if args.dryRun else args.targetFile, 'w') as changelog:
with open(os.path.join(targetDir, 'templates', 'header.html'), 'r') as h:
for line in h:
changelog.write(line)
for _date in reversed(sorted(all_changelog_entries.keys())):
entry_htm = '\n'
entry_htm += '\t\t\t<h2 class="date">{date}</h2>\n'.format(date=_date.strftime(dateformat))
write_entry = False
for author in sorted(all_changelog_entries[_date].keys()):
if len(all_changelog_entries[_date]) == 0: continue
author_htm = '\t\t\t<h3 class="author">{author} updated:</h3>\n'.format(author=author)
author_htm += '\t\t\t<ul class="changes bgimages16">\n'
changes_added = []
for (css_class, change) in (dictToTuples(e)[0] for e in all_changelog_entries[_date][author]):
if change in changes_added: continue
write_entry = True
changes_added += [change]
author_htm += '\t\t\t\t<li class="{css_class}">{change}</li>\n'.format(css_class=css_class, change=change.strip())
author_htm += '\t\t\t</ul>\n'
if len(changes_added) > 0:
entry_htm += author_htm
if write_entry:
changelog.write(entry_htm)
with open(os.path.join(targetDir, 'templates', 'footer.html'), 'r') as h:
for line in h:
changelog.write(line)
with open(changelog_cache, 'w') as f:
cache_head = 'DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.'
yaml.dump_all([cache_head, all_changelog_entries], f, default_flow_style=False)
if len(del_after):
print('Cleaning up...')
for fileName in del_after:
if os.path.isfile(fileName):
print(' Deleting {0} (delete-after set)...'.format(fileName))
os.remove(fileName)
if errors:
sys.exit(1)
>>>>>>> 27374124c4... Merge pull request #13164 from ItsSelis/tgui-prettierx