diff --git a/.update_version.py b/.update_version.py
index bbd39d2..31e09b4 100644
--- a/.update_version.py
+++ b/.update_version.py
@@ -39,9 +39,9 @@ def update_poetry_version(file_path, new_version):
# Update the version under tool.poetry
if "tool" in data and "poetry" in data["tool"] and "version" in data["tool"]["poetry"]:
data["tool"]["poetry"]["version"] = new_version
- data["tool"]["briefcase"]["version"] = new_version
- data["tool"]["briefcase"]["app"]["bitcoin-safe"]["linux"]["flatpak"]["version"] = new_version
- data["tool"]["briefcase"]["app"]["bitcoin-safe"]["linux"]["appimage"]["version"] = new_version
+ # data["tool"]["briefcase"]["version"] = new_version
+ # data["tool"]["briefcase"]["app"]["bitcoin-safe"]["linux"]["flatpak"]["version"] = new_version
+ # data["tool"]["briefcase"]["app"]["bitcoin-safe"]["linux"]["appimage"]["version"] = new_version
# Write the updated data back to pyproject.toml
with open(file_path, "w") as file:
diff --git a/README.md b/README.md
index 9ed1ae6..47356d6 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
- **Easy** Multisig-Wallet Setup
- Step-by-Step instructions for a secure MultiSig setup with PDF backup sheets
- Test transactions ensure that all hardware signers are ready
- - Full support for [Coldcard](https://store.coinkite.com/promo/8BFF877000C34A86F410), [Coldcard Q](https://store.coinkite.com/promo/8BFF877000C34A86F410), [Bitbox02](https://shiftcrypto.ch/bitbox02/?ref=MOB4dk7gpm), [Blockstream Jade](https://store.blockstream.com/?code=XEocg5boS77D), [Trezor](https://trezor.io), [Foundation Passport](https://foundation.xyz/passport), [Keystone](https://keyst.one), [Specter DIY](https://specter.solutions/hardware), using *QR*, *USB*, and *SD-card*
+ - Full support for [Coldcard](https://store.coinkite.com/promo/8BFF877000C34A86F410), [Coldcard Q](https://store.coinkite.com/promo/8BFF877000C34A86F410), [Bitbox02](https://shiftcrypto.ch/bitbox02/?ref=MOB4dk7gpm), [Blockstream Jade](https://store.blockstream.com/?code=XEocg5boS77D), [Trezor](https://trezor.io), [Foundation Passport](https://foundation.xyz/passport), [Keystone](https://keyst.one), [Ledger](https://shop.ledger.com/pages/ledger-nano-s-plus), [Specter DIY](https://specter.solutions/hardware), using *QR*, *USB*, and *SD-card*
- **Secure**: Hardware signers only
- All wallets require hardware signers/wallets for safe seed storage
- Powered by **[BDK](https://github.com/bitcoindevkit/bdk)**
@@ -21,7 +21,7 @@
- **Sending** for non-technical users
- 1-click fee selection via mempool-blocks
- Automatic merging of utxos when fees are low
-- **SyncChat**:
+- **Sync & Chat**:
- Encrypted cloud backup (via nostr) of labels
- Label synchronization between different computers
- Wallet chat and PSBTs sharing between different computers
diff --git a/bitcoin_safe/__init__.py b/bitcoin_safe/__init__.py
index 59690c3..dc32bc7 100644
--- a/bitcoin_safe/__init__.py
+++ b/bitcoin_safe/__init__.py
@@ -1,2 +1,2 @@
# this is the source of the version information
-__version__ = "1.0.0b5"
+__version__ = "1.0.0rc1"
diff --git a/bitcoin_safe/config.py b/bitcoin_safe/config.py
index 58468e8..504f75b 100644
--- a/bitcoin_safe/config.py
+++ b/bitcoin_safe/config.py
@@ -46,11 +46,7 @@
from .network_config import NetworkConfig, NetworkConfigs
from .storage import BaseSaveableClass
-from .util import (
- briefcase_project_dir,
- path_to_rel_home_path,
- rel_home_path_to_abs_path,
-)
+from .util import current_project_dir, path_to_rel_home_path, rel_home_path_to_abs_path
MIN_RELAY_FEE = 1
FEE_RATIO_HIGH_WARNING = 0.05 # warn user if fee/amount for on-chain tx is higher than this
@@ -65,7 +61,7 @@ class UserConfig(BaseSaveableClass):
VERSION = "0.1.6"
app_name = "bitcoin_safe"
- locales_path = briefcase_project_dir() / "gui" / "locales"
+ locales_path = current_project_dir() / "gui" / "locales"
config_dir = Path(appdirs.user_config_dir(app_name))
config_file = config_dir / (app_name + ".conf")
diff --git a/bitcoin_safe/gui/locales/app_ar_AE.qm b/bitcoin_safe/gui/locales/app_ar_AE.qm
index 63a2728..6e5dede 100644
Binary files a/bitcoin_safe/gui/locales/app_ar_AE.qm and b/bitcoin_safe/gui/locales/app_ar_AE.qm differ
diff --git a/bitcoin_safe/gui/locales/app_ar_AE.ts b/bitcoin_safe/gui/locales/app_ar_AE.ts
index 35ff896..c34d21c 100644
--- a/bitcoin_safe/gui/locales/app_ar_AE.ts
+++ b/bitcoin_safe/gui/locales/app_ar_AE.ts
@@ -127,6 +127,17 @@
توليف إلى العناوين المحددة
+
+ AmountAnalyzer
+
+ Amount too small
+ المبلغ صغير جدًا
+
+
+ Amount too large
+ المبلغ كبير جدًا
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
مزامنة متعددة الأجهزة والدردشة
- Choose trusted computers in SyncChat tab on each computer.
- اختر الحواسيب الموثوقة في تبويب SyncChat على كل جهاز.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ اختر الحواسيب الموثوقة في تبويب المزامنة والدردشة على كل جهاز.
See video
@@ -1720,8 +1731,8 @@ Location of signing device: .....
استيراد التسميات
- SyncChat
- SyncChat
+ Sync && Chat
+ المزامنة && الدردشة
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
تسجيل multisig على الموقعين
- SyncChat
- SyncChat
+ Sync & Chat
+ المزامنة & الدردشة
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
نسخة احتياطية لبذور {id}
+
+ Total
+ الإجمالي
+
Created at {date} with
أُنشئ في {date} مع
diff --git a/bitcoin_safe/gui/locales/app_de_DE.qm b/bitcoin_safe/gui/locales/app_de_DE.qm
index 0de808e..59e18b5 100644
Binary files a/bitcoin_safe/gui/locales/app_de_DE.qm and b/bitcoin_safe/gui/locales/app_de_DE.qm differ
diff --git a/bitcoin_safe/gui/locales/app_de_DE.ts b/bitcoin_safe/gui/locales/app_de_DE.ts
index bb1b422..68a4bbf 100644
--- a/bitcoin_safe/gui/locales/app_de_DE.ts
+++ b/bitcoin_safe/gui/locales/app_de_DE.ts
@@ -127,6 +127,17 @@
Für ausgewählte Adressen generieren
+
+ AmountAnalyzer
+
+ Amount too small
+ Betrag zu klein
+
+
+ Amount too large
+ Betrag zu groß
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Mehr-Computer-Synchronisation und Chat
- Choose trusted computers in SyncChat tab on each computer.
- Wählen Sie vertrauenswürdige Computer im SyncChat-Tab auf jedem Computer aus.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Wählen Sie vertrauenswürdige Computer im Synchronisieren & Chatten-Tab auf jedem Computer aus.
See video
@@ -1717,8 +1728,8 @@ Location of signing device: .....
Etiketten importieren
- SyncChat
- SyncChat
+ Sync && Chat
+ Synchronisieren && Chatten
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2739,8 +2750,8 @@ below {rate}
Multisig auf Signern registrieren
- SyncChat
- SyncChat
+ Sync & Chat
+ Synchronisieren & Chatten
Send test {j}
@@ -3251,6 +3262,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Seed-Backup von {id}
+
+ Total
+ Gesamt
+
Created at {date} with
Erstellt am {date} mit
diff --git a/bitcoin_safe/gui/locales/app_es_ES.qm b/bitcoin_safe/gui/locales/app_es_ES.qm
index ca90367..2c06632 100644
Binary files a/bitcoin_safe/gui/locales/app_es_ES.qm and b/bitcoin_safe/gui/locales/app_es_ES.qm differ
diff --git a/bitcoin_safe/gui/locales/app_es_ES.ts b/bitcoin_safe/gui/locales/app_es_ES.ts
index 1f82023..622c7c4 100644
--- a/bitcoin_safe/gui/locales/app_es_ES.ts
+++ b/bitcoin_safe/gui/locales/app_es_ES.ts
@@ -127,6 +127,17 @@
Generar para direcciones seleccionadas
+
+ AmountAnalyzer
+
+ Amount too small
+ Cantidad demasiado pequeña
+
+
+ Amount too large
+ Cantidad demasiado grande
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Sincronización entre múltiples computadoras y chat
- Choose trusted computers in SyncChat tab on each computer.
- Elija computadoras de confianza en la pestaña SyncChat en cada computadora.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Elija computadoras de confianza en la pestaña Sincronizar & Chatear en cada computadora.
See video
@@ -1720,8 +1731,8 @@ Location of signing device: .....
Importar etiquetas
- SyncChat
- SyncChat
+ Sync && Chat
+ Sincronizar && Chatear
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
Registrar multisig en firmantes
- SyncChat
- SyncChat
+ Sync & Chat
+ Sincronizar & Chatear
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Copia de seguridad de semilla de {id}
+
+ Total
+ Total
+
Created at {date} with
Creado el {date} con
diff --git a/bitcoin_safe/gui/locales/app_fr_FR.qm b/bitcoin_safe/gui/locales/app_fr_FR.qm
index 06845f2..9a5f7df 100644
Binary files a/bitcoin_safe/gui/locales/app_fr_FR.qm and b/bitcoin_safe/gui/locales/app_fr_FR.qm differ
diff --git a/bitcoin_safe/gui/locales/app_fr_FR.ts b/bitcoin_safe/gui/locales/app_fr_FR.ts
index a938f5b..56c965d 100644
--- a/bitcoin_safe/gui/locales/app_fr_FR.ts
+++ b/bitcoin_safe/gui/locales/app_fr_FR.ts
@@ -127,6 +127,17 @@
Générer aux adresses sélectionnées
+
+ AmountAnalyzer
+
+ Amount too small
+ Montant trop petit
+
+
+ Amount too large
+ Montant trop grand
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Synchronisation multi-ordinateur et chat
- Choose trusted computers in SyncChat tab on each computer.
- Choisissez des ordinateurs de confiance dans l'onglet SyncChat sur chaque ordinateur.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Choisissez des ordinateurs de confiance dans l'onglet Synchroniser & Discuter sur chaque ordinateur.
See video
@@ -1720,8 +1731,8 @@ Voulez-vous continuer malgré tout ?
Importer les étiquettes
- SyncChat
- SyncChat
+ Sync && Chat
+ Synchroniser && Discuter
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
Enregistrer le multisig sur les signataires
- SyncChat
- SyncChat
+ Sync & Chat
+ Synchroniser & Discuter
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Sauvegarde de graine de {id}
+
+ Total
+ Total
+
Created at {date} with
Créé le {date} avec
diff --git a/bitcoin_safe/gui/locales/app_hi_IN.qm b/bitcoin_safe/gui/locales/app_hi_IN.qm
index 0310fae..ffebe63 100644
Binary files a/bitcoin_safe/gui/locales/app_hi_IN.qm and b/bitcoin_safe/gui/locales/app_hi_IN.qm differ
diff --git a/bitcoin_safe/gui/locales/app_hi_IN.ts b/bitcoin_safe/gui/locales/app_hi_IN.ts
index 2145b10..9edf51a 100644
--- a/bitcoin_safe/gui/locales/app_hi_IN.ts
+++ b/bitcoin_safe/gui/locales/app_hi_IN.ts
@@ -127,6 +127,17 @@
चयनित पतों के लिए उत्पन्न करें
+
+ AmountAnalyzer
+
+ Amount too small
+ राशि बहुत छोटी है
+
+
+ Amount too large
+ राशि बहुत बड़ी है
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
मल्टी-कंप्यूटर सिंक्रोनाइजेशन और चैट
- Choose trusted computers in SyncChat tab on each computer.
- प्रत्येक कंप्यूटर पर SyncChat टैब में विश्वसनीय कंप्यूटरों का चयन करें।
+ Choose trusted computers in Sync & Chat tab on each computer.
+ प्रत्येक कंप्यूटर पर सिंक और चैट टैब में विश्वसनीय कंप्यूटरों का चयन करें।
See video
@@ -1720,8 +1731,8 @@ Location of signing device: .....
लेबल आयात करें
- SyncChat
- SyncChat
+ Sync && Chat
+ सिंक && चैट
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
साइनर्स पर मल्टीसिग पंजीकृत करें
- SyncChat
- SyncChat
+ Sync & Chat
+ सिंक & चैट
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
{id} का सीड बैकअप
+
+ Total
+ कुल
+
Created at {date} with
{date} को बनाया गया
diff --git a/bitcoin_safe/gui/locales/app_it_IT.qm b/bitcoin_safe/gui/locales/app_it_IT.qm
index 39a04fd..3a81ab1 100644
Binary files a/bitcoin_safe/gui/locales/app_it_IT.qm and b/bitcoin_safe/gui/locales/app_it_IT.qm differ
diff --git a/bitcoin_safe/gui/locales/app_it_IT.ts b/bitcoin_safe/gui/locales/app_it_IT.ts
index db6b71f..67cd03f 100644
--- a/bitcoin_safe/gui/locales/app_it_IT.ts
+++ b/bitcoin_safe/gui/locales/app_it_IT.ts
@@ -127,6 +127,17 @@
Genera agli indirizzi selezionati
+
+ AmountAnalyzer
+
+ Amount too small
+ Importo troppo piccolo
+
+
+ Amount too large
+ Importo troppo grande
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Sincronizzazione tra più computer e chat
- Choose trusted computers in SyncChat tab on each computer.
- Scegli computer fidati nella scheda SyncChat su ogni computer.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Scegli computer fidati nella scheda Sincronizza & Chatta su ogni computer.
See video
@@ -1720,8 +1731,8 @@ Vuoi procedere comunque?
Importa etichette
- SyncChat
- SyncChat
+ Sync && Chat
+ Sincronizza && Chatta
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
Registra multisig sui firmatari
- SyncChat
- SyncChat
+ Sync & Chat
+ Sincronizza & Chatta
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Backup del seme di {id}
+
+ Total
+ Totale
+
Created at {date} with
Creato il {date} con
diff --git a/bitcoin_safe/gui/locales/app_ja_JP.qm b/bitcoin_safe/gui/locales/app_ja_JP.qm
index a182e44..6b1353b 100644
Binary files a/bitcoin_safe/gui/locales/app_ja_JP.qm and b/bitcoin_safe/gui/locales/app_ja_JP.qm differ
diff --git a/bitcoin_safe/gui/locales/app_ja_JP.ts b/bitcoin_safe/gui/locales/app_ja_JP.ts
index f8ccd1f..51f9ffe 100644
--- a/bitcoin_safe/gui/locales/app_ja_JP.ts
+++ b/bitcoin_safe/gui/locales/app_ja_JP.ts
@@ -127,6 +127,17 @@
選択したアドレスに生成
+
+ AmountAnalyzer
+
+ Amount too small
+ 金額が小さすぎます
+
+
+ Amount too large
+ 金額が大きすぎます
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
マルチコンピュータ同期とチャット
- Choose trusted computers in SyncChat tab on each computer.
- 各コンピューターのSyncChatタブで信頼できるコンピューターを選択してください。
+ Choose trusted computers in Sync & Chat tab on each computer.
+ 各コンピューターの同期&チャットタブで信頼できるコンピューターを選択してください。
See video
@@ -1720,8 +1731,8 @@ Location of signing device: .....
ラベルのインポート
- SyncChat
- SyncChat
+ Sync && Chat
+ 同期 && チャット
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
マルチシグをサイナーに登録
- SyncChat
- SyncChat
+ Sync & Chat
+ 同期 & チャット
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
{id}のシードバックアップ
+
+ Total
+ 合計
+
Created at {date} with
{date}に作成された
diff --git a/bitcoin_safe/gui/locales/app_pt_PT.qm b/bitcoin_safe/gui/locales/app_pt_PT.qm
index ebc193e..f1f9170 100644
Binary files a/bitcoin_safe/gui/locales/app_pt_PT.qm and b/bitcoin_safe/gui/locales/app_pt_PT.qm differ
diff --git a/bitcoin_safe/gui/locales/app_pt_PT.ts b/bitcoin_safe/gui/locales/app_pt_PT.ts
index d99b064..756eaa2 100644
--- a/bitcoin_safe/gui/locales/app_pt_PT.ts
+++ b/bitcoin_safe/gui/locales/app_pt_PT.ts
@@ -127,6 +127,17 @@
Gerar para endereços selecionados
+
+ AmountAnalyzer
+
+ Amount too small
+ Montante demasiado pequeno
+
+
+ Amount too large
+ Montante demasiado grande
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Sincronização entre múltiplos computadores e chat
- Choose trusted computers in SyncChat tab on each computer.
- Escolha computadores de confiança na aba SyncChat em cada computador.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Escolha computadores de confiança na aba Sincronizar & Conversar em cada computador.
See video
@@ -1720,8 +1731,8 @@ Deseja prosseguir mesmo assim?
Importar etiquetas
- SyncChat
- SyncChat
+ Sync && Chat
+ Sincronizar && Conversar
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
Registrar multisig nos assinantes
- SyncChat
- SyncChat
+ Sync & Chat
+ Sincronizar & Conversar
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Cópia de segurança da semente de {id}
+
+ Total
+ Total
+
Created at {date} with
Criado em {date} com
diff --git a/bitcoin_safe/gui/locales/app_ru_RU.qm b/bitcoin_safe/gui/locales/app_ru_RU.qm
index 0a1784d..daffddd 100644
Binary files a/bitcoin_safe/gui/locales/app_ru_RU.qm and b/bitcoin_safe/gui/locales/app_ru_RU.qm differ
diff --git a/bitcoin_safe/gui/locales/app_ru_RU.ts b/bitcoin_safe/gui/locales/app_ru_RU.ts
index 330a306..c051130 100644
--- a/bitcoin_safe/gui/locales/app_ru_RU.ts
+++ b/bitcoin_safe/gui/locales/app_ru_RU.ts
@@ -127,6 +127,17 @@
Генерировать на выбранные адреса
+
+ AmountAnalyzer
+
+ Amount too small
+ Сумма слишком мала
+
+
+ Amount too large
+ Сумма слишком велика
+
+
BTCSpinBox
@@ -946,8 +957,8 @@ Location of signing device: .....
Синхронизация и чат на нескольких компьютерах
- Choose trusted computers in SyncChat tab on each computer.
- Выберите доверенные компьютеры на вкладке SyncChat на каждом компьютере.
+ Choose trusted computers in Sync & Chat tab on each computer.
+ Выберите доверенные компьютеры на вкладке Синхронизация & Чат на каждом компьютере.
See video
@@ -1720,8 +1731,8 @@ Location of signing device: .....
Импортировать метки
- SyncChat
- SyncChat
+ Sync && Chat
+ Синхронизация && Чат
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2742,8 +2753,8 @@ below {rate}
Зарегистрировать мультисиг на подписывающих устройствах
- SyncChat
- SyncChat
+ Sync & Chat
+ Синхронизация & Чат
Send test {j}
@@ -3254,6 +3265,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
Резервная копия семени {id}
+
+ Total
+ Итого
+
Created at {date} with
Создано {date} с
diff --git a/bitcoin_safe/gui/locales/app_zh_CN.qm b/bitcoin_safe/gui/locales/app_zh_CN.qm
index 3885588..c29d135 100644
Binary files a/bitcoin_safe/gui/locales/app_zh_CN.qm and b/bitcoin_safe/gui/locales/app_zh_CN.qm differ
diff --git a/bitcoin_safe/gui/locales/app_zh_CN.ts b/bitcoin_safe/gui/locales/app_zh_CN.ts
index fd4f88a..7cf5dfd 100644
--- a/bitcoin_safe/gui/locales/app_zh_CN.ts
+++ b/bitcoin_safe/gui/locales/app_zh_CN.ts
@@ -127,6 +127,17 @@
生成到选定地址
+
+ AmountAnalyzer
+
+ Amount too small
+ 金额太小
+
+
+ Amount too large
+ 金额太大
+
+
BTCSpinBox
@@ -947,8 +958,8 @@ Location of signing device: .....
多电脑同步和聊天
- Choose trusted computers in SyncChat tab on each computer.
- 在每台电脑上的SyncChat标签中选择受信任的电脑。
+ Choose trusted computers in Sync & Chat tab on each computer.
+ 在每台电脑上的同步与聊天标签中选择受信任的电脑。
See video
@@ -1723,8 +1734,8 @@ Location of signing device: .....
导入标签
- SyncChat
- SyncChat
+ Sync && Chat
+ 同步 && 聊天
All Files (*);;JSONL Files (*.jsonl);;JSON Files (*.json)
@@ -2748,8 +2759,8 @@ below {rate}
在签名器上注册多签
- SyncChat
- SyncChat
+ Sync & Chat
+ 同步 & 聊天
Send test {j}
@@ -3261,6 +3272,10 @@ It is best to use your own server, such as {link}.
Seed backup of {id}
{id}的种子备份
+
+ Total
+ 总计
+
Created at {date} with
在 {date} 创建的
diff --git a/bitcoin_safe/gui/qt/analyzers.py b/bitcoin_safe/gui/qt/analyzers.py
index f39ba7f..8149cc9 100644
--- a/bitcoin_safe/gui/qt/analyzers.py
+++ b/bitcoin_safe/gui/qt/analyzers.py
@@ -168,3 +168,18 @@ def analyze(self, input: str, pos: int = 0) -> AnalyzerMessage:
return AnalyzerMessage(self.tr("Valid Address"), AnalyzerState.Valid)
else:
return AnalyzerMessage(self.tr("Invalid Address"), AnalyzerState.Invalid)
+
+
+class AmountAnalyzer(QObject):
+ def __init__(self, parent: QObject | None = None) -> None:
+ super().__init__(parent)
+ self.max_amount = 0
+ self.min_amount = 0
+
+ def analyze(self, input: float) -> AnalyzerMessage: # type: ignore
+ if input < self.min_amount:
+ return AnalyzerMessage(self.tr("Amount too small"), AnalyzerState.Invalid)
+ if input > self.max_amount:
+ return AnalyzerMessage(self.tr("Amount too large"), AnalyzerState.Invalid)
+
+ return AnalyzerMessage("Amount within allowed range", AnalyzerState.Valid)
diff --git a/bitcoin_safe/gui/qt/custom_edits.py b/bitcoin_safe/gui/qt/custom_edits.py
index 66c982d..e3b18a8 100644
--- a/bitcoin_safe/gui/qt/custom_edits.py
+++ b/bitcoin_safe/gui/qt/custom_edits.py
@@ -79,6 +79,23 @@ def worst_message(l: List[AnalyzerMessage]):
return l[states.index(worst_state)]
+class BaseIntAnalyzer:
+ @abstractmethod
+ def analyze(self, input: int) -> AnalyzerMessage:
+ raise NotImplementedError()
+
+ def normalize(self, input: int) -> int:
+ return input
+
+ @staticmethod
+ def worst_message(l: List[AnalyzerMessage]):
+ if not l:
+ return AnalyzerMessage("", AnalyzerState.Valid)
+ states = [message.state for message in l]
+ worst_state = max(states)
+ return l[states.index(worst_state)]
+
+
class AnalyzerLineEdit(QLineEdit):
def __init__(self, parent=None) -> None:
super().__init__(parent=parent)
diff --git a/bitcoin_safe/gui/qt/qt_wallet.py b/bitcoin_safe/gui/qt/qt_wallet.py
index 5b32bff..d68d2e3 100644
--- a/bitcoin_safe/gui/qt/qt_wallet.py
+++ b/bitcoin_safe/gui/qt/qt_wallet.py
@@ -398,7 +398,7 @@ def wallet_signals(self) -> WalletSignals:
def updateUi(self) -> None:
self.tabs.setTabText(self.tabs.indexOf(self.send_tab), self.tr("Send"))
self.tabs.setTabText(self.tabs.indexOf(self.wallet_descriptor_tab), self.tr("Descriptor"))
- self.tabs.setTabText(self.tabs.indexOf(self.sync_tab_widget), self.tr("SyncChat"))
+ self.tabs.setTabText(self.tabs.indexOf(self.sync_tab_widget), self.tr("Sync && Chat"))
self.tabs.setTabText(self.tabs.indexOf(self.history_tab), self.tr("History"))
self.tabs.setTabText(self.tabs.indexOf(self.addresses_tab), self.tr("Receive"))
diff --git a/bitcoin_safe/gui/qt/recipients.py b/bitcoin_safe/gui/qt/recipients.py
index 5b23858..420e167 100644
--- a/bitcoin_safe/gui/qt/recipients.py
+++ b/bitcoin_safe/gui/qt/recipients.py
@@ -32,6 +32,7 @@
from pathlib import Path
from bitcoin_safe.gui.qt.address_edit import AddressEdit
+from bitcoin_safe.gui.qt.analyzers import AmountAnalyzer
from bitcoin_safe.gui.qt.labeledit import WalletLabelAndCategoryEdit
from bitcoin_safe.gui.qt.util import Message, MessageType, read_QIcon
from bitcoin_safe.gui.qt.wrappers import Menu
@@ -121,6 +122,10 @@ def __init__(
self.amount_layout = QHBoxLayout()
self.amount_spin_box = BTCSpinBox(self.signals.get_network())
+ amount_analyzer = AmountAnalyzer()
+ amount_analyzer.min_amount = 0
+ amount_analyzer.max_amount = int(21e6 * 1e8)
+ self.amount_spin_box.setAnalyzer(amount_analyzer)
self.label_unit = QLabel(unit_str(self.signals.get_network()))
self.send_max_button = QPushButton()
self.send_max_button.setCheckable(True)
diff --git a/bitcoin_safe/gui/qt/spinbox.py b/bitcoin_safe/gui/qt/spinbox.py
index 97da859..10f922b 100644
--- a/bitcoin_safe/gui/qt/spinbox.py
+++ b/bitcoin_safe/gui/qt/spinbox.py
@@ -27,15 +27,50 @@
# SOFTWARE.
-from typing import Tuple
+from typing import Optional, Tuple
import bdkpython as bdk
from PyQt6 import QtGui, QtWidgets
+from PyQt6.QtWidgets import QWidget
+
+from bitcoin_safe.gui.qt.analyzers import AmountAnalyzer
+from bitcoin_safe.gui.qt.custom_edits import AnalyzerState
from ...util import Satoshis
-class BTCSpinBox(QtWidgets.QDoubleSpinBox):
+class AnalyzerSpinBox(QtWidgets.QDoubleSpinBox):
+ def __init__(self, parent: QWidget | None = None) -> None:
+ super().__init__(parent)
+ self._smart_state: Optional[AmountAnalyzer] = None
+ self.valueChanged.connect(self.format_and_apply_validator)
+
+ def setAnalyzer(self, smart_state: AmountAnalyzer):
+ """Set a custom validator."""
+ self._smart_state = smart_state
+
+ def analyzer(self) -> Optional[AmountAnalyzer]:
+ return self._smart_state
+
+ def format_as_error(self, value: bool) -> None:
+ if value:
+ self.setStyleSheet(f"{self.__class__.__name__}" + " { background-color: #ff6c54; }")
+ else:
+ self.setStyleSheet("")
+
+ def format_and_apply_validator(self) -> None:
+ analyzer = self.analyzer()
+ if not analyzer:
+ self.format_as_error(False)
+ return
+
+ analysis = analyzer.analyze(self.value())
+ error = bool(self.text()) and (analysis.state != AnalyzerState.Valid)
+ self.format_as_error(error)
+ self.setToolTip(analysis.msg if error else "")
+
+
+class BTCSpinBox(AnalyzerSpinBox):
"A Satoshi Spin Box. The value stored is in Satoshis."
def __init__(self, network: bdk.Network, parent=None) -> None:
@@ -45,6 +80,10 @@ def __init__(self, network: bdk.Network, parent=None) -> None:
self.setDecimals(0) # Set the number of decimal places
self.setRange(0, 21e6 * 1e8) # Define range as required
+ def setValue(self, val: float) -> None:
+ super().setValue(val)
+ self.format_and_apply_validator()
+
def set_max(self, value: bool) -> None:
self.setDisabled(value)
self._is_max = value
@@ -74,3 +113,9 @@ def validate(self, text: str | None, pos: int) -> Tuple[QtGui.QValidator.State,
except ValueError:
# If it fails, the text is not valid
return QtGui.QValidator.State.Invalid, text, pos
+
+ def set_warning_maximum(self, value: int) -> None:
+ if not self._smart_state:
+ return
+ self._smart_state.max_amount = value
+ self.format_and_apply_validator()
diff --git a/bitcoin_safe/gui/qt/tutorial_screenshots.py b/bitcoin_safe/gui/qt/tutorial_screenshots.py
index da95b91..a505ace 100644
--- a/bitcoin_safe/gui/qt/tutorial_screenshots.py
+++ b/bitcoin_safe/gui/qt/tutorial_screenshots.py
@@ -45,14 +45,7 @@
class ScreenshotsTutorial(QWidget):
- enabled_hardware_signers = [
- HardwareSigners.q,
- HardwareSigners.coldcard,
- HardwareSigners.bitbox02,
- HardwareSigners.jade,
- HardwareSigners.passport,
- HardwareSigners.specterdiy,
- ]
+ enabled_hardware_signers = HardwareSigners.as_list() # activate all of them
def __init__(
self,
diff --git a/bitcoin_safe/gui/qt/tx_export.py b/bitcoin_safe/gui/qt/tx_export.py
index 16d91fc..c474961 100644
--- a/bitcoin_safe/gui/qt/tx_export.py
+++ b/bitcoin_safe/gui/qt/tx_export.py
@@ -84,7 +84,7 @@ def __init__(
self.button_copy = CopyToolButton(data=self.data, network=network, parent=self)
self.add_button(self.button_copy)
- # SyncChat
+ # Sync & Chat
self.button_sync_share = SyncChatToolButton(
data=self.data, network=network, sync_tabs=sync_tabs, parent=self
)
diff --git a/bitcoin_safe/gui/qt/ui_tx.py b/bitcoin_safe/gui/qt/ui_tx.py
index 7604dac..3282619 100644
--- a/bitcoin_safe/gui/qt/ui_tx.py
+++ b/bitcoin_safe/gui/qt/ui_tx.py
@@ -1597,14 +1597,16 @@ def get_global_xpub_dict(self, wallets: List[Wallet]) -> Dict[str, Tuple[str, st
def reapply_max_amounts(self, fee_amount: int) -> None:
recipient_group_boxes = self.recipients.get_recipient_group_boxes()
for recipient_group_box in recipient_group_boxes:
- recipient_group_box.recipient_widget.amount_spin_box.setMaximum(self.get_total_input_value())
+ recipient_group_box.recipient_widget.amount_spin_box.set_warning_maximum(
+ self.get_total_input_value()
+ )
recipient_group_boxes_max_checked = [
recipient_group_box
for recipient_group_box in recipient_group_boxes
if recipient_group_box.recipient_widget.send_max_button.isChecked()
]
- total_change_amount = self.get_total_change_amount(include_max_checked=False) - fee_amount
+ total_change_amount = max(0, self.get_total_change_amount(include_max_checked=False) - fee_amount)
for recipient_group_box in recipient_group_boxes_max_checked:
self.set_max_amount(
recipient_group_box, total_change_amount // len(recipient_group_boxes_max_checked)
diff --git a/bitcoin_safe/gui/qt/wizard.py b/bitcoin_safe/gui/qt/wizard.py
index a61e921..cd5f53a 100644
--- a/bitcoin_safe/gui/qt/wizard.py
+++ b/bitcoin_safe/gui/qt/wizard.py
@@ -1378,7 +1378,7 @@ def updateUi(self) -> None:
{self.tr('Multi-computer synchronization and chat')}
- - {self.tr('Choose trusted computers in SyncChat tab on each computer.') + ' '+ link('https://github.com/andreasgriffin/bitcoin-safe?tab=readme-ov-file#psbt-sharing-with-trusted-devices', self.tr('See video')) }
+ - {self.tr('Choose trusted computers in Sync & Chat tab on each computer.') + ' '+ link('https://github.com/andreasgriffin/bitcoin-safe?tab=readme-ov-file#psbt-sharing-with-trusted-devices', self.tr('See video')) }
""",
@@ -1840,7 +1840,7 @@ def updateUi(self) -> None:
TutorialStep.receive: self.tr("Receive Test"),
TutorialStep.distribute: self.tr("Put in secure locations"),
TutorialStep.register: self.tr("Register multisig on signers"),
- TutorialStep.sync: self.tr("SyncChat"),
+ TutorialStep.sync: self.tr("Sync & Chat"),
}
for i, tutoral_step in enumerate(self.get_send_tests_steps()):
labels[tutoral_step] = (
diff --git a/bitcoin_safe/gui/screenshots/bitbox02-wallet-export.png b/bitcoin_safe/gui/screenshots/bitbox02-wallet-export.png
index 3b2791e..1542dfb 100644
Binary files a/bitcoin_safe/gui/screenshots/bitbox02-wallet-export.png and b/bitcoin_safe/gui/screenshots/bitbox02-wallet-export.png differ
diff --git a/bitcoin_safe/gui/screenshots/ledger-generate-seed.png b/bitcoin_safe/gui/screenshots/ledger-generate-seed.png
new file mode 100644
index 0000000..13d541b
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/ledger-generate-seed.png differ
diff --git a/bitcoin_safe/gui/screenshots/ledger-register-multisig-decriptor.png b/bitcoin_safe/gui/screenshots/ledger-register-multisig-decriptor.png
new file mode 100644
index 0000000..4fc9616
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/ledger-register-multisig-decriptor.png differ
diff --git a/bitcoin_safe/gui/screenshots/ledger-view-seed.png b/bitcoin_safe/gui/screenshots/ledger-view-seed.png
new file mode 100644
index 0000000..6d913b9
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/ledger-view-seed.png differ
diff --git a/bitcoin_safe/gui/screenshots/ledger-wallet-export.png b/bitcoin_safe/gui/screenshots/ledger-wallet-export.png
new file mode 100644
index 0000000..aa641bc
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/ledger-wallet-export.png differ
diff --git a/bitcoin_safe/gui/screenshots/trezor-generate-seed.png b/bitcoin_safe/gui/screenshots/trezor-generate-seed.png
new file mode 100644
index 0000000..14bc056
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/trezor-generate-seed.png differ
diff --git a/bitcoin_safe/gui/screenshots/trezor-register-multisig-decriptor.png b/bitcoin_safe/gui/screenshots/trezor-register-multisig-decriptor.png
new file mode 100644
index 0000000..57c38cb
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/trezor-register-multisig-decriptor.png differ
diff --git a/bitcoin_safe/gui/screenshots/trezor-wallet-export.png b/bitcoin_safe/gui/screenshots/trezor-wallet-export.png
new file mode 100644
index 0000000..9b023e9
Binary files /dev/null and b/bitcoin_safe/gui/screenshots/trezor-wallet-export.png differ
diff --git a/bitcoin_safe/hardware_signers.py b/bitcoin_safe/hardware_signers.py
index a320940..d455123 100644
--- a/bitcoin_safe/hardware_signers.py
+++ b/bitcoin_safe/hardware_signers.py
@@ -158,6 +158,20 @@ class HardwareSigners:
qr_types=[QrExportTypes.ur, DescriptorQrExportTypes.keystone],
descriptor_export_types=[DescriptorExportTypes.keystone],
)
+ trezor = HardwareSigner(
+ "trezor",
+ "Trezor",
+ usb_preferred=True,
+ qr_types=[],
+ descriptor_export_types=[],
+ )
+ ledger = HardwareSigner(
+ "ledger",
+ "Ledger",
+ usb_preferred=True,
+ qr_types=[],
+ descriptor_export_types=[],
+ )
specterdiy = HardwareSigner(
"specterdiy",
"Specter-DIY",
diff --git a/bitcoin_safe/pdf_statement.py b/bitcoin_safe/pdf_statement.py
index aac7f2c..70ae4eb 100644
--- a/bitcoin_safe/pdf_statement.py
+++ b/bitcoin_safe/pdf_statement.py
@@ -137,6 +137,8 @@ def create_balance_table(
("ALIGN", (0, 0), (-1, -1), "CENTER"), # Default alignment to center
("GRID", (0, 0), (-1, -1), 0.5, colors.black), # Grid color and size
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"), # Font style for header
+ ("BACKGROUND", (0, -1), (-1, -1), colors.lightgrey), # Header background color
+ ("TEXTCOLOR", (0, -1), (-1, -1), colors.whitesmoke), # Header text color
]
)
@@ -176,11 +178,11 @@ def create_invisible_table(columns: List[Any], col_widths: List[int]) -> Table:
def add_page_break(self) -> None:
self.elements.append(PageBreak()) # Add a page break between documents if needed
- def _address_table(self, address_info: List[Tuple[str, str]]) -> None:
+ def _address_table(self, address_info: List[Tuple[str, str]], total_amount: str) -> None:
self.elements.append(
self.create_balance_table(
- table=np.array(address_info),
+ table=np.array(address_info + [(translate("pdf", "Total"), total_amount)]),
widths=[400, 120],
header=["Address", f"Balance [{unit_str(self.network)}]"],
styles=[self.style_paragraph_left, self.style_paragraph_right],
@@ -221,6 +223,7 @@ def create_pdf(
wallet_descriptor_string: str,
address_info: List[Tuple[str, str]],
threshold: int,
+ total_amount: str,
) -> None:
self.elements.append(Paragraph(title, style=self.style_heading))
@@ -239,7 +242,7 @@ def create_pdf(
self._descriptor_part(wallet_descriptor_string, threshold)
- self._address_table(address_info=address_info)
+ self._address_table(address_info=address_info, total_amount=total_amount)
def save_pdf(self, filename: str) -> None:
@@ -270,9 +273,11 @@ def make_and_open_pdf_statement(wallet: Wallet, lang_code: str) -> None:
info = DescriptorInfo.from_str(wallet.multipath_descriptor.as_string())
address_info: List[Tuple[str, str]] = []
+ total_amount = 0
for address in wallet.get_addresses():
balance = wallet.get_addr_balance(address).total
if balance:
+ total_amount += balance
address_info.append(
(
address,
@@ -300,6 +305,9 @@ def make_and_open_pdf_statement(wallet: Wallet, lang_code: str) -> None:
wallet_descriptor_string=wallet.multipath_descriptor.as_string(),
address_info=address_info,
threshold=info.threshold,
+ total_amount=Satoshis(value=total_amount, network=wallet.network).format(
+ color_formatting="rich", show_unit=False, unicode_space_character=False
+ ),
)
temp_file = os.path.join(Path.home(), f"{file_title}.pdf")
diff --git a/bitcoin_safe/signature_manager.py b/bitcoin_safe/signature_manager.py
index a85b963..62d9c48 100644
--- a/bitcoin_safe/signature_manager.py
+++ b/bitcoin_safe/signature_manager.py
@@ -31,11 +31,12 @@
import logging
import os
import platform
+import re
import shutil
import subprocess
from dataclasses import dataclass
from pathlib import Path
-from typing import Any, Dict, List, Optional, Union
+from typing import Any, Dict, List, Optional, Tuple, Union
import pgpy # Python-native OpenPGP library
import requests
@@ -45,36 +46,72 @@
@dataclass
-class SimpleGPGKey:
- key: str
- repository: str # org/repo_name
- prefix: str
- manifest_ending: Optional[str] = None
+class FilenameInfo:
+ app_name: str
+ extension: str
+ version: str
+ architecture: Optional[str] = None
+ extra_info: Optional[str] = None
- @staticmethod
- def extract_prefix_and_version(filename: str) -> tuple[Optional[str], Optional[str]]:
- import re
+ @classmethod
+ def modify_filename_remove_architecture(cls, filename: str) -> Optional[Tuple[str, str]]:
+ # Capture architecture specifically
+ arch_regex = r"(.*?)([-_.](x86_64|arm64|aarch64|amd64))(.*)"
+ match = re.match(arch_regex, filename)
+ if match:
+ # Reconstruct the filename without the architecture part
+ parts_without_arch = match.group(1) + match.group(4)
+ architecture = match.group(3) # Capture the architecture
+ return (parts_without_arch, architecture)
+ return None # Return None if no architecture or matching issue
- if filename.endswith(".deb"):
- match = re.search(r"(.+)_(.+?)(?:-.+)?_.*\.deb", filename)
- if match:
- return (match.group(1), match.group(2))
+ @classmethod
+ def from_filename(cls, filename: str) -> Optional["FilenameInfo"]:
+ architecture = None
+ if res := cls.modify_filename_remove_architecture(filename=filename):
+ filename, architecture = res
+
+ # try with 4 digit version numbering
+ regex = (
+ r"(?P.+?)" # Capture app name up to the version, non-greedy
+ r"[-_.](?P\d+\.\d+\.\d+\.\d+[a-zA-Z0-9]*)?" # Capture version number, potentially including additional alphanumeric characters
+ r"(?:[-_.](?P[^-]+))?" # Optionally capture extra info with generalized separator
+ r"\.(?P[^._-]+)$" # Capture the extension, ensure no inclusion of '-' or '_'
+ )
- # try with - separator
- match = re.search(r"(.*?)-([\d\.]+[a-zA-Z0-9]*)", filename)
+ match = re.match(regex, filename)
if match:
- return (match.group(1), match.group(2))
+ return FilenameInfo(**match.groupdict(), architecture=architecture)
+
+ # try with 3 digit version numbering
+ regex = (
+ r"(?P.+?)" # Capture app name up to the version, non-greedy
+ r"[-_.](?P\d+\.\d+\.\d+[a-zA-Z0-9]*)?" # Capture version number, potentially including additional alphanumeric characters
+ r"(?:[-_.](?P[^-]+))?" # Optionally capture extra info with generalized separator
+ r"\.(?P[^._-]+)$" # Capture the extension, ensure no inclusion of '-' or '_'
+ )
- # try with _ separator
- match = re.search(r"(.*?)_([\d\.]+[a-zA-Z0-9]*)", filename)
+ match = re.match(regex, filename)
if match:
- return (match.group(1), match.group(2))
- return (None, None)
+ return FilenameInfo(**match.groupdict(), architecture=architecture)
+
+ return None
+
+
+@dataclass
+class SimpleGPGKey:
+ key: str
+ repository: str # org/repo_name
+ prefix: str
+ manifest_ending: Optional[str] = None
def get_tag_if_mine(self, filename: str) -> Optional[str]:
- prefix, version = self.extract_prefix_and_version(filename)
- if prefix and prefix.lower() == self.prefix.lower():
- return version
+ info = FilenameInfo.from_filename(filename)
+ if not info or not info.app_name or not info.version:
+ return None
+
+ if info.app_name.lower() == self.prefix.lower():
+ return info.version
return None
diff --git a/bitcoin_safe/util.py b/bitcoin_safe/util.py
index e05801f..290acf6 100644
--- a/bitcoin_safe/util.py
+++ b/bitcoin_safe/util.py
@@ -846,7 +846,7 @@ def calculate_ema(
return ema
-def briefcase_project_dir() -> Path:
+def current_project_dir() -> Path:
# __file__ == /tmp/.mount_Bitcoix7tQIZ/usr/app/bitcoin_safe/util.py
return Path(__file__).parent
diff --git a/poetry.lock b/poetry.lock
index 38dcd67..5e619da 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -22,25 +22,6 @@ files = [
{file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"},
]
-[[package]]
-name = "arrow"
-version = "1.3.0"
-description = "Better dates & times for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"},
- {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"},
-]
-
-[package.dependencies]
-python-dateutil = ">=2.7.0"
-types-python-dateutil = ">=2.8.10"
-
-[package.extras]
-doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"]
-test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"]
-
[[package]]
name = "base58"
version = "2.1.1"
@@ -76,20 +57,6 @@ files = [
{file = "bdkpython-0.31.0-cp39-cp39-win_amd64.whl", hash = "sha256:6d6d844a62fcf758ac5ebcdffe263c1fed4f5add9287400bc50a110f39d93476"},
]
-[[package]]
-name = "binaryornot"
-version = "0.4.4"
-description = "Ultra-lightweight pure Python package to check if a file is binary or text."
-optional = false
-python-versions = "*"
-files = [
- {file = "binaryornot-0.4.4-py2.py3-none-any.whl", hash = "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4"},
- {file = "binaryornot-0.4.4.tar.gz", hash = "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061"},
-]
-
-[package.dependencies]
-chardet = ">=3.0.2"
-
[[package]]
name = "bitcoin-nostr-chat"
version = "0.5.1"
@@ -110,13 +77,13 @@ requests = ">=2.31.0,<3.0.0"
[[package]]
name = "bitcoin-qr-tools"
-version = "1.0.0"
+version = "1.0.1"
description = "Python bitcoin qr reader and generator"
optional = false
python-versions = "<3.13,>=3.9"
files = [
- {file = "bitcoin_qr_tools-1.0.0-py3-none-any.whl", hash = "sha256:ba1af1135d741ba414fae6e6ab2b570c21600e99dd9ee6e6782e1312158c6c06"},
- {file = "bitcoin_qr_tools-1.0.0.tar.gz", hash = "sha256:cc45e3236ed8bba5ac9055db332a8cbe6102514ff09c54b392c7cbf2fd80bb66"},
+ {file = "bitcoin_qr_tools-1.0.1-py3-none-any.whl", hash = "sha256:873077fc385566200d640b181edec8f026f08579ad3c5450bd4a37116e6b5fa3"},
+ {file = "bitcoin_qr_tools-1.0.1.tar.gz", hash = "sha256:f0ef6c0d3e78b4b06c6654c4982efb283616bd7248164cbb93e613dfc9be3d03"},
]
[package.dependencies]
@@ -153,38 +120,6 @@ python-bitcointx = "1.1.4"
requests = ">=2.32.3,<3.0.0"
trezor = ">=0.13.9,<0.14.0"
-[[package]]
-name = "briefcase"
-version = "0.3.19"
-description = "Tools to support converting a Python project into a standalone native application."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "briefcase-0.3.19-py3-none-any.whl", hash = "sha256:d5f47ddd23fe7ea79870e13ea9bf43bbb51d238a2fdd3ef75d1a59bffdeff3f1"},
- {file = "briefcase-0.3.19.tar.gz", hash = "sha256:53d8344b73f357b155f892e3fcf19be97bcabb8b3997ebeaa483eb692d326748"},
-]
-
-[package.dependencies]
-build = ">=0.10"
-cookiecutter = ">=2.6.0,<3.0"
-dmgbuild = {version = ">=1.6,<2.0", markers = "sys_platform == \"darwin\""}
-GitPython = ">=3.1,<4.0"
-packaging = ">=22.0"
-pip = ">=23.1.2"
-platformdirs = ">=2.6,<5.0"
-psutil = ">=5.9,<6.0"
-python-dateutil = ">=2.9.0.post0"
-requests = ">=2.28,<3.0"
-rich = ">=12.6,<14.0"
-setuptools = ">=60"
-tomli = {version = ">=2.0,<3.0", markers = "python_version <= \"3.10\""}
-tomli-w = ">=1.0,<2.0"
-wheel = ">=0.37"
-
-[package.extras]
-dev = ["coverage-conditional-plugin (==0.9.0)", "coverage[toml] (==7.5.3)", "pre-commit (==3.5.0)", "pre-commit (==3.7.1)", "pytest (==8.2.2)", "pytest-xdist (==3.6.1)", "setuptools-scm (==8.1.0)", "tox (==4.15.1)"]
-docs = ["furo (==2024.5.6)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx (==7.3.7)", "sphinx-autobuild (==2021.3.14)", "sphinx-autobuild (==2024.4.16)", "sphinx-copybutton (==0.5.2)", "sphinx-tabs (==3.4.5)", "sphinxcontrib-spelling (==8.0.0)"]
-
[[package]]
name = "build"
version = "1.2.2.post1"
@@ -403,116 +338,103 @@ files = [
[[package]]
name = "charset-normalizer"
-version = "3.4.0"
+version = "3.4.1"
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
optional = false
-python-versions = ">=3.7.0"
-files = [
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"},
- {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"},
- {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"},
- {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"},
- {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"},
- {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"},
- {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"},
- {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"},
- {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"},
- {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"},
+python-versions = ">=3.7"
+files = [
+ {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
+ {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
+ {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+ {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
+ {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
+ {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
+ {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
+ {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
+ {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+ {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
]
[[package]]
@@ -532,13 +454,13 @@ rapidfuzz = ">=3.0.0,<4.0.0"
[[package]]
name = "click"
-version = "8.1.7"
+version = "8.1.8"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
files = [
- {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
- {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+ {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
]
[package.dependencies]
@@ -583,27 +505,6 @@ files = [
[package.dependencies]
construct = ">=2.10,<3.0"
-[[package]]
-name = "cookiecutter"
-version = "2.6.0"
-description = "A command-line utility that creates projects from project templates, e.g. creating a Python package project from a Python package project template."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "cookiecutter-2.6.0-py3-none-any.whl", hash = "sha256:a54a8e37995e4ed963b3e82831072d1ad4b005af736bb17b99c2cbd9d41b6e2d"},
- {file = "cookiecutter-2.6.0.tar.gz", hash = "sha256:db21f8169ea4f4fdc2408d48ca44859349de2647fbe494a9d6c3edfc0542c21c"},
-]
-
-[package.dependencies]
-arrow = "*"
-binaryornot = ">=0.4.4"
-click = ">=7.0,<9.0.0"
-Jinja2 = ">=2.7,<4.0.0"
-python-slugify = ">=4.0.0"
-pyyaml = ">=5.3.1"
-requests = ">=2.23.0"
-rich = "*"
-
[[package]]
name = "crashtest"
version = "0.4.1"
@@ -731,44 +632,6 @@ files = [
{file = "distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403"},
]
-[[package]]
-name = "dmgbuild"
-version = "1.6.2"
-description = "macOS command line utility to build disk images"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "dmgbuild-1.6.2-py3-none-any.whl", hash = "sha256:f78200b992027ccd2aa63872ed6ed11464e9149249303b8eee477e65280993d1"},
- {file = "dmgbuild-1.6.2.tar.gz", hash = "sha256:dba01d29f10c6804f2d72301600ddd03724daa41cd21a95409c44a3e199b19aa"},
-]
-
-[package.dependencies]
-ds-store = ">=1.1.0"
-mac-alias = ">=2.0.1"
-
-[package.extras]
-dev = ["coverage (==7.6.0)", "pre-commit (==3.5.0)", "pre-commit (==3.8.0)", "pytest (==8.3.2)", "pytest-cov (==5.0.0)", "tox (==4.16.0)"]
-docs = ["sphinx (==7.1.2)", "sphinx (==7.4.7)", "sphinx-autobuild (==2021.3.14)", "sphinx-autobuild (==2024.4.16)", "sphinx-rtd-theme (==2.0.0)"]
-
-[[package]]
-name = "ds-store"
-version = "1.3.1"
-description = "Manipulate Finder .DS_Store files from Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "ds_store-1.3.1-py3-none-any.whl", hash = "sha256:fbacbb0bd5193ab3e66e5a47fff63619f15e374ffbec8ae29744251a6c8f05b5"},
- {file = "ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c"},
-]
-
-[package.dependencies]
-mac-alias = ">=2.0.1"
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"]
-test = ["pytest", "pytest-cov", "pytest-tldr"]
-
[[package]]
name = "dulwich"
version = "0.21.7"
@@ -1007,38 +870,6 @@ defusedxml = "*"
fonttools = ">=4.34.0"
Pillow = ">=6.2.2,<9.2.dev0 || >=9.3.dev0"
-[[package]]
-name = "gitdb"
-version = "4.0.11"
-description = "Git Object Database"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"},
- {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"},
-]
-
-[package.dependencies]
-smmap = ">=3.0.1,<6"
-
-[[package]]
-name = "gitpython"
-version = "3.1.43"
-description = "GitPython is a Python library used to interact with Git repositories"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"},
- {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"},
-]
-
-[package.dependencies]
-gitdb = ">=4.0.1,<5"
-
-[package.extras]
-doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"]
-test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"]
-
[[package]]
name = "hidapi"
version = "0.14.0.post4"
@@ -1263,23 +1094,6 @@ files = [
test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"]
trio = ["async_generator", "trio"]
-[[package]]
-name = "jinja2"
-version = "3.1.4"
-description = "A very fast and expressive template engine."
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"},
- {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"},
-]
-
-[package.dependencies]
-MarkupSafe = ">=2.0"
-
-[package.extras]
-i18n = ["Babel (>=2.7)"]
-
[[package]]
name = "keyring"
version = "24.3.1"
@@ -1470,22 +1284,6 @@ html5 = ["html5lib"]
htmlsoup = ["BeautifulSoup4"]
source = ["Cython (>=3.0.11)"]
-[[package]]
-name = "mac-alias"
-version = "2.2.2"
-description = "Generate/parse Mac OS Alias records from Python"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mac_alias-2.2.2-py3-none-any.whl", hash = "sha256:504ab8ac546f35bbd75ad014d6ad977c426660aa721f2cd3acf3dc2f664141bd"},
- {file = "mac_alias-2.2.2.tar.gz", hash = "sha256:c99c728eb512e955c11f1a6203a0ffa8883b26549e8afe68804031aa5da856b7"},
-]
-
-[package.extras]
-dev = ["pre-commit", "tox"]
-docs = ["sphinx", "sphinx-autobuild", "sphinx-rtd-theme"]
-test = ["pytest", "pytest-cov", "pytest-tldr"]
-
[[package]]
name = "macholib"
version = "1.16.3"
@@ -1500,111 +1298,6 @@ files = [
[package.dependencies]
altgraph = ">=0.17"
-[[package]]
-name = "markdown-it-py"
-version = "3.0.0"
-description = "Python port of markdown-it. Markdown parsing, done right!"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"},
- {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"},
-]
-
-[package.dependencies]
-mdurl = ">=0.1,<1.0"
-
-[package.extras]
-benchmarking = ["psutil", "pytest", "pytest-benchmark"]
-code-style = ["pre-commit (>=3.0,<4.0)"]
-compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"]
-linkify = ["linkify-it-py (>=1,<3)"]
-plugins = ["mdit-py-plugins"]
-profiling = ["gprof2dot"]
-rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"]
-testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"]
-
-[[package]]
-name = "markupsafe"
-version = "3.0.2"
-description = "Safely add untrusted strings to HTML/XML markup."
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
- {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
- {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
- {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
- {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
- {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
- {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
- {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
-]
-
-[[package]]
-name = "mdurl"
-version = "0.1.2"
-description = "Markdown URL utilities"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"},
- {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
-]
-
[[package]]
name = "mnemonic"
version = "0.21"
@@ -1771,66 +1464,66 @@ files = [
[[package]]
name = "numpy"
-version = "2.2.0"
+version = "2.2.1"
description = "Fundamental package for array computing in Python"
optional = false
python-versions = ">=3.10"
files = [
- {file = "numpy-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa"},
- {file = "numpy-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219"},
- {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e"},
- {file = "numpy-2.2.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9"},
- {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3"},
- {file = "numpy-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83"},
- {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a"},
- {file = "numpy-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31"},
- {file = "numpy-2.2.0-cp310-cp310-win32.whl", hash = "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661"},
- {file = "numpy-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4"},
- {file = "numpy-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6"},
- {file = "numpy-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90"},
- {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608"},
- {file = "numpy-2.2.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da"},
- {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74"},
- {file = "numpy-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e"},
- {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b"},
- {file = "numpy-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d"},
- {file = "numpy-2.2.0-cp311-cp311-win32.whl", hash = "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410"},
- {file = "numpy-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73"},
- {file = "numpy-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3"},
- {file = "numpy-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e"},
- {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67"},
- {file = "numpy-2.2.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e"},
- {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038"},
- {file = "numpy-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03"},
- {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a"},
- {file = "numpy-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef"},
- {file = "numpy-2.2.0-cp312-cp312-win32.whl", hash = "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1"},
- {file = "numpy-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3"},
- {file = "numpy-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"},
- {file = "numpy-2.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae"},
- {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69"},
- {file = "numpy-2.2.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13"},
- {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671"},
- {file = "numpy-2.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571"},
- {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d"},
- {file = "numpy-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742"},
- {file = "numpy-2.2.0-cp313-cp313-win32.whl", hash = "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e"},
- {file = "numpy-2.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2"},
- {file = "numpy-2.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95"},
- {file = "numpy-2.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c"},
- {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca"},
- {file = "numpy-2.2.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d"},
- {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529"},
- {file = "numpy-2.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3"},
- {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab"},
- {file = "numpy-2.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72"},
- {file = "numpy-2.2.0-cp313-cp313t-win32.whl", hash = "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066"},
- {file = "numpy-2.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881"},
- {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773"},
- {file = "numpy-2.2.0-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e"},
- {file = "numpy-2.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7"},
- {file = "numpy-2.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221"},
- {file = "numpy-2.2.0.tar.gz", hash = "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0"},
+ {file = "numpy-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5edb4e4caf751c1518e6a26a83501fda79bff41cc59dac48d70e6d65d4ec4440"},
+ {file = "numpy-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa3017c40d513ccac9621a2364f939d39e550c542eb2a894b4c8da92b38896ab"},
+ {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:61048b4a49b1c93fe13426e04e04fdf5a03f456616f6e98c7576144677598675"},
+ {file = "numpy-2.2.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:7671dc19c7019103ca44e8d94917eba8534c76133523ca8406822efdd19c9308"},
+ {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4250888bcb96617e00bfa28ac24850a83c9f3a16db471eca2ee1f1714df0f957"},
+ {file = "numpy-2.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7746f235c47abc72b102d3bce9977714c2444bdfaea7888d241b4c4bb6a78bf"},
+ {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:059e6a747ae84fce488c3ee397cee7e5f905fd1bda5fb18c66bc41807ff119b2"},
+ {file = "numpy-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f62aa6ee4eb43b024b0e5a01cf65a0bb078ef8c395e8713c6e8a12a697144528"},
+ {file = "numpy-2.2.1-cp310-cp310-win32.whl", hash = "sha256:48fd472630715e1c1c89bf1feab55c29098cb403cc184b4859f9c86d4fcb6a95"},
+ {file = "numpy-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:b541032178a718c165a49638d28272b771053f628382d5e9d1c93df23ff58dbf"},
+ {file = "numpy-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40f9e544c1c56ba8f1cf7686a8c9b5bb249e665d40d626a23899ba6d5d9e1484"},
+ {file = "numpy-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9b57eaa3b0cd8db52049ed0330747b0364e899e8a606a624813452b8203d5f7"},
+ {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bc8a37ad5b22c08e2dbd27df2b3ef7e5c0864235805b1e718a235bcb200cf1cb"},
+ {file = "numpy-2.2.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:9036d6365d13b6cbe8f27a0eaf73ddcc070cae584e5ff94bb45e3e9d729feab5"},
+ {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51faf345324db860b515d3f364eaa93d0e0551a88d6218a7d61286554d190d73"},
+ {file = "numpy-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38efc1e56b73cc9b182fe55e56e63b044dd26a72128fd2fbd502f75555d92591"},
+ {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:31b89fa67a8042e96715c68e071a1200c4e172f93b0fbe01a14c0ff3ff820fc8"},
+ {file = "numpy-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4c86e2a209199ead7ee0af65e1d9992d1dce7e1f63c4b9a616500f93820658d0"},
+ {file = "numpy-2.2.1-cp311-cp311-win32.whl", hash = "sha256:b34d87e8a3090ea626003f87f9392b3929a7bbf4104a05b6667348b6bd4bf1cd"},
+ {file = "numpy-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:360137f8fb1b753c5cde3ac388597ad680eccbbbb3865ab65efea062c4a1fd16"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:694f9e921a0c8f252980e85bce61ebbd07ed2b7d4fa72d0e4246f2f8aa6642ab"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3683a8d166f2692664262fd4900f207791d005fb088d7fdb973cc8d663626faa"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:780077d95eafc2ccc3ced969db22377b3864e5b9a0ea5eb347cc93b3ea900315"},
+ {file = "numpy-2.2.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:55ba24ebe208344aa7a00e4482f65742969a039c2acfcb910bc6fcd776eb4355"},
+ {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b1d07b53b78bf84a96898c1bc139ad7f10fda7423f5fd158fd0f47ec5e01ac7"},
+ {file = "numpy-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5062dc1a4e32a10dc2b8b13cedd58988261416e811c1dc4dbdea4f57eea61b0d"},
+ {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fce4f615f8ca31b2e61aa0eb5865a21e14f5629515c9151850aa936c02a1ee51"},
+ {file = "numpy-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:67d4cda6fa6ffa073b08c8372aa5fa767ceb10c9a0587c707505a6d426f4e046"},
+ {file = "numpy-2.2.1-cp312-cp312-win32.whl", hash = "sha256:32cb94448be47c500d2c7a95f93e2f21a01f1fd05dd2beea1ccd049bb6001cd2"},
+ {file = "numpy-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:ba5511d8f31c033a5fcbda22dd5c813630af98c70b2661f2d2c654ae3cdfcfc8"},
+ {file = "numpy-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f1d09e520217618e76396377c81fba6f290d5f926f50c35f3a5f72b01a0da780"},
+ {file = "numpy-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ecc47cd7f6ea0336042be87d9e7da378e5c7e9b3c8ad0f7c966f714fc10d821"},
+ {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f419290bc8968a46c4933158c91a0012b7a99bb2e465d5ef5293879742f8797e"},
+ {file = "numpy-2.2.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b6c390bfaef8c45a260554888966618328d30e72173697e5cabe6b285fb2348"},
+ {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:526fc406ab991a340744aad7e25251dd47a6720a685fa3331e5c59fef5282a59"},
+ {file = "numpy-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f74e6fdeb9a265624ec3a3918430205dff1df7e95a230779746a6af78bc615af"},
+ {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:53c09385ff0b72ba79d8715683c1168c12e0b6e84fb0372e97553d1ea91efe51"},
+ {file = "numpy-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f3eac17d9ec51be534685ba877b6ab5edc3ab7ec95c8f163e5d7b39859524716"},
+ {file = "numpy-2.2.1-cp313-cp313-win32.whl", hash = "sha256:9ad014faa93dbb52c80d8f4d3dcf855865c876c9660cb9bd7553843dd03a4b1e"},
+ {file = "numpy-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:164a829b6aacf79ca47ba4814b130c4020b202522a93d7bff2202bfb33b61c60"},
+ {file = "numpy-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4dfda918a13cc4f81e9118dea249e192ab167a0bb1966272d5503e39234d694e"},
+ {file = "numpy-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:733585f9f4b62e9b3528dd1070ec4f52b8acf64215b60a845fa13ebd73cd0712"},
+ {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:89b16a18e7bba224ce5114db863e7029803c179979e1af6ad6a6b11f70545008"},
+ {file = "numpy-2.2.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:676f4eebf6b2d430300f1f4f4c2461685f8269f94c89698d832cdf9277f30b84"},
+ {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f5cdf9f493b35f7e41e8368e7d7b4bbafaf9660cba53fb21d2cd174ec09631"},
+ {file = "numpy-2.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1ad395cf254c4fbb5b2132fee391f361a6e8c1adbd28f2cd8e79308a615fe9d"},
+ {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:08ef779aed40dbc52729d6ffe7dd51df85796a702afbf68a4f4e41fafdc8bda5"},
+ {file = "numpy-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:26c9c4382b19fcfbbed3238a14abf7ff223890ea1936b8890f058e7ba35e8d71"},
+ {file = "numpy-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:93cf4e045bae74c90ca833cba583c14b62cb4ba2cba0abd2b141ab52548247e2"},
+ {file = "numpy-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bff7d8ec20f5f42607599f9994770fa65d76edca264a87b5e4ea5629bce12268"},
+ {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7ba9cc93a91d86365a5d270dee221fdc04fb68d7478e6bf6af650de78a8339e3"},
+ {file = "numpy-2.2.1-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:3d03883435a19794e41f147612a77a8f56d4e52822337844fff3d4040a142964"},
+ {file = "numpy-2.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4511d9e6071452b944207c8ce46ad2f897307910b402ea5fa975da32e0102800"},
+ {file = "numpy-2.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5c5cc0cbabe9452038ed984d05ac87910f89370b9242371bd9079cb4af61811e"},
+ {file = "numpy-2.2.1.tar.gz", hash = "sha256:45681fd7128c8ad1c379f0ca0776a8b0c6583d2f69889ddac01559dfe4390918"},
]
[[package]]
@@ -2002,17 +1695,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa
typing = ["typing-extensions"]
xmp = ["defusedxml"]
-[[package]]
-name = "pip"
-version = "24.3.1"
-description = "The PyPA recommended tool for installing Python packages."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pip-24.3.1-py3-none-any.whl", hash = "sha256:3790624780082365f47549d032f3770eeb2b1e8bd1f7b2e02dace1afa361b4ed"},
- {file = "pip-24.3.1.tar.gz", hash = "sha256:ebcb60557f2aefabc2e0f918751cd24ea0d56d8ec5445fe1807f1d2109660b99"},
-]
-
[[package]]
name = "pkginfo"
version = "1.12.0"
@@ -2158,34 +1840,6 @@ files = [
{file = "protobuf-4.25.5.tar.gz", hash = "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584"},
]
-[[package]]
-name = "psutil"
-version = "5.9.8"
-description = "Cross-platform lib for process and system monitoring in Python."
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
-files = [
- {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"},
- {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"},
- {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"},
- {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"},
- {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"},
- {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"},
- {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"},
- {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"},
- {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"},
- {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"},
- {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"},
- {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"},
- {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"},
- {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"},
- {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"},
-]
-
-[package.extras]
-test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"]
-
[[package]]
name = "ptyprocess"
version = "0.7.0"
@@ -2298,20 +1952,6 @@ files = [
{file = "pygame-2.6.1.tar.gz", hash = "sha256:56fb02ead529cee00d415c3e007f75e0780c655909aaa8e8bf616ee09c9feb1f"},
]
-[[package]]
-name = "pygments"
-version = "2.18.0"
-description = "Pygments is a syntax highlighting package written in Python."
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"},
- {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"},
-]
-
-[package.extras]
-windows-terminal = ["colorama (>=0.4.6)"]
-
[[package]]
name = "pyinstaller"
version = "6.11.1"
@@ -2348,13 +1988,13 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"]
[[package]]
name = "pyinstaller-hooks-contrib"
-version = "2024.10"
+version = "2024.11"
description = "Community maintained hooks for PyInstaller"
optional = false
python-versions = ">=3.8"
files = [
- {file = "pyinstaller_hooks_contrib-2024.10-py3-none-any.whl", hash = "sha256:ad47db0e153683b4151e10d231cb91f2d93c85079e78d76d9e0f57ac6c8a5e10"},
- {file = "pyinstaller_hooks_contrib-2024.10.tar.gz", hash = "sha256:8a46655e5c5b0186b5e527399118a9b342f10513eb1425c483fa4f6d02e8800c"},
+ {file = "pyinstaller_hooks_contrib-2024.11-py3-none-any.whl", hash = "sha256:2781d121a1ee961152ba7287a262c65a1078da30c9ef7621cb8c819326884fd5"},
+ {file = "pyinstaller_hooks_contrib-2024.11.tar.gz", hash = "sha256:84399af6b4b902030958063df25f657abbff249d0f329c5344928355c9833ab4"},
]
[package.dependencies]
@@ -2444,6 +2084,7 @@ python-versions = "*"
files = [
{file = "PyQt6_Charts_Qt6-6.8.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:40df5c70482e6f10ab1d5f7ac1744ddde97e14722e8db1e41d01e25b540ea5d8"},
{file = "PyQt6_Charts_Qt6-6.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eeb435a44344db843711bbeae7b09b524230501a607238c4c6734606e7593489"},
+ {file = "PyQt6_Charts_Qt6-6.8.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:80dcef5bab01901aa50643680a7dbc5132b577f8aa5d68f3617b9e006f4732f4"},
{file = "PyQt6_Charts_Qt6-6.8.1-py3-none-manylinux_2_35_x86_64.whl", hash = "sha256:fcd77a96bc1c2e2f92ffead543d6bba951eaec4c1b63c894e2ff9f7d314af075"},
{file = "PyQt6_Charts_Qt6-6.8.1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:ec473791fa79b124539cc154d577cb8958997b65f4aff6dd0139fcad217695db"},
{file = "PyQt6_Charts_Qt6-6.8.1-py3-none-win_amd64.whl", hash = "sha256:404be7fb5ded6a0285f6e16c6d5457f57e95425caed65878b41bd5a084c84ec8"},
@@ -2459,6 +2100,7 @@ python-versions = "*"
files = [
{file = "PyQt6_Qt6-6.8.1-py3-none-macosx_10_14_x86_64.whl", hash = "sha256:1eb8460a1fdb38d0b2458c2974c01d471c1e59e4eb19ea63fc447aaba3ad530e"},
{file = "PyQt6_Qt6-6.8.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9f3790c4ce4dc576e48b8718d55fb8743057e6cbd53a6ca1dd253ffbac9b7287"},
+ {file = "PyQt6_Qt6-6.8.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:d6ca5d2b9d2ec0ee4a814b2175f641a5c4299cb80b45e0f5f8356632663f89b3"},
{file = "PyQt6_Qt6-6.8.1-py3-none-manylinux_2_35_x86_64.whl", hash = "sha256:08065d595f1e6fc2dde9f4450eeff89082f4bad26f600a8e9b9cc5966716bfcf"},
{file = "PyQt6_Qt6-6.8.1-py3-none-manylinux_2_39_aarch64.whl", hash = "sha256:20843cb86bd94942d1cd99e39bf1aeabb875b241a35a8ab273e4bbbfa63776db"},
{file = "PyQt6_Qt6-6.8.1-py3-none-win_amd64.whl", hash = "sha256:006d786693d0511fbcf184a862edbd339c6ed1bb3bd9de363d73a19ed4b23dff"},
@@ -2578,20 +2220,6 @@ files = [
{file = "python_bitcointx-1.1.4-py3-none-any.whl", hash = "sha256:075a05a46920e31024fef226d8977f443e8405c65d669f1f1246fe58ba1df873"},
]
-[[package]]
-name = "python-dateutil"
-version = "2.9.0.post0"
-description = "Extensions to the standard Python datetime module"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
-files = [
- {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
- {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
-]
-
-[package.dependencies]
-six = ">=1.5"
-
[[package]]
name = "python-gnupg"
version = "0.5.3"
@@ -2603,23 +2231,6 @@ files = [
{file = "python_gnupg-0.5.3-py2.py3-none-any.whl", hash = "sha256:2f8a4c6f63766feca6cc1416408f8b84e1b914fe7b54514e570fc5cbe92e9248"},
]
-[[package]]
-name = "python-slugify"
-version = "8.0.4"
-description = "A Python slugify application that also handles Unicode"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "python-slugify-8.0.4.tar.gz", hash = "sha256:59202371d1d05b54a9e7720c5e038f928f45daaffe41dd10822f3907b937c856"},
- {file = "python_slugify-8.0.4-py2.py3-none-any.whl", hash = "sha256:276540b79961052b66b7d116620b36518847f52d5fd9e3a70164fc8c50faa6b8"},
-]
-
-[package.dependencies]
-text-unidecode = ">=1.3"
-
-[package.extras]
-unidecode = ["Unidecode (>=1.1.1)"]
-
[[package]]
name = "pyvirtualdisplay"
version = "3.0"
@@ -2874,25 +2485,6 @@ files = [
[package.dependencies]
requests = ">=2.0.1,<3.0.0"
-[[package]]
-name = "rich"
-version = "13.9.4"
-description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
-optional = false
-python-versions = ">=3.8.0"
-files = [
- {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
- {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
-]
-
-[package.dependencies]
-markdown-it-py = ">=2.2.0"
-pygments = ">=2.13.0,<3.0.0"
-typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.11\""}
-
-[package.extras]
-jupyter = ["ipywidgets (>=7.5.1,<9)"]
-
[[package]]
name = "secretstorage"
version = "3.3.3"
@@ -2972,17 +2564,6 @@ files = [
{file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
]
-[[package]]
-name = "smmap"
-version = "5.0.1"
-description = "A pure Python implementation of a sliding window memory map manager"
-optional = false
-python-versions = ">=3.7"
-files = [
- {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"},
- {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"},
-]
-
[[package]]
name = "snakeviz"
version = "2.2.2"
@@ -2997,17 +2578,6 @@ files = [
[package.dependencies]
tornado = ">=2.0"
-[[package]]
-name = "text-unidecode"
-version = "1.3"
-description = "The most basic Text::Unidecode port"
-optional = false
-python-versions = "*"
-files = [
- {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
- {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
-]
-
[[package]]
name = "tomli"
version = "2.2.1"
@@ -3049,17 +2619,6 @@ files = [
{file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"},
]
-[[package]]
-name = "tomli-w"
-version = "1.1.0"
-description = "A lil' TOML writer"
-optional = false
-python-versions = ">=3.9"
-files = [
- {file = "tomli_w-1.1.0-py3-none-any.whl", hash = "sha256:1403179c78193e3184bfaade390ddbd071cba48a32a2e62ba11aae47490c63f7"},
- {file = "tomli_w-1.1.0.tar.gz", hash = "sha256:49e847a3a304d516a169a601184932ef0f6b61623fe680f836a2aa7128ed0d33"},
-]
-
[[package]]
name = "tomlkit"
version = "0.13.2"
@@ -3093,13 +2652,13 @@ files = [
[[package]]
name = "translate-toolkit"
-version = "3.14.4"
+version = "3.14.5"
description = "Tools and API for translation and localization engineering."
optional = false
python-versions = ">=3.9"
files = [
- {file = "translate_toolkit-3.14.4-py3-none-any.whl", hash = "sha256:d190de7eba3e6d604203e71dcdade20a35550ddeff964d2d448fd369a8e7ee3e"},
- {file = "translate_toolkit-3.14.4.tar.gz", hash = "sha256:6bf58e151385b32e45c9643b24c80b3cd46ad5bcc4665afa5332974bc94cf79b"},
+ {file = "translate_toolkit-3.14.5-py3-none-any.whl", hash = "sha256:9fc0d1b011c4a1af6f970905df5775206f9c5f76b26eae0c8c0e2693c817d976"},
+ {file = "translate_toolkit-3.14.5.tar.gz", hash = "sha256:2846180b74a0b8cb7f51e7a70ae410c1310e9be37b7c6c849247c049e5c53dd0"},
]
[package.dependencies]
@@ -3107,8 +2666,8 @@ cwcwidth = ">=0.1.9"
lxml = ">=4.6.3"
[package.extras]
-all = ["BeautifulSoup4 (>=4.10.0)", "aeidon (==1.15)", "charset-normalizer (==3.4.0)", "cheroot (==10.0.1)", "fluent.syntax (==0.19.0)", "iniparse (==0.5)", "mistletoe (==1.4.0)", "phply (==1.2.6)", "pyenchant (==3.2.2)", "pyparsing (==3.2.0)", "python-Levenshtein (>=0.21.0)", "ruamel.yaml (==0.18.6)", "vobject (==0.9.9)"]
-chardet = ["charset-normalizer (==3.4.0)"]
+all = ["BeautifulSoup4 (>=4.10.0)", "aeidon (==1.15)", "charset-normalizer (==3.4.1)", "cheroot (==10.0.1)", "fluent.syntax (==0.19.0)", "iniparse (==0.5)", "mistletoe (==1.4.0)", "phply (==1.2.6)", "pyenchant (==3.2.2)", "pyparsing (==3.2.0)", "python-Levenshtein (>=0.21.0)", "ruamel.yaml (==0.18.6)", "vobject (==0.9.9)"]
+chardet = ["charset-normalizer (==3.4.1)"]
fluent = ["fluent.syntax (==0.19.0)"]
ical = ["vobject (==0.9.9)"]
ini = ["iniparse (==0.5)"]
@@ -3163,17 +2722,6 @@ files = [
{file = "trove_classifiers-2024.10.21.16.tar.gz", hash = "sha256:17cbd055d67d5e9d9de63293a8732943fabc21574e4c7b74edf112b4928cf5f3"},
]
-[[package]]
-name = "types-python-dateutil"
-version = "2.9.0.20241206"
-description = "Typing stubs for python-dateutil"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"},
- {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"},
-]
-
[[package]]
name = "typing-extensions"
version = "4.12.2"
@@ -3187,13 +2735,13 @@ files = [
[[package]]
name = "urllib3"
-version = "2.2.3"
+version = "2.3.0"
description = "HTTP library with thread-safe connection pooling, file post, and more."
optional = false
-python-versions = ">=3.8"
+python-versions = ">=3.9"
files = [
- {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"},
- {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"},
+ {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
+ {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
]
[package.extras]
@@ -3222,20 +2770,6 @@ platformdirs = ">=3.9.1,<5"
docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
-[[package]]
-name = "wheel"
-version = "0.45.1"
-description = "A built-package format for Python"
-optional = false
-python-versions = ">=3.8"
-files = [
- {file = "wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248"},
- {file = "wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729"},
-]
-
-[package.extras]
-test = ["pytest (>=6.0.0)", "setuptools (>=65)"]
-
[[package]]
name = "xattr"
version = "1.1.0"
@@ -3331,4 +2865,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.0"
python-versions = ">=3.10,<3.11"
-content-hash = "180a6d96f61eca3dd6207ec3d1e83d2066934bd8740ba8ddf79d4e4d4dd62ff1"
+content-hash = "0b1c9204be3f7985e7789121c49a25d09522107987582d1d3b6ae39afd22e7cb"
diff --git a/pyproject.toml b/pyproject.toml
index 0520966..21483da 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -12,7 +12,7 @@ line-length = 110
name = "bitcoin-safe"
# the version here and in all other places in this toml are updated automatically
# from the source: bitcoin_safe/__init__.py
-version = "1.0.0b5"
+version = "1.0.0rc1"
description = "A bitcoin savings wallet for the entire family."
authors = [ "andreasgriffin ",]
license = "GPL-3.0"
@@ -39,48 +39,18 @@ python-gnupg = "^0.5.2"
# bitcoin-qr-tools = {path="../bitcoin-qr-tools"} # "^0.10.15"
# bitcoin-nostr-chat = {path="../bitcoin-nostr-chat"} # "^0.2.6"
# bitcoin-usb = {path="../bitcoin-usb"} # "^0.3.3"
-bitcoin-qr-tools = "^1.0.0"
+bitcoin-qr-tools = "^1.0.1"
bitcoin-nostr-chat = "^0.5.1"
bitcoin-usb = "^0.7.0"
numpy = "^2.0.1"
pgpy = "^0.6.0"
-[tool.pytest.ini_options]
-markers = [
- "marker_qt_1: marks tests as marker_qt_1 (deselect by default)",
- "marker_qt_2: marks tests as marker_qt_2 (deselect by default)"
-]
-
-
-[tool.briefcase]
-project_name = "Bitcoin-Safe"
-bundle = "org.bitcoin-safe"
-version = "1.0.0b5"
-url = "www.bitcoin-safe.org"
-author = "Andreas Griffin"
-author_email = "andreasgriffin@proton.me"
-
-[tool.briefcase.license]
-file = "LICENSE"
-
-[tool.briefcase.app.bitcoin-safe]
-formal_name = "Bitcoin-Safe"
-description = "A bitcoin wallet for the entire family."
-long_description = "More details about the app should go here.\n"
-sources = [ "bitcoin_safe",]
-test_sources = [ "tests",]
-test_requires = [ "pytest",]
-resources = [ "bitcoin_safe/gui/locales/*.qm",]
-# these requirements are updated from the poetry lock file automatically
-requires = ["altgraph==0.17.4", "appdirs==1.4.4", "arrow==1.3.0", "base58==2.1.1", "bdkpython==0.31.0", "binaryornot==0.4.4", "bitcoin-nostr-chat==0.5.1", "bitcoin-qr-tools==1.0.0", "bitcoin-usb==0.7.0", "briefcase==0.3.19", "build==1.2.2.post1", "cachecontrol==0.14.1", "cbor2==5.6.5", "certifi==2024.8.30", "cffi==1.17.1", "cfgv==3.4.0", "chardet==5.2.0", "charset-normalizer==3.4.0", "cleo==2.1.0", "click==8.1.7", "colorama==0.4.6", "construct==2.10.70", "construct-classes==0.1.2", "cookiecutter==2.6.0", "crashtest==0.4.1", "cryptography==43.0.3", "cwcwidth==0.1.9", "defusedxml==0.7.1", "distlib==0.3.9", "dmgbuild==1.6.2", "ds-store==1.3.1", "dulwich==0.21.7", "ecdsa==0.19.0", "exceptiongroup==1.2.2", "fastjsonschema==2.21.1", "filelock==3.16.1", "fonttools==4.55.3", "fpdf2==2.8.1", "gitdb==4.0.11", "gitpython==3.1.43", "hidapi==0.14.0.post4", "hwi==3.1.0", "identify==2.6.3", "idna==3.10", "importlib-metadata==8.5.0", "iniconfig==2.0.0", "installer==0.7.0", "jaraco-classes==3.4.0", "jeepney==0.8.0", "jinja2==3.1.4", "keyring==24.3.1", "libusb1==3.1.0", "lxml==5.3.0", "mac-alias==2.2.2", "macholib==1.16.3", "markdown-it-py==3.0.0", "markupsafe==3.0.2", "mdurl==0.1.2", "mnemonic==0.21", "more-itertools==10.5.0", "msgpack==1.1.0", "mss==9.0.2", "nodeenv==1.9.1", "noiseprotocol==0.3.1", "nostr-sdk==0.32.2", "numpy==2.2.0", "opencv-python-headless==4.10.0.84", "packaging==24.2", "pefile==2023.2.7", "pexpect==4.9.0", "pgpy==0.6.0", "pillow==10.4.0", "pip==24.3.1", "pkginfo==1.12.0", "platformdirs==4.3.6", "pluggy==1.5.0", "poetry-core==1.9.1", "poetry-plugin-export==1.8.0", "pre-commit==3.8.0", "protobuf==4.25.5", "psutil==5.9.8", "ptyprocess==0.7.0", "pyaes==1.6.1", "pyasn1==0.6.1", "pycparser==2.22", "pygame==2.6.1", "pygments==2.18.0", "pyinstaller==6.11.1", "pyinstaller-hooks-contrib==2024.10", "pyprof2calltree==1.4.5", "pyproject-hooks==1.2.0", "pyqrcode==1.2.1", "pyqt6==6.8.0", "pyqt6-charts==6.8.0", "pyqt6-charts-qt6==6.8.1", "pyqt6-qt6==6.8.1", "pyqt6-sip==13.9.1", "pyserial==3.5", "pytest==8.3.4", "pytest-qt==4.4.0", "pytest-xvfb==3.0.0", "python-bitcointx==1.1.4", "python-dateutil==2.9.0.post0", "python-gnupg==0.5.3", "python-slugify==8.0.4", "pyvirtualdisplay==3.0", "pywin32-ctypes==0.2.3", "pyyaml==6.0.2", "pyzbar==0.1.9", "rapidfuzz==3.10.1", "reportlab==4.0.8", "requests==2.32.3", "requests-toolbelt==1.0.0", "rich==13.9.4", "secretstorage==3.3.3", "segno==1.6.1", "semver==3.0.2", "setuptools==75.6.0", "shellingham==1.5.4", "six==1.17.0", "smmap==5.0.1", "snakeviz==2.2.2", "text-unidecode==1.3", "tomli==2.2.1", "tomli-w==1.1.0", "tomlkit==0.13.2", "tornado==6.4.2", "translate-toolkit==3.14.2", "trezor==0.13.9", "trove-classifiers==2024.10.21.16", "types-python-dateutil==2.9.0.20241206", "typing-extensions==4.12.2", "urllib3==2.2.3", "virtualenv==20.28.0", "wheel==0.45.1", "zipp==3.21.0"]
-
-
[tool.poetry.group.dev.dependencies]
pytest = "^8.2.2"
pytest-qt = ">=4.4.0"
-briefcase = "0.3.19"
+# briefcase = "0.3.19"
requests = "^2.31.0"
pre-commit = "^3.8.0"
python-gnupg = "^0.5.2"
@@ -93,61 +63,93 @@ poetry = "^1.8.4"
pyinstaller = "^6.11.0"
poetry-plugin-export = "^1.8.0"
-[tool.briefcase.app.bitcoin-safe.macOS]
-universal_build = true
-requires = [ "std-nslog~=1.0.0",]
-system_runtime_requires = [ "libzbar0", "libsecp256k1-1",]
-[tool.briefcase.app.bitcoin-safe.linux]
-icon = "tools/resources/icon"
+[tool.pytest.ini_options]
+markers = [
+ "marker_qt_1: marks tests as marker_qt_1 (deselect by default)",
+ "marker_qt_2: marks tests as marker_qt_2 (deselect by default)"
+]
+
+
+# [tool.briefcase]
+# project_name = "Bitcoin-Safe"
+# bundle = "org.bitcoin-safe"
+# version = "1.0.0b5"
+# url = "www.bitcoin-safe.org"
+# author = "Andreas Griffin"
+# author_email = "andreasgriffin@proton.me"
+
+# [tool.briefcase.license]
+# file = "LICENSE"
+
+# [tool.briefcase.app.bitcoin-safe]
+# formal_name = "Bitcoin-Safe"
+# description = "A bitcoin wallet for the entire family."
+# long_description = "More details about the app should go here.\n"
+# sources = [ "bitcoin_safe",]
+# test_sources = [ "tests",]
+# test_requires = [ "pytest",]
+# resources = [ "bitcoin_safe/gui/locales/*.qm",]
+# # these requirements are updated from the poetry lock file automatically
+# requires = ["altgraph==0.17.4", "appdirs==1.4.4", "arrow==1.3.0", "base58==2.1.1", "bdkpython==0.31.0", "binaryornot==0.4.4", "bitcoin-nostr-chat==0.5.1", "bitcoin-qr-tools==1.0.0", "bitcoin-usb==0.7.0", "briefcase==0.3.19", "build==1.2.2.post1", "cachecontrol==0.14.1", "cbor2==5.6.5", "certifi==2024.8.30", "cffi==1.17.1", "cfgv==3.4.0", "chardet==5.2.0", "charset-normalizer==3.4.0", "cleo==2.1.0", "click==8.1.7", "colorama==0.4.6", "construct==2.10.70", "construct-classes==0.1.2", "cookiecutter==2.6.0", "crashtest==0.4.1", "cryptography==43.0.3", "cwcwidth==0.1.9", "defusedxml==0.7.1", "distlib==0.3.9", "dmgbuild==1.6.2", "ds-store==1.3.1", "dulwich==0.21.7", "ecdsa==0.19.0", "exceptiongroup==1.2.2", "fastjsonschema==2.21.1", "filelock==3.16.1", "fonttools==4.55.3", "fpdf2==2.8.1", "gitdb==4.0.11", "gitpython==3.1.43", "hidapi==0.14.0.post4", "hwi==3.1.0", "identify==2.6.3", "idna==3.10", "importlib-metadata==8.5.0", "iniconfig==2.0.0", "installer==0.7.0", "jaraco-classes==3.4.0", "jeepney==0.8.0", "jinja2==3.1.4", "keyring==24.3.1", "libusb1==3.1.0", "lxml==5.3.0", "mac-alias==2.2.2", "macholib==1.16.3", "markdown-it-py==3.0.0", "markupsafe==3.0.2", "mdurl==0.1.2", "mnemonic==0.21", "more-itertools==10.5.0", "msgpack==1.1.0", "mss==9.0.2", "nodeenv==1.9.1", "noiseprotocol==0.3.1", "nostr-sdk==0.32.2", "numpy==2.2.0", "opencv-python-headless==4.10.0.84", "packaging==24.2", "pefile==2023.2.7", "pexpect==4.9.0", "pgpy==0.6.0", "pillow==10.4.0", "pip==24.3.1", "pkginfo==1.12.0", "platformdirs==4.3.6", "pluggy==1.5.0", "poetry-core==1.9.1", "poetry-plugin-export==1.8.0", "pre-commit==3.8.0", "protobuf==4.25.5", "psutil==5.9.8", "ptyprocess==0.7.0", "pyaes==1.6.1", "pyasn1==0.6.1", "pycparser==2.22", "pygame==2.6.1", "pygments==2.18.0", "pyinstaller==6.11.1", "pyinstaller-hooks-contrib==2024.10", "pyprof2calltree==1.4.5", "pyproject-hooks==1.2.0", "pyqrcode==1.2.1", "pyqt6==6.8.0", "pyqt6-charts==6.8.0", "pyqt6-charts-qt6==6.8.1", "pyqt6-qt6==6.8.1", "pyqt6-sip==13.9.1", "pyserial==3.5", "pytest==8.3.4", "pytest-qt==4.4.0", "pytest-xvfb==3.0.0", "python-bitcointx==1.1.4", "python-dateutil==2.9.0.post0", "python-gnupg==0.5.3", "python-slugify==8.0.4", "pyvirtualdisplay==3.0", "pywin32-ctypes==0.2.3", "pyyaml==6.0.2", "pyzbar==0.1.9", "rapidfuzz==3.10.1", "reportlab==4.0.8", "requests==2.32.3", "requests-toolbelt==1.0.0", "rich==13.9.4", "secretstorage==3.3.3", "segno==1.6.1", "semver==3.0.2", "setuptools==75.6.0", "shellingham==1.5.4", "six==1.17.0", "smmap==5.0.1", "snakeviz==2.2.2", "text-unidecode==1.3", "tomli==2.2.1", "tomli-w==1.1.0", "tomlkit==0.13.2", "tornado==6.4.2", "translate-toolkit==3.14.2", "trezor==0.13.9", "trove-classifiers==2024.10.21.16", "types-python-dateutil==2.9.0.20241206", "typing-extensions==4.12.2", "urllib3==2.2.3", "virtualenv==20.28.0", "wheel==0.45.1", "zipp==3.21.0"]
+
+
+
+# [tool.briefcase.app.bitcoin-safe.macOS]
+# universal_build = true
+# requires = [ "std-nslog~=1.0.0",]
+# system_runtime_requires = [ "libzbar0", "libsecp256k1-1",]
+
+# [tool.briefcase.app.bitcoin-safe.linux]
+# icon = "tools/resources/icon"
-[tool.briefcase.app.bitcoin-safe.windows]
-requires = []
-use_full_install_path = false
+# [tool.briefcase.app.bitcoin-safe.windows]
+# requires = []
+# use_full_install_path = false
-[tool.briefcase.app.bitcoin-safe.iOS]
-supported = false
+# [tool.briefcase.app.bitcoin-safe.iOS]
+# supported = false
-[tool.briefcase.app.bitcoin-safe.android]
-supported = false
+# [tool.briefcase.app.bitcoin-safe.android]
+# supported = false
-[tool.briefcase.app.bitcoin-safe.web]
-supported = false
+# [tool.briefcase.app.bitcoin-safe.web]
+# supported = false
-[tool.briefcase.app.bitcoin-safe.macOS.entitlement]
-"com.apple.security.device.camera" = true
+# [tool.briefcase.app.bitcoin-safe.macOS.entitlement]
+# "com.apple.security.device.camera" = true
-[tool.briefcase.app.bitcoin-safe.macOS.info]
-NSCameraUsageDescription = "This application supports scanning QR-codes."
+# [tool.briefcase.app.bitcoin-safe.macOS.info]
+# NSCameraUsageDescription = "This application supports scanning QR-codes."
-[tool.briefcase.app.bitcoin-safe.linux.appimage]
-# deprecated. appimage are build using the
-# dedicated docker container
-manylinux = "manylinux_2_28"
-icon = "tools/resources/icon"
-resources = [ "tools/resources/icon/*.png", "tools/resources/icon/*.svg",]
-version = "1.0.0b5"
-# system_requires = [ "cmake", "gcc", "gcc-c++", "make", "perl", "git", "libxcb", "libxcb-devel", "xcb-util", "xcb-util-devel", "mesa-libGL-devel", "openssl-devel", "bison", "flex", "gperf", "sqlite-devel", "libicu-devel"]
+# [tool.briefcase.app.bitcoin-safe.linux.appimage]
+# # deprecated. appimage are build using the
+# # dedicated docker container
+# manylinux = "manylinux_2_28"
+# icon = "tools/resources/icon"
+# resources = [ "tools/resources/icon/*.png", "tools/resources/icon/*.svg",]
+# version = "1.0.0b5"
+# # system_requires = [ "cmake", "gcc", "gcc-c++", "make", "perl", "git", "libxcb", "libxcb-devel", "xcb-util", "xcb-util-devel", "mesa-libGL-devel", "openssl-devel", "bison", "flex", "gperf", "sqlite-devel", "libicu-devel"]
-[tool.briefcase.app.bitcoin-safe.linux.flatpak]
-bundle = "org.bitcoinsafe"
-flatpak_runtime = "org.kde.Platform"
-flatpak_runtime_version = "6.6"
-flatpak_sdk = "org.kde.Sdk"
+# [tool.briefcase.app.bitcoin-safe.linux.flatpak]
+# bundle = "org.bitcoinsafe"
+# flatpak_runtime = "org.kde.Platform"
+# flatpak_runtime_version = "6.6"
+# flatpak_sdk = "org.kde.Sdk"
-version = "1.0.0b5"
+# version = "1.0.0b5"
-[tool.briefcase.app.bitcoin-safe.linux.system.debian]
+# [tool.briefcase.app.bitcoin-safe.linux.system.debian]
-[tool.briefcase.app.bitcoin-safe.linux.system.rhel]
-system_runtime_requires = [ "qt6-qtbase-gui",]
+# [tool.briefcase.app.bitcoin-safe.linux.system.rhel]
+# system_runtime_requires = [ "qt6-qtbase-gui",]
-[tool.briefcase.app.bitcoin-safe.linux.system.suse]
-system_runtime_requires = [ "libQt6Gui6",]
+# [tool.briefcase.app.bitcoin-safe.linux.system.suse]
+# system_runtime_requires = [ "libQt6Gui6",]
-[tool.briefcase.app.bitcoin-safe.linux.system.arch]
+# [tool.briefcase.app.bitcoin-safe.linux.system.arch]
diff --git a/tests/non_gui/test_filename_info.py b/tests/non_gui/test_filename_info.py
new file mode 100644
index 0000000..3a13f19
--- /dev/null
+++ b/tests/non_gui/test_filename_info.py
@@ -0,0 +1,182 @@
+#
+# Bitcoin Safe
+# Copyright (C) 2024 Andreas Griffin
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of version 3 of the GNU General Public License as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see https://www.gnu.org/licenses/gpl-3.0.html
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+import logging
+
+from bitcoin_safe.signature_manager import FilenameInfo
+
+logger = logging.getLogger(__name__)
+
+
+def test_name_splitting_sparrow():
+ filename = "Sparrow-2.0.0-aarch64.dmg"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Sparrow', extension='dmg', version='2.0.0', architecture='aarch64', extra_info=None)"
+ )
+
+ filename = "Sparrow-2.0.0.msi"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Sparrow', extension='msi', version='2.0.0', architecture=None, extra_info=None)"
+ )
+
+ filename = "Sparrow-2.0.0.zip"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Sparrow', extension='zip', version='2.0.0', architecture=None, extra_info=None)"
+ )
+
+ filename = "sparrow_2.0.0-1_amd64.deb"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='deb', version='2.0.0', architecture='amd64', extra_info='1')"
+ )
+
+ filename = "sparrow-2.0.0-1.x86_64.rpm"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='rpm', version='2.0.0', architecture='x86_64', extra_info='1')"
+ )
+
+ filename = "sparrow-2.0.0-x86_64.tar.gz"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='gz', version='2.0.0', architecture='x86_64', extra_info='tar')"
+ )
+
+ filename = "sparrow_2.0.0-1_arm64.deb"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='deb', version='2.0.0', architecture='arm64', extra_info='1')"
+ )
+
+ filename = "sparrow-2.0.0-1.aarch64.rpm"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='rpm', version='2.0.0', architecture='aarch64', extra_info='1')"
+ )
+
+ filename = "sparrow-2.0.0-aarch64.tar.gz"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='gz', version='2.0.0', architecture='aarch64', extra_info='tar')"
+ )
+
+ filename = "sparrow-2.0.0-manifest.txt.asc"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='asc', version='2.0.0', architecture=None, extra_info='manifest.txt')"
+ )
+
+ filename = "sparrow-2.0.0-manifest.txt"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow', extension='txt', version='2.0.0', architecture=None, extra_info='manifest')"
+ )
+
+ filename = "sparrow-server-2.0.0-1.x86_64.rpm"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='sparrow-server', extension='rpm', version='2.0.0', architecture='x86_64', extra_info='1')"
+ )
+
+
+def test_name_bitcoin_safe():
+
+ filename = "Bitcoin-Safe-1.0.0b4-portable.exe"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='exe', version='1.0.0b4', architecture=None, extra_info='portable')"
+ )
+
+ filename = "Bitcoin-Safe-1.0.0b4-setup.exe"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='exe', version='1.0.0b4', architecture=None, extra_info='setup')"
+ )
+
+ for arch in ["arm64", "x86_64"]:
+ filename = f"Bitcoin-Safe-1.0.0b4_{arch}-setup.exe"
+ info = FilenameInfo.from_filename(filename)
+ assert info.app_name == "Bitcoin-Safe"
+ assert info.version == "1.0.0b4"
+ assert info.architecture == arch
+ assert info.extra_info == "setup"
+
+ filename = "Bitcoin-Safe-1.0.3-x86_64.AppImage"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='AppImage', version='1.0.3', architecture='x86_64', extra_info=None)"
+ )
+
+ filename = "Bitcoin-Safe_11.022.333beta3-x86_64_extra_info.AppImage"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='AppImage', version='11.022.333beta3', architecture='x86_64', extra_info='extra_info')"
+ )
+
+ filename = "Bitcoin-Safe_11.022.333beta3-x86_64.AppImage"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='AppImage', version='11.022.333beta3', architecture='x86_64', extra_info=None)"
+ )
+
+ filename = "Bitcoin-Safe-1.0.3.dmg"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='Bitcoin-Safe', extension='dmg', version='1.0.3', architecture=None, extra_info=None)"
+ )
+
+
+def test_name_splitting_linux_packages():
+
+ filename = "libreoffice-qt6-7.6.7.2-r0.apk"
+ info = FilenameInfo.from_filename(filename)
+ assert (
+ str(info)
+ == "FilenameInfo(app_name='libreoffice-qt6', extension='apk', version='7.6.7.2', architecture=None, extra_info='r0')"
+ )
diff --git a/tools/build.py b/tools/build.py
index 0d52ccf..f182bc8 100644
--- a/tools/build.py
+++ b/tools/build.py
@@ -36,7 +36,6 @@
from pathlib import Path
from typing import List, Literal
-import tomlkit
from translation_handler import TranslationHandler, run_local
from bitcoin_safe import __version__
@@ -81,49 +80,49 @@ def app_name_formatter(module_name: str) -> str:
return "-".join(parts)
- def update_briefcase_requires(
- self,
- pyproject_path="pyproject.toml",
- poetry_lock_path="poetry.lock",
- additional_requires=[],
- ):
-
- # Load pyproject.toml
- with open(pyproject_path, "r") as file:
- pyproject_data = tomlkit.load(file)
-
- # Load and parse poetry lock file
- with open(poetry_lock_path, "r") as file:
- poetry_lock_data = tomlkit.load(file)
-
- briefcase_requires = []
- # Extract packages from the lock file
- for package in poetry_lock_data["package"]:
- name = package["name"]
- if name in ["xattr", "poetry"]:
- continue
- version = package["version"]
- if package.get("source"):
- briefcase_requires.append(package.get("source", {}).get("url"))
- else:
- briefcase_requires.append(f"{name}=={version}")
-
- # Append any additional requires
- briefcase_requires.extend(additional_requires)
-
- # Ensure the structure exists before updating it
- pyproject_data.setdefault("tool", {}).setdefault("briefcase", {}).setdefault("app", {}).setdefault(
- "bitcoin-safe", {}
- )["requires"] = briefcase_requires
-
- # update version
- pyproject_data.setdefault("tool", {}).setdefault("briefcase", {})["version"] = self.version
- # update version
- pyproject_data.setdefault("tool", {}).setdefault("poetry", {})["version"] = self.version
-
- # Write updated pyproject.toml
- with open(pyproject_path, "w") as file:
- tomlkit.dump(pyproject_data, file)
+ # def update_briefcase_requires(
+ # self,
+ # pyproject_path="pyproject.toml",
+ # poetry_lock_path="poetry.lock",
+ # additional_requires=[],
+ # ):
+
+ # # Load pyproject.toml
+ # with open(pyproject_path, "r") as file:
+ # pyproject_data = tomlkit.load(file)
+
+ # # Load and parse poetry lock file
+ # with open(poetry_lock_path, "r") as file:
+ # poetry_lock_data = tomlkit.load(file)
+
+ # briefcase_requires = []
+ # # Extract packages from the lock file
+ # for package in poetry_lock_data["package"]:
+ # name = package["name"]
+ # if name in ["xattr", "poetry"]:
+ # continue
+ # version = package["version"]
+ # if package.get("source"):
+ # briefcase_requires.append(package.get("source", {}).get("url"))
+ # else:
+ # briefcase_requires.append(f"{name}=={version}")
+
+ # # Append any additional requires
+ # briefcase_requires.extend(additional_requires)
+
+ # # Ensure the structure exists before updating it
+ # pyproject_data.setdefault("tool", {}).setdefault("briefcase", {}).setdefault("app", {}).setdefault(
+ # "bitcoin-safe", {}
+ # )["requires"] = briefcase_requires
+
+ # # update version
+ # pyproject_data.setdefault("tool", {}).setdefault("briefcase", {})["version"] = self.version
+ # # update version
+ # pyproject_data.setdefault("tool", {}).setdefault("poetry", {})["version"] = self.version
+
+ # # Write updated pyproject.toml
+ # with open(pyproject_path, "w") as file:
+ # tomlkit.dump(pyproject_data, file)
def build_appimage_docker(
self, no_cache=False, build_commit: None | str | Literal["current_commit"] = "current_commit"
@@ -298,40 +297,40 @@ def build_dmg(
# Perform the move
shutil.move(str(file), str(DISTDIR / new_dir_name))
- def briefcase_appimage(self, **kwargs):
- # briefcase appimage building works on some systems, but not on others... unknown why.
- # so we build using the bitcoin_safe docker by default
- run_local("poetry run briefcase -u package linux appimage")
+ # def briefcase_appimage(self, **kwargs):
+ # # briefcase appimage building works on some systems, but not on others... unknown why.
+ # # so we build using the bitcoin_safe docker by default
+ # run_local("poetry run briefcase -u package linux appimage")
- def briefcase_windows(self, **kwargs):
- run_local("poetry run briefcase -u package windows")
+ # def briefcase_windows(self, **kwargs):
+ # run_local("poetry run briefcase -u package windows")
- def briefcase_mac(self, **kwargs):
- run_local("python3 -m poetry run briefcase -u package macOS app --no-notarize")
+ # def briefcase_mac(self, **kwargs):
+ # run_local("python3 -m poetry run briefcase -u package macOS app --no-notarize")
- def briefcase_deb(self, **kwargs):
- # _run_local(" briefcase -u package --target ubuntu:23.10") # no bdkpython for python3.11
- # _run_local(" briefcase -u package --target ubuntu:23.04") # no bdkpython for python3.11
- run_local("poetry run briefcase -u package --target ubuntu:22.04 -p deb")
+ # def briefcase_deb(self, **kwargs):
+ # # _run_local(" briefcase -u package --target ubuntu:23.10") # no bdkpython for python3.11
+ # # _run_local(" briefcase -u package --target ubuntu:23.04") # no bdkpython for python3.11
+ # run_local("poetry run briefcase -u package --target ubuntu:22.04 -p deb")
- def briefcase_flatpak(self, **kwargs):
- run_local("poetry run briefcase package linux flatpak")
+ # def briefcase_flatpak(self, **kwargs):
+ # run_local("poetry run briefcase package linux flatpak")
- shutil.rmtree("build")
+ # shutil.rmtree("build")
def package_application(
self,
targets: List[TARGET_LITERAL],
build_commit: None | str | Literal["current_commit"] = None,
):
- self.update_briefcase_requires()
+ # self.update_briefcase_requires()
f_map = {
"appimage": self.build_appimage_docker,
"windows": self.build_windows_exe_and_installer_docker,
"mac": self.build_dmg,
- "deb": self.briefcase_deb,
- "flatpak": self.briefcase_flatpak,
+ # "deb": self.briefcase_deb,
+ # "flatpak": self.briefcase_flatpak,
"snap": self.build_snap,
}