BibexPy 2.0.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.
Files changed (171) hide show
  1. bibex_core/MergeDB.py +1189 -0
  2. bibex_core/__init__.py +13 -0
  3. bibex_core/modules/__init__.py +35 -0
  4. bibex_core/modules/api_utils.py +1172 -0
  5. bibex_core/modules/c1_utils.py +423 -0
  6. bibex_core/modules/file_utils.py +71 -0
  7. bibex_core/modules/ml_utils.py +332 -0
  8. bibex_core/modules/post_process.py +50 -0
  9. bibex_core/modules/stats_utils.py +216 -0
  10. bibex_core/scp2xlsx.py +235 -0
  11. bibex_core/wos2xlsx.py +159 -0
  12. bibex_core/xlsx2vos.py +185 -0
  13. bibexpy/__init__.py +9 -0
  14. bibexpy/__main__.py +6 -0
  15. bibexpy/_server/__init__.py +1 -0
  16. bibexpy/_server/config.py +92 -0
  17. bibexpy/_server/jobs/__init__.py +3 -0
  18. bibexpy/_server/jobs/runner.py +301 -0
  19. bibexpy/_server/main.py +211 -0
  20. bibexpy/_server/models/__init__.py +0 -0
  21. bibexpy/_server/models/project.py +25 -0
  22. bibexpy/_server/routers/__init__.py +0 -0
  23. bibexpy/_server/routers/audit.py +65 -0
  24. bibexpy/_server/routers/convert.py +101 -0
  25. bibexpy/_server/routers/disambiguate.py +177 -0
  26. bibexpy/_server/routers/downloads.py +26 -0
  27. bibexpy/_server/routers/enrich.py +42 -0
  28. bibexpy/_server/routers/export.py +116 -0
  29. bibexpy/_server/routers/export_folder.py +97 -0
  30. bibexpy/_server/routers/filter.py +131 -0
  31. bibexpy/_server/routers/jobs.py +72 -0
  32. bibexpy/_server/routers/merge.py +437 -0
  33. bibexpy/_server/routers/prepare.py +241 -0
  34. bibexpy/_server/routers/projects.py +49 -0
  35. bibexpy/_server/routers/quality.py +288 -0
  36. bibexpy/_server/routers/records.py +204 -0
  37. bibexpy/_server/routers/report.py +111 -0
  38. bibexpy/_server/routers/settings.py +383 -0
  39. bibexpy/_server/routers/system.py +209 -0
  40. bibexpy/_server/routers/tools.py +257 -0
  41. bibexpy/_server/routers/upload.py +110 -0
  42. bibexpy/_server/services/__init__.py +0 -0
  43. bibexpy/_server/services/analyses.py +364 -0
  44. bibexpy/_server/services/audit.py +340 -0
  45. bibexpy/_server/services/bibex_adapter.py +47 -0
  46. bibexpy/_server/services/bibtex_writer.py +104 -0
  47. bibexpy/_server/services/converter.py +205 -0
  48. bibexpy/_server/services/disambiguation/__init__.py +19 -0
  49. bibexpy/_server/services/disambiguation/blocking.py +581 -0
  50. bibexpy/_server/services/disambiguation/cache.py +47 -0
  51. bibexpy/_server/services/disambiguation/deepseek_client.py +203 -0
  52. bibexpy/_server/services/disambiguation/orcid.py +261 -0
  53. bibexpy/_server/services/disambiguation/pipeline.py +985 -0
  54. bibexpy/_server/services/disambiguation/similarity.py +91 -0
  55. bibexpy/_server/services/enricher.py +338 -0
  56. bibexpy/_server/services/exporter.py +112 -0
  57. bibexpy/_server/services/filter_engine.py +300 -0
  58. bibexpy/_server/services/merger.py +202 -0
  59. bibexpy/_server/services/methodology.py +102 -0
  60. bibexpy/_server/services/report_export.py +300 -0
  61. bibexpy/_server/services/ris_writer.py +62 -0
  62. bibexpy/_server/services/smart_merger.py +967 -0
  63. bibexpy/_server/services/storage.py +165 -0
  64. bibexpy/_web/404/index.html +1 -0
  65. bibexpy/_web/404.html +1 -0
  66. bibexpy/_web/_next/static/chunks/117-7ad5186126fa076d.js +2 -0
  67. bibexpy/_web/_next/static/chunks/156-75beffb8ae92a7f3.js +1 -0
  68. bibexpy/_web/_next/static/chunks/169-301c04fcec22686f.js +4 -0
  69. bibexpy/_web/_next/static/chunks/2-ecc1c36a5632ac61.js +1 -0
  70. bibexpy/_web/_next/static/chunks/244-be343e0f8aa00fb5.js +1 -0
  71. bibexpy/_web/_next/static/chunks/367-b7457c2b95f6932b.js +1 -0
  72. bibexpy/_web/_next/static/chunks/382-9cd163eed632e241.js +1 -0
  73. bibexpy/_web/_next/static/chunks/392-afa8bfa4c1a9893d.js +1 -0
  74. bibexpy/_web/_next/static/chunks/507-63607ded9f83c1aa.js +1 -0
  75. bibexpy/_web/_next/static/chunks/624-cae565632f47217d.js +1 -0
  76. bibexpy/_web/_next/static/chunks/739-a00c6b9c0f11813e.js +1 -0
  77. bibexpy/_web/_next/static/chunks/862-8e1bd5f93c082c02.js +1 -0
  78. bibexpy/_web/_next/static/chunks/app/_not-found/page-873ba59b5eb7c342.js +1 -0
  79. bibexpy/_web/_next/static/chunks/app/layout-0d5fc68ac8971a04.js +1 -0
  80. bibexpy/_web/_next/static/chunks/app/page-cf2bea5edc74459a.js +1 -0
  81. bibexpy/_web/_next/static/chunks/app/projects/[id]/convert/page-ab6dd645ae113b64.js +1 -0
  82. bibexpy/_web/_next/static/chunks/app/projects/[id]/disambiguate/page-dd98482cc47344e9.js +1 -0
  83. bibexpy/_web/_next/static/chunks/app/projects/[id]/enrich/page-4727e431468514e9.js +1 -0
  84. bibexpy/_web/_next/static/chunks/app/projects/[id]/export/page-f9005d164bb22cb0.js +1 -0
  85. bibexpy/_web/_next/static/chunks/app/projects/[id]/layout-07755fda55b3ae1f.js +1 -0
  86. bibexpy/_web/_next/static/chunks/app/projects/[id]/merge/page-45b95318ea7beccf.js +1 -0
  87. bibexpy/_web/_next/static/chunks/app/projects/[id]/records/page-bfad80457da9eb0b.js +1 -0
  88. bibexpy/_web/_next/static/chunks/app/projects/[id]/report/page-f05767e74158e995.js +1 -0
  89. bibexpy/_web/_next/static/chunks/app/projects/[id]/upload/page-8df78ca9cdecbcb8.js +1 -0
  90. bibexpy/_web/_next/static/chunks/app/projects/page-99960711ac6a13e9.js +1 -0
  91. bibexpy/_web/_next/static/chunks/app/settings/page-002df809d6c5a227.js +1 -0
  92. bibexpy/_web/_next/static/chunks/app/tools/page-27eee1c6a590859f.js +1 -0
  93. bibexpy/_web/_next/static/chunks/fd9d1056-f2718be92181f426.js +1 -0
  94. bibexpy/_web/_next/static/chunks/framework-f66176bb897dc684.js +1 -0
  95. bibexpy/_web/_next/static/chunks/main-app-d138a6e2f8c847f6.js +1 -0
  96. bibexpy/_web/_next/static/chunks/main-c4b9ddbf514503ef.js +1 -0
  97. bibexpy/_web/_next/static/chunks/pages/_app-72b849fbd24ac258.js +1 -0
  98. bibexpy/_web/_next/static/chunks/pages/_error-7ba65e1336b92748.js +1 -0
  99. bibexpy/_web/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  100. bibexpy/_web/_next/static/chunks/webpack-c81f7fd28659d64f.js +1 -0
  101. bibexpy/_web/_next/static/css/1c4638f3e39cf127.css +3 -0
  102. bibexpy/_web/_next/static/ypx2IQAkZiSaFiKWnzZGB/_buildManifest.js +1 -0
  103. bibexpy/_web/_next/static/ypx2IQAkZiSaFiKWnzZGB/_ssgManifest.js +1 -0
  104. bibexpy/_web/images/PROMPTS.md +83 -0
  105. bibexpy/_web/images/about-illustration.png +0 -0
  106. bibexpy/_web/images/authors/alperen-sahin.jpg +0 -0
  107. bibexpy/_web/images/authors/burak-can-kara.jpg +0 -0
  108. bibexpy/_web/images/authors/taskin-dirsehan.jpg +0 -0
  109. bibexpy/_web/images/bibexpy-logo-full.png +0 -0
  110. bibexpy/_web/images/bibexpy-logo-header.png +0 -0
  111. bibexpy/_web/images/bibexpy-logo-in.png +0 -0
  112. bibexpy/_web/images/bibexpy-logo.webp +0 -0
  113. bibexpy/_web/images/hero-illustration.png +0 -0
  114. bibexpy/_web/images/loader.gif +0 -0
  115. bibexpy/_web/images/workflow-diagram.png +0 -0
  116. bibexpy/_web/index.html +1 -0
  117. bibexpy/_web/index.txt +11 -0
  118. bibexpy/_web/projects/_/convert/index.html +1 -0
  119. bibexpy/_web/projects/_/convert/index.txt +12 -0
  120. bibexpy/_web/projects/_/disambiguate/index.html +1 -0
  121. bibexpy/_web/projects/_/disambiguate/index.txt +12 -0
  122. bibexpy/_web/projects/_/enrich/index.html +1 -0
  123. bibexpy/_web/projects/_/enrich/index.txt +12 -0
  124. bibexpy/_web/projects/_/export/index.html +1 -0
  125. bibexpy/_web/projects/_/export/index.txt +12 -0
  126. bibexpy/_web/projects/_/merge/index.html +1 -0
  127. bibexpy/_web/projects/_/merge/index.txt +12 -0
  128. bibexpy/_web/projects/_/records/index.html +1 -0
  129. bibexpy/_web/projects/_/records/index.txt +12 -0
  130. bibexpy/_web/projects/_/report/index.html +1 -0
  131. bibexpy/_web/projects/_/report/index.txt +12 -0
  132. bibexpy/_web/projects/_/upload/index.html +1 -0
  133. bibexpy/_web/projects/_/upload/index.txt +12 -0
  134. bibexpy/_web/projects/index.html +1 -0
  135. bibexpy/_web/projects/index.txt +11 -0
  136. bibexpy/_web/settings/index.html +1 -0
  137. bibexpy/_web/settings/index.txt +11 -0
  138. bibexpy/_web/tools/README.md +65 -0
  139. bibexpy/_web/tools/bibexcel.svg +6 -0
  140. bibexpy/_web/tools/bibliometrix.png +0 -0
  141. bibexpy/_web/tools/biblioshiny.svg +12 -0
  142. bibexpy/_web/tools/citavi.svg +6 -0
  143. bibexpy/_web/tools/citespace.svg +7 -0
  144. bibexpy/_web/tools/citnetexplorer.svg +8 -0
  145. bibexpy/_web/tools/endnote.svg +6 -0
  146. bibexpy/_web/tools/excel.svg +1 -0
  147. bibexpy/_web/tools/gephi.svg +66 -0
  148. bibexpy/_web/tools/histcite.svg +7 -0
  149. bibexpy/_web/tools/index.html +1 -0
  150. bibexpy/_web/tools/index.txt +11 -0
  151. bibexpy/_web/tools/jabref.svg +122 -0
  152. bibexpy/_web/tools/latex.svg +1 -0
  153. bibexpy/_web/tools/mendeley.svg +1 -0
  154. bibexpy/_web/tools/openrefine.svg +15 -0
  155. bibexpy/_web/tools/overleaf.svg +1 -0
  156. bibexpy/_web/tools/papers.svg +7 -0
  157. bibexpy/_web/tools/powerbi.svg +1 -0
  158. bibexpy/_web/tools/python.svg +1 -0
  159. bibexpy/_web/tools/r.svg +1 -0
  160. bibexpy/_web/tools/refworks.svg +5 -0
  161. bibexpy/_web/tools/scite.svg +5 -0
  162. bibexpy/_web/tools/tableau.svg +1 -0
  163. bibexpy/_web/tools/vosviewer.png +0 -0
  164. bibexpy/_web/tools/zotero.svg +1 -0
  165. bibexpy/cli.py +242 -0
  166. bibexpy-2.0.0.dist-info/METADATA +105 -0
  167. bibexpy-2.0.0.dist-info/RECORD +171 -0
  168. bibexpy-2.0.0.dist-info/WHEEL +5 -0
  169. bibexpy-2.0.0.dist-info/entry_points.txt +2 -0
  170. bibexpy-2.0.0.dist-info/licenses/LICENSE +674 -0
  171. bibexpy-2.0.0.dist-info/top_level.txt +2 -0
@@ -0,0 +1,122 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Generator: Adobe Illustrator 16.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+
4
+ <svg
5
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
6
+ xmlns:cc="http://creativecommons.org/ns#"
7
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
8
+ xmlns="http://www.w3.org/2000/svg"
9
+ xmlns:xlink="http://www.w3.org/1999/xlink"
10
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12
+ version="1.1"
13
+ id="Ebene_1"
14
+ x="0px"
15
+ y="0px"
16
+ width="205"
17
+ height="205"
18
+ viewBox="0 0 205.00001 205.00001"
19
+ enable-background="new 0 0 350.024 350.024"
20
+ xml:space="preserve"
21
+ inkscape:version="0.48.5 r10040"
22
+ sodipodi:docname="without-bg.svg"
23
+ inkscape:export-filename="D:\forschung\eclipse-projects\jabref-repos\jabref-admin\files-logo-contest\version2\exported bitmaps\JabRef-icon-32.png"
24
+ inkscape:export-xdpi="14.04878"
25
+ inkscape:export-ydpi="14.04878"><metadata
26
+ id="metadata3041"><rdf:RDF><cc:Work
27
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
28
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
29
+ id="defs3039">
30
+ <defs
31
+ id="defs3017">
32
+ <rect
33
+ height="350.02399"
34
+ width="350.02399"
35
+ id="SVGID_1_"
36
+ x="0"
37
+ y="0" />
38
+ </defs>
39
+ <clipPath
40
+ id="SVGID_2_">
41
+ <use
42
+ id="use3021"
43
+ overflow="visible"
44
+ xlink:href="#SVGID_1_"
45
+ style="overflow:visible"
46
+ x="0"
47
+ y="0"
48
+ width="350.02399"
49
+ height="350.02399" />
50
+ </clipPath>
51
+
52
+
53
+
54
+
55
+
56
+
57
+
58
+ </defs><sodipodi:namedview
59
+ pagecolor="#ffffff"
60
+ bordercolor="#666666"
61
+ borderopacity="1"
62
+ objecttolerance="10"
63
+ gridtolerance="10"
64
+ guidetolerance="10"
65
+ inkscape:pageopacity="0"
66
+ inkscape:pageshadow="2"
67
+ inkscape:window-width="1536"
68
+ inkscape:window-height="801"
69
+ id="namedview3037"
70
+ showgrid="false"
71
+ inkscape:zoom="2.696958"
72
+ inkscape:cx="28.023199"
73
+ inkscape:cy="104.45913"
74
+ inkscape:window-x="-8"
75
+ inkscape:window-y="-8"
76
+ inkscape:window-maximized="1"
77
+ inkscape:current-layer="Ebene_1"
78
+ fit-margin-top="0"
79
+ fit-margin-left="0"
80
+ fit-margin-right="0"
81
+ fit-margin-bottom="0" />
82
+ <g
83
+ id="g4308"
84
+ transform="translate(4.464505,-1.0189586)"><path
85
+ transform="translate(-76.976,-71.492991)"
86
+ clip-path="url(#SVGID_2_)"
87
+ d="M 169.701,159.59 C 165.76,106.354 90.925,87.102 90.754,88.131 c -0.138,6.655 -0.277,13.309 -0.415,19.964 17.786,3.616 61.666,20.094 79.362,51.495"
88
+ id="path3025"
89
+ inkscape:connector-curvature="0"
90
+ style="fill:#4f5f8f;fill-opacity:1" /><path
91
+ transform="translate(-76.976,-71.492991)"
92
+ clip-path="url(#SVGID_2_)"
93
+ d="M 168.724,133.743 C 165.32,91.685 107.608,72.901 107.501,73.547 c -0.041,3.517 -0.081,7.035 -0.121,10.553 18.138,7.541 47.675,24.698 61.344,49.643"
94
+ id="path3027"
95
+ inkscape:connector-curvature="0"
96
+ style="fill:#4f5f8f;fill-opacity:1" /><path
97
+ transform="translate(-76.976,-71.492991)"
98
+ clip-path="url(#SVGID_2_)"
99
+ d="m 139.626,137.75 c -25.869,-17.587 -58.458,-22.145 -58.582,-21.399 -0.316,12.413 -0.631,24.826 -0.946,37.239 37.889,2.181 40.156,25.749 37.868,40.824 l -39.112,12.556 -1.878,69.523 68.665,-26.614 c 8.02,-3.279 16.04,-6.436 24.061,-9.326 v -47.922 c 0,-21.406 -10.904,-41.845 -30.076,-54.881"
100
+ id="path3029"
101
+ inkscape:connector-curvature="0"
102
+ style="fill:#4f5f8f;fill-opacity:1" /><path
103
+ transform="translate(-76.976,-71.492991)"
104
+ clip-path="url(#SVGID_2_)"
105
+ d="m 180.322,159.59 c 3.941,-53.236 78.776,-72.488 78.947,-71.459 0.138,6.655 0.277,13.309 0.415,19.964 -17.786,3.616 -61.665,20.094 -79.362,51.495"
106
+ id="path3031"
107
+ inkscape:connector-curvature="0"
108
+ style="fill:#4f5f8f;fill-opacity:1" /><path
109
+ transform="translate(-76.976,-71.492991)"
110
+ clip-path="url(#SVGID_2_)"
111
+ d="m 181.3,133.743 c 3.404,-42.058 61.116,-60.842 61.223,-60.196 0.041,3.517 0.081,7.035 0.121,10.553 -18.138,7.541 -47.675,24.698 -61.344,49.643"
112
+ id="path3033"
113
+ inkscape:connector-curvature="0"
114
+ style="fill:#4f5f8f;fill-opacity:1" /><path
115
+ transform="translate(-76.976,-71.492991)"
116
+ clip-path="url(#SVGID_2_)"
117
+ d="m 210.397,137.75 c 25.869,-17.587 58.458,-22.145 58.582,-21.399 0.316,12.413 0.632,24.826 0.946,37.239 -37.889,2.181 -40.156,25.749 -37.868,40.824 l 39.112,12.556 1.878,69.523 -68.665,-26.614 c -8.02,-3.279 -16.04,-6.436 -24.061,-9.326 v -47.922 c 0.001,-21.406 10.905,-41.845 30.076,-54.881"
118
+ id="path3035"
119
+ inkscape:connector-curvature="0"
120
+ style="fill:#4f5f8f;fill-opacity:1" /></g>
121
+ </svg>
122
+
@@ -0,0 +1 @@
1
+ <svg fill="#008080" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LaTeX</title><path d="M2.176 2.814c.233.42.476.78.73 1.09.247-.013 1.132.456 1.312.523.508.282 1.063.63 1.567.966.505.337.96.662 1.272.9.156.12.278.218.352.286a.483.483 0 01.078.082.08.08 0 01.01.021.06.06 0 01-.004.047.057.057 0 01-.04.03.077.077 0 01-.028 0c-.057 0-.203-.163-.497-.415a23.474 23.474 0 00-2.759-1.827c-.504-.28-.956-.542-1.264-.613a2.322 2.322 0 00-.36-.025 2.706 2.706 0 00-.788.133c.494.414.91.716 1.28.949-.57-.182-1.182-.21-1.902.133.526.329.967.567 1.354.745 1.103.156 2.258.696 3.224 1.309.483.307.904.615 1.219.867.157.125.29.237.39.328.098.091.174.154.197.21.03.073-.019.104-.084.058-.032-.022-.088-.102-.184-.191a7.35 7.35 0 00-.384-.327c-.312-.25-.729-.552-1.209-.857-.893-.562-2.232-1.013-3.173-1.397-.602-.11-1.225-.06-1.906.39.449.2.837.349 1.182.463.812 0 1.892.365 2.935.922 1.042.556 2.04 1.214 2.523 1.774.066.077-.016.126-.074.07-.52-.495-1.463-1.204-2.498-1.756-.639-.337-2.153-1.01-2.886-1.01l.004.002c-.567.02-1.13.195-1.679.716.477.118.885.196 1.244.249-.44.088-.87.3-1.289.722.324.07.616.122.882.162-.328.159-.639.404-.923.78.373.03.703.042 1 .044-.36.166-.696.43-.996.85.533.027.98.025 1.364.003-.422.172-.812.464-1.145.968.662.01 1.188-.022 1.628-.076l-.006.002c.99-.073 2.297.127 2.962.847.052.057-.024.118-.072.074-.648-.58-1.493-.827-2.89-.921h-.002c-.543.149-1.046.446-1.46 1.074.536.008.982-.013 1.366-.05-.469.257-.873.644-1.139 1.306.483-.092.888-.19 1.237-.292-.363.265-.668.636-.873 1.194.324-.072.612-.146.871-.221a2.519 2.519 0 00-.513 1.095c.352-.13.655-.254.926-.377-.257.3-.453.681-.55 1.19.495-.199.899-.388 1.238-.568-.31.333-.543.76-.635 1.356a11.816 11.816 0 001.442-.744c-.433.362-.764.843-.879 1.587.788-.348 1.339-.663 1.767-.955-.184.372-.282.806-.235 1.348.762-.584 1.243-1.056 1.602-1.473-.024.269-.003.56.077.884.546-.939 1.089-1.212 1.65-1.526-.895.451-.762.79-.762 1.184.683-.72 1.635-1.482 1.927-1.96-.39.585-.547 1.14-.65 1.63-1.993 1.054-3.207 1.329-4.568 1.75.528.194 1.093.383.859.652l-.624.622c.399-.124.805-.3 1.158-.059-.035.327-.447.492-.8.683.621-.224.756-.172.92-.12.081.393-.203.603-.388.862 1.565-1.19 3.606-2.13 5.044-2.522 2.022-.681 4.63-1.389 5.339-3.115l.712-2.847-.004.004c-.111-.034-.246-.063-.35-.133a.651.651 0 01-.235-.297c-.252.065-.44.03-.56-.088-.117-.117-.167-.296-.203-.491-.203.041-.362.016-.467-.077-.116-.101-.17-.26-.198-.444l-.008-.039.037-.015a.842.842 0 00.302-.194.257.257 0 00.07-.225l-.006-.037.03-.016c.163-.093.345-.169.428-.28a.274.274 0 00.053-.21.88.88 0 00-.155-.357l-.027-.04.04-.027c.118-.09.244-.179.308-.26.032-.04.048-.076.047-.11 0-.033-.015-.07-.064-.117l-.098-.094.135.006c.213.01.395-.007.538-.053a.504.504 0 00.274-.197c-.007-.033-.02-.063-.02-.098a.484.484 0 01.967 0c0 .044-.015.084-.026.125.177.014.347.01.507-.06l.002.001.035-.013c.236-.085.334.045.72-.456-1.69-2.19-4.157-.635-4.977 1.622-.21.576-1.405.578-1.751 0-1.37-2.95-5.53-6.068-9.07-7.218zm.86 2.145c.906.293 1.913.782 2.77 1.328.43.273.813.543 1.114.779.301.236.566.473.62.575.054.102 0 .14-.082.06-.081-.078-.303-.32-.6-.553-.298-.234-.68-.505-1.106-.777-.775-.49-1.982-.958-2.716-1.412zm-1.7 2.7c1.116.014 2.35.447 3.434.997.541.275 1.023.567 1.395.83.372.263.672.524.734.657.061.134-.02.13-.087.055a4.401 4.401 0 00-.704-.626 11.47 11.47 0 00-1.385-.826C3.76 8.264 2.439 7.82 1.336 7.66zm14.916.772a.381.381 0 100 .762.381.381 0 000-.762zM1.7 8.478c.822.072 1.72.368 2.534.75 1.086.509 2.035 1.158 2.434 1.667.035.045-.014.131-.08.062-.428-.44-1.322-1.131-2.397-1.635-.913-.421-2.282-.87-3.262-.78.251-.03.497-.088.771-.064zm16.339.01c-.366.475-.53.423-.703.464.094.43.35.586.585.77l-.06.012c2.315-.447 4.186-.286 6.139-.236l-5.961-1.01zm-.178 1.246h-.002l-.004.016.006-.016zm-.625-.757c-.183.074-.373.076-.563.059a.477.477 0 01-.42.26.483.483 0 01-.435-.278.609.609 0 01-.274.188c-.139.045-.308.057-.493.055.02.035.054.068.055.104a.273.273 0 01-.069.174c-.073.092-.189.17-.295.248.087.141.137.26.149.362a.39.39 0 01-.07.284c-.106.14-.288.21-.439.293a.374.374 0 01-.09.268.89.89 0 01-.297.198c.027.156.074.283.154.354.086.076.211.103.425.047l.055-.014.01.055c.033.207.088.385.187.483.1.099.244.135.503.055l.049-.015.016.048c.05.142.12.223.209.282.087.06.247.112.358.147.798-.869 1.525-1.772 1.884-2.86-.225-.177-.506-.338-.609-.797zm-16.23.386c1.165-.08 2.283.196 3.202.626.92.43 1.658.939 1.974 1.307.075.087-.019.12-.072.072a8.187 8.187 0 00-1.947-1.29c-.904-.414-2.193-.644-3.157-.715zm.864.802c.61.02 1.24.155 1.806.352.756.262 1.421.614 1.747.98.045.05-.007.127-.074.069-.349-.304-.961-.693-1.706-.951-.574-.195-1.613-.369-2.268-.397.197-.022.292-.06.495-.053zm1.05 1.788c.423.034.886.133 1.341.407.043.026.049.136-.049.09-.856-.402-1.326-.49-2.457-.31.386-.128.74-.221 1.164-.187zm-.04.788c.4-.035.784-.002 1.297.204.044.018.08.126-.033.094-.857-.243-1.167-.328-2.287.104.28-.229.622-.366 1.023-.402zm1.285.687c.317-.023.635-.026.934.006.052.006.055.105-.006.102a7.87 7.87 0 00-1.837.115c-.243.046-.423.043-1.405.458.287-.233.794-.452 1.385-.56a8.91 8.91 0 01.93-.12zm1.28.49c.099.003.062.104.006.103-.728-.01-1.304.132-1.875.295a9.78 9.78 0 00-1.318.525c.283-.23.713-.457 1.291-.622.579-.166 1.248-.326 1.896-.302zm.528.398c.036-.005.105.084.018.1-.73.137-1.244.267-1.794.454-.216.074-.58.207-1.243.587.26-.269.656-.492 1.213-.68.558-.19 1.196-.37 1.806-.46zm.311.507c.075-.012.097.087.02.102-1.217.241-1.76.556-2.54 1.144.504-.523 1.297-1.051 2.52-1.246zm.595.448c.087-.013.11.087.021.1-.872.13-1.477.553-2.255 1.33.295-.493 1.004-1.24 2.234-1.43zm.372.39c.046-.006.114.073.023.1a2.634 2.634 0 00-.669.3c-.182.118-.3.2-.597.507.111-.245.296-.434.542-.59.247-.157.509-.293.7-.317z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="#9D1620" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Mendeley</title><path d="M12.0037 9.1684h.019a2.355 2.355 0 011.5038 4.1655 1.8076 1.8076 0 01-.8561.452 2.348 2.348 0 01-.6487.0923h-.019c-.2246 0-.4421-.033-.6487-.0922a1.8126 1.8126 0 01-.8561-.4521 2.346 2.346 0 01-.8511-1.8106 2.358 2.358 0 012.3569-2.355m-9.9731 9.474c1.2652.1583 2.388-.762 2.5073-2.0573a2.4442 2.4442 0 00-.2136-1.236c-1.7724-3.8889 6.9726-3.978 5.4949-.3078l-.01.016c-.6988 1.1178-.3198 2.5695.841 3.2402.4272.2486.9003.3508 1.3625.3308.4622.02.9354-.0822 1.3624-.3308 1.161-.6717 1.54-2.1224.8412-3.2402l-.01-.016c-1.4778-3.6703 7.2682-3.581 5.4938.3077a2.4462 2.4462 0 00-.2126 1.2361c.1203 1.2953 1.2422 2.2156 2.5083 2.0572a2.345 2.345 0 001.4246-.7368s.5885-.4883.5795-1.7334c-.008-1.0156-.5795-1.578-.5795-1.578a2.2116 2.2116 0 00-1.8145-.6456c-1.6231-.036-1.8637-1.3073-1.4056-3.7033.1685-.4251.2416-.8802.2266-1.3354a3.4166 3.4166 0 00-2.1304-3.2953c-.039-.017-.0782-.03-.1183-.0461a1.5138 1.5138 0 00-.1343-.0461 3.4156 3.4156 0 00-4.004 1.4526c-.8171.8973-1.187 1.4417-2.0272 1.4417-.799 0-1.211-.5444-2.0271-1.4417a3.4126 3.4126 0 00-4.1374-1.4075c-.0401.016-.0792.029-.1193.0461a3.4156 3.4156 0 00-2.1294 3.2953c-.016.4552.0582.9103.2256 1.3354.4581 2.397.2175 3.6672-1.4045 3.7033-.795-.0852-1.3885.2426-1.988.8431-.6016.5995-.5514 2.2056 0 2.9063.4.5103.9423.8632 1.598.9454"/></svg>
@@ -0,0 +1,15 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 47.66 186.63 139.97">
3
+ <title>OpenRefine logo (2018)</title>
4
+ <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
5
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
6
+ <polygon id="Stroke-25" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="46.6561 94.3132 46.6561 47.6562 93.3131 47.6562" fill="#00dcff"/>
7
+ <polygon id="Stroke-27" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="46.6561 94.3132 46.6561 47.6562 0.0001 94.3132" fill="#00ffff"/>
8
+ <polygon id="Stroke-29" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="139.9696 94.3132 139.9696 47.6562 93.3136 47.6562" fill="#00b4ff"/>
9
+ <polygon id="Stroke-31" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="46.6561 94.3132 93.3131 47.6562 139.9691 94.3132" fill="#00c8ff"/>
10
+ <polygon id="Stroke-33" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="139.9696 94.3132 139.9696 47.6562 186.6256 94.3132" fill="#00a0ff"/>
11
+ <polygon id="Stroke-35" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="46.6561 94.3132 0.0001 94.3132 93.3131 187.6262" fill="#00c8ff"/>
12
+ <polygon id="Stroke-37" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="139.9696 94.3132 46.6566 94.3132 93.3136 187.6262" fill="#00a0ff"/>
13
+ <polygon id="Stroke-39" stroke="none" stroke-width="4px" stroke-linecap="round" stroke-linejoin="round" points="186.6258 94.3132 139.9698 94.3132 93.3138 187.6262" fill="#0078ff"/>
14
+ </g>
15
+ </svg>
@@ -0,0 +1 @@
1
+ <svg fill="#47A141" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Overleaf</title><path d="M22.3515.7484C19.1109-.5101 7.365-.982 7.3452 6.0266c-3.4272 2.194-5.6967 5.768-5.6967 9.598a8.373 8.373 0 0 0 13.1225 6.898 8.373 8.373 0 0 0-1.7668-14.7194c-.6062-.2339-1.9234-.6481-2.9753-.559-1.5007.9544-3.3308 2.9155-4.1949 4.8693 2.5894-3.082 7.5046-2.425 9.1937 1.2287 1.6892 3.6538-.9944 7.8237-5.0198 7.7998a5.4995 5.4995 0 0 1-4.1949-1.9328c-1.485-1.7483-1.8678-3.6444-1.5615-5.4975 1.057-6.4947 8.759-10.1894 14.486-11.6094-1.8677.989-5.2373 2.6134-7.5948 4.3837C18.015 9.1382 19.1308 3.345 22.3515.7484z"/></svg>
@@ -0,0 +1,7 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
+ <title id="title">Papers</title>
3
+ <rect width="64" height="64" rx="14" fill="#ECFEFF"/>
4
+ <path d="M21 14h17l9 9v27H21V14Z" fill="#0891B2"/>
5
+ <path d="M38 14v10h9" fill="#67E8F9"/>
6
+ <path d="M27 31h14M27 38h14M27 45h9" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round"/>
7
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#F2C811" d="M10 12a1 1 0 0 1 1 1v11H4a1 1 0 0 1-1-1V13a1 1 0 0 1 1-1zm-2-.5V7a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v17h-4.5V13a1.5 1.5 0 0 0-1.5-1.5zm5-6V1a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v22a1 1 0 0 1-1 1h-3.5V7A1.5 1.5 0 0 0 15 5.5z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="#3776AB" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Python</title><path d="M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-.59.14-.5.22-.41.27-.33.32-.27.35-.2.36-.15.37-.1.35-.07.32-.04.27-.02.21v3.06H3.17l-.21-.03-.28-.07-.32-.12-.35-.18-.36-.26-.36-.36-.35-.46-.32-.59-.28-.73-.21-.88-.14-1.05-.05-1.23.06-1.22.16-1.04.24-.87.32-.71.36-.57.4-.44.42-.33.42-.24.4-.16.36-.1.32-.05.24-.01h.16l.06.01h8.16v-.83H6.18l-.01-2.75-.02-.37.05-.34.11-.31.17-.28.25-.26.31-.23.38-.2.44-.18.51-.15.58-.12.64-.1.71-.06.77-.04.84-.02 1.27.05zm-6.3 1.98l-.23.33-.08.41.08.41.23.34.33.22.41.09.41-.09.33-.22.23-.34.08-.41-.08-.41-.23-.33-.33-.22-.41-.09-.41.09zm13.09 3.95l.28.06.32.12.35.18.36.27.36.35.35.47.32.59.28.73.21.88.14 1.04.05 1.23-.06 1.23-.16 1.04-.24.86-.32.71-.36.57-.4.45-.42.33-.42.24-.4.16-.36.09-.32.05-.24.02-.16-.01h-8.22v.82h5.84l.01 2.76.02.36-.05.34-.11.31-.17.29-.25.25-.31.24-.38.2-.44.17-.51.15-.58.13-.64.09-.71.07-.77.04-.84.01-1.27-.04-1.07-.14-.9-.2-.73-.25-.59-.3-.45-.33-.34-.34-.25-.34-.16-.33-.1-.3-.04-.25-.02-.2.01-.13v-5.34l.05-.64.13-.54.21-.46.26-.38.3-.32.33-.24.35-.2.35-.14.33-.1.3-.06.26-.04.21-.02.13-.01h5.84l.69-.05.59-.14.5-.21.41-.28.33-.32.27-.35.2-.36.15-.36.1-.35.07-.32.04-.28.02-.21V6.07h2.09l.14.01zm-6.47 14.25l-.23.33-.08.41.08.41.23.33.33.23.41.08.41-.08.33-.23.23-.33.08-.41-.08-.41-.23-.33-.33-.23-.41-.08-.41.08z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="#276DC3" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>R</title><path d="M12 2.746c-6.627 0-12 3.599-12 8.037 0 3.897 4.144 7.144 9.64 7.88V16.26c-2.924-.915-4.925-2.755-4.925-4.877 0-3.035 4.084-5.494 9.12-5.494 5.038 0 8.757 1.683 8.757 5.494 0 1.976-.999 3.379-2.662 4.272.09.066.174.128.258.216.169.149.25.363.372.544 2.128-1.45 3.44-3.437 3.44-5.631 0-4.44-5.373-8.038-12-8.038zm-2.111 4.99v13.516l4.093-.002-.002-5.291h1.1c.225 0 .321.066.549.25.272.22.715.982.715.982l2.164 4.063 4.627-.002-2.864-4.826s-.086-.193-.265-.383a2.22 2.22 0 00-.582-.416c-.422-.214-1.149-.434-1.149-.434s3.578-.264 3.578-3.826c0-3.562-3.744-3.63-3.744-3.63zm4.127 2.93l2.478.002s1.149-.062 1.149 1.127c0 1.165-1.149 1.17-1.149 1.17h-2.478zm1.754 6.119c-.494.049-1.012.079-1.54.088v1.807a16.622 16.622 0 002.37-.473l-.471-.891s-.108-.183-.248-.394c-.039-.054-.08-.098-.111-.137z"/></svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
+ <title id="title">RefWorks</title>
3
+ <rect width="64" height="64" rx="14" fill="#F5F3FF"/>
4
+ <path d="M18 17h15.6c7.1 0 11.4 3.8 11.4 10.1 0 4.2-2 7.3-5.5 8.9L47 50h-8.8l-6.5-12.4h-5.9V50H18V17Zm15 14c2.8 0 4.5-1.4 4.5-3.9s-1.7-3.9-4.5-3.9h-7.2V31H33Z" fill="#7C3AED"/>
5
+ </svg>
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-labelledby="title">
2
+ <title id="title">Scite</title>
3
+ <rect width="64" height="64" rx="14" fill="#EEF2FF"/>
4
+ <path d="M44 22.3c-2.5-1.4-5.7-2.3-9.4-2.3-4.1 0-6.2 1.2-6.2 3.3 0 2.2 2.5 2.8 7.2 3.8 6.3 1.3 10.7 3.6 10.7 10.2 0 6.8-5.4 10.8-14.1 10.8-5 0-9.5-1.2-12.5-3.1v-7.6c3.2 2.3 7.3 3.7 11.6 3.7 4.3 0 6.5-1.2 6.5-3.5 0-2.4-2.4-3.1-7.4-4.1-6.2-1.3-10.5-3.4-10.5-9.8 0-6.5 5.2-10.5 13.8-10.5 4.4 0 7.9.8 10.3 2.1v7Z" fill="#4F46E5"/>
5
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="#E97627" d="M11.654.174v2.203H9.682v.58h1.972V5.16h.696V2.957h1.97v-.58h-1.97V.174h-.348zm6.03 2.262l-.002 1.623v1.623h-2.957v.927h2.957v3.188h1.043l.011-1.582l.02-1.576l1.465-.02l1.46-.01v-.927h-2.953V2.436h-.522zm-12.407.06v3.19H2.291v.925h2.986v3.19h.985V6.61h3.013v-.925H6.262V2.496H5.77zm6.086 5.27v3.593H8.06v1.188h3.304v3.596h1.28v-3.596h3.309v-1.188h-3.31V7.766h-.637zm9.721 1.55v2.221h-2.012v.811h2.012v2.261h.887v-2.261H24v-.811h-2.029v-2.22h-.422zm-19.111.131v2.174H0v.621h1.973v2.194h.667v-2.194h2v-.62H2.609V9.446h-.318zm15.709 4.516v3.254h-3.016v.927h3.016v3.217h1.072v-3.216h2.986v-.928h-2.986v-3.254h-.533zm-12.463.008v3.246H2.262v.928h2.957v3.189H6.32v-3.189h2.955v-.928H6.32V13.97h-.55zm6.316 4.578l.002 1.103v1.1H9.566v.812h1.971v2.262h.928l.012-1.119l.017-1.143h1.969v-.812h-2v-2.203h-.465z"/></svg>
Binary file
@@ -0,0 +1 @@
1
+ <svg fill="#CC2936" role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Zotero</title><path d="M21.231 2.462 7.18 20.923h14.564V24H2.256v-2.462L16.308 3.076H2.975V0h18.256v2.462z"/></svg>
bibexpy/cli.py ADDED
@@ -0,0 +1,242 @@
1
+ """BibexPy v2 — komut satırı başlatıcı.
2
+
3
+ `pip install bibexpy` sonrası `bibexpy` komutu bu modülü çağırır:
4
+
5
+ bibexpy # ~/.bibexpy/storage, tarayıcı otomatik açılır, port 8001
6
+ bibexpy --port 8080 # özel port
7
+ bibexpy --no-browser # sadece sunucu, tarayıcı açma
8
+ bibexpy --storage ./data # bu çalıştırma için özel depolama klasörü
9
+ bibexpy --version # sürüm
10
+
11
+ Mimari:
12
+ • _web/ — Next.js static export (BIBEXPY_FRONTEND_DIST ile main.py'ye verilir)
13
+ • _server/ — FastAPI uygulaması; sys.path'e eklenince flat import'lar çözülür
14
+ • bibex_core — wheel'da ikinci top-level paket olarak kurulu
15
+
16
+ Node.js / npm GEREKMEZ — UI önceden derlenmiş statik dosyalardır.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import os
23
+ import re
24
+ import socket
25
+ import sys
26
+ import threading
27
+ import time
28
+ import urllib.request
29
+ import webbrowser
30
+ from pathlib import Path
31
+
32
+ # Wheel içindeki bu paketin kökü (cli.py'nin bulunduğu dizin).
33
+ _PKG_DIR = Path(__file__).resolve().parent
34
+ _WEB_DIR = _PKG_DIR / "_web"
35
+ _SERVER_DIR = _PKG_DIR / "_server"
36
+
37
+ __version__ = "2.0.0"
38
+ __codename__ = "Helium" # v2 surum kod adi (v1 "Hydrogen"in ardili; H -> He)
39
+
40
+
41
+ # Ilk-calistirma .env sablonu — kullanici anahtarlari nereye gireceğini gorur.
42
+ # Hepsi opsiyonel; anahtarsiz da calisir (enrichment/LLM graceful skip).
43
+ _ENV_TEMPLATE = """\
44
+ # BibexPy ayarlari — API anahtarlari (hepsi OPSIYONEL).
45
+ # Crossref, OpenAlex ve Unpaywall UCRETSIZdir; yalniz Scopus anahtar ister.
46
+
47
+ # --- Zenginlestirme kaynaklari (opsiyonel) ---
48
+ SCOPUS_API_KEY=
49
+ CROSSREF_EMAIL=
50
+ UNPAYWALL_EMAIL=
51
+ SEMANTIC_SCHOLAR_API_KEY=
52
+
53
+ # --- LLM (disambiguation icin, opsiyonel) ---
54
+ # Saglayici: deepseek | openai | openrouter | custom
55
+ LLM_PROVIDER=deepseek
56
+ LLM_API_KEY=
57
+ LLM_BASE_URL=https://api.deepseek.com
58
+ LLM_MODEL=deepseek-v4-flash
59
+ """
60
+
61
+
62
+ def _write_env_template(env_file: Path) -> None:
63
+ """`.env` yoksa yorumlu bir sablon yaz (varsa dokunma)."""
64
+ if env_file.exists():
65
+ return
66
+ try:
67
+ env_file.write_text(_ENV_TEMPLATE, encoding="utf-8")
68
+ except OSError:
69
+ pass
70
+
71
+
72
+ def _port_is_free(host: str, port: int) -> bool:
73
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
74
+ s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
75
+ try:
76
+ s.bind((host, port))
77
+ return True
78
+ except OSError:
79
+ return False
80
+
81
+
82
+ def _resolve_port(host: str, preferred: int) -> int:
83
+ """Istenen port boşsa onu; degilse sonraki 20'yi, sonra OS'tan boş port dener."""
84
+ if _port_is_free(host, preferred):
85
+ return preferred
86
+ for p in range(preferred + 1, preferred + 21):
87
+ if _port_is_free(host, p):
88
+ return p
89
+ with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
90
+ s.bind((host, 0))
91
+ return int(s.getsockname()[1])
92
+
93
+
94
+ def _read_env_value(env_file: Path, key: str) -> str | None:
95
+ """`.env` dosyasından tek bir KEY değerini oku (yoksa None)."""
96
+ if not env_file.is_file():
97
+ return None
98
+ try:
99
+ for raw in env_file.read_text(encoding="utf-8").splitlines():
100
+ line = raw.strip()
101
+ m = re.match(rf"^{re.escape(key)}\s*=\s*(.*)$", line)
102
+ if m:
103
+ val = m.group(1).strip()
104
+ if (val.startswith('"') and val.endswith('"')) or (
105
+ val.startswith("'") and val.endswith("'")
106
+ ):
107
+ val = val[1:-1]
108
+ return val
109
+ except OSError:
110
+ return None
111
+ return None
112
+
113
+
114
+ def _open_browser_when_ready(url: str, health_url: str, timeout: float = 30.0) -> None:
115
+ """Sunucu /api/health'e cevap verince tarayıcıyı aç.
116
+
117
+ Ayrı thread'de çalışır; sunucunun ayağa kalkmasını bekler ki tarayıcı
118
+ 'bağlantı reddedildi' göstermesin.
119
+ """
120
+ deadline = time.monotonic() + timeout
121
+ while time.monotonic() < deadline:
122
+ try:
123
+ with urllib.request.urlopen(health_url, timeout=1.5) as resp:
124
+ if resp.status == 200:
125
+ break
126
+ except Exception:
127
+ time.sleep(0.4)
128
+ try:
129
+ webbrowser.open(url)
130
+ except Exception:
131
+ pass
132
+
133
+
134
+ def _build_parser() -> argparse.ArgumentParser:
135
+ p = argparse.ArgumentParser(
136
+ prog="bibexpy",
137
+ description="Self-hosted bibliometric data preparation tool "
138
+ "(Scopus + Web of Science).",
139
+ )
140
+ p.add_argument("--host", default="127.0.0.1", help="Bağlanılacak host (varsayılan: 127.0.0.1)")
141
+ p.add_argument("--port", type=int, default=6060, help="Port (varsayılan: 6060)")
142
+ p.add_argument(
143
+ "--storage",
144
+ default=None,
145
+ help="Depolama klasörü (varsayılan: ~/.bibexpy/storage veya .env'deki STORAGE_DIR)",
146
+ )
147
+ p.add_argument(
148
+ "--config-dir",
149
+ default=None,
150
+ help="Yapılandırma klasörü (.env burada; varsayılan: ~/.bibexpy)",
151
+ )
152
+ p.add_argument("--no-browser", action="store_true", help="Tarayıcıyı otomatik açma")
153
+ p.add_argument("--version", action="version", version=f"BibexPy {__version__} ({__codename__})")
154
+ return p
155
+
156
+
157
+ def main(argv: list[str] | None = None) -> int:
158
+ # Windows konsolu (cp1254/cp850 vb.) UTF-8 olmayan codepage'lerde Türkçe
159
+ # karakterlerde veya ok işaretlerinde UnicodeEncodeError ile çökebilir.
160
+ # stdout/stderr'i UTF-8'e ayarla; errors='replace' → asla raise etmez.
161
+ for _stream in (sys.stdout, sys.stderr):
162
+ try:
163
+ _stream.reconfigure(encoding="utf-8", errors="replace") # type: ignore[attr-defined]
164
+ except Exception:
165
+ pass
166
+
167
+ args = _build_parser().parse_args(argv)
168
+
169
+ # 1. Paket bütünlüğü kontrolü — build script çalışmadan kurulmuşsa anlamlı hata ver.
170
+ if not (_WEB_DIR / "index.html").is_file():
171
+ sys.stderr.write(
172
+ "HATA: Gömülü frontend bulunamadı (_web/index.html yok).\n"
173
+ "Bu wheel düzgün build edilmemiş. scripts/build_wheel.* ile yeniden üretin.\n"
174
+ )
175
+ return 2
176
+ if not (_SERVER_DIR / "main.py").is_file():
177
+ sys.stderr.write(
178
+ "HATA: Gömülü sunucu bulunamadı (_server/main.py yok).\n"
179
+ "Bu wheel düzgün build edilmemiş. scripts/build_wheel.* ile yeniden üretin.\n"
180
+ )
181
+ return 2
182
+
183
+ # 2. Yapılandırma + depolama klasörleri (yazılabilir kullanıcı konumu).
184
+ config_dir = Path(args.config_dir).expanduser() if args.config_dir else Path.home() / ".bibexpy"
185
+ config_dir.mkdir(parents=True, exist_ok=True)
186
+ env_file = config_dir / ".env"
187
+ _write_env_template(env_file) # ilk calistirmada yorumlu sablon
188
+
189
+ # Depolama önceliği: --storage > .env'deki STORAGE_DIR > <config_dir>/storage
190
+ storage = (
191
+ args.storage
192
+ or _read_env_value(env_file, "STORAGE_DIR")
193
+ or str(config_dir / "storage")
194
+ )
195
+ storage_path = Path(storage).expanduser()
196
+ storage_path.mkdir(parents=True, exist_ok=True)
197
+
198
+ # 3. Ortam değişkenleri — main.py + config.py + settings router bunları okur.
199
+ os.environ["BIBEXPY_CONFIG_DIR"] = str(config_dir)
200
+ os.environ["BIBEXPY_FRONTEND_DIST"] = str(_WEB_DIR)
201
+ os.environ["STORAGE_DIR"] = str(storage_path)
202
+
203
+ # 4. Flat import'lar (from config import ..., from routers import ...) için
204
+ # gömülü sunucu dizinini sys.path başına ekle.
205
+ sys.path.insert(0, str(_SERVER_DIR))
206
+
207
+ # 5. Uygulamayı import et (env var'lar set edildikten SONRA — _frontend_root()
208
+ # BIBEXPY_FRONTEND_DIST'i okuyup statik UI'yi mount eder).
209
+ try:
210
+ from main import app # type: ignore # noqa: E402 (gömülü _server modülü)
211
+ except Exception as exc: # pragma: no cover
212
+ sys.stderr.write(f"HATA: Sunucu uygulaması yüklenemedi: {exc}\n")
213
+ return 1
214
+
215
+ import uvicorn
216
+
217
+ port = _resolve_port(args.host, args.port)
218
+ if port != args.port:
219
+ print(f" (not: {args.port} portu dolu; {port} kullaniliyor)")
220
+ url = f"http://{args.host}:{port}/"
221
+ health = f"http://{args.host}:{port}/api/health"
222
+
223
+ print(f" BibexPy v{__version__} \"{__codename__}\"")
224
+ print(f" -> Arayuz: {url}")
225
+ print(f" -> Depolama: {storage_path}")
226
+ print(f" -> Ayarlar: {env_file}")
227
+ print(f" (Durdurmak icin Ctrl+C)\n")
228
+
229
+ if not args.no_browser:
230
+ threading.Thread(
231
+ target=_open_browser_when_ready, args=(url, health), daemon=True
232
+ ).start()
233
+
234
+ try:
235
+ uvicorn.run(app, host=args.host, port=port, log_level="info")
236
+ except KeyboardInterrupt: # pragma: no cover
237
+ pass
238
+ return 0
239
+
240
+
241
+ if __name__ == "__main__": # pragma: no cover
242
+ raise SystemExit(main())
@@ -0,0 +1,105 @@
1
+ Metadata-Version: 2.4
2
+ Name: bibexpy
3
+ Version: 2.0.0
4
+ Summary: Self-hosted bibliometric data preparation tool (Scopus + Web of Science)
5
+ Author: Burak Can Kara, Alperen Şahin, Taşkın Dirsehan
6
+ License: GPL-3.0-or-later
7
+ Project-URL: Homepage, https://bibexpy.com
8
+ Project-URL: Repository, https://github.com/bcankara/BibexPy
9
+ Project-URL: Paper, https://doi.org/10.1016/j.softx.2025.102098
10
+ Keywords: bibliometrics,scientometrics,scopus,web of science,research
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
21
+ Classifier: Framework :: FastAPI
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: fastapi>=0.110.0
26
+ Requires-Dist: uvicorn[standard]>=0.27.0
27
+ Requires-Dist: python-multipart>=0.0.9
28
+ Requires-Dist: pydantic>=2.6.0
29
+ Requires-Dist: pydantic-settings>=2.2.0
30
+ Requires-Dist: sse-starlette>=2.0.0
31
+ Requires-Dist: pandas>=2.0.0
32
+ Requires-Dist: numpy>=1.24.0
33
+ Requires-Dist: openpyxl>=3.1.2
34
+ Requires-Dist: scikit-learn>=1.3.0
35
+ Requires-Dist: nltk>=3.8.1
36
+ Requires-Dist: requests>=2.31.0
37
+ Requires-Dist: urllib3>=2.0.0
38
+ Requires-Dist: certifi>=2023.5.7
39
+ Requires-Dist: python-dotenv>=1.0.0
40
+ Requires-Dist: tqdm>=4.65.0
41
+ Requires-Dist: colorama>=0.4.6
42
+ Requires-Dist: unidecode==1.3.6
43
+ Requires-Dist: typing-extensions>=4.7.0
44
+ Dynamic: license-file
45
+
46
+ <p align="center">
47
+ <a href="https://bibexpy.com">
48
+ <img src="https://raw.githubusercontent.com/bcankara/BibexPy/main/apps/web/public/images/bibexpy-logo-full.png" alt="BibexPy — V2.0.0 Helium — Bibliometrics Experience with Python" width="420">
49
+ </a>
50
+ </p>
51
+
52
+ **Self-hosted, reproducible bibliometric data preparation for Web of Science & Scopus.**
53
+
54
+ BibexPy v2.0.0 **"Helium"** merges, filters, harmonizes, enriches and exports WoS + Scopus
55
+ records through a local web interface — with full provenance — and keeps your licensed
56
+ exports on your own machine. It prepares analysis-ready datasets for VOSviewer, Biblioshiny,
57
+ BibTeX, RIS, Excel and more.
58
+
59
+ ## Install
60
+
61
+ ```bash
62
+ pip install bibexpy
63
+ bibexpy # launches the local web UI (browser opens automatically)
64
+ ```
65
+
66
+ Requires **Python 3.10+** only — **no Node.js/npm needed** (the interface ships precompiled
67
+ inside the package). Works on Windows, macOS and Linux.
68
+
69
+ ```bash
70
+ bibexpy --port 8080 # custom port
71
+ bibexpy --no-browser # server only
72
+ bibexpy --storage ./data # custom storage folder
73
+ bibexpy --version
74
+ ```
75
+
76
+ Defaults: UI at `http://127.0.0.1:6060`, data under `~/.bibexpy/storage`, settings/API keys
77
+ under `~/.bibexpy/.env` (managed from the in-app Settings page). Press `Ctrl+C` to stop.
78
+
79
+ ## Highlights (v2)
80
+
81
+ - One-click **Smart Merge** — probabilistic record linkage (DOI + Jaro–Winkler), confidence
82
+ scoring, optional borderline review, and a copy-ready methodology paragraph.
83
+ - **ORCID-first** author disambiguation + **address harmonization** (organization roll-up,
84
+ country standardization).
85
+ - **Multi-source enrichment** (CrossRef, OpenAlex, Scopus, DataCite, Unpaywall, Europe PMC,
86
+ Semantic Scholar) with reverse-DOI recovery — verifiable sources only.
87
+ - Reproducible, preset-based **filtering** and a bibliometrically weighted **quality dashboard**.
88
+ - Full **provenance**: append-only audit log, snapshots, isolated analyses, auto-generated
89
+ methodology narrative.
90
+ - Structured **export**: WoS, VOSviewer TSV, BibTeX, RIS, CSV, TSV, XLSX.
91
+
92
+ ## Links
93
+
94
+ [Website](https://bibexpy.com) · [Docs](https://bibexpy.com/doc) ·
95
+ [GitHub](https://github.com/bcankara/BibexPy) · [Paper (SoftwareX)](https://doi.org/10.1016/j.softx.2025.102098)
96
+
97
+ ## Citation
98
+
99
+ > Kara, B. C., Şahin, A., & Dirsehan, T. (2025). BibexPy: Harmonizing the bibliometric symphony
100
+ > of Scopus and Web of Science. *SoftwareX*, 30, 102098.
101
+ > https://doi.org/10.1016/j.softx.2025.102098
102
+
103
+ ## License
104
+
105
+ GPL-3.0-or-later