portugython 0.1.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. portugython-0.3.0/CHANGELOG.md +91 -0
  2. {portugython-0.1.0 → portugython-0.3.0}/PKG-INFO +1 -1
  3. {portugython-0.1.0 → portugython-0.3.0}/portugython/__init__.py +16 -3
  4. portugython-0.3.0/portugython/_importador.py +136 -0
  5. portugython-0.3.0/portugython/abstrato.py +14 -0
  6. portugython-0.3.0/portugython/argumentos.py +44 -0
  7. portugython-0.3.0/portugython/assincronico.py +87 -0
  8. portugython-0.3.0/portugython/bisecao.py +106 -0
  9. portugython-0.3.0/portugython/calendario.py +70 -0
  10. portugython-0.3.0/portugython/caminho.py +132 -0
  11. portugython-0.3.0/portugython/classe_dados.py +40 -0
  12. portugython-0.3.0/portugython/codificacao.py +95 -0
  13. portugython-0.3.0/portugython/compressao.py +58 -0
  14. portugython-0.3.0/portugython/configuracao.py +70 -0
  15. portugython-0.3.0/portugython/contexto.py +21 -0
  16. portugython-0.3.0/portugython/copia.py +28 -0
  17. portugython-0.3.0/portugython/csv_pt.py +46 -0
  18. portugython-0.3.0/portugython/depuracao.py +122 -0
  19. portugython-0.3.0/portugython/enumeracao.py +17 -0
  20. portugython-0.3.0/portugython/estatistica.py +81 -0
  21. portugython-0.3.0/portugython/estrutura.py +73 -0
  22. portugython-0.3.0/portugython/formatacao.py +118 -0
  23. portugython-0.3.0/portugython/hash_pt.py +96 -0
  24. portugython-0.3.0/portugython/identificador.py +45 -0
  25. portugython-0.3.0/portugython/json.py +71 -0
  26. portugython-0.3.0/portugython/rede.py +129 -0
  27. portugython-0.3.0/portugython/registro.py +64 -0
  28. portugython-0.3.0/portugython/serializacao.py +55 -0
  29. portugython-0.3.0/portugython/soquete.py +75 -0
  30. portugython-0.3.0/portugython/subprocesso.py +91 -0
  31. portugython-0.3.0/portugython/threads.py +110 -0
  32. portugython-0.3.0/portugython/tipagem.py +83 -0
  33. {portugython-0.1.0 → portugython-0.3.0}/pyproject.toml +1 -1
  34. portugython-0.3.0/tests/test_importador.py +170 -0
  35. {portugython-0.1.0 → portugython-0.3.0}/tests/test_portugython.py +1 -1
  36. portugython-0.3.0/tests/test_submodulos.py +433 -0
  37. portugython-0.1.0/CHANGELOG.md +0 -31
  38. portugython-0.1.0/tests/test_submodulos.py +0 -217
  39. {portugython-0.1.0 → portugython-0.3.0}/.gitignore +0 -0
  40. {portugython-0.1.0 → portugython-0.3.0}/LICENSE +0 -0
  41. {portugython-0.1.0 → portugython-0.3.0}/README.md +0 -0
  42. {portugython-0.1.0 → portugython-0.3.0}/portugython/aleatorio.py +0 -0
  43. {portugython-0.1.0 → portugython-0.3.0}/portugython/colecoes.py +0 -0
  44. {portugython-0.1.0 → portugython-0.3.0}/portugython/expressao.py +0 -0
  45. {portugython-0.1.0 → portugython-0.3.0}/portugython/funcional.py +0 -0
  46. {portugython-0.1.0 → portugython-0.3.0}/portugython/iteradores.py +0 -0
  47. {portugython-0.1.0 → portugython-0.3.0}/portugython/matematica.py +0 -0
  48. {portugython-0.1.0 → portugython-0.3.0}/portugython/py.typed +0 -0
  49. {portugython-0.1.0 → portugython-0.3.0}/portugython/sistema.py +0 -0
  50. {portugython-0.1.0 → portugython-0.3.0}/portugython/tempo.py +0 -0
  51. {portugython-0.1.0 → portugython-0.3.0}/tests/__init__.py +0 -0
@@ -0,0 +1,91 @@
1
+ # Changelog
2
+
3
+ ## 0.3.0 (2026-06-26)
4
+
5
+ Add import hook so all Portuguese module names work as top-level imports.
6
+
7
+ After `import portugython`, the full stdlib-level syntax works:
8
+
9
+ import aleatorio
10
+ from matematica import raiz_quadrada, PI
11
+ from colecoes import Contador, Pilha, Fila
12
+ from tempo import agora, hoje
13
+ from expressao import buscar, encontrar_todos
14
+ from dados import serializar, deserializar # json
15
+ from subprocesso import executar
16
+ from caminho import Caminho
17
+ # ... all 36 modules
18
+
19
+ New exports:
20
+ - `portugython.instalar()` - instala o gancho (chamado automaticamente)
21
+ - `portugython.desinstalar()` - remove o gancho
22
+ - `portugython.listar_modulos()` - retorna o mapa de nomes
23
+
24
+
25
+
26
+ Full stdlib coverage. 36 submodules total, all importable via `from portugython import <modulo>`:
27
+
28
+ **New in 0.2.0:**
29
+ - `caminho` (pathlib): Caminho com existe, eh_arquivo, listar, ler_texto, escrever_texto, etc.
30
+ - `json`: serializar, deserializar, serializar_arquivo, deserializar_arquivo
31
+ - `estatistica` (statistics): media, mediana, moda, desvio_padrao, covariancia, correlacao, quantis
32
+ - `enumeracao` (enum): Enumeracao, EnumeracaoInteira, EnumeracaoBandeira, automatico, unico
33
+ - `classe_dados` (dataclasses): classe_dados, campo, para_dicionario, para_tupla, substituir
34
+ - `contexto` (contextlib): gerenciador, suprimir, fechar_ao_sair, pilha_saida
35
+ - `tipagem` (typing): re-exporta todos os tipos com nomes em Portugues
36
+ - `csv_pt` (csv): ler_csv, escrever_csv, LeitorCSV, EscritorCSV, LeitorDicionario
37
+ - `registro` (logging): obter_registrador, configurar_registro, depurar, informar, avisar, erro
38
+ - `argumentos` (argparse): AnalisadorArgumentos com adicionar_argumento, analisar
39
+ - `subprocesso` (subprocess): executar, executar_shell, saida, chamar
40
+ - `copia` (copy): copiar, copiar_profundo
41
+ - `hash_pt` (hashlib + hmac): md5, sha256, sha512, blake2b, codigo_autenticacao, comparar_seguro
42
+ - `threads` (threading): Thread, Semaforo, Evento, Trava, contagem_threads, thread_atual
43
+ - `abstrato` (abc): ClasseAbstrata, metodo_abstrato, propriedade_abstrata
44
+ - `bisecao` (bisect + heapq): inserir_ordenado, buscar_ordenado, heapificar, empurrar, n_maiores
45
+ - `identificador` (uuid): uuid1, uuid3, uuid4, uuid5
46
+ - `calendario` (calendar): dias_no_mes, eh_ano_bissexto, dia_semana, calendario_mes
47
+ - `configuracao` (configparser): AnalisadorConfig com ler_arquivo, obter, definir, escrever_arquivo
48
+ - `serializacao` (pickle): serializar, deserializar, serializar_arquivo, deserializar_arquivo
49
+ - `codificacao` (base64 + codecs): para_base64, de_base64, para_base32, para_base16
50
+ - `compressao` (gzip + zlib): comprimir_gzip, descomprimir_gzip, comprimir_zlib
51
+ - `formatacao` (textwrap + pprint + string): quebrar, preencher, dedenter, recuar, imprimir_bonito
52
+ - `depuracao` (traceback + warnings + gc): imprimir_excecao, formatar_excecao, coletar_lixo
53
+ - `soquete` (socket): Soquete, criar_conexao, criar_servidor, nome_host, endereco_ip
54
+ - `assincronico` (asyncio): executar, criar_tarefa, dormir, reunir, Evento, Fila
55
+ - `estrutura` (struct): empacotar, desempacotar, calcular_tamanho
56
+ - `rede` (urllib + http): baixar_url, abrir_url, analisar_url, codificar_url, codificar_parametros
57
+
58
+ Also in 0.2.0:
59
+ - Fix: renamed builtin `identificador` alias to `obter_id` to avoid shadowing the uuid submodule
60
+ - 49 tests covering all modules
61
+
62
+
63
+ ## 0.1.0 (2026-06-26)
64
+
65
+ - Add full stdlib submodule set with Portuguese translations:
66
+ - `aleatorio` (random): escolha, embaralhe, amostra, gauss, normal, etc.
67
+ - `matematica` (math): raiz_quadrada, seno, cosseno, fatorial, mdc, mmc, etc.
68
+ - `sistema` (os + sys): diretorio_atual, listar_diretorio, existe, sair, etc.
69
+ - `tempo` (time + datetime): Data, Hora, DataHora, Duracao, agora, hoje, dormir, etc.
70
+ - `colecoes` (collections): Contador, Deque, DicionarioOrdenado, Pilha, Fila, etc.
71
+ - `iteradores` (itertools): encadeie, combine, permute, acumule, agrupe, etc.
72
+ - `funcional` (functools): reduzido, parcial, cache, compor, negado, etc.
73
+ - `expressao` (re): compilar, buscar, substituir, encontrar_todos, Padrao, etc.
74
+ - Rewrite `__init__.py` with clean Portuguese names (remove `_pt` suffixes)
75
+ - Add `Conjunto` class with Portuguese methods
76
+ - Expand `Texto`, `Lista`, `Dicionario` with more methods
77
+ - Add more exception types: ErroArquivo, ErroPermissao, ErroRecursao, ErroPausa
78
+ - Bump minimum Python to >=3.10
79
+ - 30 tests across all modules
80
+
81
+ ## 0.0.15 (2026-06-26)
82
+
83
+ - Add Portuguese translations of Python builtins and core functions
84
+ - Introduce Lista, Dicionario, Texto classes with Portuguese methods
85
+ - Add helper functions: se(), para_cada(), filtro()
86
+ - Add Portuguese exception classes
87
+ - Expand test suite
88
+
89
+ ## 0.0.14 (2022-11-28)
90
+
91
+ - Latest release on PyPI.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: portugython
3
- Version: 0.1.0
3
+ Version: 0.3.0
4
4
  Summary: A Portuguese translation of the Python functions/modules/packages
5
5
  Project-URL: Homepage, https://github.com/spacemany2k38/portugython
6
6
  Project-URL: Bug Tracker, https://github.com/spacemany2k38/portugython/issues
@@ -4,7 +4,16 @@ from __future__ import annotations
4
4
 
5
5
  from functools import reduce as _reduce
6
6
 
7
- __version__ = "0.1.0"
7
+ from portugython._importador import (
8
+ desinstalar,
9
+ instalar,
10
+ listar_modulos,
11
+ )
12
+
13
+ __version__ = "0.3.0"
14
+
15
+ # Instala o gancho de importacao automaticamente
16
+ instalar()
8
17
 
9
18
  # ---------------------------------------------------------------------------
10
19
  # IO
@@ -48,7 +57,7 @@ tipo = type
48
57
  chamavel = callable
49
58
  e_instancia = isinstance
50
59
  e_subclasse = issubclass
51
- identificador = id
60
+ obter_id = id
52
61
  atributos = dir
53
62
  obter_atributo = getattr
54
63
  definir_atributo = setattr
@@ -490,6 +499,10 @@ def imprima(*args: object, sep: str = " ", fim: str = "\n", **kwargs: object) ->
490
499
  # ---------------------------------------------------------------------------
491
500
  __all__ = [
492
501
  "__version__",
502
+ # Importador
503
+ "instalar",
504
+ "desinstalar",
505
+ "listar_modulos",
493
506
  # IO
494
507
  "escreva",
495
508
  "leia",
@@ -522,7 +535,7 @@ __all__ = [
522
535
  "chamavel",
523
536
  "e_instancia",
524
537
  "e_subclasse",
525
- "identificador",
538
+ "obter_id",
526
539
  "atributos",
527
540
  "obter_atributo",
528
541
  "definir_atributo",
@@ -0,0 +1,136 @@
1
+ """_importador - gancho de importacao que permite importar modulos em Portugues.
2
+
3
+ Quando ativado, permite usar nomes de modulos em Portugues diretamente:
4
+
5
+ import aleatorio
6
+ from matematica import raiz_quadrada
7
+ from colecoes import Contador
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import importlib
13
+ import importlib.abc
14
+ import importlib.machinery
15
+ import sys
16
+ from importlib.machinery import ModuleSpec
17
+ from typing import Sequence
18
+
19
+ # Mapeamento de nome em Portugues -> caminho completo do modulo portugython
20
+ MAPA_MODULOS: dict[str, str] = {
21
+ # Matematica e ciencia
22
+ "aleatorio": "portugython.aleatorio",
23
+ "matematica": "portugython.matematica",
24
+ "estatistica": "portugython.estatistica",
25
+ # Tipos e estruturas
26
+ "colecoes": "portugython.colecoes",
27
+ "iteradores": "portugython.iteradores",
28
+ "funcional": "portugython.funcional",
29
+ "bisecao": "portugython.bisecao",
30
+ # Tempo e data
31
+ "tempo": "portugython.tempo",
32
+ "calendario": "portugython.calendario",
33
+ # Sistema e IO
34
+ "sistema": "portugython.sistema",
35
+ "caminho": "portugython.caminho",
36
+ "subprocesso": "portugython.subprocesso",
37
+ "soquete": "portugython.soquete",
38
+ "rede": "portugython.rede",
39
+ # Texto e expressoes
40
+ "expressao": "portugython.expressao",
41
+ "formatacao": "portugython.formatacao",
42
+ # Serialization e codificacao
43
+ "serializacao": "portugython.serializacao",
44
+ "codificacao": "portugython.codificacao",
45
+ "compressao": "portugython.compressao",
46
+ "dados": "portugython.json",
47
+ # Concorrencia
48
+ "threads": "portugython.threads",
49
+ "assincronico": "portugython.assincronico",
50
+ # OOP e tipos
51
+ "abstrato": "portugython.abstrato",
52
+ "enumeracao": "portugython.enumeracao",
53
+ "classe_dados": "portugython.classe_dados",
54
+ "tipagem": "portugython.tipagem",
55
+ # Utilitarios
56
+ "registro": "portugython.registro",
57
+ "argumentos": "portugython.argumentos",
58
+ "contexto": "portugython.contexto",
59
+ "copia": "portugython.copia",
60
+ "hash_pt": "portugython.hash_pt",
61
+ "identificador": "portugython.identificador",
62
+ "configuracao": "portugython.configuracao",
63
+ "estrutura": "portugython.estrutura",
64
+ "depuracao": "portugython.depuracao",
65
+ "csv_pt": "portugython.csv_pt",
66
+ }
67
+
68
+
69
+ class _CarregadorAlias(importlib.abc.Loader):
70
+ """Carrega um modulo portugython sob um nome em Portugues."""
71
+
72
+ def __init__(self, modulo_real: str) -> None:
73
+ self._modulo_real = modulo_real
74
+
75
+ def create_module(self, spec: ModuleSpec): # noqa: ANN001
76
+ """Retorna o modulo real (ja carregado ou carregado agora)."""
77
+ return importlib.import_module(self._modulo_real)
78
+
79
+ def exec_module(self, module) -> None: # noqa: ANN001
80
+ """Nao precisa fazer nada: create_module ja retornou o modulo pronto."""
81
+
82
+
83
+ class ImportadorPortugues(importlib.abc.MetaPathFinder):
84
+ """Intercepta imports de nomes em Portugues e redireciona para portugython.*."""
85
+
86
+ def find_spec(
87
+ self,
88
+ fullname: str,
89
+ path: Sequence[str] | None,
90
+ target=None, # noqa: ANN001
91
+ ) -> ModuleSpec | None:
92
+ """Retorna um ModuleSpec para o modulo em Portugues, se mapeado.
93
+
94
+ Args:
95
+ fullname: Nome completo do modulo sendo importado.
96
+ path: Caminho de busca (ignorado aqui).
97
+ target: Modulo alvo (ignorado aqui).
98
+ """
99
+ if fullname in MAPA_MODULOS:
100
+ modulo_real = MAPA_MODULOS[fullname]
101
+ carregador = _CarregadorAlias(modulo_real)
102
+ return ModuleSpec(fullname, carregador)
103
+ return None
104
+
105
+
106
+ _gancho = ImportadorPortugues()
107
+
108
+
109
+ def instalar() -> None:
110
+ """Instala o importador de modulos em Portugues no sys.meta_path.
111
+
112
+ Apos chamar esta funcao, e possivel importar modulos pelo nome em Portugues:
113
+
114
+ import aleatorio
115
+ from matematica import raiz_quadrada, PI
116
+ from colecoes import Contador, Pilha
117
+ from tempo import agora, hoje
118
+ """
119
+ if not any(isinstance(f, ImportadorPortugues) for f in sys.meta_path):
120
+ sys.meta_path.insert(0, _gancho)
121
+
122
+
123
+ def desinstalar() -> None:
124
+ """Remove o importador de modulos em Portugues do sys.meta_path."""
125
+ sys.meta_path[:] = [
126
+ f for f in sys.meta_path if not isinstance(f, ImportadorPortugues)
127
+ ]
128
+
129
+
130
+ def listar_modulos() -> dict[str, str]:
131
+ """Retorna o mapeamento de nomes em Portugues para modulos portugython.
132
+
133
+ Returns:
134
+ Dicionario com nome_portugues -> caminho_modulo.
135
+ """
136
+ return dict(MAPA_MODULOS)
@@ -0,0 +1,14 @@
1
+ """abstrato - traducao em Portugues do modulo abc."""
2
+ from __future__ import annotations
3
+
4
+ import abc as _abc
5
+
6
+ __all__ = ["ClasseAbstrata", "metodo_abstrato", "propriedade_abstrata", "ABCMeta"]
7
+
8
+ ClasseAbstrata = _abc.ABC
9
+ metodo_abstrato = _abc.abstractmethod
10
+ ABCMeta = _abc.ABCMeta
11
+
12
+ def propriedade_abstrata(func):
13
+ """Decorator para propriedades abstratas."""
14
+ return property(_abc.abstractmethod(func))
@@ -0,0 +1,44 @@
1
+ """argumentos - traducao em Portugues do modulo argparse."""
2
+ from __future__ import annotations
3
+
4
+ import argparse as _ap
5
+
6
+ __all__ = [
7
+ "AnalisadorArgumentos", "EspacoNomes", "AcaoAdicionar",
8
+ "AcaoVerdadeiro", "AcaoFalso", "AcaoContar",
9
+ "ErroArgumento",
10
+ ]
11
+
12
+ ErroArgumento = _ap.ArgumentError
13
+ EspacoNomes = _ap.Namespace
14
+ AcaoAdicionar = "append"
15
+ AcaoVerdadeiro = "store_true"
16
+ AcaoFalso = "store_false"
17
+ AcaoContar = "count"
18
+
19
+ class AnalisadorArgumentos(_ap.ArgumentParser):
20
+ """ArgumentParser com metodos em Portugues."""
21
+
22
+ def adicionar_argumento(self, *nomes, **kwargs) -> None:
23
+ """Adiciona um argumento ao analisador."""
24
+ self.add_argument(*nomes, **kwargs)
25
+
26
+ def analisar(self, args=None) -> _ap.Namespace:
27
+ """Analisa os argumentos da linha de comando."""
28
+ return self.parse_args(args)
29
+
30
+ def analisar_parcial(self, args=None) -> tuple:
31
+ """Analisa os argumentos conhecidos, ignorando os desconhecidos."""
32
+ return self.parse_known_args(args)
33
+
34
+ def adicionar_subcomandos(self, **kwargs) -> _ap.Action:
35
+ """Adiciona suporte a subcomandos."""
36
+ return self.add_subparsers(**kwargs)
37
+
38
+ def adicionar_grupo(self, titulo: str = "", descricao: str = ""):
39
+ """Adiciona um grupo de argumentos."""
40
+ return self.add_argument_group(titulo, descricao)
41
+
42
+ def adicionar_grupo_exclusivo(self, obrigatorio: bool = False):
43
+ """Adiciona um grupo mutualmente exclusivo."""
44
+ return self.add_mutually_exclusive_group(required=obrigatorio)
@@ -0,0 +1,87 @@
1
+ """assincronico - traducao em Portugues do modulo asyncio."""
2
+ from __future__ import annotations
3
+
4
+ import asyncio as _aio
5
+ from typing import Any, Coroutine
6
+
7
+ __all__ = [
8
+ "executar", "esperar", "criar_tarefa", "dormir",
9
+ "reunir", "timeout", "cancelar_ao_timeout",
10
+ "Evento", "Fila", "Semaforo", "Trava",
11
+ "obter_laco", "novo_laco", "LacoEventos",
12
+ "corrotina", "eh_corrotina", "eh_aguardavel",
13
+ ]
14
+
15
+ LacoEventos = _aio.AbstractEventLoop
16
+ Evento = _aio.Event
17
+ Fila = _aio.Queue
18
+ Semaforo = _aio.Semaphore
19
+ Trava = _aio.Lock
20
+ corrotina = _aio.coroutine if hasattr(_aio, "coroutine") else None
21
+
22
+ def executar(corrotina_principal: Coroutine, *, depurar: bool = False) -> Any:
23
+ """Executa uma corrotina como programa principal.
24
+
25
+ Args:
26
+ corrotina_principal: Corrotina a executar.
27
+ depurar: Habilita modo de depuracao.
28
+ """
29
+ return _aio.run(corrotina_principal, debug=depurar)
30
+
31
+ async def esperar(aguardavel: Any) -> Any:
32
+ """Aguarda um aguardavel e retorna o resultado.
33
+
34
+ Args:
35
+ aguardavel: Corrotina, Task ou Future a aguardar.
36
+ """
37
+ return await _aio.ensure_future(aguardavel)
38
+
39
+ def criar_tarefa(corrotina: Coroutine, *, nome: str | None = None) -> _aio.Task:
40
+ """Cria uma Task a partir de uma corrotina.
41
+
42
+ Args:
43
+ corrotina: Corrotina a executar como tarefa.
44
+ nome: Nome opcional da tarefa.
45
+ """
46
+ return _aio.create_task(corrotina, name=nome)
47
+
48
+ async def dormir(segundos: float) -> None:
49
+ """Suspende a corrotina pelo tempo especificado.
50
+
51
+ Args:
52
+ segundos: Tempo de espera em segundos.
53
+ """
54
+ await _aio.sleep(segundos)
55
+
56
+ async def reunir(*aguardaveis: Any, retornar_excecoes: bool = False) -> list:
57
+ """Executa multiplos aguardaveis concorrentemente.
58
+
59
+ Args:
60
+ *aguardaveis: Corrotinas ou Tasks a executar.
61
+ retornar_excecoes: Se True, excecoes sao retornadas em vez de propagadas.
62
+ """
63
+ return await _aio.gather(*aguardaveis, return_exceptions=retornar_excecoes)
64
+
65
+ def timeout(delay: float):
66
+ """Context manager que cancela a operacao apos delay segundos."""
67
+ return _aio.timeout(delay)
68
+
69
+ def cancelar_ao_timeout(delay: float):
70
+ """Context manager que cancela apos delay (compat anterior)."""
71
+ return _aio.timeout(delay)
72
+
73
+ def obter_laco() -> _aio.AbstractEventLoop:
74
+ """Retorna o laco de eventos em execucao."""
75
+ return _aio.get_event_loop()
76
+
77
+ def novo_laco() -> _aio.AbstractEventLoop:
78
+ """Cria e retorna um novo laco de eventos."""
79
+ return _aio.new_event_loop()
80
+
81
+ def eh_corrotina(obj: Any) -> bool:
82
+ """Retorna True se obj for uma corrotina."""
83
+ return _aio.iscoroutine(obj)
84
+
85
+ def eh_aguardavel(obj: Any) -> bool:
86
+ """Retorna True se obj for aguardavel."""
87
+ return _aio.isfuture(obj) or _aio.iscoroutine(obj) or _aio.iscoroutinefunction(obj)
@@ -0,0 +1,106 @@
1
+ """bisecao - traducao em Portugues dos modulos bisect e heapq."""
2
+ from __future__ import annotations
3
+
4
+ import bisect as _bis
5
+ import heapq as _hq
6
+ from typing import Any
7
+
8
+ __all__ = [
9
+ # bisect
10
+ "inserir_esquerda", "inserir_direita", "buscar_esquerda", "buscar_direita",
11
+ # heapq
12
+ "heapificar", "empurrar", "retirar", "empurrar_retirar", "retirar_empurrar",
13
+ "n_maiores", "n_menores", "fundir",
14
+ # alias
15
+ "inserir_ordenado", "buscar_ordenado",
16
+ ]
17
+
18
+ def inserir_esquerda(
19
+ lista: list, item: Any, inicio: int = 0, fim: int | None = None
20
+ ) -> None:
21
+ """Insere item na lista ordenada, a esquerda de iguais.
22
+
23
+ Args:
24
+ lista: Lista ordenada.
25
+ item: Item a inserir.
26
+ inicio: Indice de inicio da busca.
27
+ fim: Indice de fim da busca.
28
+ """
29
+ if fim is None:
30
+ _bis.insort_left(lista, item, inicio)
31
+ else:
32
+ _bis.insort_left(lista, item, inicio, fim)
33
+
34
+ def inserir_direita(
35
+ lista: list, item: Any, inicio: int = 0, fim: int | None = None
36
+ ) -> None:
37
+ """Insere item na lista ordenada, a direita de iguais."""
38
+ if fim is None:
39
+ _bis.insort_right(lista, item, inicio)
40
+ else:
41
+ _bis.insort_right(lista, item, inicio, fim)
42
+
43
+ inserir_ordenado = inserir_direita
44
+
45
+ def buscar_esquerda(
46
+ lista: list, item: Any, inicio: int = 0, fim: int | None = None
47
+ ) -> int:
48
+ """Retorna o indice de insercao a esquerda de iguais."""
49
+ if fim is None:
50
+ return _bis.bisect_left(lista, item, inicio)
51
+ return _bis.bisect_left(lista, item, inicio, fim)
52
+
53
+ def buscar_direita(
54
+ lista: list, item: Any, inicio: int = 0, fim: int | None = None
55
+ ) -> int:
56
+ """Retorna o indice de insercao a direita de iguais."""
57
+ if fim is None:
58
+ return _bis.bisect_right(lista, item, inicio)
59
+ return _bis.bisect_right(lista, item, inicio, fim)
60
+
61
+ buscar_ordenado = buscar_direita
62
+
63
+ def heapificar(lista: list) -> None:
64
+ """Converte uma lista em heap no lugar (min-heap).
65
+
66
+ Args:
67
+ lista: Lista a converter.
68
+ """
69
+ _hq.heapify(lista)
70
+
71
+ def empurrar(heap: list, item: Any) -> None:
72
+ """Adiciona item ao heap mantendo a propriedade de heap.
73
+
74
+ Args:
75
+ heap: Heap existente.
76
+ item: Item a adicionar.
77
+ """
78
+ _hq.heappush(heap, item)
79
+
80
+ def retirar(heap: list) -> Any:
81
+ """Remove e retorna o menor item do heap.
82
+
83
+ Args:
84
+ heap: Heap existente.
85
+ """
86
+ return _hq.heappop(heap)
87
+
88
+ def empurrar_retirar(heap: list, item: Any) -> Any:
89
+ """Empurra item e retira o menor de forma eficiente."""
90
+ return _hq.heappushpop(heap, item)
91
+
92
+ def retirar_empurrar(heap: list, item: Any) -> Any:
93
+ """Retira o menor e empurra item de forma eficiente."""
94
+ return _hq.heapreplace(heap, item)
95
+
96
+ def n_maiores(n: int, iteravel: Any, chave=None) -> list:
97
+ """Retorna os n maiores elementos do iteravel."""
98
+ return _hq.nlargest(n, iteravel, key=chave)
99
+
100
+ def n_menores(n: int, iteravel: Any, chave=None) -> list:
101
+ """Retorna os n menores elementos do iteravel."""
102
+ return _hq.nsmallest(n, iteravel, key=chave)
103
+
104
+ def fundir(*iteraveis: Any, chave=None) -> Any:
105
+ """Funde iteraveis ordenados em um unico iteravel ordenado."""
106
+ return _hq.merge(*iteraveis, key=chave)
@@ -0,0 +1,70 @@
1
+ """calendario - traducao em Portugues do modulo calendar."""
2
+ from __future__ import annotations
3
+
4
+ import calendar as _cal
5
+
6
+ __all__ = [
7
+ "calendario_mes", "calendario_ano", "dias_no_mes", "eh_ano_bissexto",
8
+ "dia_semana", "dias_semana", "meses",
9
+ "SEGUNDA", "TERCA", "QUARTA", "QUINTA", "SEXTA", "SABADO", "DOMINGO",
10
+ "Calendario", "CalendarioTexto",
11
+ ]
12
+
13
+ SEGUNDA = _cal.MONDAY
14
+ TERCA = _cal.TUESDAY
15
+ QUARTA = _cal.WEDNESDAY
16
+ QUINTA = _cal.THURSDAY
17
+ SEXTA = _cal.FRIDAY
18
+ SABADO = _cal.SATURDAY
19
+ DOMINGO = _cal.SUNDAY
20
+
21
+ dias_semana = list(_cal.day_name)
22
+ meses = list(_cal.month_name)[1:]
23
+
24
+ Calendario = _cal.Calendar
25
+ CalendarioTexto = _cal.TextCalendar
26
+
27
+ def calendario_mes(ano: int, mes: int, largura: int = 0) -> str:
28
+ """Retorna o calendario de um mes como texto.
29
+
30
+ Args:
31
+ ano: Ano.
32
+ mes: Mes (1-12).
33
+ largura: Largura da coluna de dia.
34
+ """
35
+ return _cal.month(ano, mes, largura)
36
+
37
+ def calendario_ano(ano: int) -> str:
38
+ """Retorna o calendario do ano inteiro como texto.
39
+
40
+ Args:
41
+ ano: Ano.
42
+ """
43
+ return _cal.calendar(ano)
44
+
45
+ def dias_no_mes(ano: int, mes: int) -> int:
46
+ """Retorna o numero de dias no mes.
47
+
48
+ Args:
49
+ ano: Ano.
50
+ mes: Mes (1-12).
51
+ """
52
+ return _cal.monthrange(ano, mes)[1]
53
+
54
+ def eh_ano_bissexto(ano: int) -> bool:
55
+ """Retorna True se o ano for bissexto.
56
+
57
+ Args:
58
+ ano: Ano.
59
+ """
60
+ return _cal.isleap(ano)
61
+
62
+ def dia_semana(ano: int, mes: int, dia: int) -> int:
63
+ """Retorna o dia da semana (0=segunda, 6=domingo).
64
+
65
+ Args:
66
+ ano: Ano.
67
+ mes: Mes (1-12).
68
+ dia: Dia (1-31).
69
+ """
70
+ return _cal.weekday(ano, mes, dia)