pub-analyzer 0.2.0__py3-none-any.whl → 0.3.0__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.

Potentially problematic release.


This version of pub-analyzer might be problematic. Click here for more details.

Files changed (40) hide show
  1. pub_analyzer/css/body.tcss +48 -35
  2. pub_analyzer/css/buttons.tcss +0 -4
  3. pub_analyzer/css/main.tcss +1 -1
  4. pub_analyzer/css/summary.tcss +75 -0
  5. pub_analyzer/internal/identifier.py +26 -0
  6. pub_analyzer/internal/report.py +73 -31
  7. pub_analyzer/internal/templates/author/{author_resume.typ → author_summary.typ} +4 -3
  8. pub_analyzer/internal/templates/author/report.typ +4 -3
  9. pub_analyzer/internal/templates/author/sources.typ +7 -5
  10. pub_analyzer/internal/templates/author/works.typ +12 -12
  11. pub_analyzer/internal/templates/author/works_extended.typ +4 -4
  12. pub_analyzer/main.py +3 -2
  13. pub_analyzer/models/author.py +9 -25
  14. pub_analyzer/models/concept.py +19 -0
  15. pub_analyzer/models/institution.py +11 -1
  16. pub_analyzer/models/report.py +14 -14
  17. pub_analyzer/models/source.py +59 -3
  18. pub_analyzer/models/topic.py +59 -0
  19. pub_analyzer/models/work.py +23 -0
  20. pub_analyzer/widgets/author/cards.py +6 -5
  21. pub_analyzer/widgets/author/core.py +11 -10
  22. pub_analyzer/widgets/common/summary.py +7 -0
  23. pub_analyzer/widgets/institution/core.py +10 -9
  24. pub_analyzer/widgets/report/cards.py +10 -11
  25. pub_analyzer/widgets/report/concept.py +47 -0
  26. pub_analyzer/widgets/report/core.py +14 -0
  27. pub_analyzer/widgets/report/grants.py +46 -0
  28. pub_analyzer/widgets/report/source.py +11 -4
  29. pub_analyzer/widgets/report/topic.py +55 -0
  30. pub_analyzer/widgets/report/work.py +45 -9
  31. pub_analyzer/widgets/search/results.py +8 -8
  32. pub_analyzer/widgets/sidebar.py +11 -2
  33. {pub_analyzer-0.2.0.dist-info → pub_analyzer-0.3.0.dist-info}/METADATA +8 -7
  34. pub_analyzer-0.3.0.dist-info/RECORD +69 -0
  35. {pub_analyzer-0.2.0.dist-info → pub_analyzer-0.3.0.dist-info}/WHEEL +1 -1
  36. pub_analyzer/css/author.tcss +0 -82
  37. pub_analyzer/css/institution.tcss +0 -82
  38. pub_analyzer-0.2.0.dist-info/RECORD +0 -64
  39. {pub_analyzer-0.2.0.dist-info → pub_analyzer-0.3.0.dist-info}/LICENSE +0 -0
  40. {pub_analyzer-0.2.0.dist-info → pub_analyzer-0.3.0.dist-info}/entry_points.txt +0 -0
@@ -9,7 +9,7 @@ from textual.containers import VerticalScroll
9
9
  from textual.widgets import Static
10
10
 
11
11
  from pub_analyzer.models.report import AuthorReport, InstitutionReport
12
- from pub_analyzer.models.source import DehydratedSource
12
+ from pub_analyzer.models.source import Source
13
13
 
14
14
 
15
15
  class SourcesTable(Static):
@@ -22,7 +22,7 @@ class SourcesTable(Static):
22
22
  }
23
23
  """
24
24
 
25
- def __init__(self, sources_list: list[DehydratedSource]) -> None:
25
+ def __init__(self, sources_list: list[Source]) -> None:
26
26
  self.sources_list = sources_list
27
27
  super().__init__()
28
28
 
@@ -36,7 +36,9 @@ class SourcesTable(Static):
36
36
  sources_table.add_column("Publisher or institution", ratio=2)
37
37
  sources_table.add_column("Type")
38
38
  sources_table.add_column("ISSN-L")
39
- sources_table.add_column("Is Open Access")
39
+ sources_table.add_column("Impact factor")
40
+ sources_table.add_column("h-index")
41
+ sources_table.add_column("Is OA")
40
42
 
41
43
  for idx, source in enumerate(self.sources_list):
42
44
  if source.host_organization_name:
@@ -49,6 +51,9 @@ class SourcesTable(Static):
49
51
  title = f"""[@click=app.open_link('{quote(str(source.id))}')][u]{source.display_name}[/u][/]"""
50
52
  type_source = source.type
51
53
  issn_l = source.issn_l if source.issn_l else "-"
54
+ impact_factor = f"{source.summary_stats.two_yr_mean_citedness:.3f}"
55
+ h_index = f"{source.summary_stats.h_index}"
56
+
52
57
  is_open_access = "[#909d63]True[/]" if source.is_oa else "[#bc5653]False[/]"
53
58
 
54
59
  sources_table.add_row(
@@ -57,6 +62,8 @@ class SourcesTable(Static):
57
62
  Text.from_markup(host_organization),
58
63
  Text.from_markup(type_source),
59
64
  Text.from_markup(issn_l),
65
+ Text.from_markup(impact_factor),
66
+ Text.from_markup(h_index),
60
67
  Text.from_markup(is_open_access),
61
68
  )
62
69
 
@@ -80,4 +87,4 @@ class SourcesReportPane(VerticalScroll):
80
87
 
81
88
  def compose(self) -> ComposeResult:
82
89
  """Compose content pane."""
83
- yield SourcesTable(sources_list=self.report.sources_resume.sources)
90
+ yield SourcesTable(sources_list=self.report.sources_summary.sources)
@@ -0,0 +1,55 @@
1
+ """Topics Widgets."""
2
+
3
+ from urllib.parse import quote
4
+
5
+ from rich.table import Table
6
+ from rich.text import Text
7
+ from textual.app import ComposeResult
8
+ from textual.widgets import Static
9
+
10
+ from pub_analyzer.models.topic import DehydratedTopic
11
+
12
+
13
+ class TopicsTable(Static):
14
+ """All Topics from a work in a table."""
15
+
16
+ DEFAULT_CSS = """
17
+ TopicsTable .topics-table {
18
+ height: auto;
19
+ padding: 1 2 0 2;
20
+ }
21
+ """
22
+
23
+ def __init__(self, topics_list: list[DehydratedTopic]) -> None:
24
+ self.topics_list = topics_list
25
+ super().__init__()
26
+
27
+ def compose(self) -> ComposeResult:
28
+ """Compose Table."""
29
+ topics_table = Table(title="Topics", expand=True, show_lines=True)
30
+
31
+ # Define Columns
32
+ topics_table.add_column("", justify="center", vertical="middle")
33
+ topics_table.add_column("Name", ratio=3)
34
+ topics_table.add_column("Score", ratio=1)
35
+ topics_table.add_column("Domain", ratio=1)
36
+ topics_table.add_column("Field", ratio=1)
37
+ topics_table.add_column("SubField", ratio=1)
38
+
39
+ for idx, topic in enumerate(self.topics_list):
40
+ name = f"""[@click=app.open_link('{quote(str(topic.id))}')][u]{topic.display_name}[/u][/]"""
41
+
42
+ domain = f"""[@click=app.open_link('{quote(str(topic.domain.id))}')][u]{topic.domain.display_name}[/u][/]"""
43
+ field = f"""[@click=app.open_link('{quote(str(topic.field.id))}')][u]{topic.field.display_name}[/u][/]"""
44
+ subfield = f"""[@click=app.open_link('{quote(str(topic.subfield.id))}')][u]{topic.subfield.display_name}[/u][/]"""
45
+
46
+ topics_table.add_row(
47
+ str(idx),
48
+ Text.from_markup(name, overflow="ellipsis"),
49
+ Text.from_markup(f"{topic.score:.2f}"),
50
+ Text.from_markup(domain),
51
+ Text.from_markup(field),
52
+ Text.from_markup(subfield),
53
+ )
54
+
55
+ yield Static(topics_table, classes="topics-table")
@@ -17,12 +17,15 @@ from pub_analyzer.widgets.report.cards import (
17
17
  AuthorshipCard,
18
18
  CitationMetricsCard,
19
19
  OpenAccessCard,
20
- OpenAccessResumeCard,
20
+ OpenAccessSummaryCard,
21
21
  ReportCitationMetricsCard,
22
- WorksTypeResumeCard,
22
+ WorksTypeSummaryCard,
23
23
  )
24
24
 
25
+ from .concept import ConceptsTable
26
+ from .grants import GrantsTable
25
27
  from .locations import LocationsTable
28
+ from .topic import TopicsTable
26
29
 
27
30
 
28
31
  class CitedByTable(Static):
@@ -108,22 +111,40 @@ class WorkModal(Modal[None]):
108
111
  yield CitationMetricsCard(work_report=self.work_report)
109
112
 
110
113
  with TabbedContent(id="tables-container"):
114
+ # Abtract if exists
115
+ if self.work_report.work.abstract:
116
+ with TabPane("Abstract"):
117
+ yield Label(self.work_report.work.abstract, classes="abstract")
111
118
  # Citations Table
112
119
  with TabPane("Cited By Works"):
113
120
  if len(self.work_report.cited_by):
114
121
  yield CitedByTable(citations_list=self.work_report.cited_by)
115
122
  else:
116
123
  yield Label("No works found.")
124
+ # Concepts Table
125
+ with TabPane("Concepts"):
126
+ if len(self.work_report.work.concepts):
127
+ yield ConceptsTable(self.work_report.work.concepts)
128
+ else:
129
+ yield Label("No Concepts found.")
130
+ # Grants Table
131
+ with TabPane("Grants"):
132
+ if len(self.work_report.work.grants):
133
+ yield GrantsTable(self.work_report.work.grants)
134
+ else:
135
+ yield Label("No Grants found.")
117
136
  # Locations Table
118
137
  with TabPane("Locations"):
119
138
  if len(self.work_report.work.locations):
120
139
  yield LocationsTable(self.work_report.work.locations)
121
140
  else:
122
141
  yield Label("No sources found.")
123
- # Abtract if exists
124
- if self.work_report.work.abstract:
125
- with TabPane("Abstract"):
126
- yield Label(self.work_report.work.abstract, classes="abstract")
142
+ # Topics Table
143
+ with TabPane("Topics"):
144
+ if len(self.work_report.work.topics):
145
+ yield TopicsTable(self.work_report.work.topics)
146
+ else:
147
+ yield Label("No Topics found.")
127
148
 
128
149
 
129
150
  class WorksTable(Static):
@@ -136,8 +157,9 @@ class WorksTable(Static):
136
157
  }
137
158
  """
138
159
 
139
- def __init__(self, report: AuthorReport | InstitutionReport) -> None:
160
+ def __init__(self, report: AuthorReport | InstitutionReport, show_empty_works: bool = True) -> None:
140
161
  self.report = report
162
+ self.show_empty_works = show_empty_works
141
163
  super().__init__()
142
164
 
143
165
  class _WorksTableRenderer(Static):
@@ -174,6 +196,9 @@ class WorksTable(Static):
174
196
 
175
197
  for idx, work_report in enumerate(self.report.works):
176
198
  work = work_report.work
199
+ if not self.show_empty_works and len(work_report.cited_by) < 1:
200
+ continue
201
+
177
202
  doi = work.ids.doi
178
203
  doi_url = f"""[@click=app.open_link("{quote(str(doi))}")]DOI[/]""" if doi else "-"
179
204
 
@@ -204,12 +229,23 @@ class WorkReportPane(VerticalScroll):
204
229
  self.report = report
205
230
  super().__init__()
206
231
 
232
+ async def toggle_empty_works(self) -> None:
233
+ """Hide/show works if cites are cero."""
234
+ report_works_status: bool = self.app.query_one("ReportWidget").show_empty_works # type: ignore
235
+ table_works_status = self.query_one(WorksTable).show_empty_works
236
+
237
+ if self.report.works and (report_works_status != table_works_status):
238
+ self.loading = True
239
+ await self.query_one(WorksTable).remove()
240
+ await self.mount(WorksTable(report=self.report, show_empty_works=report_works_status))
241
+ self.loading = False
242
+
207
243
  def compose(self) -> ComposeResult:
208
244
  """Compose content pane."""
209
245
  with Horizontal(classes="cards-container"):
210
246
  yield ReportCitationMetricsCard(report=self.report)
211
- yield WorksTypeResumeCard(report=self.report)
212
- yield OpenAccessResumeCard(report=self.report)
247
+ yield WorksTypeSummaryCard(report=self.report)
248
+ yield OpenAccessSummaryCard(report=self.report)
213
249
 
214
250
  if self.report.works:
215
251
  yield WorksTable(report=self.report)
@@ -8,8 +8,8 @@ from textual.widgets import Button, Label, Static
8
8
 
9
9
  from pub_analyzer.models.author import AuthorResult
10
10
  from pub_analyzer.models.institution import InstitutionResult
11
- from pub_analyzer.widgets.author.core import AuthorResumeWidget
12
- from pub_analyzer.widgets.institution.core import InstitutionResumeWidget
11
+ from pub_analyzer.widgets.author.core import AuthorSummaryWidget
12
+ from pub_analyzer.widgets.institution.core import InstitutionSummaryWidget
13
13
 
14
14
 
15
15
  class ResultWidget(Static):
@@ -39,14 +39,14 @@ class AuthorResultWidget(ResultWidget):
39
39
  yield Label(self.author_result.hint or "", classes="text-hint")
40
40
 
41
41
  async def on_button_pressed(self, event: Button.Pressed) -> None:
42
- """Go to the Author resume page."""
42
+ """Go to the Author summary page."""
43
43
  from pub_analyzer.widgets.body import MainContent
44
44
 
45
- author_resume_widget = AuthorResumeWidget(author_result=self.author_result)
45
+ author_summary_widget = AuthorSummaryWidget(author_result=self.author_result)
46
46
 
47
47
  main_content = self.app.query_one(MainContent)
48
48
  main_content.update_title(title=self.author_result.display_name)
49
- await main_content.mount(author_resume_widget)
49
+ await main_content.mount(author_summary_widget)
50
50
 
51
51
  await self.app.query_one("FinderWidget").remove()
52
52
 
@@ -74,13 +74,13 @@ class InstitutionResultWidget(ResultWidget):
74
74
  yield Label(self.institution_result.hint or "", classes="text-hint")
75
75
 
76
76
  async def on_button_pressed(self, event: Button.Pressed) -> None:
77
- """Go to the Institution resume page."""
77
+ """Go to the Institution summary page."""
78
78
  from pub_analyzer.widgets.body import MainContent
79
79
 
80
- institution_resume_widget = InstitutionResumeWidget(institution_result=self.institution_result)
80
+ institution_summary_widget = InstitutionSummaryWidget(institution_result=self.institution_result)
81
81
 
82
82
  main_content = self.app.query_one(MainContent)
83
83
  main_content.update_title(title=self.institution_result.display_name)
84
- await main_content.mount(institution_resume_widget)
84
+ await main_content.mount(institution_summary_widget)
85
85
 
86
86
  await self.app.query_one("FinderWidget").remove()
@@ -1,5 +1,7 @@
1
1
  """Sidebar components and options."""
2
+
2
3
  from enum import Enum
4
+ from importlib.metadata import version
3
5
 
4
6
  from textual import on
5
7
  from textual.app import ComposeResult
@@ -25,19 +27,26 @@ class SideBar(Static):
25
27
 
26
28
  def compose(self) -> ComposeResult:
27
29
  """Compose dynamically the sidebar options."""
30
+ pub_analyzer_version = version("pub-analyzer")
31
+
28
32
  with Vertical(classes="sidebar-options-column"):
29
33
  yield Label("Menu", id="sidebar-title")
30
34
 
31
- yield Button(SideBarOptionsName.SEARCH.value, variant="primary", id="search-sidebar-button", classes="sidebar-option")
32
- yield Button(SideBarOptionsName.LOAD_REPORT.value, variant="primary", id="load-sidebar-button", classes="sidebar-option")
35
+ with Vertical(classes="sidebar-buttons-column"):
36
+ yield Button(SideBarOptionsName.SEARCH.value, variant="primary", id="search-sidebar-button", classes="sidebar-option")
37
+ yield Button(SideBarOptionsName.LOAD_REPORT.value, variant="primary", id="load-sidebar-button", classes="sidebar-option")
38
+
39
+ yield Label(f"v{pub_analyzer_version}", id="module-version-label")
33
40
 
34
41
  def toggle(self) -> None:
35
42
  """Show/Hide Sidebar."""
36
43
  if self.has_class("-hidden"):
37
44
  self.remove_class("-hidden")
45
+ self.styles.animate("width", value=20, duration=0.5)
38
46
  else:
39
47
  if self.query("*:focus"):
40
48
  self.screen.set_focus(None)
49
+ self.styles.animate("width", value=0, duration=0.5)
41
50
  self.add_class("-hidden")
42
51
 
43
52
  async def _replace_main_content(self, new_title: str, new_widget: Widget) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pub-analyzer
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: A text user interface, written in python, which automates the generation of scientific production reports using OpenAlex
5
5
  Home-page: https://github.com/alejandrgaspar/pub-analyzer
6
6
  License: MIT
@@ -20,12 +20,13 @@ Classifier: Operating System :: POSIX :: Linux
20
20
  Classifier: Programming Language :: Python :: 3
21
21
  Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
23
24
  Classifier: Typing :: Typed
24
- Requires-Dist: httpx (==0.25.1)
25
- Requires-Dist: jinja2 (==3.1.2)
26
- Requires-Dist: pydantic (==2.4.2)
27
- Requires-Dist: textual (==0.41.0)
28
- Requires-Dist: typst (==0.8.0)
25
+ Requires-Dist: httpx (==0.27.0)
26
+ Requires-Dist: jinja2 (==3.1.3)
27
+ Requires-Dist: pydantic (==2.7.1)
28
+ Requires-Dist: textual (==0.58.0)
29
+ Requires-Dist: typst (==0.11.0)
29
30
  Project-URL: Documentation, https://pub-analyzer.com/
30
31
  Project-URL: Repository, https://github.com/alejandrgaspar/pub-analyzer
31
32
  Description-Content-Type: text/markdown
@@ -33,7 +34,7 @@ Description-Content-Type: text/markdown
33
34
  # Pub Analyzer
34
35
 
35
36
  <p align="center">
36
- <img src="docs/assets/img/logo.png" alt="PubAnalyzer" width="275">
37
+ <img src="https://raw.githubusercontent.com/alejandrgaspar/pub-analyzer/main/docs/assets/img/logo.png" alt="PubAnalyzer splash image" width="275">
37
38
  </p>
38
39
 
39
40
  <p align="center">
@@ -0,0 +1,69 @@
1
+ pub_analyzer/__init__.py,sha256=8xDULqkSyOBAa5bvzcnteo5nW1sqXB6pR9fSc9DpXFo,40
2
+ pub_analyzer/css/body.tcss,sha256=Yw9bx5eWABVQPKWDAfWk8AdSXnBAg396JB9Lm4LXD-o,1682
3
+ pub_analyzer/css/buttons.tcss,sha256=FruJ39dXmKnZm3_y0CxAJByKHrbmt6RQky0T0uM906g,546
4
+ pub_analyzer/css/checkbox.tcss,sha256=FblyIHns-r1K0ikOnSJtoTMz57C6iDEcscdFAsJ7s48,506
5
+ pub_analyzer/css/collapsible.tcss,sha256=Rh-L5PcIMhnZ7RhY1udd_BcYC1mfCMew2m6o6ty3juE,605
6
+ pub_analyzer/css/datatable.tcss,sha256=JgdMUPc4fYmZlXi_FxbuD88pegK6Pi4FgDHIfA_TKxo,994
7
+ pub_analyzer/css/main.tcss,sha256=wL8KD2gwRDrE_u0EbZrvu5s3eTFwWLtbP8RMLgCv2Sk,834
8
+ pub_analyzer/css/report.tcss,sha256=5v-h4Y5gUdonLQTVkVm-HYrYT1xDS-4NYHVZDYghVEs,2066
9
+ pub_analyzer/css/search.tcss,sha256=rovbWjp4pYfCF_OyAC_QrV_0WdMUlsYoQ3vbs9pGw7g,1326
10
+ pub_analyzer/css/summary.tcss,sha256=i4ixICwoQFj2BToW9NVmJGUIYk5upbukbTCnDgT40ds,1350
11
+ pub_analyzer/css/tabs.tcss,sha256=dS7y6ZZmo1Vw7Wqpx66-O-oE7zeqPE9reWqIhQ1KcZs,311
12
+ pub_analyzer/css/tree.tcss,sha256=5BSabX9ZmRL3VTz0Gya2RRJnWrwdIF9cTf6dXj2R4kE,818
13
+ pub_analyzer/internal/__init__.py,sha256=9aqrBJDedUiBO5kEO81kSAuPbOSFoaDZZK8w5NydPhs,22
14
+ pub_analyzer/internal/identifier.py,sha256=LDYew25TLuwqJHmLg9iRNTURWynN27ZbTxTVGbuOUD0,2939
15
+ pub_analyzer/internal/render.py,sha256=gq5dScWs507tne3glJbTQ-PekmALvtcZPB1p_mVAkE0,2144
16
+ pub_analyzer/internal/report.py,sha256=zeDn4mR8G7-NA0SxelIhanZ2e4mLecbiuVqlv2_hMb8,16320
17
+ pub_analyzer/internal/templates/author/author_summary.typ,sha256=0qyS2C075wpj3mOxY4Ka5-aNjQ5RAjoJskkIb8tnLFE,2478
18
+ pub_analyzer/internal/templates/author/report.typ,sha256=izdq5Z-504hkLwI_C47RsqDDu_K8N74h_3KCetzSies,1444
19
+ pub_analyzer/internal/templates/author/sources.typ,sha256=_yFNDuYPu1casCy73JVL7l9qZ_YYRqTGLLgr5tnQW5A,814
20
+ pub_analyzer/internal/templates/author/works.typ,sha256=wKgg4EoPYLzY2q3UBsBKZADOmTy4-1r8CD1pt8A3VYo,1980
21
+ pub_analyzer/internal/templates/author/works_extended.typ,sha256=B38IHOwlBuPzUA6SewoHEp5eU-9kEH3yH5KvK7Nm7a0,3527
22
+ pub_analyzer/main.py,sha256=-yv34eVkLT8cyJ-wCl3vuoprMmqpsMhc3arGAnytCuY,2201
23
+ pub_analyzer/models/__init__.py,sha256=hvR6m379slQw7gSwnl_OFY21Ytv90mmmOe7bp8vZYkk,59
24
+ pub_analyzer/models/author.py,sha256=9DzBQY4JoDv5ilBNOLyquOqnlwbXCTpmZq25cQLCgYU,1900
25
+ pub_analyzer/models/concept.py,sha256=yNvajKWTn6uBalNoJmlobitvbFBOjF80jlZnjKjwDRw,677
26
+ pub_analyzer/models/institution.py,sha256=kjS3U0w454SBCZNsZ03-XZqciZR0ubwsCRo2ix6RojM,3067
27
+ pub_analyzer/models/report.py,sha256=zrAkUYgGCGnDzvQYbidyf1cmi7iXbXxsskfqZaeurbw,2574
28
+ pub_analyzer/models/source.py,sha256=o3ich4iDYB_PH_cVbrZtVRFVLQlPS3W5ajgBQQGzYqM,2730
29
+ pub_analyzer/models/topic.py,sha256=3MBQV-njnjfmOVvgmFZxy8fFU7sMj5yxUW8EHFAjlD4,1825
30
+ pub_analyzer/models/work.py,sha256=vN2mSB6oiPbkhaGy0pjWGc2meWjkkHAz5Eubed3BO6w,4115
31
+ pub_analyzer/widgets/__init__.py,sha256=JALs1yGE06XYwjoY_0AG-Wt_pMknI1WEWNYK3atQaEA,18
32
+ pub_analyzer/widgets/author/__init__.py,sha256=oiJibt7YiuGpovOnFIAlC9YwLO-0LN3SDgPWFL-LVPQ,22
33
+ pub_analyzer/widgets/author/cards.py,sha256=JWZxYy4Oen5fToiSBgvfEgmBJlrIVXCWpT-XjkLbxY4,2445
34
+ pub_analyzer/widgets/author/core.py,sha256=XaqjOajU0zz8rtraF5Y9vjjiLyMKJmke8GblFaa6UwU,5069
35
+ pub_analyzer/widgets/author/tables.py,sha256=kowgw5_NIRKdLvL9b97q9PSugHQ__eMcLWfahKETZdA,793
36
+ pub_analyzer/widgets/body.py,sha256=wN9cMcm1MaRTjuHYt8RWrG8D_ngg5cn-hVllvmzPX_o,972
37
+ pub_analyzer/widgets/common/__init__.py,sha256=Fx5Gl17Rd_wueZjNElBtI1kCn-4DMSbC3lEA8u7PSto,287
38
+ pub_analyzer/widgets/common/card.py,sha256=GGSaeuZt6AqY7kAvcVnWNMrhNPzr7do66YRQOYNSYvU,595
39
+ pub_analyzer/widgets/common/filesystem.py,sha256=i0S3D6JJzPkF1Sqm83SSQlmYFKRf82SnoFgKVE6BdYI,6460
40
+ pub_analyzer/widgets/common/filters.py,sha256=7KNRcSAED0EGxIZp6o1zxmGpzbmEM2yozDeYw-5ysSM,3373
41
+ pub_analyzer/widgets/common/input.py,sha256=tK_UCtLDGHlI_NKpKjGkVu4gWiwMAIHixT9Im--Un4c,2649
42
+ pub_analyzer/widgets/common/modal.py,sha256=otLQZotdTRTlSeTBknIxqRyduVY6lRZ5yW5u20SLcwI,882
43
+ pub_analyzer/widgets/common/selector.py,sha256=Jh5bsn-zYmHGfEE3eO9XL6BsgKpLMGfg8FJur4gQmH0,1493
44
+ pub_analyzer/widgets/common/summary.py,sha256=Qj-FRfAVgJmCaVUJI-jQrHX2sGKHTP2b75KukuJWlog,165
45
+ pub_analyzer/widgets/institution/__init__.py,sha256=T_WDTDistaaq2obl1Cy_wZI5nTBiJNUnB-_OwBOLFTE,27
46
+ pub_analyzer/widgets/institution/cards.py,sha256=OgLWP8M0xENa5NnY9NtmwjdqOwZJUN77fXSHFNT3BYU,2862
47
+ pub_analyzer/widgets/institution/core.py,sha256=q21GXawR9g-pN68YgdiHc3r_ZxiKq5JYbakeLvdu4dk,5332
48
+ pub_analyzer/widgets/institution/tables.py,sha256=tXjrop9HGSkZGjYIOGQEOKVoyoeIGPd-8oSh08iuTRw,838
49
+ pub_analyzer/widgets/report/__init__.py,sha256=oolRVss3JKaQHaQVDncjtxbLINRJ5Rd1ulW1uk7MLhc,54
50
+ pub_analyzer/widgets/report/author.py,sha256=orlq-YSHeRcEyCXrQHiRpp2tdPC9SO1MjQ9uhNpU0-k,1227
51
+ pub_analyzer/widgets/report/cards.py,sha256=NtsGCdlAqsuocun_QwE7dJeZetfAqKAjduHYpVtq-ic,4826
52
+ pub_analyzer/widgets/report/concept.py,sha256=xiGXy_RXO_XmdqnlePkOozYPmQrsDdqKPMRXHsZbDP0,1485
53
+ pub_analyzer/widgets/report/core.py,sha256=V4fwBHnSqkUzC1da8sGYqzsPKQRofA7GqpEhbEXsk4s,11436
54
+ pub_analyzer/widgets/report/export.py,sha256=EQzF5fMZgHtLv3f5hITDgf9WW2XytRX_foeLWwcIHkM,4762
55
+ pub_analyzer/widgets/report/grants.py,sha256=m183W6djVhucAuYs-EhjkHuA9heqpGwsW_iRouVQsns,1347
56
+ pub_analyzer/widgets/report/institution.py,sha256=PDPE9fK18l9kKKch5sJrbnHHDss0kJ6bgVhM4hTyrAo,1297
57
+ pub_analyzer/widgets/report/locations.py,sha256=s6O5v_jX_oPsKOf2fEujtDxLHQRVsqrIcgN4rZkRKkg,2892
58
+ pub_analyzer/widgets/report/source.py,sha256=WJhJc0_sZOcAtkmh9-VjbgugoArZgxKoXlITqVaBYK0,3045
59
+ pub_analyzer/widgets/report/topic.py,sha256=SI3STTBFlpR-VJcsNhJyu6vc9uyytU_ASKuWXb-qr60,1969
60
+ pub_analyzer/widgets/report/work.py,sha256=8PwuEkTN-cvteMv9xULLfaDrTZpogX6z0DBiOjN0JKA,9590
61
+ pub_analyzer/widgets/search/__init__.py,sha256=8C3IQtFkiIL8hlQbhJ_fAHM59-TAoe29wBAM2ptozhw,239
62
+ pub_analyzer/widgets/search/core.py,sha256=4NvowtBcrH1fmob9kuF7v9Tq3Nd99jzB2S7xaD8OYeI,3861
63
+ pub_analyzer/widgets/search/results.py,sha256=6Sl-shkGCf-jcMmalXpk1n8oBHk1aZNzFPJfHSRP1gA,3702
64
+ pub_analyzer/widgets/sidebar.py,sha256=XlIshlCVW5Bb3MXFPnU9is0qQrUrGdT6xlkKiYNEcAM,2704
65
+ pub_analyzer-0.3.0.dist-info/LICENSE,sha256=OPopoEowTMKqIea8Kbxk3TKdCQ97YkLvIknjTHE5oCI,1080
66
+ pub_analyzer-0.3.0.dist-info/METADATA,sha256=sMpAloa5JJUR1k3N7lgpLATfrn4Q8lZqERK5_NBYPaE,4508
67
+ pub_analyzer-0.3.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
68
+ pub_analyzer-0.3.0.dist-info/entry_points.txt,sha256=mVb_gUNX_-aVWHlNKLjcMAS8YLgNnSq9JLRXVJGIF2c,54
69
+ pub_analyzer-0.3.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.7.0
2
+ Generator: poetry-core 1.9.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,82 +0,0 @@
1
- /* COLORS */
2
- $bg-main-color: white;
3
- $bg-secondary-color: #e5e7eb;
4
- $bg-secondary-color-accent: #d1d5db;
5
- $text-primary-color: black;
6
-
7
- $bg-main-color-darken: #1e293b;
8
- $bg-secondary-color-darken: #0f172a;
9
- $text-primary-color-darken: black;
10
-
11
- AuthorResumeWidget {
12
- height: 1fr;
13
- margin: 1 2;
14
- }
15
-
16
- .-dark-mode AuthorResumeWidget {
17
- color: $text-primary-color-darken;
18
- background: $bg-secondary-color;
19
- }
20
-
21
- /* Main Container */
22
- AuthorResumeWidget #main-container{
23
- height: 1fr;
24
- }
25
-
26
- /* Block Container */
27
- AuthorResumeWidget .block-container {
28
- padding: 1;
29
- height: auto;
30
- }
31
-
32
- AuthorResumeWidget .block-title {
33
- text-align: center;
34
- width: 100%;
35
- border-bottom: solid $text-primary-color;
36
- }
37
-
38
- /* Info Container */
39
- AuthorResumeWidget .info-container {
40
- height: auto;
41
- }
42
-
43
- AuthorResumeWidget .info-container Label {
44
- text-align: center;
45
- width: 1fr;
46
- }
47
-
48
- /* Filter Container */
49
- AuthorResumeWidget CollapsibleTitle {
50
- padding: 0;
51
- }
52
-
53
- AuthorResumeWidget .filter-collapsible {
54
- margin-top: 1;
55
- }
56
-
57
- AuthorResumeWidget .filter-collapsible DateRangeFilter {
58
- margin-top: 1;
59
- }
60
-
61
- /* Cards */
62
- AuthorResumeWidget .cards-container {
63
- height: auto;
64
- margin: 1 0 0 0 ;
65
-
66
- layout: grid;
67
- grid-size: 3 1;
68
- grid-rows: 11;
69
- grid-columns: 1fr;
70
- grid-gutter: 1 2;
71
- }
72
-
73
- /* Table */
74
- AuthorResumeWidget .table-container {
75
- height: auto;
76
- margin: 1 0 0 0;
77
- }
78
-
79
- /* Buttons */
80
- AuthorResumeWidget .button-container {
81
- align: center middle;
82
- }
@@ -1,82 +0,0 @@
1
- /* COLORS */
2
- $bg-main-color: white;
3
- $bg-secondary-color: #e5e7eb;
4
- $bg-secondary-color-accent: #d1d5db;
5
- $text-primary-color: black;
6
-
7
- $bg-main-color-darken: #1e293b;
8
- $bg-secondary-color-darken: #0f172a;
9
- $text-primary-color-darken: black;
10
-
11
- InstitutionResumeWidget {
12
- height: 1fr;
13
- margin: 1 2;
14
- }
15
-
16
- .-dark-mode InstitutionResumeWidget {
17
- color: $text-primary-color-darken;
18
- background: $bg-secondary-color;
19
- }
20
-
21
- /* Main Container */
22
- InstitutionResumeWidget #main-container{
23
- height: 1fr;
24
- }
25
-
26
- /* Block Container */
27
- InstitutionResumeWidget .block-container {
28
- padding: 1;
29
- height: auto;
30
- }
31
-
32
- InstitutionResumeWidget .block-title {
33
- text-align: center;
34
- width: 100%;
35
- border-bottom: solid $text-primary-color;
36
- }
37
-
38
- /* Info Container */
39
- InstitutionResumeWidget .info-container {
40
- height: auto;
41
- }
42
-
43
- InstitutionResumeWidget .info-container Label {
44
- text-align: center;
45
- width: 1fr;
46
- }
47
-
48
- /* Filter Container */
49
- InstitutionResumeWidget CollapsibleTitle {
50
- padding: 0;
51
- }
52
-
53
- InstitutionResumeWidget .filter-collapsible {
54
- margin-top: 1;
55
- }
56
-
57
- InstitutionResumeWidget .filter-collapsible DateRangeFilter {
58
- margin-top: 1;
59
- }
60
-
61
- /* Cards */
62
- InstitutionResumeWidget .cards-container {
63
- height: auto;
64
- margin: 1 0 0 0 ;
65
-
66
- layout: grid;
67
- grid-size: 3 1;
68
- grid-rows: 14;
69
- grid-columns: 1fr;
70
- grid-gutter: 1 2;
71
- }
72
-
73
- /* Table */
74
- InstitutionResumeWidget .table-container {
75
- height: auto;
76
- margin: 1 0 0 0 ;
77
- }
78
-
79
- /* Buttons */
80
- InstitutionResumeWidget .button-container {
81
- align: center middle;
82
- }
@@ -1,64 +0,0 @@
1
- pub_analyzer/__init__.py,sha256=8xDULqkSyOBAa5bvzcnteo5nW1sqXB6pR9fSc9DpXFo,40
2
- pub_analyzer/css/author.tcss,sha256=EIzhIqDYcldo9ARncp5fIBa9YxD66RZl7hdnqT-tH-M,1461
3
- pub_analyzer/css/body.tcss,sha256=6pMQ8wUYb8auIC2MZYJgdBNOsj2nabdIzsBD2BpOxBA,1400
4
- pub_analyzer/css/buttons.tcss,sha256=mQWyJ4tI1AqDaH2ANDLyxw67bBCbwqLPjA22dOoaAYE,581
5
- pub_analyzer/css/checkbox.tcss,sha256=FblyIHns-r1K0ikOnSJtoTMz57C6iDEcscdFAsJ7s48,506
6
- pub_analyzer/css/collapsible.tcss,sha256=Rh-L5PcIMhnZ7RhY1udd_BcYC1mfCMew2m6o6ty3juE,605
7
- pub_analyzer/css/datatable.tcss,sha256=JgdMUPc4fYmZlXi_FxbuD88pegK6Pi4FgDHIfA_TKxo,994
8
- pub_analyzer/css/institution.tcss,sha256=t6KAz6EAfLxU8M4a4ny-fQlZw16GHf0rxFIqrd8KG9A,1527
9
- pub_analyzer/css/main.tcss,sha256=rq_tH2JPlmaHFjN5PtipjKOqRSJhkdbBRwde2aNcxQI,816
10
- pub_analyzer/css/report.tcss,sha256=5v-h4Y5gUdonLQTVkVm-HYrYT1xDS-4NYHVZDYghVEs,2066
11
- pub_analyzer/css/search.tcss,sha256=rovbWjp4pYfCF_OyAC_QrV_0WdMUlsYoQ3vbs9pGw7g,1326
12
- pub_analyzer/css/tabs.tcss,sha256=dS7y6ZZmo1Vw7Wqpx66-O-oE7zeqPE9reWqIhQ1KcZs,311
13
- pub_analyzer/css/tree.tcss,sha256=5BSabX9ZmRL3VTz0Gya2RRJnWrwdIF9cTf6dXj2R4kE,818
14
- pub_analyzer/internal/__init__.py,sha256=9aqrBJDedUiBO5kEO81kSAuPbOSFoaDZZK8w5NydPhs,22
15
- pub_analyzer/internal/identifier.py,sha256=7jkl7u0-6XTkuv7SdeKhjqwQCOtLrTIH5rIEPxBs594,2268
16
- pub_analyzer/internal/render.py,sha256=gq5dScWs507tne3glJbTQ-PekmALvtcZPB1p_mVAkE0,2144
17
- pub_analyzer/internal/report.py,sha256=bxxjpt928a9c6ZXymsg9n47ZShP-0tweL-ivd_FYFTI,14666
18
- pub_analyzer/internal/templates/author/author_resume.typ,sha256=hF6SjfUfOjijJQGUCRH5QGQEQSVu8lAqCAzWeWpXyqs,2407
19
- pub_analyzer/internal/templates/author/report.typ,sha256=qwyD3aeVeQ4D5-oy3-zdmIzoRDA3FVgQl6qXVBRw2MQ,1378
20
- pub_analyzer/internal/templates/author/sources.typ,sha256=TQkohC5ZW4ZupymFRJGe1v6QVln9c17_H9rwQBnSFDY,593
21
- pub_analyzer/internal/templates/author/works.typ,sha256=aPV4woC55YpQT9qNh7h6Gu1bx-ypp_59f02_6D96zYA,1966
22
- pub_analyzer/internal/templates/author/works_extended.typ,sha256=iNxPyg1rKJDOPx5-zWf-94HXR-1HY9KR9Lt6VMO-vFU,3436
23
- pub_analyzer/main.py,sha256=gU3RfDWODRL7ID8yBmBzkY2aPZvHHAwiXkyUAjCjgcY,2204
24
- pub_analyzer/models/__init__.py,sha256=hvR6m379slQw7gSwnl_OFY21Ytv90mmmOe7bp8vZYkk,59
25
- pub_analyzer/models/author.py,sha256=9cZL4x2nVlJOQrPAccanAYthlgpe41ikN4pfT9eh__k,2435
26
- pub_analyzer/models/institution.py,sha256=g_2xs2Mq7tPY-48Prw3ooUe0RU2xh6SPA4gwVy6xCHs,2826
27
- pub_analyzer/models/report.py,sha256=8c-A8sX0a_smqjlirWRyTK9YbAAHLqPU5GNiGJcntAI,2575
28
- pub_analyzer/models/source.py,sha256=Fq6M5Wut7pOMoe2qATxasGLpaORleUuMXBaKDaFwiLc,453
29
- pub_analyzer/models/work.py,sha256=0Vd2UOajmzcFEWI-gtX7mcESSt8rRdpYc-fXglTd9GA,3593
30
- pub_analyzer/widgets/__init__.py,sha256=JALs1yGE06XYwjoY_0AG-Wt_pMknI1WEWNYK3atQaEA,18
31
- pub_analyzer/widgets/author/__init__.py,sha256=oiJibt7YiuGpovOnFIAlC9YwLO-0LN3SDgPWFL-LVPQ,22
32
- pub_analyzer/widgets/author/cards.py,sha256=O6QIr5V47mxb4sDLnTeRNvZErS1RpYkFK6GoQsHn4GI,2416
33
- pub_analyzer/widgets/author/core.py,sha256=URX0Z5afkyITCwEuMbKAcf5r0koFsV9tPwOsOma9C7U,5032
34
- pub_analyzer/widgets/author/tables.py,sha256=kowgw5_NIRKdLvL9b97q9PSugHQ__eMcLWfahKETZdA,793
35
- pub_analyzer/widgets/body.py,sha256=wN9cMcm1MaRTjuHYt8RWrG8D_ngg5cn-hVllvmzPX_o,972
36
- pub_analyzer/widgets/common/__init__.py,sha256=Fx5Gl17Rd_wueZjNElBtI1kCn-4DMSbC3lEA8u7PSto,287
37
- pub_analyzer/widgets/common/card.py,sha256=GGSaeuZt6AqY7kAvcVnWNMrhNPzr7do66YRQOYNSYvU,595
38
- pub_analyzer/widgets/common/filesystem.py,sha256=i0S3D6JJzPkF1Sqm83SSQlmYFKRf82SnoFgKVE6BdYI,6460
39
- pub_analyzer/widgets/common/filters.py,sha256=7KNRcSAED0EGxIZp6o1zxmGpzbmEM2yozDeYw-5ysSM,3373
40
- pub_analyzer/widgets/common/input.py,sha256=tK_UCtLDGHlI_NKpKjGkVu4gWiwMAIHixT9Im--Un4c,2649
41
- pub_analyzer/widgets/common/modal.py,sha256=otLQZotdTRTlSeTBknIxqRyduVY6lRZ5yW5u20SLcwI,882
42
- pub_analyzer/widgets/common/selector.py,sha256=Jh5bsn-zYmHGfEE3eO9XL6BsgKpLMGfg8FJur4gQmH0,1493
43
- pub_analyzer/widgets/institution/__init__.py,sha256=T_WDTDistaaq2obl1Cy_wZI5nTBiJNUnB-_OwBOLFTE,27
44
- pub_analyzer/widgets/institution/cards.py,sha256=OgLWP8M0xENa5NnY9NtmwjdqOwZJUN77fXSHFNT3BYU,2862
45
- pub_analyzer/widgets/institution/core.py,sha256=N6Rqy2aIeTdJXLc9KAVMrewdg4DOens3BPuXDYybaRQ,5279
46
- pub_analyzer/widgets/institution/tables.py,sha256=tXjrop9HGSkZGjYIOGQEOKVoyoeIGPd-8oSh08iuTRw,838
47
- pub_analyzer/widgets/report/__init__.py,sha256=oolRVss3JKaQHaQVDncjtxbLINRJ5Rd1ulW1uk7MLhc,54
48
- pub_analyzer/widgets/report/author.py,sha256=orlq-YSHeRcEyCXrQHiRpp2tdPC9SO1MjQ9uhNpU0-k,1227
49
- pub_analyzer/widgets/report/cards.py,sha256=uTcwFNXe2vQKjBxNZ9uxX8mrZYExTTdgKfZrtzXi__4,4818
50
- pub_analyzer/widgets/report/core.py,sha256=6ZO2mL0vKYbY3IQUQN1zh1KArjn_P6SgrVLOAoCqhJc,10902
51
- pub_analyzer/widgets/report/export.py,sha256=EQzF5fMZgHtLv3f5hITDgf9WW2XytRX_foeLWwcIHkM,4762
52
- pub_analyzer/widgets/report/institution.py,sha256=PDPE9fK18l9kKKch5sJrbnHHDss0kJ6bgVhM4hTyrAo,1297
53
- pub_analyzer/widgets/report/locations.py,sha256=s6O5v_jX_oPsKOf2fEujtDxLHQRVsqrIcgN4rZkRKkg,2892
54
- pub_analyzer/widgets/report/source.py,sha256=Clb9kR3YvihgmscavxSIsLvr4NGPjZGHLnUzWCtPOeM,2750
55
- pub_analyzer/widgets/report/work.py,sha256=T_5EwxL39R1aM_gsdwycxtiNsN7gZVR-0UsJi8Xoi8k,7873
56
- pub_analyzer/widgets/search/__init__.py,sha256=8C3IQtFkiIL8hlQbhJ_fAHM59-TAoe29wBAM2ptozhw,239
57
- pub_analyzer/widgets/search/core.py,sha256=4NvowtBcrH1fmob9kuF7v9Tq3Nd99jzB2S7xaD8OYeI,3861
58
- pub_analyzer/widgets/search/results.py,sha256=NPgglQEC7ZteO7VLv2WnI-fzoUdwpPPpTHJMD5zL-nI,3692
59
- pub_analyzer/widgets/sidebar.py,sha256=4SUuhiZQMC8zuyCfg00D4a2nK_KV23xp88xRGp9Qaig,2330
60
- pub_analyzer-0.2.0.dist-info/LICENSE,sha256=OPopoEowTMKqIea8Kbxk3TKdCQ97YkLvIknjTHE5oCI,1080
61
- pub_analyzer-0.2.0.dist-info/METADATA,sha256=ObcxRx67dmL54FHcpjpLeb1-qNop6uXGY0uIHAyXVWc,4376
62
- pub_analyzer-0.2.0.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
63
- pub_analyzer-0.2.0.dist-info/entry_points.txt,sha256=mVb_gUNX_-aVWHlNKLjcMAS8YLgNnSq9JLRXVJGIF2c,54
64
- pub_analyzer-0.2.0.dist-info/RECORD,,