sci-report-analyzer 1.0.0__tar.gz
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.
- sci_report_analyzer-1.0.0/LICENSE +48 -0
- sci_report_analyzer-1.0.0/PKG-INFO +126 -0
- sci_report_analyzer-1.0.0/README.md +106 -0
- sci_report_analyzer-1.0.0/pyproject.toml +70 -0
- sci_report_analyzer-1.0.0/pyproject.toml.orig +56 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/__init__.py +6 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/annotations.py +415 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/authors.py +81 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/categories.py +649 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/config.py +59 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/contribution.py +291 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/README.md +24 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/conferences.json +989 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/conferences.past.json +1274 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/datadir.py +49 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/__init__.py +0 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/backup.py +120 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/env.py +26 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/script.py.mako +25 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/3b7c2d9e4a61_period_documents.py +49 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/5d2a9c4e1f73_edited_volume_venues.py +31 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/8e1f5a2c7b90_categories_excerpts.py +60 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/9c4e7b2a5d18_report_cite_form.py +21 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/a7e3c1f9b250_drop_report_cite_form.py +27 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/b8e4c6f2d071_excerpt_groups.py +34 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/c2d8f4a61e37_excerpt_years_rayonnement.py +32 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/c2d9a7e4b153_excerpt_group_text.py +28 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/d4e8b1c6f720_excerpt_original.py +27 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/e5b1a9d73c42_excerpt_influence.py +25 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/f14fa8f18280_initial_schema.py +382 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/f3c7d2e8a915_excerpt_colour.py +26 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/models.py +672 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/session.py +104 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/documents.py +652 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/folders.py +214 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/i18n.py +33 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/keys.py +40 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/livereload.py +88 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/main.py +93 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/manual.py +151 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/merge.py +307 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/pdfs.py +343 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/pubview.py +1132 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/__init__.py +0 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/badge.py +427 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/datasets.py +412 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/kinds.py +300 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/matcher.py +198 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/normalize.py +276 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/service.py +528 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/reflist.py +201 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/reports.py +518 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/settings_io.py +466 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/source_settings.py +46 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/__init__.py +33 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/base.py +216 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/dblp.py +241 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/doi.py +480 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/hal.py +296 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/openalex.py +129 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/orcid.py +105 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/scholar.py +171 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/semanticscholar.py +123 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/thesesfr.py +95 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/stop.py +57 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/sync.py +567 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/theses.py +79 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/__init__.py +0 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/categories_editor.py +235 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/documents_page.py +482 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/help_page.py +333 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/mdedit.py +173 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/panel.py +1262 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/pdf_viewer.py +933 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/person.py +964 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/persons.py +543 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/pub_details.py +1813 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/reflist.py +224 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/report.py +475 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/scimago_years.py +82 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/settings.py +1197 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/tags.py +271 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/theme.py +297 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/venues_page.py +1503 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/viewer_side.py +1040 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/venue_match.py +372 -0
- sci_report_analyzer-1.0.0/src/sci_report_analyzer/venues.py +1121 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Benjamin Piwowarski
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
---------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
THIRD-PARTY DATA
|
|
26
|
+
|
|
27
|
+
The MIT license above covers VenueRank's *source code* only. The ranking
|
|
28
|
+
datasets bundled under `source/data/` and fetched at runtime are the work of
|
|
29
|
+
third parties and remain under their own terms:
|
|
30
|
+
|
|
31
|
+
- Scimago Journal Rank (SJR) — © SCImago, derived from Scopus data, released
|
|
32
|
+
under Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0).
|
|
33
|
+
Attribution required; commercial use is not permitted.
|
|
34
|
+
https://www.scimagojr.com/
|
|
35
|
+
|
|
36
|
+
- CORE conference rankings — © Computing Research and Education Association of
|
|
37
|
+
Australasia (CORE). Publicly available for academic use; attribute CORE and
|
|
38
|
+
link back to the portal. https://portal.core.edu.au/conf-ranks/
|
|
39
|
+
|
|
40
|
+
- Predatory-venue list — from the community-maintained
|
|
41
|
+
stop-predatory-journals project, distributed under the MIT License.
|
|
42
|
+
https://github.com/stop-predatory-journals/stop-predatory-journals.github.io
|
|
43
|
+
|
|
44
|
+
JCR Impact Factors (Clarivate) are proprietary and are NEVER bundled or
|
|
45
|
+
fetched; they are imported by the user at runtime and stay on the device.
|
|
46
|
+
|
|
47
|
+
Because the bundled Scimago data is CC BY-NC, redistribution of VenueRank as a
|
|
48
|
+
whole (code + bundled data) is limited to non-commercial use with attribution.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: sci-report-analyzer
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Track researchers' publications across sources and rank their venues, with per-person folders, notes and reports
|
|
5
|
+
Author: Benjamin Piwowarski
|
|
6
|
+
Author-email: Benjamin Piwowarski <benjamin@piwowarski.fr>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
License-File: LICENSE
|
|
9
|
+
Requires-Dist: alembic>=1.20.0
|
|
10
|
+
Requires-Dist: beautifulsoup4>=4.15.0
|
|
11
|
+
Requires-Dist: httpx>=0.28.1
|
|
12
|
+
Requires-Dist: lark>=1.3.1
|
|
13
|
+
Requires-Dist: latex2mathml>=3.81.1
|
|
14
|
+
Requires-Dist: lxml>=6.1.3
|
|
15
|
+
Requires-Dist: nicegui>=3.17.1
|
|
16
|
+
Requires-Dist: pydantic>=2.13.5
|
|
17
|
+
Requires-Dist: sqlalchemy>=2.1.1
|
|
18
|
+
Requires-Python: >=3.13
|
|
19
|
+
Description-Content-Type: text/markdown
|
|
20
|
+
|
|
21
|
+
# SciReport Analyzer
|
|
22
|
+
|
|
23
|
+
A local web app (NiceGUI + SQLite) to follow and evaluate researchers: it tracks their
|
|
24
|
+
publications across sources, ranks their venues, and keeps per-person folders with tags,
|
|
25
|
+
notes, stored PDFs and reports. Venues are ranked with Scimago, CORE (every edition since
|
|
26
|
+
2008) and a predatory list.
|
|
27
|
+
|
|
28
|
+
## Features
|
|
29
|
+
|
|
30
|
+
- **People** with profiles on DBLP (SPARQL endpoint), HAL, ORCID, Semantic Scholar, Google
|
|
31
|
+
Scholar, theses.fr and OpenAlex (needs a free API key). Profiles are found automatically
|
|
32
|
+
and must be **validated** by hand; each source shows its update status (never synced,
|
|
33
|
+
updating, up to date, out of date, error). Syncing is on demand only.
|
|
34
|
+
- **Merging** across sources (DOI, titles, years), preprints folded into the published
|
|
35
|
+
version, PDF links, manual split / merge / hide.
|
|
36
|
+
- **Publications panel**: distribution, publications by year,
|
|
37
|
+
co-authors, author position, "with PhD student", cross-filtering, named **periods** with
|
|
38
|
+
**stars**, **flags** (short, demo…) that stick to papers, **tags** (global or within a
|
|
39
|
+
period) and Markdown **notes**, with a Markdown listing of the noted / tagged papers;
|
|
40
|
+
**tag from a pasted list** (e.g. a report's numbered list: matched by HAL id / DOI / title,
|
|
41
|
+
missing papers searched on HAL and added, the list's numbers kept for reporting).
|
|
42
|
+
Notes accept LaTeX (`$…$`, `$$…$$`), edited with a Markdown editor (toolbar, preview).
|
|
43
|
+
- **Reports** within a period / folder: Markdown citing the papers (Pandoc's `[@key]`,
|
|
44
|
+
`@key`, `[@key]{.notes}`, `[@key]{.tags}`), checking each paper to discuss (by tags) is
|
|
45
|
+
cited, substituted (numbers like **#6**, titles, notes, tags) when copied.
|
|
46
|
+
- **PDFs**: downloaded from the papers' open-access links (sources, else Unpaywall), one by
|
|
47
|
+
one or for all the papers shown, or uploaded; stored in the data directory and read in
|
|
48
|
+
the browser with PDF.js (highlight, text, drawing, images), the annotations saved back,
|
|
49
|
+
the paper's tags and notes alongside, bookmarks, the paper of a selected reference found
|
|
50
|
+
(or added from HAL); clean-up of the files of deleted papers.
|
|
51
|
+
- **Documents** of a person within a folder / period (an application, a CV…): PDFs read and
|
|
52
|
+
annotated the same way, with bookmarks and a note; the person's papers they mention are
|
|
53
|
+
found (titles, DOIs / HAL ids, and the citations of numbered references like `[11]`),
|
|
54
|
+
marked, and show the paper's details next to the document; references can be linked by
|
|
55
|
+
hand from a selection; author-year citations (“(Lyu et al., 2023b)”) are linked too.
|
|
56
|
+
- **Categories** per folder (an ordered tree, drag and drop, optional years): passages
|
|
57
|
+
selected in the PDFs are filed in them, listed per person, and inserted in reports as
|
|
58
|
+
Markdown.
|
|
59
|
+
- **Venues** (Conferences / Journals pages): variants after cleaning, two-level
|
|
60
|
+
classification (kind → rank), default levels per kind, manual decisions per paper or per
|
|
61
|
+
venue that are never overridden.
|
|
62
|
+
- Author highlighting: the person (with aliases) and their PhD students (from theses.fr),
|
|
63
|
+
with potential matches to confirm.
|
|
64
|
+
- **Settings**: ranking sources, confidence threshold, rewrite and cleaning rules, venue
|
|
65
|
+
kinds, flags, datasets, JCR import, API keys, and **import / export** (replace, or merge
|
|
66
|
+
with per-conflict choices) to share them.
|
|
67
|
+
|
|
68
|
+
## Usage
|
|
69
|
+
|
|
70
|
+
```sh
|
|
71
|
+
uv tool run sci-report-analyzer # http://127.0.0.1:8081
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
or install it with `uv tool install sci-report-analyzer` and run `sci-report-analyzer`. Options:
|
|
75
|
+
`--port`, `--host`, `--data-dir`, `--no-browser`. Press Ctrl-C, or the power button in the
|
|
76
|
+
header, to quit.
|
|
77
|
+
|
|
78
|
+
Data lives in `~/.local/share/sci-report-analyzer` (override with `SCI_REPORT_ANALYZER_DATA`). Your email is
|
|
79
|
+
required before anything is fetched (it identifies you to the sources); it and the API keys can
|
|
80
|
+
be given with `SCI_REPORT_ANALYZER_EMAIL`, `OPENALEX_API_KEY` / `S2_API_KEY` or in Settings → API keys.
|
|
81
|
+
|
|
82
|
+
The database (not the PDFs) is backed up in `backups/` next to it: daily at startup (the last 7
|
|
83
|
+
kept) and before each schema migration (`pre-migration-…`; a `.pending` marker next to one means
|
|
84
|
+
that migration failed, and it is never removed). To restore a backup, stop the app and copy it
|
|
85
|
+
over `sci-report-analyzer.sqlite` (removing the `-wal` / `-shm` files, if any).
|
|
86
|
+
|
|
87
|
+
## Data sources
|
|
88
|
+
|
|
89
|
+
Venue ranks come from third-party data, credited here and in the app (Settings → Data):
|
|
90
|
+
|
|
91
|
+
- **[SCImago Journal & Country Rank](https://www.scimagojr.com)** (journals), downloaded
|
|
92
|
+
by the app from this repository (`datasets/journals.json`, checked every week). *SCImago, (n.d.). SJR — SCImago Journal & Country Rank [Portal].* SCImago allows
|
|
93
|
+
the use of its data as long as the source is cited; the journal metadata comes from
|
|
94
|
+
Scopus (Elsevier).
|
|
95
|
+
- **[ICORE conference rankings](https://portal.core.edu.au/conf-ranks/)** (conferences,
|
|
96
|
+
every CORE edition since 2008), shipped with the app.
|
|
97
|
+
- **Predatory list**: Beall's list as maintained by
|
|
98
|
+
[stop-predatory-journals](https://github.com/stop-predatory-journals/stop-predatory-journals.github.io)
|
|
99
|
+
(MIT licence), downloaded by the app and refreshed weekly. Being listed is an indication,
|
|
100
|
+
not a verdict.
|
|
101
|
+
- **JCR** impact factors are Clarivate's and are not distributed: import your own export.
|
|
102
|
+
|
|
103
|
+
See [`src/sci_report_analyzer/data/README.md`](src/sci_report_analyzer/data/README.md) for the
|
|
104
|
+
files and their terms.
|
|
105
|
+
|
|
106
|
+
## Licence
|
|
107
|
+
|
|
108
|
+
The code is released under the [MIT licence](LICENSE). The ranking datasets keep their
|
|
109
|
+
sources' terms (see above).
|
|
110
|
+
|
|
111
|
+
## Development
|
|
112
|
+
|
|
113
|
+
```sh
|
|
114
|
+
uv sync
|
|
115
|
+
uv run pre-commit install
|
|
116
|
+
uv run pytest # unit + simulated-UI tests
|
|
117
|
+
uv run pytest -m live -o addopts="" # smoke tests against the real APIs
|
|
118
|
+
uv run sci-report-analyzer --live-reload # offers a restart when the code changes
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
- `src/sci_report_analyzer/ranking/` — venue normalization, fuzzy matching and resolution
|
|
122
|
+
(checked against reference fixtures by `tests/test_matcher_parity.py`).
|
|
123
|
+
- `sources/` — one adapter per source; `merge.py` — clustering; `sync.py` — syncing and
|
|
124
|
+
auto-matching; `venues.py` — venues; `pubview.py` — panel view model; `ui/` — pages.
|
|
125
|
+
- Schema changes go through Alembic migrations (`db/migrations/versions`), applied at
|
|
126
|
+
startup; never edit a released migration.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# SciReport Analyzer
|
|
2
|
+
|
|
3
|
+
A local web app (NiceGUI + SQLite) to follow and evaluate researchers: it tracks their
|
|
4
|
+
publications across sources, ranks their venues, and keeps per-person folders with tags,
|
|
5
|
+
notes, stored PDFs and reports. Venues are ranked with Scimago, CORE (every edition since
|
|
6
|
+
2008) and a predatory list.
|
|
7
|
+
|
|
8
|
+
## Features
|
|
9
|
+
|
|
10
|
+
- **People** with profiles on DBLP (SPARQL endpoint), HAL, ORCID, Semantic Scholar, Google
|
|
11
|
+
Scholar, theses.fr and OpenAlex (needs a free API key). Profiles are found automatically
|
|
12
|
+
and must be **validated** by hand; each source shows its update status (never synced,
|
|
13
|
+
updating, up to date, out of date, error). Syncing is on demand only.
|
|
14
|
+
- **Merging** across sources (DOI, titles, years), preprints folded into the published
|
|
15
|
+
version, PDF links, manual split / merge / hide.
|
|
16
|
+
- **Publications panel**: distribution, publications by year,
|
|
17
|
+
co-authors, author position, "with PhD student", cross-filtering, named **periods** with
|
|
18
|
+
**stars**, **flags** (short, demo…) that stick to papers, **tags** (global or within a
|
|
19
|
+
period) and Markdown **notes**, with a Markdown listing of the noted / tagged papers;
|
|
20
|
+
**tag from a pasted list** (e.g. a report's numbered list: matched by HAL id / DOI / title,
|
|
21
|
+
missing papers searched on HAL and added, the list's numbers kept for reporting).
|
|
22
|
+
Notes accept LaTeX (`$…$`, `$$…$$`), edited with a Markdown editor (toolbar, preview).
|
|
23
|
+
- **Reports** within a period / folder: Markdown citing the papers (Pandoc's `[@key]`,
|
|
24
|
+
`@key`, `[@key]{.notes}`, `[@key]{.tags}`), checking each paper to discuss (by tags) is
|
|
25
|
+
cited, substituted (numbers like **#6**, titles, notes, tags) when copied.
|
|
26
|
+
- **PDFs**: downloaded from the papers' open-access links (sources, else Unpaywall), one by
|
|
27
|
+
one or for all the papers shown, or uploaded; stored in the data directory and read in
|
|
28
|
+
the browser with PDF.js (highlight, text, drawing, images), the annotations saved back,
|
|
29
|
+
the paper's tags and notes alongside, bookmarks, the paper of a selected reference found
|
|
30
|
+
(or added from HAL); clean-up of the files of deleted papers.
|
|
31
|
+
- **Documents** of a person within a folder / period (an application, a CV…): PDFs read and
|
|
32
|
+
annotated the same way, with bookmarks and a note; the person's papers they mention are
|
|
33
|
+
found (titles, DOIs / HAL ids, and the citations of numbered references like `[11]`),
|
|
34
|
+
marked, and show the paper's details next to the document; references can be linked by
|
|
35
|
+
hand from a selection; author-year citations (“(Lyu et al., 2023b)”) are linked too.
|
|
36
|
+
- **Categories** per folder (an ordered tree, drag and drop, optional years): passages
|
|
37
|
+
selected in the PDFs are filed in them, listed per person, and inserted in reports as
|
|
38
|
+
Markdown.
|
|
39
|
+
- **Venues** (Conferences / Journals pages): variants after cleaning, two-level
|
|
40
|
+
classification (kind → rank), default levels per kind, manual decisions per paper or per
|
|
41
|
+
venue that are never overridden.
|
|
42
|
+
- Author highlighting: the person (with aliases) and their PhD students (from theses.fr),
|
|
43
|
+
with potential matches to confirm.
|
|
44
|
+
- **Settings**: ranking sources, confidence threshold, rewrite and cleaning rules, venue
|
|
45
|
+
kinds, flags, datasets, JCR import, API keys, and **import / export** (replace, or merge
|
|
46
|
+
with per-conflict choices) to share them.
|
|
47
|
+
|
|
48
|
+
## Usage
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
uv tool run sci-report-analyzer # http://127.0.0.1:8081
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
or install it with `uv tool install sci-report-analyzer` and run `sci-report-analyzer`. Options:
|
|
55
|
+
`--port`, `--host`, `--data-dir`, `--no-browser`. Press Ctrl-C, or the power button in the
|
|
56
|
+
header, to quit.
|
|
57
|
+
|
|
58
|
+
Data lives in `~/.local/share/sci-report-analyzer` (override with `SCI_REPORT_ANALYZER_DATA`). Your email is
|
|
59
|
+
required before anything is fetched (it identifies you to the sources); it and the API keys can
|
|
60
|
+
be given with `SCI_REPORT_ANALYZER_EMAIL`, `OPENALEX_API_KEY` / `S2_API_KEY` or in Settings → API keys.
|
|
61
|
+
|
|
62
|
+
The database (not the PDFs) is backed up in `backups/` next to it: daily at startup (the last 7
|
|
63
|
+
kept) and before each schema migration (`pre-migration-…`; a `.pending` marker next to one means
|
|
64
|
+
that migration failed, and it is never removed). To restore a backup, stop the app and copy it
|
|
65
|
+
over `sci-report-analyzer.sqlite` (removing the `-wal` / `-shm` files, if any).
|
|
66
|
+
|
|
67
|
+
## Data sources
|
|
68
|
+
|
|
69
|
+
Venue ranks come from third-party data, credited here and in the app (Settings → Data):
|
|
70
|
+
|
|
71
|
+
- **[SCImago Journal & Country Rank](https://www.scimagojr.com)** (journals), downloaded
|
|
72
|
+
by the app from this repository (`datasets/journals.json`, checked every week). *SCImago, (n.d.). SJR — SCImago Journal & Country Rank [Portal].* SCImago allows
|
|
73
|
+
the use of its data as long as the source is cited; the journal metadata comes from
|
|
74
|
+
Scopus (Elsevier).
|
|
75
|
+
- **[ICORE conference rankings](https://portal.core.edu.au/conf-ranks/)** (conferences,
|
|
76
|
+
every CORE edition since 2008), shipped with the app.
|
|
77
|
+
- **Predatory list**: Beall's list as maintained by
|
|
78
|
+
[stop-predatory-journals](https://github.com/stop-predatory-journals/stop-predatory-journals.github.io)
|
|
79
|
+
(MIT licence), downloaded by the app and refreshed weekly. Being listed is an indication,
|
|
80
|
+
not a verdict.
|
|
81
|
+
- **JCR** impact factors are Clarivate's and are not distributed: import your own export.
|
|
82
|
+
|
|
83
|
+
See [`src/sci_report_analyzer/data/README.md`](src/sci_report_analyzer/data/README.md) for the
|
|
84
|
+
files and their terms.
|
|
85
|
+
|
|
86
|
+
## Licence
|
|
87
|
+
|
|
88
|
+
The code is released under the [MIT licence](LICENSE). The ranking datasets keep their
|
|
89
|
+
sources' terms (see above).
|
|
90
|
+
|
|
91
|
+
## Development
|
|
92
|
+
|
|
93
|
+
```sh
|
|
94
|
+
uv sync
|
|
95
|
+
uv run pre-commit install
|
|
96
|
+
uv run pytest # unit + simulated-UI tests
|
|
97
|
+
uv run pytest -m live -o addopts="" # smoke tests against the real APIs
|
|
98
|
+
uv run sci-report-analyzer --live-reload # offers a restart when the code changes
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
- `src/sci_report_analyzer/ranking/` — venue normalization, fuzzy matching and resolution
|
|
102
|
+
(checked against reference fixtures by `tests/test_matcher_parity.py`).
|
|
103
|
+
- `sources/` — one adapter per source; `merge.py` — clustering; `sync.py` — syncing and
|
|
104
|
+
auto-matching; `venues.py` — venues; `pubview.py` — panel view model; `ui/` — pages.
|
|
105
|
+
- Schema changes go through Alembic migrations (`db/migrations/versions`), applied at
|
|
106
|
+
startup; never edit a released migration.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "sci-report-analyzer"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "Track researchers' publications across sources and rank their venues, with per-person folders, notes and reports"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
requires-python = ">=3.13"
|
|
9
|
+
dependencies = [
|
|
10
|
+
"alembic>=1.20.0",
|
|
11
|
+
"beautifulsoup4>=4.15.0",
|
|
12
|
+
"httpx>=0.28.1",
|
|
13
|
+
"lark>=1.3.1",
|
|
14
|
+
"latex2mathml>=3.81.1",
|
|
15
|
+
"lxml>=6.1.3",
|
|
16
|
+
"nicegui>=3.17.1",
|
|
17
|
+
"pydantic>=2.13.5",
|
|
18
|
+
"sqlalchemy>=2.1.1",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
[[project.authors]]
|
|
22
|
+
name = "Benjamin Piwowarski"
|
|
23
|
+
email = "benjamin@piwowarski.fr"
|
|
24
|
+
|
|
25
|
+
[project.scripts]
|
|
26
|
+
sci-report-analyzer = "sci_report_analyzer.main:main"
|
|
27
|
+
|
|
28
|
+
[build-system]
|
|
29
|
+
requires = ["uv_build>=0.12.17,<0.13.0"]
|
|
30
|
+
build-backend = "uv_build"
|
|
31
|
+
|
|
32
|
+
[dependency-groups]
|
|
33
|
+
dev = [
|
|
34
|
+
"pre-commit>=4.6.2",
|
|
35
|
+
"pytest>=9.1.1",
|
|
36
|
+
"pytest-asyncio>=1.4.0",
|
|
37
|
+
"respx>=0.23.1",
|
|
38
|
+
"ruff>=0.16.9",
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
[tool.ruff]
|
|
42
|
+
line-length = 100
|
|
43
|
+
target-version = "py313"
|
|
44
|
+
|
|
45
|
+
[tool.ruff.lint]
|
|
46
|
+
select = [
|
|
47
|
+
"E",
|
|
48
|
+
"F",
|
|
49
|
+
"W",
|
|
50
|
+
"I",
|
|
51
|
+
"UP",
|
|
52
|
+
"B",
|
|
53
|
+
"SIM",
|
|
54
|
+
"RUF",
|
|
55
|
+
]
|
|
56
|
+
ignore = [
|
|
57
|
+
"RUF001",
|
|
58
|
+
"RUF002",
|
|
59
|
+
"RUF003",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
[tool.ruff.lint.per-file-ignores]
|
|
63
|
+
"tests/*" = ["E501"]
|
|
64
|
+
"src/sci_report_analyzer/db/migrations/versions/*" = ["E501"]
|
|
65
|
+
|
|
66
|
+
[tool.pytest.ini_options]
|
|
67
|
+
testpaths = ["tests"]
|
|
68
|
+
asyncio_mode = "auto"
|
|
69
|
+
markers = ["live: hits real remote APIs (run with -m live)"]
|
|
70
|
+
addopts = "-m 'not live'"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "sci-report-analyzer"
|
|
3
|
+
version = "1.0.0"
|
|
4
|
+
description = "Track researchers' publications across sources and rank their venues, with per-person folders, notes and reports"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Benjamin Piwowarski", email = "benjamin@piwowarski.fr" }
|
|
10
|
+
]
|
|
11
|
+
requires-python = ">=3.13"
|
|
12
|
+
dependencies = [
|
|
13
|
+
"alembic>=1.20.0",
|
|
14
|
+
"beautifulsoup4>=4.15.0",
|
|
15
|
+
"httpx>=0.28.1",
|
|
16
|
+
"lark>=1.3.1",
|
|
17
|
+
"latex2mathml>=3.81.1",
|
|
18
|
+
"lxml>=6.1.3",
|
|
19
|
+
"nicegui>=3.17.1",
|
|
20
|
+
"pydantic>=2.13.5",
|
|
21
|
+
"sqlalchemy>=2.1.1",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
[project.scripts]
|
|
25
|
+
sci-report-analyzer = "sci_report_analyzer.main:main"
|
|
26
|
+
|
|
27
|
+
[build-system]
|
|
28
|
+
requires = ["uv_build>=0.12.17,<0.13.0"]
|
|
29
|
+
build-backend = "uv_build"
|
|
30
|
+
|
|
31
|
+
[dependency-groups]
|
|
32
|
+
dev = [
|
|
33
|
+
"pre-commit>=4.6.2",
|
|
34
|
+
"pytest>=9.1.1",
|
|
35
|
+
"pytest-asyncio>=1.4.0",
|
|
36
|
+
"respx>=0.23.1",
|
|
37
|
+
"ruff>=0.16.9",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[tool.ruff]
|
|
41
|
+
line-length = 100
|
|
42
|
+
target-version = "py313"
|
|
43
|
+
|
|
44
|
+
[tool.ruff.lint]
|
|
45
|
+
select = ["E", "F", "W", "I", "UP", "B", "SIM", "RUF"]
|
|
46
|
+
ignore = ["RUF001", "RUF002", "RUF003"]
|
|
47
|
+
|
|
48
|
+
[tool.ruff.lint.per-file-ignores]
|
|
49
|
+
"tests/*" = ["E501"]
|
|
50
|
+
"src/sci_report_analyzer/db/migrations/versions/*" = ["E501"]
|
|
51
|
+
|
|
52
|
+
[tool.pytest.ini_options]
|
|
53
|
+
testpaths = ["tests"]
|
|
54
|
+
asyncio_mode = "auto"
|
|
55
|
+
markers = ["live: hits real remote APIs (run with -m live)"]
|
|
56
|
+
addopts = "-m 'not live'"
|