Skip to content

Commit

Permalink
STY: ruff format and ruff --fix [git-blame-ignore-rev]
Browse files Browse the repository at this point in the history
  • Loading branch information
effigies committed Jan 16, 2024
1 parent 9292580 commit c0f2183
Show file tree
Hide file tree
Showing 55 changed files with 2,530 additions and 2,544 deletions.
48 changes: 33 additions & 15 deletions .maint/paper_author_list.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
#!/usr/bin/env python3
"""Generate an author list for a new paper or abstract."""
import json
import sys
from pathlib import Path
import json
from update_zenodo import get_git_lines, sort_contributors

from update_zenodo import get_git_lines, sort_contributors

# These authors should go last
AUTHORS_LAST = ['Gorgolewski, Krzysztof J.', 'Poldrack, Russell A.', 'Esteban, Oscar']
Expand All @@ -21,9 +21,11 @@ def _aslist(inlist):
contribs = json.loads(Path('.maint/contributors.json').read_text())

author_matches, unmatched = sort_contributors(
devs + contribs, get_git_lines(),
devs + contribs,
get_git_lines(),
exclude=json.loads(Path('.maint/former.json').read_text()),
last=AUTHORS_LAST)
last=AUTHORS_LAST,
)
# Remove position
affiliations = []
for item in author_matches:
Expand All @@ -32,18 +34,34 @@ def _aslist(inlist):
if a not in affiliations:
affiliations.append(a)

aff_indexes = [', '.join(['%d' % (affiliations.index(a) + 1)
for a in _aslist(author.get('affiliation', 'Unaffiliated'))])
for author in author_matches]
aff_indexes = [
', '.join(
[
'%d' % (affiliations.index(a) + 1)
for a in _aslist(author.get('affiliation', 'Unaffiliated'))
]
)
for author in author_matches
]

print("Some people made commits, but are missing in .maint/ "
"files: %s." % ', '.join(unmatched), file=sys.stderr)
print(
'Some people made commits, but are missing in .maint/ '
'files: %s.' % ', '.join(unmatched),
file=sys.stderr,
)

print('Authors (%d):' % len(author_matches))
print("%s." % '; '.join([
'%s \\ :sup:`%s`\\ ' % (i['name'], idx)
for i, idx in zip(author_matches, aff_indexes)
]))
print(
'%s.'
% '; '.join(
[
'%s \\ :sup:`%s`\\ ' % (i['name'], idx)
for i, idx in zip(author_matches, aff_indexes, strict=False)
]
)
)

print('\n\nAffiliations:\n%s' % '\n'.join(['{0: >2}. {1}'.format(i + 1, a)
for i, a in enumerate(affiliations)]))
print(
'\n\nAffiliations:\n%s'
% '\n'.join([f'{i + 1: >2}. {a}' for i, a in enumerate(affiliations)])
)
164 changes: 73 additions & 91 deletions .maint/update_authors.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#!/usr/bin/env python3
"""Update and sort the creators list of the zenodo record."""
import json
import sys
from pathlib import Path
import json

import click
from fuzzywuzzy import fuzz, process

Expand Down Expand Up @@ -35,44 +36,35 @@ def read_md_table(md_text):
keys = None
retval = []
for line in md_text.splitlines():
if line.strip().startswith("| --- |"):
keys = (
k.replace("*", "").strip()
for k in prev.split("|")
)
if line.strip().startswith('| --- |'):
keys = (k.replace('*', '').strip() for k in prev.split('|'))
keys = [k.lower() for k in keys if k]
continue
elif not keys:
prev = line
continue

if not line or not line.strip().startswith("|"):
if not line or not line.strip().startswith('|'):
break

values = [v.strip() or None for v in line.split("|")][1:-1]
retval.append({k: v for k, v in zip(keys, values) if v})
values = [v.strip() or None for v in line.split('|')][1:-1]
retval.append({k: v for k, v in zip(keys, values, strict=False) if v})

return retval


def sort_contributors(entries, git_lines, exclude=None, last=None):
"""Return a list of author dictionaries, ordered by contribution."""
last = last or []
sorted_authors = sorted(entries, key=lambda i: i["name"])
sorted_authors = sorted(entries, key=lambda i: i['name'])

first_last = [
" ".join(val["name"].split(",")[::-1]).strip() for val in sorted_authors
]
first_last_excl = [
" ".join(val["name"].split(",")[::-1]).strip() for val in exclude or []
]
first_last = [' '.join(val['name'].split(',')[::-1]).strip() for val in sorted_authors]
first_last_excl = [' '.join(val['name'].split(',')[::-1]).strip() for val in exclude or []]

unmatched = []
author_matches = []
for ele in git_lines:
matches = process.extract(
ele, first_last, scorer=fuzz.token_sort_ratio, limit=2
)
matches = process.extract(ele, first_last, scorer=fuzz.token_sort_ratio, limit=2)
# matches is a list [('First match', % Match), ('Second match', % Match)]
if matches[0][1] > 80:
val = sorted_authors[first_last.index(matches[0][0])]
Expand All @@ -85,15 +77,15 @@ def sort_contributors(entries, git_lines, exclude=None, last=None):
if val not in author_matches:
author_matches.append(val)

names = {" ".join(val["name"].split(",")[::-1]).strip() for val in author_matches}
names = {' '.join(val['name'].split(',')[::-1]).strip() for val in author_matches}
for missing_name in first_last:
if missing_name not in names:
missing = sorted_authors[first_last.index(missing_name)]
author_matches.append(missing)

position_matches = []
for i, item in enumerate(author_matches):
pos = item.pop("position", None)
pos = item.pop('position', None)
if pos is not None:
position_matches.append((i, int(pos)))

Expand All @@ -105,7 +97,7 @@ def sort_contributors(entries, git_lines, exclude=None, last=None):
return author_matches, unmatched


def get_git_lines(fname="line-contributors.txt"):
def get_git_lines(fname='line-contributors.txt'):
"""Run git-line-summary."""
import shutil
import subprocess as sp
Expand All @@ -114,15 +106,15 @@ def get_git_lines(fname="line-contributors.txt"):

lines = []
if contrib_file.exists():
print("WARNING: Reusing existing line-contributors.txt file.", file=sys.stderr)
print('WARNING: Reusing existing line-contributors.txt file.', file=sys.stderr)
lines = contrib_file.read_text().splitlines()

git_line_summary_path = shutil.which("git-line-summary")
git_line_summary_path = shutil.which('git-line-summary')
if not lines and git_line_summary_path:
print("Running git-line-summary on repo")
print('Running git-line-summary on repo')
lines = sp.check_output([git_line_summary_path]).decode().splitlines()
lines = [line for line in lines if "Not Committed Yet" not in line]
contrib_file.write_text("\n".join(lines))
lines = [line for line in lines if 'Not Committed Yet' not in line]
contrib_file.write_text('\n'.join(lines))

if not lines:
raise RuntimeError(
Expand All @@ -132,13 +124,13 @@ def get_git_lines(fname="line-contributors.txt"):
git-line-summary not found, please install git-extras. """
* (git_line_summary_path is None)
)
return [" ".join(line.strip().split()[1:-1]) for line in lines if "%" in line]
return [' '.join(line.strip().split()[1:-1]) for line in lines if '%' in line]


def _namelast(inlist):
retval = []
for i in inlist:
i["name"] = (f"{i.pop('name', '')} {i.pop('lastname', '')}").strip()
i['name'] = (f"{i.pop('name', '')} {i.pop('lastname', '')}").strip()
retval.append(i)
return retval

Expand All @@ -150,12 +142,13 @@ def cli():


@cli.command()
@click.option("-z", "--zenodo-file", type=click.Path(exists=True), default=".zenodo.json")
@click.option("-m", "--maintainers", type=click.Path(exists=True), default=".maint/MAINTAINERS.md")
@click.option("-c", "--contributors", type=click.Path(exists=True),
default=".maint/CONTRIBUTORS.md")
@click.option("--pi", type=click.Path(exists=True), default=".maint/PIs.md")
@click.option("-f", "--former-file", type=click.Path(exists=True), default=".maint/FORMER.md")
@click.option('-z', '--zenodo-file', type=click.Path(exists=True), default='.zenodo.json')
@click.option('-m', '--maintainers', type=click.Path(exists=True), default='.maint/MAINTAINERS.md')
@click.option(
'-c', '--contributors', type=click.Path(exists=True), default='.maint/CONTRIBUTORS.md'
)
@click.option('--pi', type=click.Path(exists=True), default='.maint/PIs.md')
@click.option('-f', '--former-file', type=click.Path(exists=True), default='.maint/FORMER.md')
def zenodo(
zenodo_file,
maintainers,
Expand All @@ -176,65 +169,60 @@ def zenodo(
)

zen_contributors, miss_contributors = sort_contributors(
_namelast(read_md_table(Path(contributors).read_text())),
data,
exclude=former
_namelast(read_md_table(Path(contributors).read_text())), data, exclude=former
)

zen_pi = _namelast(
sorted(
read_md_table(Path(pi).read_text()),
key=lambda v: (int(v.get("position", -1)), v.get("lastname"))
key=lambda v: (int(v.get('position', -1)), v.get('lastname')),
)
)

zenodo["creators"] = zen_creators
zenodo["contributors"] = zen_contributors + zen_pi
zenodo['creators'] = zen_creators
zenodo['contributors'] = zen_contributors + zen_pi

misses = set(miss_creators).intersection(miss_contributors)
if misses:
print(
"Some people made commits, but are missing in .maint/ "
f"files: {', '.join(misses)}",
"Some people made commits, but are missing in .maint/ " f"files: {', '.join(misses)}",
file=sys.stderr,
)

# Remove position
for creator in zenodo["creators"]:
creator.pop("position", None)
creator.pop("handle", None)
if isinstance(creator["affiliation"], list):
creator["affiliation"] = creator["affiliation"][0]

for creator in zenodo["contributors"]:
creator.pop("handle", None)
creator["type"] = "Researcher"
creator.pop("position", None)

if isinstance(creator["affiliation"], list):
creator["affiliation"] = creator["affiliation"][0]

Path(zenodo_file).write_text(
"%s\n" % json.dumps(zenodo, indent=2)
)
for creator in zenodo['creators']:
creator.pop('position', None)
creator.pop('handle', None)
if isinstance(creator['affiliation'], list):
creator['affiliation'] = creator['affiliation'][0]

for creator in zenodo['contributors']:
creator.pop('handle', None)
creator['type'] = 'Researcher'
creator.pop('position', None)

if isinstance(creator['affiliation'], list):
creator['affiliation'] = creator['affiliation'][0]

Path(zenodo_file).write_text('%s\n' % json.dumps(zenodo, indent=2))


@cli.command()
@click.option("-m", "--maintainers", type=click.Path(exists=True), default=".maint/MAINTAINERS.md")
@click.option("-c", "--contributors", type=click.Path(exists=True),
default=".maint/CONTRIBUTORS.md")
@click.option("--pi", type=click.Path(exists=True), default=".maint/PIs.md")
@click.option("-f", "--former-file", type=click.Path(exists=True), default=".maint/FORMER.md")
@click.option('-m', '--maintainers', type=click.Path(exists=True), default='.maint/MAINTAINERS.md')
@click.option(
'-c', '--contributors', type=click.Path(exists=True), default='.maint/CONTRIBUTORS.md'
)
@click.option('--pi', type=click.Path(exists=True), default='.maint/PIs.md')
@click.option('-f', '--former-file', type=click.Path(exists=True), default='.maint/FORMER.md')
def publication(
maintainers,
contributors,
pi,
former_file,
):
"""Generate the list of authors and affiliations for papers."""
members = (
_namelast(read_md_table(Path(maintainers).read_text()))
+ _namelast(read_md_table(Path(contributors).read_text()))
members = _namelast(read_md_table(Path(maintainers).read_text())) + _namelast(
read_md_table(Path(contributors).read_text())
)

hits, misses = sort_contributors(
Expand All @@ -246,15 +234,12 @@ def publication(
pi_hits = _namelast(
sorted(
read_md_table(Path(pi).read_text()),
key=lambda v: (int(v.get("position", -1)), v.get("lastname"))
key=lambda v: (int(v.get('position', -1)), v.get('lastname')),
)
)

pi_names = [pi["name"] for pi in pi_hits]
hits = [
hit for hit in hits
if hit["name"] not in pi_names
] + pi_hits
pi_names = [pi['name'] for pi in pi_hits]
hits = [hit for hit in hits if hit['name'] not in pi_names] + pi_hits

def _aslist(value):
if isinstance(value, (list, tuple)):
Expand All @@ -264,47 +249,44 @@ def _aslist(value):
# Remove position
affiliations = []
for item in hits:
item.pop("position", None)
for a in _aslist(item.get("affiliation", "Unaffiliated")):
item.pop('position', None)
for a in _aslist(item.get('affiliation', 'Unaffiliated')):
if a not in affiliations:
affiliations.append(a)

aff_indexes = [
", ".join(
', '.join(
[
"%d" % (affiliations.index(a) + 1)
for a in _aslist(author.get("affiliation", "Unaffiliated"))
'%d' % (affiliations.index(a) + 1)
for a in _aslist(author.get('affiliation', 'Unaffiliated'))
]
)
for author in hits
]

if misses:
print(
"Some people made commits, but are missing in .maint/ "
f"files: {', '.join(misses)}",
"Some people made commits, but are missing in .maint/ " f"files: {', '.join(misses)}",
file=sys.stderr,
)

print("Authors (%d):" % len(hits))
print('Authors (%d):' % len(hits))
print(
"%s."
% "; ".join(
'%s.'
% '; '.join(
[
"%s \\ :sup:`%s`\\ " % (i["name"], idx)
for i, idx in zip(hits, aff_indexes)
'%s \\ :sup:`%s`\\ ' % (i['name'], idx)
for i, idx in zip(hits, aff_indexes, strict=False)
]
)
)

print(
"\n\nAffiliations:\n%s"
% "\n".join(
["{0: >2}. {1}".format(i + 1, a) for i, a in enumerate(affiliations)]
)
'\n\nAffiliations:\n%s'
% '\n'.join([f'{i + 1: >2}. {a}' for i, a in enumerate(affiliations)])
)


if __name__ == "__main__":
if __name__ == '__main__':
""" Install entry-point """
cli()
Loading

0 comments on commit c0f2183

Please sign in to comment.