gismap 0.1.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gismap/__init__.py +2 -0
- gismap/lab/__init__.py +2 -2
- gismap/lab/egomap.py +42 -0
- gismap/lab/expansion.py +240 -0
- gismap/lab/filters.py +18 -0
- gismap/lab/graph.py +11 -8
- gismap/lab/lab.py +86 -70
- gismap/lab/lab_author.py +84 -0
- gismap/lab/lip6.py +2 -1
- gismap/lab/toulouse.py +2 -1
- gismap/lab/vis.py +183 -25
- gismap/sources/dblp.py +26 -22
- gismap/sources/hal.py +47 -11
- gismap/sources/multi.py +68 -31
- gismap/utils/common.py +47 -2
- gismap/utils/requests.py +24 -11
- gismap/utils/text.py +66 -1
- {gismap-0.1.0.dist-info → gismap-0.2.1.dist-info}/METADATA +6 -4
- gismap-0.2.1.dist-info/RECORD +29 -0
- gismap-0.1.0.dist-info/RECORD +0 -25
- {gismap-0.1.0.dist-info → gismap-0.2.1.dist-info}/WHEEL +0 -0
- {gismap-0.1.0.dist-info → gismap-0.2.1.dist-info}/licenses/AUTHORS.md +0 -0
gismap/utils/common.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
HIDDEN_KEYS = {"sources", "aliases", "abstract"}
|
|
1
|
+
HIDDEN_KEYS = {"sources", "aliases", "abstract", "metadata"}
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
class LazyRepr:
|
|
@@ -10,7 +10,7 @@ class LazyRepr:
|
|
|
10
10
|
kws = [
|
|
11
11
|
f"{key}={value!r}"
|
|
12
12
|
for key, value in self.__dict__.items()
|
|
13
|
-
if value and key not in HIDDEN_KEYS
|
|
13
|
+
if value and key not in HIDDEN_KEYS and not key.startswith("_")
|
|
14
14
|
]
|
|
15
15
|
return f"{type(self).__name__}({', '.join(kws)})"
|
|
16
16
|
|
|
@@ -58,3 +58,48 @@ def get_classes(root, key="name"):
|
|
|
58
58
|
for c in root.__subclasses__():
|
|
59
59
|
result.update(get_classes(c))
|
|
60
60
|
return result
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def list_of_objects(clss, dico, default=None):
|
|
64
|
+
"""
|
|
65
|
+
Versatile way to enter a list of objects referenced by a dico.
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
clss: :class:`object`
|
|
70
|
+
Object or reference to an object or list of objects / references to objects.
|
|
71
|
+
dico: :class:`dict`
|
|
72
|
+
Dictionary of references to objects.
|
|
73
|
+
default: :class:`list`, optional
|
|
74
|
+
Default list to return if `clss` is None.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
:class:`list`
|
|
79
|
+
Proper list of objects.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
________
|
|
83
|
+
|
|
84
|
+
>>> from gismap.sources.models import DB
|
|
85
|
+
>>> subclasses = get_classes(DB, key='db_name')
|
|
86
|
+
>>> from gismap import HAL, DBLP
|
|
87
|
+
>>> list_of_objects([HAL, 'dblp'], subclasses)
|
|
88
|
+
[<class 'gismap.sources.hal.HAL'>, <class 'gismap.sources.dblp.DBLP'>]
|
|
89
|
+
>>> list_of_objects(None, subclasses, [DBLP])
|
|
90
|
+
[<class 'gismap.sources.dblp.DBLP'>]
|
|
91
|
+
>>> list_of_objects(DBLP, subclasses)
|
|
92
|
+
[<class 'gismap.sources.dblp.DBLP'>]
|
|
93
|
+
>>> list_of_objects('hal', subclasses)
|
|
94
|
+
[<class 'gismap.sources.hal.HAL'>]
|
|
95
|
+
"""
|
|
96
|
+
if default is None:
|
|
97
|
+
default = []
|
|
98
|
+
if clss is None:
|
|
99
|
+
return default
|
|
100
|
+
elif isinstance(clss, str):
|
|
101
|
+
return [dico[clss]]
|
|
102
|
+
elif isinstance(clss, list):
|
|
103
|
+
return [cls for lcls in clss for cls in list_of_objects(lcls, dico, default)]
|
|
104
|
+
else:
|
|
105
|
+
return [clss]
|
gismap/utils/requests.py
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
from time import sleep
|
|
2
2
|
import requests
|
|
3
|
+
from importlib.metadata import metadata
|
|
3
4
|
from gismap.utils.logger import logger
|
|
4
5
|
|
|
5
6
|
|
|
7
|
+
infos = metadata("gismap")
|
|
6
8
|
session = requests.Session()
|
|
9
|
+
session.headers.update(
|
|
10
|
+
{
|
|
11
|
+
"User-Agent": f"{infos['name']}/{infos['Version']} ({'; '.join(infos.get_all('Project-URL'))}; Contact, {infos['author-email']}"
|
|
12
|
+
}
|
|
13
|
+
)
|
|
7
14
|
|
|
8
15
|
|
|
9
|
-
def get(url, params=None):
|
|
16
|
+
def get(url, params=None, n_trials=10):
|
|
10
17
|
"""
|
|
11
18
|
Parameters
|
|
12
19
|
----------
|
|
@@ -20,14 +27,20 @@ def get(url, params=None):
|
|
|
20
27
|
:class:`str`
|
|
21
28
|
Result.
|
|
22
29
|
"""
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
for attempt in range(n_trials):
|
|
31
|
+
try:
|
|
32
|
+
r = session.get(url, params=params)
|
|
33
|
+
if r.status_code == 429:
|
|
34
|
+
try:
|
|
35
|
+
t = int(r.headers["Retry-After"])
|
|
36
|
+
except KeyError:
|
|
37
|
+
t = 60
|
|
38
|
+
logger.warning(f"Too many requests. Auto-retry in {t} seconds.")
|
|
39
|
+
sleep(t)
|
|
40
|
+
else:
|
|
41
|
+
return r.text
|
|
42
|
+
except requests.exceptions.ConnectionError:
|
|
43
|
+
t = 6
|
|
44
|
+
logger.warning(f"Connection error. Auto-retry in {t} seconds.")
|
|
31
45
|
sleep(t)
|
|
32
|
-
|
|
33
|
-
return r.text
|
|
46
|
+
raise requests.exceptions.ConnectionError(f"Unable to retrieve {url}")
|
gismap/utils/text.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from bof.fuzz import Process
|
|
2
|
+
import unicodedata
|
|
2
3
|
|
|
3
4
|
|
|
4
5
|
class Corrector:
|
|
@@ -90,4 +91,68 @@ def clean_aliases(name, alias_list):
|
|
|
90
91
|
:class:`list`
|
|
91
92
|
Aliases deduped, sorted, and with main name removed.
|
|
92
93
|
"""
|
|
93
|
-
return sorted(set(n for
|
|
94
|
+
return sorted(set(n for nn in alias_list for n in [nn, asciify(nn)] if n != name))
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def asciify(text):
|
|
98
|
+
"""
|
|
99
|
+
Parameters
|
|
100
|
+
----------
|
|
101
|
+
text::class:`str`
|
|
102
|
+
Some text (typically names) with annoying accents.
|
|
103
|
+
|
|
104
|
+
Returns
|
|
105
|
+
-------
|
|
106
|
+
:class:`str`
|
|
107
|
+
Same text simplified into ascii.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> asciify('Ana Bušić')
|
|
112
|
+
'Ana Busic'
|
|
113
|
+
>>> asciify("Thomas Deiß")
|
|
114
|
+
'Thomas Deiss'
|
|
115
|
+
"""
|
|
116
|
+
text = text.replace("ß", "ss")
|
|
117
|
+
decomposed = unicodedata.normalize("NFD", text)
|
|
118
|
+
no_accents = "".join(c for c in decomposed if unicodedata.category(c) != "Mn")
|
|
119
|
+
ascii_text = no_accents.encode("ascii", "ignore").decode()
|
|
120
|
+
return ascii_text
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def normalized_name(txt):
|
|
124
|
+
"""
|
|
125
|
+
Try to normalize names for facilitating comparisons. Name is lowered, split, asciified, sorted, and filtered.
|
|
126
|
+
|
|
127
|
+
Parameters
|
|
128
|
+
----------
|
|
129
|
+
txt: :class:`str`
|
|
130
|
+
|
|
131
|
+
Returns
|
|
132
|
+
-------
|
|
133
|
+
:class:`str`
|
|
134
|
+
|
|
135
|
+
Examples
|
|
136
|
+
--------
|
|
137
|
+
|
|
138
|
+
>>> normalized_name("Thomas Deiß")
|
|
139
|
+
'deiss thomas'
|
|
140
|
+
>>> normalized_name("Dario Rossi 001")
|
|
141
|
+
'dario rossi'
|
|
142
|
+
>>> normalized_name("James W. Roberts")
|
|
143
|
+
'james roberts'
|
|
144
|
+
"""
|
|
145
|
+
return " ".join(
|
|
146
|
+
sorted(
|
|
147
|
+
asciify(a)
|
|
148
|
+
for a in txt.lower().replace("-", " ").split()
|
|
149
|
+
if not (a.isdigit() or (len(a) < 3 and "." in a))
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def auto_int(txt):
|
|
155
|
+
try:
|
|
156
|
+
return int(txt)
|
|
157
|
+
except ValueError:
|
|
158
|
+
return txt
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gismap
|
|
3
|
-
Version: 0.1
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: GISMAP leverages DBLP and HAL databases to provide cartography tools for you and your lab.
|
|
5
5
|
Project-URL: Repository, https://github.com/balouf/gismap
|
|
6
6
|
Project-URL: Documentation, https://balouf.github.io/gismap
|
|
@@ -11,6 +11,8 @@ License-File: AUTHORS.md
|
|
|
11
11
|
Requires-Python: >=3.10
|
|
12
12
|
Requires-Dist: bof>=0.3.5
|
|
13
13
|
Requires-Dist: gismo>=0.5.2
|
|
14
|
+
Requires-Dist: ipykernel>=6.30.1
|
|
15
|
+
Requires-Dist: tqdm>=4.67.1
|
|
14
16
|
Description-Content-Type: text/markdown
|
|
15
17
|
|
|
16
18
|
# Generic Information Search: Mapping and Analysis of Publications
|
|
@@ -47,11 +49,11 @@ Use GISMAP to produce a collaboration graph (HTML):
|
|
|
47
49
|
|
|
48
50
|
```pycon
|
|
49
51
|
>>> from gismap.sources.hal import HAL
|
|
50
|
-
>>> from gismap.lab import ListLab
|
|
51
|
-
>>> lab = ListLab(["
|
|
52
|
+
>>> from gismap.lab import ListLab
|
|
53
|
+
>>> lab = ListLab(["Fabien Mathieu", "François Baccelli", "Ludovic Noirie", "Céline Comte", "Sébastien Tixeuil"], dbs="hal")
|
|
52
54
|
>>> lab.update_authors()
|
|
53
55
|
>>> lab.update_publis()
|
|
54
|
-
>>>
|
|
56
|
+
>>> lab.show_html()
|
|
55
57
|
```
|
|
56
58
|
|
|
57
59
|
## Credits
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
gismap/__init__.py,sha256=wZhnsqnlouh2Ugsb4L36K9QG8IEGrvI7s9biEv6LjRw,735
|
|
2
|
+
gismap/author.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
gismap/gismap.py,sha256=h0hwdogXGFqerm-5ZPeT-irPn91pCcQRjiHThXsRzEk,19
|
|
4
|
+
gismap/gismo.py,sha256=kBzvlo-fqcvEgwQt-c_hHkfI1oTjBbKKb54vM8il_nI,6295
|
|
5
|
+
gismap/search.py,sha256=nsUoDsFGeEtvCZ0dB7ooRPC_6qsazkiWx_oM7dHdNV4,4932
|
|
6
|
+
gismap/lab/__init__.py,sha256=WeJkoNZmFnLoEgK_nwXqZrA4nQtpeTLPf6PPMFIGb4k,415
|
|
7
|
+
gismap/lab/egomap.py,sha256=L5OKeZR7RCfX3EPm859-jZ1jnqlC3kpa0jybofhLPPc,1328
|
|
8
|
+
gismap/lab/expansion.py,sha256=fYcUvkGi3W1GTx2gnFT1z3cI-jlZFFAicDM99wi2wzE,6186
|
|
9
|
+
gismap/lab/filters.py,sha256=LL3jeCqLBpLeaz1lz5IvduV4G1xBPaty9SHiBxoYgak,486
|
|
10
|
+
gismap/lab/graph.py,sha256=8fzxohyUWqayLKaOC7CpBaKDN63eZK6oYp7nrfDDosw,6680
|
|
11
|
+
gismap/lab/lab.py,sha256=Uc9Qg7Okf3L5K8gHTlnOv7lPbeA9OBfivCmZwRPwzp8,5331
|
|
12
|
+
gismap/lab/lab_author.py,sha256=jQhq1spZP5P-Bpzr5E_OP73gWy3SG6UjiVCGotjm57s,2439
|
|
13
|
+
gismap/lab/lip6.py,sha256=LLLjV8zNqwdkvtuV4nfmScCDlaeeGw79I0KQuOQ1_Yo,1443
|
|
14
|
+
gismap/lab/toulouse.py,sha256=Ex3lBPdYhAzAnPQw9Driho7joJNTHLpE_nNMooQH_nc,1495
|
|
15
|
+
gismap/lab/vis.py,sha256=YwMkoSa3-IsoNooQgZbluvIrQsYRbti1dlVRewypBNY,8734
|
|
16
|
+
gismap/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
gismap/sources/dblp.py,sha256=_AgPgDbHYYaeJVam43eExv1VsglvAV46eP77RL7o9Fo,5278
|
|
18
|
+
gismap/sources/hal.py,sha256=3VjiUH5amNfJYV5uAtX-JcGWMNKUkmjfXU0Osca9CC8,10021
|
|
19
|
+
gismap/sources/models.py,sha256=yJPBXcJO6MgOrSXgpGPepHDDtniJP1OsK8OSz__VzYc,543
|
|
20
|
+
gismap/sources/multi.py,sha256=HQMQ4kcDwg0rZ42av98DZ17o83dpR2fD4KtP1yFX14c,4352
|
|
21
|
+
gismap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
22
|
+
gismap/utils/common.py,sha256=nx1f60yNwFpl1oz08h-R5o0xK9CbJv9tmYLDk61dwYA,2898
|
|
23
|
+
gismap/utils/logger.py,sha256=1YALIaNYKTqeIyyCnYxzvZTK7x4FTSfYYl5CP9IMw8E,86
|
|
24
|
+
gismap/utils/requests.py,sha256=DA-ifVMdcOtipDSqYdVRQi-7CGR5WCTYiGyZ7Xu78q0,1291
|
|
25
|
+
gismap/utils/text.py,sha256=1_9DlduAYh7Nz-yAg-MaCTmdKbPPmuIY20bb87t7JAQ,3810
|
|
26
|
+
gismap-0.2.1.dist-info/METADATA,sha256=ZKER11xqoYCNSMmLpe-E7BdBbiLRMrAQuFEqct3ofuk,2542
|
|
27
|
+
gismap-0.2.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
28
|
+
gismap-0.2.1.dist-info/licenses/AUTHORS.md,sha256=oDR4mptVUBMq0WKIpt19Km1Bdfz3cO2NAOVgwVfTO8g,131
|
|
29
|
+
gismap-0.2.1.dist-info/RECORD,,
|
gismap-0.1.0.dist-info/RECORD
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
gismap/__init__.py,sha256=TFBKB5AwAxzmcpIB48EpT4Ud9S417i5Obh85w2t1-Zc,598
|
|
2
|
-
gismap/author.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
gismap/gismap.py,sha256=h0hwdogXGFqerm-5ZPeT-irPn91pCcQRjiHThXsRzEk,19
|
|
4
|
-
gismap/gismo.py,sha256=kBzvlo-fqcvEgwQt-c_hHkfI1oTjBbKKb54vM8il_nI,6295
|
|
5
|
-
gismap/search.py,sha256=nsUoDsFGeEtvCZ0dB7ooRPC_6qsazkiWx_oM7dHdNV4,4932
|
|
6
|
-
gismap/lab/__init__.py,sha256=UQVY6Sk7o9O0YREArXA8_8ZfrDO0JYLy8tikSHBEbzo,377
|
|
7
|
-
gismap/lab/graph.py,sha256=LOHNnmFqgsZc7YGUcFQ1GKl0DFiStFfoYqx-2IrjFAk,6525
|
|
8
|
-
gismap/lab/lab.py,sha256=-mBcHcP9JaBAiiZlWRygac5MQdO0b6AriHWiLgTveWc,4224
|
|
9
|
-
gismap/lab/lip6.py,sha256=yRx-RWgcGhGWUk_oyfgC9QYJSVnATnp6YlNvaOlr8Gw,1410
|
|
10
|
-
gismap/lab/toulouse.py,sha256=KkzNOCFt3OU6pDJmDmli6wRNuMwH8CPXHj_S6aOcYeg,1462
|
|
11
|
-
gismap/lab/vis.py,sha256=1QgLgLQjcB7rGiZ946lhLU1kR38oXp_Y8l8U-Ukn65k,5497
|
|
12
|
-
gismap/sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
gismap/sources/dblp.py,sha256=5ZKngU66xgXffmiGHsbXGXJfU_NIybnuzXXZPcWIZoE,5381
|
|
14
|
-
gismap/sources/hal.py,sha256=mWyiG12wXE9A8w81YGFicx8Yy9mX-anvIEoBueU2U6Q,9136
|
|
15
|
-
gismap/sources/models.py,sha256=yJPBXcJO6MgOrSXgpGPepHDDtniJP1OsK8OSz__VzYc,543
|
|
16
|
-
gismap/sources/multi.py,sha256=jfvBVgmnLT85RaEWcMNCZ8YtmSRuQuq8CkCHWY8u-hc,3515
|
|
17
|
-
gismap/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
-
gismap/utils/common.py,sha256=BV5mma4aikHyPIhH4theLkiNHaiqLv5_EfxhT0yajZo,1509
|
|
19
|
-
gismap/utils/logger.py,sha256=1YALIaNYKTqeIyyCnYxzvZTK7x4FTSfYYl5CP9IMw8E,86
|
|
20
|
-
gismap/utils/requests.py,sha256=DV5rmyuy7jpMp63kzGXe848pmwMb5397wGHgF0o_0BM,721
|
|
21
|
-
gismap/utils/text.py,sha256=R7tKWevfF4g-LsohF6FeiRdCuNYz4jQ1VcQJIyhwei0,2393
|
|
22
|
-
gismap-0.1.0.dist-info/METADATA,sha256=bTM9vZl81oJ5dUYakrCEL1uAbTZzEgC1AGSePg1TBU8,2499
|
|
23
|
-
gismap-0.1.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
24
|
-
gismap-0.1.0.dist-info/licenses/AUTHORS.md,sha256=oDR4mptVUBMq0WKIpt19Km1Bdfz3cO2NAOVgwVfTO8g,131
|
|
25
|
-
gismap-0.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|