1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#!/usr/bin/env python3
"""
This is a one-off script for pushing ISSN-L fixes to fatcat via the API.
It excpects to have fatcat python libraries available. Run it like:
export FATCAT_API_AUTH_TOKEN="..."
./fix_invalid_issnl.py ~/code/chocula/invalid_fatcat_issnl.tsv
It creates a new editgroup, which you'll need to merge/accept manually.
Defaults to QA API endpoint; edit the file to switch to prod.
"""
import os, sys
import csv
from fatcat_tools import authenticated_api
from fatcat_client import Editgroup, ContainerEntity
from fatcat_client.rest import ApiException
API_ENDPOINT = "https://api.qa.fatcat.wiki/v0"
def run(api, row_iter):
eg = api.create_editgroup(Editgroup(description=
"Update or merge containers with invalid (by checksum) ISSN-L. Using the fix_invalid_issnl.py script from chocula repo."))
print("Editgroup ident: {}".format(eg.editgroup_id))
for row in row_iter:
#print(row)
fixed_issnl = row['fixed_issnl'].strip()
if not fixed_issnl:
print("SKIP")
continue
assert row['issnl'].strip() != fixed_issnl
invalid = api.get_container(row['fatcat_ident'])
assert invalid.state == "active"
try:
fixed = api.lookup_container(issnl=row['fixed_issnl'])
except ApiException as ae:
if ae.status != 404:
raise ae
fixed = None
if fixed:
# merge/redirect
assert fixed.state == "active"
print("MERGE: {} -> {}".format(invalid.ident, fixed.ident))
invalid.redirect = fixed.ident
api.update_container(eg.editgroup_id, invalid.ident,
ContainerEntity(redirect=fixed.ident))
else:
# update in-place with fixed ISSN-L
print("FIX: {}: {}".format(invalid.ident, fixed_issnl))
invalid.issnl = fixed_issnl
api.update_container(eg.editgroup_id, invalid.ident, invalid)
# intentionally not merging editgroup
print("Editgroup ident: {}".format(eg.editgroup_id))
print("DONE")
def main():
api = authenticated_api(
API_ENDPOINT,
# token is an optional kwarg (can be empty string, None, etc)
token=os.environ.get("FATCAT_API_AUTH_TOKEN"))
path = sys.argv[1]
reader = csv.DictReader(open(path), delimiter='\t')
run(api, reader)
if __name__ == '__main__':
main()
|