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.
Files changed (87) hide show
  1. sci_report_analyzer-1.0.0/LICENSE +48 -0
  2. sci_report_analyzer-1.0.0/PKG-INFO +126 -0
  3. sci_report_analyzer-1.0.0/README.md +106 -0
  4. sci_report_analyzer-1.0.0/pyproject.toml +70 -0
  5. sci_report_analyzer-1.0.0/pyproject.toml.orig +56 -0
  6. sci_report_analyzer-1.0.0/src/sci_report_analyzer/__init__.py +6 -0
  7. sci_report_analyzer-1.0.0/src/sci_report_analyzer/annotations.py +415 -0
  8. sci_report_analyzer-1.0.0/src/sci_report_analyzer/authors.py +81 -0
  9. sci_report_analyzer-1.0.0/src/sci_report_analyzer/categories.py +649 -0
  10. sci_report_analyzer-1.0.0/src/sci_report_analyzer/config.py +59 -0
  11. sci_report_analyzer-1.0.0/src/sci_report_analyzer/contribution.py +291 -0
  12. sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/README.md +24 -0
  13. sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/conferences.json +989 -0
  14. sci_report_analyzer-1.0.0/src/sci_report_analyzer/data/conferences.past.json +1274 -0
  15. sci_report_analyzer-1.0.0/src/sci_report_analyzer/datadir.py +49 -0
  16. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/__init__.py +0 -0
  17. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/backup.py +120 -0
  18. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/env.py +26 -0
  19. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/script.py.mako +25 -0
  20. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/3b7c2d9e4a61_period_documents.py +49 -0
  21. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/5d2a9c4e1f73_edited_volume_venues.py +31 -0
  22. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/8e1f5a2c7b90_categories_excerpts.py +60 -0
  23. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/9c4e7b2a5d18_report_cite_form.py +21 -0
  24. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/a7e3c1f9b250_drop_report_cite_form.py +27 -0
  25. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/b8e4c6f2d071_excerpt_groups.py +34 -0
  26. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/c2d8f4a61e37_excerpt_years_rayonnement.py +32 -0
  27. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/c2d9a7e4b153_excerpt_group_text.py +28 -0
  28. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/d4e8b1c6f720_excerpt_original.py +27 -0
  29. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/e5b1a9d73c42_excerpt_influence.py +25 -0
  30. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/f14fa8f18280_initial_schema.py +382 -0
  31. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/migrations/versions/f3c7d2e8a915_excerpt_colour.py +26 -0
  32. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/models.py +672 -0
  33. sci_report_analyzer-1.0.0/src/sci_report_analyzer/db/session.py +104 -0
  34. sci_report_analyzer-1.0.0/src/sci_report_analyzer/documents.py +652 -0
  35. sci_report_analyzer-1.0.0/src/sci_report_analyzer/folders.py +214 -0
  36. sci_report_analyzer-1.0.0/src/sci_report_analyzer/i18n.py +33 -0
  37. sci_report_analyzer-1.0.0/src/sci_report_analyzer/keys.py +40 -0
  38. sci_report_analyzer-1.0.0/src/sci_report_analyzer/livereload.py +88 -0
  39. sci_report_analyzer-1.0.0/src/sci_report_analyzer/main.py +93 -0
  40. sci_report_analyzer-1.0.0/src/sci_report_analyzer/manual.py +151 -0
  41. sci_report_analyzer-1.0.0/src/sci_report_analyzer/merge.py +307 -0
  42. sci_report_analyzer-1.0.0/src/sci_report_analyzer/pdfs.py +343 -0
  43. sci_report_analyzer-1.0.0/src/sci_report_analyzer/pubview.py +1132 -0
  44. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/__init__.py +0 -0
  45. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/badge.py +427 -0
  46. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/datasets.py +412 -0
  47. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/kinds.py +300 -0
  48. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/matcher.py +198 -0
  49. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/normalize.py +276 -0
  50. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ranking/service.py +528 -0
  51. sci_report_analyzer-1.0.0/src/sci_report_analyzer/reflist.py +201 -0
  52. sci_report_analyzer-1.0.0/src/sci_report_analyzer/reports.py +518 -0
  53. sci_report_analyzer-1.0.0/src/sci_report_analyzer/settings_io.py +466 -0
  54. sci_report_analyzer-1.0.0/src/sci_report_analyzer/source_settings.py +46 -0
  55. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/__init__.py +33 -0
  56. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/base.py +216 -0
  57. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/dblp.py +241 -0
  58. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/doi.py +480 -0
  59. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/hal.py +296 -0
  60. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/openalex.py +129 -0
  61. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/orcid.py +105 -0
  62. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/scholar.py +171 -0
  63. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/semanticscholar.py +123 -0
  64. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sources/thesesfr.py +95 -0
  65. sci_report_analyzer-1.0.0/src/sci_report_analyzer/stop.py +57 -0
  66. sci_report_analyzer-1.0.0/src/sci_report_analyzer/sync.py +567 -0
  67. sci_report_analyzer-1.0.0/src/sci_report_analyzer/theses.py +79 -0
  68. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/__init__.py +0 -0
  69. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/categories_editor.py +235 -0
  70. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/documents_page.py +482 -0
  71. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/help_page.py +333 -0
  72. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/mdedit.py +173 -0
  73. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/panel.py +1262 -0
  74. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/pdf_viewer.py +933 -0
  75. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/person.py +964 -0
  76. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/persons.py +543 -0
  77. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/pub_details.py +1813 -0
  78. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/reflist.py +224 -0
  79. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/report.py +475 -0
  80. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/scimago_years.py +82 -0
  81. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/settings.py +1197 -0
  82. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/tags.py +271 -0
  83. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/theme.py +297 -0
  84. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/venues_page.py +1503 -0
  85. sci_report_analyzer-1.0.0/src/sci_report_analyzer/ui/viewer_side.py +1040 -0
  86. sci_report_analyzer-1.0.0/src/sci_report_analyzer/venue_match.py +372 -0
  87. 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'"
@@ -0,0 +1,6 @@
1
+ from importlib.metadata import PackageNotFoundError, version
2
+
3
+ try:
4
+ __version__ = version("sci-report-analyzer")
5
+ except PackageNotFoundError: # running from the sources without installing
6
+ __version__ = "dev"