From ab82a667c7fc90c3a4d88f0ea9a409479144e23a Mon Sep 17 00:00:00 2001 From: "qwen.ai[bot]" Date: Mon, 4 May 2026 19:36:45 +0000 Subject: [PATCH] update branch --- .coverage | Bin 0 -> 53248 bytes .gitignore | 42 +----- README.md | 121 ++++++++++++++++- tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 185 bytes .../test_auditor.cpython-312-pytest-9.0.3.pyc | Bin 0 -> 34638 bytes wunaraha.egg-info/PKG-INFO | 124 ++++++++++++++++++ wunaraha.egg-info/SOURCES.txt | 18 +++ wunaraha.egg-info/dependency_links.txt | 1 + wunaraha.egg-info/requires.txt | 31 +++++ wunaraha.egg-info/top_level.txt | 1 + wunaraha/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 585 bytes wunaraha/__pycache__/auditor.cpython-312.pyc | Bin 0 -> 12570 bytes wunaraha/__pycache__/models.cpython-312.pyc | Bin 0 -> 4924 bytes 13 files changed, 293 insertions(+), 45 deletions(-) create mode 100644 .coverage create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/test_auditor.cpython-312-pytest-9.0.3.pyc create mode 100644 wunaraha.egg-info/PKG-INFO create mode 100644 wunaraha.egg-info/SOURCES.txt create mode 100644 wunaraha.egg-info/dependency_links.txt create mode 100644 wunaraha.egg-info/requires.txt create mode 100644 wunaraha.egg-info/top_level.txt create mode 100644 wunaraha/__pycache__/__init__.cpython-312.pyc create mode 100644 wunaraha/__pycache__/auditor.cpython-312.pyc create mode 100644 wunaraha/__pycache__/models.cpython-312.pyc diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..7d08263f30ada805a12dfb86492a8cbe9dbfb0c3 GIT binary patch literal 53248 zcmeI)%WoS+90%}yxOVM0+CZtS5LKC0KoZq)YE_8Wfd+_5XeB5Fgal%{w#V^Od)M7v zH;Du)X)Bcz;syf539j6FfD0EcoZt@t2~|SsrASDCDzyiGzkT?T+Eq`fVtrSB>|82t`q{bf2VqvSer_m2A+n+P6MxHLH}W>ZI|O zl25;_81GF!YAoj0^M6l#m47<>=7gOoW=nJc3j`nl0SJtZ!1kGZrZ7FNUivVwDoq)9 zR#ke@vh_&SxPOpe)pP0`HS{4_@vhdsu(UzX5+f6BKr)F2Jz;@O}(2z;! zjxTFGXVE^IwK!lYjL&PPU87imT&E=3p53y%Epbk66~h4W*#fy4L^~)EX|FpRLd?g} z7lbG4(vwbA`cW?C?boJS1iuJdRwa%sFnt+Kb4irpRHQoldJl^315>#No_xyt02g zlgbnh9#prZ9>L=h-}em^g7@^gz>bOF{#aQ*} zoVG8*Jls7iJ>N^i-{LgZFU*B`N+uT`=GUmxCH;$5S}n_|#q$+U!%?a<_H*at^F)IP zMHF+?DShgqJJL)NjgRt(m84&4lL@EVvT9Lx=St~IaibycN-mm>Ua|ri*exkINSK+h zVQpBxsCtqP#&c6JjsO3E5M)I|gV^gX=GaY{i;Hgsic!r-#uAC zWEuhxfB*y_009U<00Izz00bZafv!MaKcpsa186yYCL6yCz@Pu?#%GH0oAEt8VSxYy zAOHafKmY;|fB*y_009U(HeBzV-==>~TH5G1mS;7rrIuThO`rZ9;jpGF ztHVNAothoE9tAm~>dL8MK}^$j?7%cB41fNw8=ou2@5T@GgarZ+fB*y_009U<00Izz z00bZafn5|hte;eeUAlL#|MesK>d+9q>woQtekwaGk-qDH{QuuBRw_;f0SG_<0uX=z z1Rwwb2tWV=5ZHYIoxUD0$)EqL#vO%jSReoa2tWV=5P$##AOHafKmY;|7()SFpUg(T z|G%afw~U{SYhzeQ6bS+lfB*y_009U<00Izz00bbgR|Ou{Q)>1J{ra8%?)>;&?t`yu z-+r;NsL{T6wd *"Apakah mereka benar-benar membaca abstraknya, atau hanya membaca judulnya?"* -**Wunaraha** adalah *tools* untuk membuktikan bahwa metrik alternatif (Altmetrics: Mention Twitter, Berita, Paten) juga rentan terhadap manipulasi bot dan *hype cycle*. Kami menggunakan AI untuk **membedakan antara Buzz Viral (Kebisingan) vs. Intellectual Adoption (Adopsi Intelektual)**. +**Wunaraha** adalah *framework* Python untuk mengaudit kualitas metrik alternatif (Altmetrics). Tools ini menggunakan AI dan NLP untuk **membedakan antara Buzz Viral (Kebisingan) vs. Intellectual Adoption (Adopsi Intelektual)** dalam percakapan media sosial tentang publikasi ilmiah. ### 🎯 Masalah Metrik seperti H-index rentan terhadap *self-citation* dan *citation cartels*. Sebagai gantinya, muncul Altmetrics yang mengukur perhatian di media sosial. Namun, Altmetrics juga memiliki kelemahan serius: @@ -27,14 +29,36 @@ Metrik seperti H-index rentan terhadap *self-citation* dan *citation cartels*. S - **πŸ€– Bot/Spam**: Akun otomatis yang mem-posting tanpa konteks. 3. **Skor "Altmetric Purity"**: Metrik baru yang kami usulkan, yaitu persentase mention yang termasuk kategori *Adopsi Intelektual*. -### πŸ“¦ Instalasi & Penggunaan +### πŸ“¦ Instalasi & Penggunaan Cepat +#### Instalasi Development (Recommended) ```bash git clone https://github.com/stipwunaraha/altmetric-validator-ai.git cd altmetric-validator-ai + +# Instal semua dependencies untuk development dan testing +pip install -r requirements-dev.txt + +# Atau instal sebagai package editable +pip install -e ".[all]" +``` + +#### Instalasi Minimal (Production) +```bash +pip install wunaraha +# atau pip install -r requirements.txt ``` +#### Verifikasi Instalasi +```bash +# Jalankan unit tests +pytest + +# Lihat coverage report +pytest --cov=wunaraha --cov-report=term-missing +``` + **Contoh Penggunaan:** ```python from wunaraha import AltmetricAuditor @@ -50,6 +74,67 @@ print(f"Buzz: {report.buzz_mentions}") print(f"Terindikasi Bot: {report.suspected_bots}") ``` +### πŸš€ Fitur Utama + +| Fitur | Deskripsi | Status | +|-------|-----------|--------| +| **Depth Analysis** | Klasifikasi mention ke dalam kategori: Adopsi Intelektual, Buzz/Hype, Bot/Spam | βœ… Ready | +| **Bot Detection** | Deteksi akun otomatis berdasarkan pola posting dan konten | βœ… Ready | +| **Altmetric Purity Score** | Metrik baru: persentase mention berkualitas tinggi | βœ… Ready | +| **Multi-Platform Support** | Twitter/X, Mastodon, Blog (via RSS) | 🚧 In Progress | +| **Dashboard Visualisasi** | Streamlit dashboard untuk explorasi hasil audit | 🚧 Planned | +| **Batch Processing** | Audit multiple DOI sekaligus | 🚧 Planned | + +### πŸ—οΈ Arsitektur + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Data Source │────▢│ Wunaraha Core │────▢│ Output β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β€’ Twitter API β”‚ β”‚ β€’ Mention Collectorβ”‚ β”‚ β€’ Audit Report β”‚ +β”‚ β€’ Mastodon API β”‚ β”‚ β€’ Depth Classifier β”‚ β”‚ β€’ Purity Score β”‚ +β”‚ β€’ RSS Feeds β”‚ β”‚ β€’ Bot Detector β”‚ β”‚ β€’ JSON/CSV β”‚ +β”‚ β”‚ β”‚ β€’ Report Generatorβ”‚ β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ AI Models β”‚ + β”‚ β”‚ + β”‚ β€’ SciBERT β”‚ + β”‚ β€’ RoBERTa β”‚ + β”‚ β€’ DeBERTa (soon) β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### πŸ“‚ Struktur Repository + +``` +wunaraha/ +β”œβ”€β”€ wunaraha/ # Package utama +β”‚ β”œβ”€β”€ __init__.py # Export public API +β”‚ β”œβ”€β”€ models.py # Data models (Mention, AuditReport, EngagementType) +β”‚ └── auditor.py # Core logic (AltmetricAuditor class) +β”œβ”€β”€ tests/ # Unit tests +β”‚ β”œβ”€β”€ test_auditor.py # Test suite untuk auditor +β”‚ └── ... +β”œβ”€β”€ requirements.txt # Dependencies minimal +β”œβ”€β”€ requirements-dev.txt # Dependencies development lengkap +β”œβ”€β”€ pyproject.toml # Package configuration +β”œβ”€β”€ setup.py # Setup script +β”œβ”€β”€ example_usage.py # Contoh penggunaan +└── docs/ # Dokumentasi (coming soon) +``` + +### πŸ§ͺ Testing & Development + +Repository ini dilengkapi dengan: +- **Unit Tests**: 12 test cases dengan 74% code coverage +- **Development Tools**: pytest, black, flake8, mypy, isort +- **CI/CD Ready**: Konfigurasi untuk automated testing + +Lihat [SETUP_DEV.md](SETUP_DEV.md) untuk panduan lengkap setup development environment. + ### 🚧 Roadmap - [ ] Integrasi Twitter API v2 dan Mastodon API. - [ ] Model klasifikasi *depth-of-engagement* berbasis **DeBERTa**. @@ -61,7 +146,35 @@ print(f"Terindikasi Bot: {report.suspected_bots}") - *Have we reached the limits of altmetrics?* (Research Information, 2023). ### 🀝 Kontribusi -Kami mencari *data scientist* dan *NLP engineer* yang tertarik dengan *research integrity*. + +Kami mencari *data scientist*, *NLP engineer*, dan peneliti yang tertarik dengan *research integrity*. + +**Cara Berkontribusi:** +1. Fork repository ini +2. Buat branch fitur (`git checkout -b feature/AmazingFeature`) +3. Commit perubahan (`git commit -m 'Add AmazingFeature'`) +4. Push ke branch (`git push origin feature/AmazingFeature`) +5. Buka Pull Request + +**Development Setup:** +```bash +# Clone fork Anda +git clone https://github.com/YOUR_USERNAME/altmetric-validator-ai.git +cd altmetric-validator-ai + +# Instal dependencies development +pip install -r requirements-dev.txt + +# Jalankan tests sebelum commit +pytest --cov=wunaraha + +# Format code +black wunaraha tests +isort wunaraha tests +``` + +Lihat [CONTRIBUTING.md](CONTRIBUTING.md) untuk panduan lengkap. ### πŸ“„ Lisensi -MIT License. + +MIT License - lihat [LICENSE](LICENSE) untuk detail. diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9bd4e6871280827e462ff2625c682224b654bee GIT binary patch literal 185 zcmX@j%ge<81l*s0WSRi!#~=<2FhUuhIe?7m3@Hpz43&(UOjWuesl_G53Z;1^rP&JM zrFn@(i5ZCsx(bdtCAq03MVZM8VTn1JDTyWdMGB6dewvK8*yH0<@{{A^S2BDCnfXgb zzdXMvySN}RIaR*|WSD+@d}dx|NqoFsLFFwDo80`A(wtPgA~v96kSmHoF8ILA$jEq$ K!MKP8$N>P-CNU@g literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_auditor.cpython-312-pytest-9.0.3.pyc b/tests/__pycache__/test_auditor.cpython-312-pytest-9.0.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..262184c126fd33c012be9bb8fbbf8f309aa50f65 GIT binary patch literal 34638 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%0A^__NuB^qrE8^>wUn<^RpTwx4s% z2o;ME(~QtxcVByeW46q-_j4V8tiEpC>}&TE=|tXq!+q_gvOoH{w!i1`HJ|JH@7-)Z z*WciCjVb!7JsICjPfVxk*P}MAPWQZ!WJ=FXv9CPPI0D`22c$cBgnK?>#bwV`kz=#H z@20ZTu6e{*c$qB%UB7&!)j;z}k~aWSQ1_c(uWq?eiD!M5LIIxmfW!n!zVJ0me(Or| zH!clb^e#9$Jvly^yGc`!-uQauesB1~@LO+VS!|E%1J6$wUBDJyvBK>7x#EE|I>aQd7gw?Rt6}zK3Zk7xzl;&sxvP@6x!QSTBWKz6;ioa}@1o?Mi(6?&0{F_pq0``FQW) z#?5q|dtJ-7KDwjV*)1g&oimQYvU z!&vxD!CO7M>%3=OSI-N3$OsyIk&Lf^-N3#`){x;# z{KZ_6`D+{RrH5W75*t$M>%I-5y680Mh2_07?^Bp+`$=%HR0YT zONNI#`Vn@YYesG&$%~22vU$L;8M&6frR8k-GP=asi{-+B{mAcxk?kW9sf&hnT-?m- zUZ`0x7cFB8<{lX~{tadJ7mRP{99)JcgM!{s^*i5G)zUI$e8y{@`i5$jwks=|nS^;N zqqA?t;N00q+MdF#gW2A6F8KUff-joPz7^+MXy+8pxb_}E)CIc-`fcl(6?fg3eEnh; z`M?4kG-O}fhGzU*68Uow5i;$V&d6%!UMJ@yk9MFKhnn?>?GN1YQ1C(aEts0)N4$fo z`N}!Y)5^ZYmUNv>;pl3|uBZLYo#{WIb>>fCLqU)P8Nc|~&BjUxhDyp9ed+ALP(^(O z{C}COzBX2VZ47J)3ET>ziWw7`NO$oeuxvJ3b zo=D-ll9rXrbOt0+ao8o2#u-rZqJnB9%f4-6m&p@(wW0*HfU#7hP-~s#>0rkudj0A4bm2?d|Fj{NdfvMrrB#egJ{HntE5maplpF})^ zPwwJTHt2b-4>bALltzRkOcjIzP4?dpg~KNwG)Kgjgh(RM#sXR38nM3?ZfHogwk7%Z z#e4Zn3*Y?iHPSb+);_)!E|aXNoyNQpR)lA<)SLJinUT7Y>ZJwXvL;_io?OSwonf`e z<1BJ3XYl1?32gEOtSQ)qHNWn>Eafyx#QJhC8UG0)WMMR42l*oC_xpbp2>3%^MSOn$ z2fp8L`X9ctW#8Gq@*VmrGT=Y+D<8;Llm6ZQ1HbZteD#L^yMF(nU-^iB_5DDL|IB?K I2)o+<2hNVlZvX%Q literal 0 HcmV?d00001 diff --git a/wunaraha.egg-info/PKG-INFO b/wunaraha.egg-info/PKG-INFO new file mode 100644 index 0000000..f127b52 --- /dev/null +++ b/wunaraha.egg-info/PKG-INFO @@ -0,0 +1,124 @@ +Metadata-Version: 2.4 +Name: wunaraha +Version: 0.1.0 +Summary: Wunaraha: Framework Audit Halusinasi Metrik Alternatif - AI-powered altmetric validation +Home-page: https://github.com/wunaraha/wunaraha +Author: Wunaraha Contributors +Author-email: Wunaraha Contributors +License: MIT +Project-URL: Homepage, https://github.com/wunaraha/wunaraha +Project-URL: Repository, https://github.com/wunaraha/wunaraha.git +Project-URL: Documentation, https://github.com/wunaraha/wunaraha#readme +Project-URL: Issues, https://github.com/wunaraha/wunaraha/issues +Keywords: altmetrics,ai,validation,research,hallucination,audit +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Science/Research +Classifier: License :: OSI Approved :: MIT License +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Topic :: Scientific/Engineering :: Information Analysis +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: transformers>=4.30.0 +Requires-Dist: torch>=2.0.0 +Requires-Dist: pandas>=1.5.0 +Requires-Dist: numpy>=1.24.0 +Requires-Dist: requests>=2.28.0 +Provides-Extra: dev +Requires-Dist: pytest>=7.0.0; extra == "dev" +Requires-Dist: pytest-cov>=4.0.0; extra == "dev" +Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev" +Requires-Dist: black>=23.0.0; extra == "dev" +Requires-Dist: flake8>=6.0.0; extra == "dev" +Requires-Dist: mypy>=1.0.0; extra == "dev" +Requires-Dist: isort>=5.12.0; extra == "dev" +Requires-Dist: pre-commit>=3.0.0; extra == "dev" +Provides-Extra: ml +Requires-Dist: scikit-learn>=1.2.0; extra == "ml" +Requires-Dist: sentence-transformers>=2.2.0; extra == "ml" +Provides-Extra: dashboard +Requires-Dist: streamlit>=1.20.0; extra == "dashboard" +Requires-Dist: plotly>=5.14.0; extra == "dashboard" +Provides-Extra: api +Requires-Dist: tweepy>=4.14.0; extra == "api" +Requires-Dist: Mastodon.py>=1.5.0; extra == "api" +Requires-Dist: python-dotenv>=1.0.0; extra == "api" +Provides-Extra: all +Requires-Dist: wunaraha[api,dashboard,dev,ml]; extra == "all" +Dynamic: author +Dynamic: home-page +Dynamic: license-file +Dynamic: requires-python + + + +# πŸ›‘οΈ Wunaraha: Framework Audit Halusinasi Metrik Alternatif + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/) +[![Hugging Face](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Transformers-yellow)](https://huggingface.co/) + +> *"Apakah mereka benar-benar membaca abstraknya, atau hanya membaca judulnya?"* + +**Wunaraha** adalah *tools* untuk membuktikan bahwa metrik alternatif (Altmetrics: Mention Twitter, Berita, Paten) juga rentan terhadap manipulasi bot dan *hype cycle*. Kami menggunakan AI untuk **membedakan antara Buzz Viral (Kebisingan) vs. Intellectual Adoption (Adopsi Intelektual)**. + +### 🎯 Masalah +Metrik seperti H-index rentan terhadap *self-citation* dan *citation cartels*. Sebagai gantinya, muncul Altmetrics yang mengukur perhatian di media sosial. Namun, Altmetrics juga memiliki kelemahan serius: +- **Bot dan Manipulasi**: Download dan mention bisa dibeli atau diotomatisasi. +- **Hype Sesaat**: Sebuah makalah bisa viral karena judul kontroversial, bukan karena substansinya. +- **Kebisingan**: Tidak ada bedanya antara "Wow, ini keren!" dengan "Ini akan mengubah cara saya bekerja." + +### πŸ€– Solusi: Audit Berbasis AI + +**Wunaraha** memanfaatkan **Large Language Models (LLMs)** dan **Natural Language Processing (NLP)** untuk mengaudit percakapan di balik metrik. + +1. **Koleksi Data**: Mengambil tweet/post/blog yang merujuk pada sebuah DOI. +2. **Analisis Kedalaman (Depth Analysis)**: Menggunakan model Transformer (seperti **SciBERT** atau **RoBERTa**) untuk mengklasifikasikan teks ke dalam tiga kategori: + - **🧠 Adopsi Intelektual**: Penulis menunjukkan pemahaman mendalam, mengaitkan dengan pekerjaan sendiri, atau mengkritisi metodologi. + - **πŸ“’ Buzz/Hype**: Sekadar membagikan tautan, pujian kosong, atau reaksi emosional singkat. + - **πŸ€– Bot/Spam**: Akun otomatis yang mem-posting tanpa konteks. +3. **Skor "Altmetric Purity"**: Metrik baru yang kami usulkan, yaitu persentase mention yang termasuk kategori *Adopsi Intelektual*. + +### πŸ“¦ Instalasi & Penggunaan + +```bash +git clone https://github.com/stipwunaraha/altmetric-validator-ai.git +cd altmetric-validator-ai +pip install -r requirements.txt +``` + +**Contoh Penggunaan:** +```python +from wunaraha import AltmetricAuditor + +auditor = AltmetricAuditor(use_gpu=True) + +# Audit sebuah DOI +report = auditor.audit(doi="10.1126/science.abc1234") + +print(f"Total Mention: {report.total_mentions}") +print(f"Adopsi Intelektual: {report.intellectual_adoption} ({report.purity_score:.2%})") +print(f"Buzz: {report.buzz_mentions}") +print(f"Terindikasi Bot: {report.suspected_bots}") +``` + +### 🚧 Roadmap +- [ ] Integrasi Twitter API v2 dan Mastodon API. +- [ ] Model klasifikasi *depth-of-engagement* berbasis **DeBERTa**. +- [ ] Dashboard Streamlit untuk visualisasi hasil audit. +- [ ] Dukungan untuk menganalisis berita dari Google News RSS. + +### πŸ“š Referensi +- *Quantitative Methods in Research Evaluation Citation Indicators, Altmetrics, and Artificial Intelligence* (Thelwall, 2024). +- *Have we reached the limits of altmetrics?* (Research Information, 2023). + +### 🀝 Kontribusi +Kami mencari *data scientist* dan *NLP engineer* yang tertarik dengan *research integrity*. + +### πŸ“„ Lisensi +MIT License. diff --git a/wunaraha.egg-info/SOURCES.txt b/wunaraha.egg-info/SOURCES.txt new file mode 100644 index 0000000..291672a --- /dev/null +++ b/wunaraha.egg-info/SOURCES.txt @@ -0,0 +1,18 @@ +.pre-commit-config.yaml +INSTALL.md +LICENSE +MANIFEST.in +README.md +pyproject.toml +requirements.txt +setup.py +tests/__init__.py +tests/test_auditor.py +wunaraha/__init__.py +wunaraha/auditor.py +wunaraha/models.py +wunaraha.egg-info/PKG-INFO +wunaraha.egg-info/SOURCES.txt +wunaraha.egg-info/dependency_links.txt +wunaraha.egg-info/requires.txt +wunaraha.egg-info/top_level.txt \ No newline at end of file diff --git a/wunaraha.egg-info/dependency_links.txt b/wunaraha.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/wunaraha.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/wunaraha.egg-info/requires.txt b/wunaraha.egg-info/requires.txt new file mode 100644 index 0000000..728b629 --- /dev/null +++ b/wunaraha.egg-info/requires.txt @@ -0,0 +1,31 @@ +transformers>=4.30.0 +torch>=2.0.0 +pandas>=1.5.0 +numpy>=1.24.0 +requests>=2.28.0 + +[all] +wunaraha[api,dashboard,dev,ml] + +[api] +tweepy>=4.14.0 +Mastodon.py>=1.5.0 +python-dotenv>=1.0.0 + +[dashboard] +streamlit>=1.20.0 +plotly>=5.14.0 + +[dev] +pytest>=7.0.0 +pytest-cov>=4.0.0 +pytest-asyncio>=0.21.0 +black>=23.0.0 +flake8>=6.0.0 +mypy>=1.0.0 +isort>=5.12.0 +pre-commit>=3.0.0 + +[ml] +scikit-learn>=1.2.0 +sentence-transformers>=2.2.0 diff --git a/wunaraha.egg-info/top_level.txt b/wunaraha.egg-info/top_level.txt new file mode 100644 index 0000000..f860d95 --- /dev/null +++ b/wunaraha.egg-info/top_level.txt @@ -0,0 +1 @@ +wunaraha diff --git a/wunaraha/__pycache__/__init__.cpython-312.pyc b/wunaraha/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d721f5b7585a39be844ffbfdc01b3d857b7bcfee GIT binary patch literal 585 zcmZ9Jv5pfl5Qgn!vl})_xQYr17a*}sa&!?wNLPRW=_pVnq;0H8Y<5k&_R4D$CDrj1 z)X?z?yaE*++6DyMif3Gh@&9d&Zx~C0fiK?(QS zV+WPoShr>;K`76jfDVl^&?t5)y;E4%UOEF_y-L%CwYp)!_^@V`td?Qz)fx<2Lb(B~ z92(%Nf!)RCLv__;>~$!BIcYpLq{u8mK+P&Jst&pnTw2cr9+ul$vekB_B_d5x;A1kH#nZ&n;!4RmlLpsgz6V=ie$7sx{^B#V_nv7lT%bw*0iHT?S-tZ^X=r3DWH&u z_X||ZBG*TRi#j*xT#W8{mbMA!!mc=PN1VTru0aweDd!M;X&uH1bc?g@KxpI23aOj_ zNF4^W=KLesBbfZXHS2cX)UcAX&BbTTI9En_&ZqUZ9X>!%(DI=>!u#EP&24n&eM;%? j-hf8u6LS5=+34%|=2`la-1$c4U&#D>`s{7uCV255VbQR1 literal 0 HcmV?d00001 diff --git a/wunaraha/__pycache__/auditor.cpython-312.pyc b/wunaraha/__pycache__/auditor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e2846aed4032c7ba7571e1af3be7a36efb5cd70 GIT binary patch literal 12570 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 literal 0 HcmV?d00001