├── modulos ├── usuarios │ ├── __init__.py │ ├── gestion │ │ ├── __init__.py │ │ ├── crud.py │ │ └── __pycache__ │ │ │ ├── crud.cpython-310.pyc │ │ │ ├── __init__.cpython-310.pyc │ │ │ └── utilidades.cpython-310.pyc │ ├── impuestos │ │ ├── __init__.py │ │ ├── __pycache__ │ │ │ ├── __init__.cpython-310.pyc │ │ │ └── utilidades.cpython-310.pyc │ │ └── utilidades.py │ └── __pycache__ │ │ ├── __init__.cpython-310.pyc │ │ └── acciones.cpython-310.pyc ├── __pycache__ │ ├── usuario.cpython-310.pyc │ └── usuario_impuestos.cpython-310.pyc └── app.py ├── productly_django ├── .gitignore ├── productly │ ├── __init__.py │ ├── views.py │ ├── asgi.py │ ├── wsgi.py │ ├── urls.py │ └── settings.py ├── productos │ ├── __init__.py │ ├── migrations │ │ ├── __init__.py │ │ ├── 0002_producto_creado_en.py │ │ └── 0001_initial.py │ ├── tests.py │ ├── apps.py │ ├── forms.py │ ├── templatetags │ │ └── add_attr.py │ ├── urls.py │ ├── templates │ │ ├── detalle.html │ │ ├── producto_form.html │ │ ├── form_snippet.html │ │ └── index.html │ ├── admin.py │ ├── models.py │ └── views.py ├── .pylintrc ├── db.sqlite3 ├── templates │ ├── inicio.html │ ├── django │ │ └── forms │ │ │ ├── label.html │ │ │ └── widgets │ │ │ ├── input.html │ │ │ └── select.html │ └── base.html ├── Pipfile ├── manage.py └── Pipfile.lock ├── modulos-nativos ├── lala-destino.md ├── holamundo.png ├── 01-browser.py ├── plantilla.html ├── 03-timedelta.py ├── 02-fechas.py ├── 04-random.py ├── 05-cli.py ├── 06-email.py └── 07-plantillas.py ├── paquetes-populares ├── .gitignore ├── planilla.xlsx ├── nuevo_excel.xlsx ├── Pipfile ├── 02-twilio.py ├── .env.example ├── 04-scrapper.py ├── 01-env.py ├── 05-excel.py ├── 06-selenium.py ├── 03-requests.py └── Pipfile.lock ├── archivos ├── archivo-prueba.txt ├── hola-mundo.txt ├── archivo.csv ├── comprimidos.zip ├── productos.json ├── 02-escritura-lectura.py ├── 01-archivos.py ├── 06-comprimidos.py ├── 05-json.py ├── 04-csv.py └── 03-open.py ├── holamundoplayer ├── holamundoplayer │ ├── lala.py │ ├── __init__.py │ └── player.py ├── README.md ├── app.py ├── setup.py └── LICENSE ├── format.py ├── clases ├── 01-introduccion.py ├── 02-clases.py ├── 17-extender-tipos-nativos.py ├── 03-constructor.py ├── 11-herencia.py ├── 12-herencia-multiple.py ├── 16-polimorfismo.py ├── 13-anulacion-metodo.py ├── 08-metodos-mágicos.py ├── 04-propiedades-clase.py ├── 05-metodos-clase.py ├── 07-decorador-properties.py ├── 06-privados.py ├── 14-ejemplo-real.py ├── 09-comparacion.py ├── 15-clases-abstractas.py └── 10-contenedores.py ├── tipos ├── 05-secuencias-escape.py ├── 03-format-strings.py ├── 01-variables.py ├── 09-conversion-tipos.py ├── 07-numeros-funciones.py ├── 06-numeros.py ├── 04-metodos-strings.py ├── 02-strings.py └── 08-calculadora.py ├── intro.py ├── sqlite ├── app.db ├── 01-intro.py ├── 06-select-one.py ├── 07-select-all.py ├── 04-insert.py ├── 03-with.py ├── 02-create-table.py └── 05-multi-insert.py ├── package ├── app.py ├── Pipfile └── Pipfile.lock ├── rutas ├── one │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-310.pyc ├── two │ ├── __init__.py │ └── __pycache__ │ │ └── __init__.cpython-310.pyc ├── 02-directorios.py ├── 01-path.py └── 03-inyeccion-deps.py ├── pypi-test ├── app.py ├── Pipfile └── Pipfile.lock ├── control-flujo ├── 08-loop-anidado.py ├── 05-cadena-comparadores.py ├── 04-operadores-logicos.py ├── 03-if-ternario.py ├── 01-comparadores.py ├── 07-while.py ├── 06-for.py ├── 02-if.py └── 09-calculadora.py ├── excepciones ├── 01-intro.py ├── 02-tipos-excepciones.py ├── 03-else-fnally.py ├── 04-invocar-excepcion.py └── 05-excepciones-custom.py ├── machine_learning ├── recomendador-juegos.joblib ├── .ipynb_checkpoints │ ├── Untitled-checkpoint.ipynb │ └── HolaMundo-checkpoint.ipynb ├── juegos-ml.csv └── HolaMundo.ipynb ├── funciones ├── 04-return.py ├── 01-funciones.py ├── 03-kwargs.py ├── 06-depuracion.py ├── 02-xargs.py ├── 05-alcance.py └── 07-ejercicio.py ├── tipos-avanzados ├── 04-iterar-listas.py ├── 05-buscar-elemento.py ├── 13-filas.py ├── 03-desempaquetar-listas.py ├── 14-colas.py ├── 10-sets.py ├── 02-manipulando-listas.py ├── 07-ordenando-listas.py ├── 06-agregando-eliminando.py ├── 12-desempaquetar.py ├── 01-listas.py ├── 09-tupla.py ├── 08-compresion-listas.py ├── 11-diccionarios.py └── 15-ejercicio.py ├── .vscode ├── settings.json └── launch.json └── README.md /modulos/usuarios/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /productly_django/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modulos-nativos/lala-destino.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /paquetes-populares/.gitignore: -------------------------------------------------------------------------------- 1 | .env -------------------------------------------------------------------------------- /archivos/archivo-prueba.txt: -------------------------------------------------------------------------------- 1 | hola mundo -------------------------------------------------------------------------------- /modulos/usuarios/gestion/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modulos/usuarios/impuestos/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /productly_django/productly/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /productly_django/productos/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /holamundoplayer/holamundoplayer/lala.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /archivos/hola-mundo.txt: -------------------------------------------------------------------------------- 1 | Chanchito feliz lando :( -------------------------------------------------------------------------------- /productly_django/.pylintrc: -------------------------------------------------------------------------------- 1 | load-plugins=pylint-django -------------------------------------------------------------------------------- /productly_django/productos/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /format.py: -------------------------------------------------------------------------------- 1 | chanchito = "feliz" 2 | a = 12 3 | b = 13 4 | -------------------------------------------------------------------------------- /clases/01-introduccion.py: -------------------------------------------------------------------------------- 1 | mensaje = "Hola mundo" 2 | print(type(mensaje)) 3 | -------------------------------------------------------------------------------- /modulos/usuarios/gestion/crud.py: -------------------------------------------------------------------------------- 1 | def guardar(): 2 | print("guardando") 3 | -------------------------------------------------------------------------------- /holamundoplayer/README.md: -------------------------------------------------------------------------------- 1 | # Player de prueba 2 | Este es un reproductor de prueba -------------------------------------------------------------------------------- /tipos/05-secuencias-escape.py: -------------------------------------------------------------------------------- 1 | curso = "Ultimate \nPython\"" 2 | print(curso) 3 | -------------------------------------------------------------------------------- /intro.py: -------------------------------------------------------------------------------- 1 | """Ultimate Python""" 2 | print("Hola Mundo!") 3 | print("El weta " * 4 ) 4 | -------------------------------------------------------------------------------- /sqlite/app.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/sqlite/app.db -------------------------------------------------------------------------------- /archivos/archivo.csv: -------------------------------------------------------------------------------- 1 | twit_id,user_id,text 2 | 1000,1,texto modificado 3 | 1001,2,otro twit! 4 | -------------------------------------------------------------------------------- /holamundoplayer/app.py: -------------------------------------------------------------------------------- 1 | from holamundoplayer import player 2 | 3 | p = player.Player() 4 | # p. -------------------------------------------------------------------------------- /holamundoplayer/holamundoplayer/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Esta es la documentación del paquete 3 | """ -------------------------------------------------------------------------------- /package/app.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | r = requests.get("https://www.google.com") 4 | print(r) -------------------------------------------------------------------------------- /rutas/one/__init__.py: -------------------------------------------------------------------------------- 1 | def init(graphql, **_): 2 | print(f"soy paquete uno: {graphql}") 3 | -------------------------------------------------------------------------------- /sqlite/01-intro.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | con = sqlite3.connect("sqlite/app.db") 3 | con.close() 4 | -------------------------------------------------------------------------------- /rutas/two/__init__.py: -------------------------------------------------------------------------------- 1 | def init(db, api, **otros): 2 | print(f"soy paquete dos: {db} {api}") 3 | -------------------------------------------------------------------------------- /productly_django/productos/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /pypi-test/app.py: -------------------------------------------------------------------------------- 1 | from holamundoplayer import player 2 | 3 | p = player.Player() 4 | p.play("hola mundo") -------------------------------------------------------------------------------- /archivos/comprimidos.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/archivos/comprimidos.zip -------------------------------------------------------------------------------- /control-flujo/08-loop-anidado.py: -------------------------------------------------------------------------------- 1 | for j in range(3): 2 | for k in range(2): 3 | print(f"{j},{k}") 4 | -------------------------------------------------------------------------------- /productly_django/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/productly_django/db.sqlite3 -------------------------------------------------------------------------------- /archivos/productos.json: -------------------------------------------------------------------------------- 1 | [{"id": 1, "name": "Chanchito Feliz"}, {"id": 2, "name": "Bicicleta"}, {"id": 3, "name": "Skate"}] -------------------------------------------------------------------------------- /modulos-nativos/holamundo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos-nativos/holamundo.png -------------------------------------------------------------------------------- /control-flujo/05-cadena-comparadores.py: -------------------------------------------------------------------------------- 1 | edad = 25 2 | 3 | if 15 <= edad <= 65: 4 | print("Puede entrar a la piscina") 5 | -------------------------------------------------------------------------------- /paquetes-populares/planilla.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/paquetes-populares/planilla.xlsx -------------------------------------------------------------------------------- /excepciones/01-intro.py: -------------------------------------------------------------------------------- 1 | try: 2 | n1 = int(input("Ingresa primer número: ")) 3 | except: 4 | print("ocurrió un error :(") 5 | -------------------------------------------------------------------------------- /paquetes-populares/nuevo_excel.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/paquetes-populares/nuevo_excel.xlsx -------------------------------------------------------------------------------- /modulos-nativos/01-browser.py: -------------------------------------------------------------------------------- 1 | import webbrowser 2 | 3 | print("producto encontrado") 4 | webbrowser.open("https://academia.holamundo.io") 5 | -------------------------------------------------------------------------------- /productly_django/productly/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | def inicio(request): 4 | return render(request, "inicio.html", ) -------------------------------------------------------------------------------- /tipos/03-format-strings.py: -------------------------------------------------------------------------------- 1 | nombre = "Nicolas" 2 | apellido = "Schurmann" 3 | nombre_completo = f"{nombre[0]} {2 + 5}" 4 | print(nombre_completo) 5 | -------------------------------------------------------------------------------- /machine_learning/recomendador-juegos.joblib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/machine_learning/recomendador-juegos.joblib -------------------------------------------------------------------------------- /modulos/__pycache__/usuario.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/__pycache__/usuario.cpython-310.pyc -------------------------------------------------------------------------------- /machine_learning/.ipynb_checkpoints/Untitled-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 5 6 | } 7 | -------------------------------------------------------------------------------- /productly_django/templates/inicio.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | Hola Mundo! Bienvenidos a productly 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /rutas/one/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/rutas/one/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /rutas/two/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/rutas/two/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /funciones/04-return.py: -------------------------------------------------------------------------------- 1 | def suma(a, b): 2 | resultado = a + b 3 | return resultado 4 | 5 | 6 | c = suma(1, 2) 7 | d = suma(c, 2) 8 | 9 | print(d) 10 | -------------------------------------------------------------------------------- /modulos/__pycache__/usuario_impuestos.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/__pycache__/usuario_impuestos.cpython-310.pyc -------------------------------------------------------------------------------- /modulos/usuarios/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /modulos/usuarios/__pycache__/acciones.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/__pycache__/acciones.cpython-310.pyc -------------------------------------------------------------------------------- /modulos/usuarios/gestion/__pycache__/crud.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/gestion/__pycache__/crud.cpython-310.pyc -------------------------------------------------------------------------------- /clases/02-clases.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | def habla(self): 3 | print("Guau!") 4 | 5 | 6 | mi_perro = Perro() 7 | mi_perro.habla() 8 | print(isinstance(mi_perro, str)) 9 | -------------------------------------------------------------------------------- /modulos-nativos/plantilla.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Hola mundo! $usuario este es mi correo de prueba 7 | 8 | -------------------------------------------------------------------------------- /modulos/usuarios/gestion/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/gestion/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /control-flujo/04-operadores-logicos.py: -------------------------------------------------------------------------------- 1 | # and, or, not 2 | 3 | gas = False 4 | encendido = True 5 | edad = 18 6 | 7 | if not gas or encendido or edad > 17: 8 | print("Puedes avanzar") 9 | -------------------------------------------------------------------------------- /modulos/usuarios/gestion/__pycache__/utilidades.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/gestion/__pycache__/utilidades.cpython-310.pyc -------------------------------------------------------------------------------- /modulos/usuarios/impuestos/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/impuestos/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /productly_django/templates/django/forms/label.html: -------------------------------------------------------------------------------- 1 | {% if use_tag %}<{{ tag }}{% include 'django/forms/attrs.html' %} class="form-label">{{ label }}{% else %}{{ label }}{% endif %} -------------------------------------------------------------------------------- /modulos/usuarios/impuestos/__pycache__/utilidades.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HolaMundoDev/ultimate-python/HEAD/modulos/usuarios/impuestos/__pycache__/utilidades.cpython-310.pyc -------------------------------------------------------------------------------- /productly_django/productos/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ProductosConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'productos' 7 | -------------------------------------------------------------------------------- /sqlite/06-select-one.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | with sqlite3.connect("sqlite/app.db") as con: 4 | cursor = con.cursor() 5 | cursor.execute("SELECT * FROM usuarios") 6 | print(cursor.fetchone()) 7 | -------------------------------------------------------------------------------- /sqlite/07-select-all.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | with sqlite3.connect("sqlite/app.db") as con: 4 | cursor = con.cursor() 5 | cursor.execute("SELECT * FROM usuarios") 6 | print(cursor.fetchall()) 7 | -------------------------------------------------------------------------------- /tipos-avanzados/04-iterar-listas.py: -------------------------------------------------------------------------------- 1 | mascotas = ["Pelusa", "Pulga", "Felipe", "Chanchito Feliz"] 2 | 3 | primero, segundo = [1, 2] 4 | for indice, mascota in enumerate(mascotas): 5 | print(indice, mascota) 6 | -------------------------------------------------------------------------------- /tipos/01-variables.py: -------------------------------------------------------------------------------- 1 | nombre_curso = "Ultimate Python" 2 | nombre1 = "Hola" 3 | NOMBRE_CURSO = "Mundo" 4 | NoMbRe_CuRsO = "Chanchito" 5 | NombreCurso = "Feliz" 6 | print(nombre_curso, nombre1, NOMBRE_CURSO) 7 | -------------------------------------------------------------------------------- /funciones/01-funciones.py: -------------------------------------------------------------------------------- 1 | def hola(nombre, apellido="Feliz"): 2 | print("Hola Mundo!") 3 | print(f"Bienvenido {nombre} {apellido}") 4 | 5 | hola(apellido="Schurmann", nombre="Wolfgang") 6 | hola("Chanchito") -------------------------------------------------------------------------------- /funciones/03-kwargs.py: -------------------------------------------------------------------------------- 1 | def get_product(**datos): 2 | print(datos["id"], datos["name"]) 3 | 4 | 5 | get_product(id="23", 6 | name="iPhone", 7 | desc="Esto es un iphone" 8 | ) 9 | -------------------------------------------------------------------------------- /tipos/09-conversion-tipos.py: -------------------------------------------------------------------------------- 1 | # x = input("") 2 | # int() 3 | # str() 4 | # float() 5 | # bool() 6 | 7 | print(bool("")) 8 | print(bool("0")) 9 | print(bool(None)) 10 | print(bool(" ")) 11 | print(bool(0)) 12 | -------------------------------------------------------------------------------- /funciones/06-depuracion.py: -------------------------------------------------------------------------------- 1 | def largo(texto): 2 | resultado = 0 3 | for _ in texto: 4 | resultado += 1 5 | return resultado 6 | 7 | 8 | print("chanchito") 9 | l = largo("Hola Mundo") 10 | print(l) 11 | -------------------------------------------------------------------------------- /package/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | requests = "*" 8 | 9 | [dev-packages] 10 | 11 | [requires] 12 | python_version = "3.10" 13 | -------------------------------------------------------------------------------- /tipos-avanzados/05-buscar-elemento.py: -------------------------------------------------------------------------------- 1 | mascotas = ["Pelusa", "Wolfgang", "Felipe", "Wolfgang", "Chanchito Feliz"] 2 | 3 | print(mascotas.count("Wolfgang")) 4 | if "Wolfgang" in mascotas: 5 | print(mascotas.index("Wolfgang")) 6 | -------------------------------------------------------------------------------- /clases/17-extender-tipos-nativos.py: -------------------------------------------------------------------------------- 1 | class Lista(list): 2 | def prepend(self, item): 3 | self.insert(0, item) 4 | 5 | 6 | lista = Lista([1, 2, 3]) 7 | lista.append(4) 8 | lista.prepend(0) 9 | 10 | print(lista) 11 | -------------------------------------------------------------------------------- /control-flujo/03-if-ternario.py: -------------------------------------------------------------------------------- 1 | edad = 19 2 | 3 | mensaje = "Es mayor" if edad > 17 else "Es menor" 4 | 5 | # if edad > 17: 6 | # mensaje = "Es mayor" 7 | # else: 8 | # mensaje = "Es menor" 9 | 10 | print(mensaje) 11 | -------------------------------------------------------------------------------- /funciones/02-xargs.py: -------------------------------------------------------------------------------- 1 | def suma(*numeros): 2 | resultado = 0 3 | for numero in numeros: 4 | resultado += numero 5 | print(resultado) 6 | 7 | 8 | suma(2, 5, 7) 9 | suma(2, 5) 10 | suma(2, 8, 7, 45, 32) 11 | -------------------------------------------------------------------------------- /sqlite/04-insert.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | with sqlite3.connect("sqlite/app.db") as con: 4 | cursor = con.cursor() 5 | cursor.execute( 6 | "INSERT INTO usuarios values(?, ?)", 7 | (1, "Hola Mundo"), 8 | ) 9 | -------------------------------------------------------------------------------- /pypi-test/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | holamundoplayer = "*" 8 | 9 | [dev-packages] 10 | 11 | [requires] 12 | python_version = "3.10" 13 | -------------------------------------------------------------------------------- /archivos/02-escritura-lectura.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | archivo = Path("archivos/archivo-prueba.txt") 4 | texto = archivo.read_text("utf-8").split("\n") 5 | texto.insert(0, "Hola mundo!") 6 | archivo.write_text("hola mundo", "utf-8") 7 | -------------------------------------------------------------------------------- /control-flujo/01-comparadores.py: -------------------------------------------------------------------------------- 1 | print(1 > 2) 2 | print(1 < 2) 3 | print(1 <= 2) 4 | print(1 >= 2) 5 | print(2 >= 2) 6 | print(2 <= 2) 7 | print(2 == 2) 8 | print(2 == 3) 9 | print(2 == "2") 10 | print(2 != "2") 11 | print(2 != 2) 12 | -------------------------------------------------------------------------------- /excepciones/02-tipos-excepciones.py: -------------------------------------------------------------------------------- 1 | try: 2 | n1 = int(input("Ingresa primer número: ")) 3 | aoeu 4 | except ValueError as e: 5 | print("Ingrese un valor que corresponda") 6 | except NameError as e: 7 | print("Ocurrió un error") 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "[python]": { 3 | "editor.defaultFormatter": "ms-python.autopep8" 4 | }, 5 | "python.formatting.provider": "none", 6 | "python.linting.pylintEnabled": true, 7 | "python.linting.enabled": true 8 | } -------------------------------------------------------------------------------- /excepciones/03-else-fnally.py: -------------------------------------------------------------------------------- 1 | try: 2 | n1 = int(input("Ingresa primer número: ")) 3 | except Exception as e: 4 | print("Ocurrió un error!") 5 | else: 6 | print("No ocurrió ningún un error") 7 | finally: 8 | print("Se ejecuta siempre!") 9 | -------------------------------------------------------------------------------- /productly_django/productos/forms.py: -------------------------------------------------------------------------------- 1 | from . import models 2 | from django.forms import ModelForm 3 | 4 | class ProductoForm(ModelForm): 5 | class Meta: 6 | model = models.Producto 7 | fields = ["nombre", "stock", "puntaje", "categoria"] -------------------------------------------------------------------------------- /productly_django/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | django = "==4.1.7" 8 | pylint-django = "*" 9 | 10 | [dev-packages] 11 | 12 | [requires] 13 | python_version = "3.9" 14 | -------------------------------------------------------------------------------- /excepciones/04-invocar-excepcion.py: -------------------------------------------------------------------------------- 1 | def division(n=0): 2 | if n == 0: 3 | raise ZeroDivisionError("No se puede dividir por 0", f"{n}") 4 | return 5 / n 5 | 6 | 7 | try: 8 | division() 9 | except ZeroDivisionError as e: 10 | print(e) 11 | -------------------------------------------------------------------------------- /control-flujo/07-while.py: -------------------------------------------------------------------------------- 1 | # numero = 1 2 | # while numero < 100: 3 | # print(numero) 4 | # numero *= 2 5 | 6 | comando = "" 7 | 8 | while True: 9 | comando = input("$ ") 10 | print(comando) 11 | if comando.lower() == "salir": 12 | break 13 | -------------------------------------------------------------------------------- /tipos-avanzados/13-filas.py: -------------------------------------------------------------------------------- 1 | from collections import deque 2 | 3 | fila = deque([1, 2]) 4 | # fila.append(3) 5 | # fila.append(4) 6 | # fila.append(5) 7 | print(fila) 8 | fila.popleft() 9 | fila.popleft() 10 | print(fila) 11 | 12 | if not fila: 13 | print("Fila vacía") 14 | -------------------------------------------------------------------------------- /tipos-avanzados/03-desempaquetar-listas.py: -------------------------------------------------------------------------------- 1 | numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9] 2 | 3 | # Feo! 4 | # primero = numeros[0] 5 | # segundo = numeros[1] 6 | # primero = numeros[2] 7 | 8 | primero, segundo, *otros, penultimo, ultimo = numeros 9 | print(segundo, penultimo, otros) 10 | -------------------------------------------------------------------------------- /clases/03-constructor.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | def __init__(self, nombre, edad): 3 | self.nombre = nombre 4 | self.edad = edad 5 | 6 | def habla(self): 7 | print(f"{self.nombre} dice: Guau!") 8 | 9 | 10 | mi_perro = Perro("Chanchito", 1) 11 | mi_perro.habla() 12 | -------------------------------------------------------------------------------- /tipos-avanzados/14-colas.py: -------------------------------------------------------------------------------- 1 | pila = [] 2 | pila.append(1) 3 | pila.append(2) 4 | pila.append(3) 5 | print(pila) 6 | ultimoElemento = pila.pop() 7 | print(ultimoElemento) 8 | print(pila) 9 | print(pila[-1]) 10 | pila.pop() 11 | pila.pop() 12 | 13 | if not pila: 14 | print("pila vacía") 15 | -------------------------------------------------------------------------------- /control-flujo/06-for.py: -------------------------------------------------------------------------------- 1 | buscar = 10 2 | for numero in range(5): 3 | print(numero) 4 | if numero == buscar: 5 | print("encontrado", buscar) 6 | break 7 | else: 8 | print("No encontré el número buscado :(") 9 | 10 | for char in "Ultimate python": 11 | print(char) 12 | -------------------------------------------------------------------------------- /modulos/app.py: -------------------------------------------------------------------------------- 1 | from usuarios.impuestos.utilidades import pagar_impuestos 2 | # import usuarios 3 | pagar_impuestos() 4 | # print(__name__) 5 | # print(usuarios.gestion.__name__) 6 | # print(usuarios.impuestos.__package__) 7 | # print(usuarios.gestion.__path__) 8 | # print(usuarios.impuestos.__file__) 9 | -------------------------------------------------------------------------------- /sqlite/03-with.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | with sqlite3.connect("sqlite/app.db") as con: 4 | cursor = con.cursor() 5 | cursor.execute( 6 | """ 7 | CREATE TABLE if not exists usuarios 8 | (id INTEGER primary key, nombre VARCHAR(50)); 9 | """ 10 | ) 11 | -------------------------------------------------------------------------------- /productly_django/templates/django/forms/widgets/input.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sqlite/02-create-table.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | con = sqlite3.connect("sqlite/app.db") 4 | 5 | cursor = con.cursor() 6 | cursor.execute( 7 | """ 8 | CREATE TABLE if not exists usuarios 9 | (id INTEGER primary key, nombre VARCHAR(50)); 10 | """ 11 | ) 12 | con.commit() 13 | con.close() 14 | -------------------------------------------------------------------------------- /holamundoplayer/setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | from pathlib import Path 3 | 4 | long_desc = Path("README.md").read_text() 5 | setuptools.setup( 6 | name="holamundoplayer", 7 | version="0.0.1", 8 | long_description=long_desc, 9 | packages=setuptools.find_packages(exclude=["mocks,tests"]) 10 | ) -------------------------------------------------------------------------------- /productly_django/productos/templatetags/add_attr.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | register = template.Library() 3 | 4 | @register.filter(name="add_attr") 5 | def add_attr(field, css): 6 | attrs = {} 7 | clase, valor = css.split(':') 8 | attrs[clase] = valor 9 | return field.as_widget(attrs=attrs) 10 | -------------------------------------------------------------------------------- /productly_django/productos/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from . import views 3 | 4 | app_name = "productos" 5 | 6 | urlpatterns = [ 7 | path("", views.index, name="index"), 8 | path("formulario", views.formulario, name="formulario"), 9 | path("", views.detalle, name="detalle") 10 | ] -------------------------------------------------------------------------------- /tipos-avanzados/10-sets.py: -------------------------------------------------------------------------------- 1 | # set significa grupo o conjunto 2 | primer = {1, 1, 2, 2, 3, 4} 3 | segundo = [3, 4, 5] 4 | segundo = set(segundo) 5 | 6 | # print(primer | segundo) 7 | # print(primer & segundo) 8 | # print(primer - segundo) 9 | print(primer ^ segundo) 10 | 11 | if 5 in segundo: 12 | print("Hola Mundo") 13 | -------------------------------------------------------------------------------- /funciones/05-alcance.py: -------------------------------------------------------------------------------- 1 | saludo = 25 2 | 3 | 4 | def saludar(): 5 | global saludo 6 | saludo = "Hola Mundo" 7 | 8 | 9 | def saludaChanchito(): 10 | saludo = 24 11 | print(saludo) 12 | 13 | 14 | resultado1 = saludo + 3 15 | print(resultado1) 16 | saludar() 17 | resultado2 = saludo + 3 18 | print(resultado2) 19 | -------------------------------------------------------------------------------- /modulos/usuarios/impuestos/utilidades.py: -------------------------------------------------------------------------------- 1 | if __name__ != "__main__": 2 | from usuarios.gestion.crud import guardar 3 | 4 | print(__name__) 5 | 6 | def pagar_impuestos(): 7 | print("pagando impuestos") 8 | guardar() 9 | 10 | 11 | if __name__ == "__main__": 12 | print("tarea de mantenimiento") 13 | -------------------------------------------------------------------------------- /productly_django/productos/templates/detalle.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 |
6 |
{{producto.nombre}}
7 |

{{producto.categoria}}

8 |

{{producto.stock}}

9 |

{{producto.puntaje}}

10 |

{{producto.creado_en}}

11 |
12 | 13 | {% endblock %} -------------------------------------------------------------------------------- /tipos/07-numeros-funciones.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | print(round(1.3)) 4 | print(round(1.7)) 5 | print(round(1.5)) 6 | print(abs(-77)) 7 | print(abs(55)) 8 | 9 | print(math.ceil(1.1)) 10 | print(math.floor(1.99999)) 11 | print(math.isnan(23)) 12 | # print(math.isnan("23")) 13 | print(math.pow(10, 3)) 14 | print(math.sqrt(9)) 15 | -------------------------------------------------------------------------------- /paquetes-populares/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | verify_ssl = true 4 | name = "pypi" 5 | 6 | [packages] 7 | sendgrid = "*" 8 | twilio = "*" 9 | requests = "*" 10 | beautifulsoup4 = "*" 11 | openpyxl = "*" 12 | selenium = "*" 13 | 14 | [dev-packages] 15 | 16 | [requires] 17 | python_version = "3.10" 18 | -------------------------------------------------------------------------------- /tipos-avanzados/02-manipulando-listas.py: -------------------------------------------------------------------------------- 1 | mascotas = ["Wolfgang", "Pelusa", "Pulga", "Copito"] 2 | print(mascotas[0]) 3 | mascotas[0] = "Bicho" 4 | # print(mascotas) 5 | # print(mascotas[2:]) 6 | # print(mascotas[-1]) 7 | # print(mascotas[1:2:2]) 8 | 9 | numeros = list(range(21)) 10 | print(numeros[::2]) 11 | print(numeros[1::2]) 12 | -------------------------------------------------------------------------------- /sqlite/05-multi-insert.py: -------------------------------------------------------------------------------- 1 | import sqlite3 2 | 3 | with sqlite3.connect("sqlite/app.db") as con: 4 | cursor = con.cursor() 5 | usuarios = [ 6 | (2, "Chanchito Feliz"), 7 | (3, "Chanchito Triste") 8 | ] 9 | cursor.executemany( 10 | "INSERT INTO usuarios values(?, ?)", 11 | usuarios 12 | ) 13 | -------------------------------------------------------------------------------- /productly_django/productos/templates/producto_form.html: -------------------------------------------------------------------------------- 1 | {% extends 'base.html' %} 2 | 3 | {% block content %} 4 |
8 | 9 | {% csrf_token %} 10 | {{ form }} 11 | 12 |
13 | {% endblock %} -------------------------------------------------------------------------------- /tipos/06-numeros.py: -------------------------------------------------------------------------------- 1 | numero = 2 # entero o integer 2 | decimal = 1.2 # float 3 | imaginario = 2 + 2j 4 | 5 | # numero = 2 + 2 6 | numero += 2 7 | numero -= 2 8 | numero *= 2 9 | numero /= 2 10 | print("numero", numero) 11 | 12 | print(1 + 3) 13 | print(1 - 3) 14 | print(1 * 3) 15 | print(1 / 3) 16 | print(1 // 3) 17 | print(8 % 3) 18 | print(2 ** 3) 19 | -------------------------------------------------------------------------------- /control-flujo/02-if.py: -------------------------------------------------------------------------------- 1 | edad = 70 2 | 3 | if edad > 65: 4 | print("Puede ver la película con super descuento") 5 | elif edad > 54: 6 | print("Puede ver la película con descuento") 7 | elif edad > 17: 8 | print("Puede ver la película") 9 | # else: 10 | # print("No puedes entrar") 11 | # print("Ve a otro lado") 12 | 13 | print("listo") 14 | -------------------------------------------------------------------------------- /paquetes-populares/02-twilio.py: -------------------------------------------------------------------------------- 1 | import os 2 | from twilio.rest import Client 3 | 4 | sid = os.environ.get("TWILIO_SID") 5 | token = os.environ.get("TWILIO_TOKEN") 6 | numero = os.environ.get("TWILIO_N") 7 | 8 | cliente = Client(sid, token) 9 | mensaje = cliente.messages.create( 10 | body="Hola mundo", 11 | from_=numero, 12 | to="+15557656310" 13 | ) -------------------------------------------------------------------------------- /tipos-avanzados/07-ordenando-listas.py: -------------------------------------------------------------------------------- 1 | numeros = [2, 4, 1, 45, 75, 22] 2 | 3 | # numeros.sort(reverse=True) 4 | numeros2 = sorted(numeros, reverse=True) 5 | print(numeros) 6 | print(numeros2) 7 | 8 | usuarios = [ 9 | ["Chanchito", 4], 10 | ["Felipe", 1], 11 | ["Pulga", 5] 12 | ] 13 | 14 | usuarios.sort(key=lambda el: el[1]) 15 | print(usuarios) 16 | -------------------------------------------------------------------------------- /tipos-avanzados/06-agregando-eliminando.py: -------------------------------------------------------------------------------- 1 | mascotas = [ 2 | "Wolfgang", 3 | "Pelusa", 4 | "Pulga", 5 | "Felipe", 6 | "Pulga", 7 | "Chanchito Feliz" 8 | ] 9 | mascotas.insert(1, "Melvin") 10 | mascotas.append("Chanchito triste") 11 | mascotas.remove("Pulga") 12 | mascotas.pop(1) 13 | del mascotas[0] 14 | mascotas.clear() 15 | print(mascotas) 16 | -------------------------------------------------------------------------------- /tipos-avanzados/12-desempaquetar.py: -------------------------------------------------------------------------------- 1 | # lista1 = [1, 2, 3, 4] 2 | # print(*lista) 3 | 4 | # lista2 = [5, 6] 5 | 6 | # combinada = ["Hola", *lista1, "mundo", *lista2, "chanchito"] 7 | # print(combinada) 8 | 9 | punto1 = {"x": 19, "y": "hola"} 10 | punto2 = {"y": 15} 11 | 12 | nuevoPunto = {**punto1, "lala": "hola mundo", **punto2, "z": "mundo"} 13 | print(nuevoPunto) 14 | -------------------------------------------------------------------------------- /clases/11-herencia.py: -------------------------------------------------------------------------------- 1 | class Animal: 2 | def comer(self): 3 | print("comiendo") 4 | 5 | 6 | class Perro(Animal): 7 | def pasear(self): 8 | print("paseando") 9 | 10 | 11 | class Chanchito(Perro): 12 | def programar(self): 13 | print("programando") 14 | 15 | 16 | perro = Perro() 17 | chanchito = Chanchito() 18 | # perro. 19 | # chanchito. 20 | -------------------------------------------------------------------------------- /machine_learning/juegos-ml.csv: -------------------------------------------------------------------------------- 1 | edad,genero,juegos 2 | 8,0,accion 3 | 11,0,accion 4 | 12,0,fps 5 | 13,0,fps 6 | 15,0,fps 7 | 18,0,fps 8 | 22,0,jrpg 9 | 25,0,jrpg 10 | 28,0,jrpg 11 | 31,0,accion 12 | 32,0,accion 13 | 35,0,accion 14 | 10,1,plataforma 15 | 13,1,plataforma 16 | 14,1,plataforma 17 | 15,1,puzzle 18 | 18,1,puzzle 19 | 19,1,fps 20 | 22,1,fps 21 | 25,1,fps -------------------------------------------------------------------------------- /modulos-nativos/03-timedelta.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime, timedelta 2 | 3 | fecha1 = datetime(2023, 1, 1) + timedelta(weeks=1) 4 | fecha2 = datetime(2023, 2, 1) 5 | 6 | delta = fecha2 - fecha1 7 | print(delta) 8 | print("dias", delta.days) 9 | print("segundos", delta.seconds) 10 | print("microsegundos", delta.microseconds) 11 | print("total_seconds()", delta.total_seconds()) 12 | -------------------------------------------------------------------------------- /tipos/04-metodos-strings.py: -------------------------------------------------------------------------------- 1 | animal = " chanCHito feliz " 2 | print(animal.upper()) 3 | print(animal.lower()) 4 | print(animal.strip().capitalize()) 5 | print(animal.title()) 6 | print(animal.strip()) 7 | print(animal.lstrip()) 8 | print(animal.rstrip()) 9 | print(animal.find("cH")) 10 | print(animal.replace("nCH", "j")) 11 | print("nCH" in animal) 12 | print("nCH" not in animal) 13 | -------------------------------------------------------------------------------- /archivos/01-archivos.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from time import ctime 3 | 4 | archivo = Path("archivos/archivo-prueba.txt") 5 | # archivo.exists() 6 | # archivo.rename() 7 | # archivo.unlink() 8 | # print(archivo.stat()) 9 | 10 | print("acceso", ctime(archivo.stat().st_atime)) 11 | print("creación", ctime(archivo.stat().st_ctime)) 12 | print("modificación", ctime(archivo.stat().st_mtime)) 13 | -------------------------------------------------------------------------------- /clases/12-herencia-multiple.py: -------------------------------------------------------------------------------- 1 | class Caminador: 2 | def caminar(self): 3 | print("caminando") 4 | 5 | 6 | class Volador: 7 | def volar(self): 8 | print("volando") 9 | 10 | 11 | class Nadador: 12 | def nadar(self): 13 | print("nadando") 14 | 15 | 16 | class pato(Volador, Nadador, Caminador): 17 | def programar(self): 18 | print("programando") 19 | -------------------------------------------------------------------------------- /tipos-avanzados/01-listas.py: -------------------------------------------------------------------------------- 1 | numeros = [1, 2, 3] 2 | letras = ["a", "b", "c"] 3 | palabras = ["chanchito", "feliz"] 4 | palabrasFelices = ["chanchito", "feliz", "Felipe", "alumno"] 5 | booleans = [True, False, True, True] 6 | matriz = [[0, 1], [1, 0]] 7 | ceros = [0, 1] * 10 8 | 9 | alfanumerico = numeros + letras 10 | rango = list(range(1, 11)) 11 | chars = list("hola mundo") 12 | print(chars) 13 | -------------------------------------------------------------------------------- /rutas/02-directorios.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | path = Path("rutas") 4 | # path.exists() 5 | # path.mkdir() 6 | # path.rmdir() 7 | # path.rename("chanchito-feliz") 8 | 9 | archivos = [p for p in path.iterdir() if not p.is_dir()] 10 | archivos = [p for p in path.glob("01-*.py")] 11 | archivos = [p for p in path.glob("**/*.py")] 12 | archivos = [p for p in path.rglob("*.py")] 13 | print(archivos) 14 | -------------------------------------------------------------------------------- /tipos/02-strings.py: -------------------------------------------------------------------------------- 1 | nombre_curso = "Ultimate Python" 2 | descripcion_curso = """ 3 | Ultimate Python, 4 | este curso contempla todos los detalles 5 | que necesitas aprender para encontrar 6 | un trabajo como programador. 7 | """ 8 | 9 | print(len(nombre_curso)) 10 | print(nombre_curso[0]) 11 | print(nombre_curso[0:8]) 12 | print(nombre_curso[9:]) 13 | print(nombre_curso[:8]) 14 | print(nombre_curso[:]) 15 | -------------------------------------------------------------------------------- /clases/16-polimorfismo.py: -------------------------------------------------------------------------------- 1 | class Usuario(): 2 | def guardar(self): 3 | print("Guardando en BBDD") 4 | 5 | 6 | class Sesion(): 7 | def guardar(self): 8 | print("Guardando en Archivo") 9 | 10 | 11 | def guardar(entidades): 12 | for entidad in entidades: 13 | entidad.guardar() 14 | 15 | 16 | usuario = Usuario() 17 | sesion = Sesion() 18 | 19 | guardar([sesion, usuario]) 20 | -------------------------------------------------------------------------------- /clases/13-anulacion-metodo.py: -------------------------------------------------------------------------------- 1 | class Ave: 2 | def __init__(self): 3 | self.volador = "volador" 4 | 5 | def vuela(self): 6 | print("vuela ave") 7 | 8 | 9 | class Pato(Ave): 10 | def __init__(self): 11 | super().__init__() 12 | self.nada = "nadador" 13 | 14 | def vuela(self): 15 | print("vuela pato") 16 | 17 | 18 | pato = Pato() 19 | pato.vuela() 20 | print(pato.volador, pato.nada) 21 | -------------------------------------------------------------------------------- /tipos-avanzados/09-tupla.py: -------------------------------------------------------------------------------- 1 | numeros = (1, 2, 3) + (4, 5, 6) 2 | print(numeros) 3 | 4 | punto = tuple([1, 2]) 5 | print(punto) 6 | 7 | menosNumeros = numeros[:2] 8 | print(menosNumeros) 9 | 10 | primero, segundo, *otros = numeros 11 | print(primero, segundo, otros) 12 | 13 | for n in numeros: 14 | print(n) 15 | 16 | # numeros[0] = 5 17 | 18 | listaNumeros = list(numeros) 19 | listaNumeros[0] = "Chanchito Feliz" 20 | print(listaNumeros) 21 | -------------------------------------------------------------------------------- /clases/08-metodos-mágicos.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | def __init__(self, nombre, edad): 3 | self.nombre = (nombre) 4 | self.edad = edad 5 | 6 | def __del__(self): 7 | print(f"Chao Perro 😔 {self.nombre}") 8 | 9 | def __str__(self): 10 | return f"Clase Perro: {self.nombre}" 11 | 12 | def habla(self): 13 | print(f"{self.nombre} dice: Guau!") 14 | 15 | 16 | perro = Perro("Chanchito", 7) 17 | del perro 18 | -------------------------------------------------------------------------------- /clases/04-propiedades-clase.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | patas = 4 3 | 4 | def __init__(self, nombre, edad): 5 | self.nombre = nombre 6 | self.edad = edad 7 | 8 | def habla(self): 9 | print(f"{self.nombre} dice: Guau!") 10 | 11 | 12 | Perro.patas = 3 13 | mi_perro = Perro("Chanchito", 1) 14 | mi_perro.patas = 5 15 | mi_perro2 = Perro("Felipe", 1) 16 | print(Perro.patas) 17 | print(mi_perro.patas) 18 | print(mi_perro2.patas) 19 | -------------------------------------------------------------------------------- /productly_django/templates/django/forms/widgets/select.html: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /modulos-nativos/02-fechas.py: -------------------------------------------------------------------------------- 1 | # import time 2 | 3 | # print(time.time()) 4 | 5 | from datetime import datetime 6 | 7 | fecha = datetime(2023, 1, 1) 8 | fecha2 = datetime(2023, 2, 1) 9 | 10 | ahora = datetime.now() 11 | 12 | fechaStr = datetime.strptime("2023-01-03", "%Y-%m-%d") 13 | 14 | print(fecha.strftime("%Y.%m.%d")) 15 | print(fecha > fecha2) 16 | 17 | print( 18 | fecha.year, 19 | fecha.month, 20 | fecha.day, 21 | fecha.hour, 22 | fecha.minute 23 | ) 24 | -------------------------------------------------------------------------------- /productly_django/productos/templates/form_snippet.html: -------------------------------------------------------------------------------- 1 | {% load add_attr %} 2 | 3 | {% for field in form %} 4 |
5 | {{ field.label_tag }} 6 | {% if field.errors %} 7 | {{ field|add_attr:"class:is-invalid" }} 8 | {% else %} 9 | {{ field }} 10 | {% endif %} 11 |
12 | {% for error in field.errors %} 13 | {{ error }} 14 | {% endfor %} 15 |
16 | 17 |
18 | {% endfor %} -------------------------------------------------------------------------------- /clases/05-metodos-clase.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | patas = 4 3 | 4 | def __init__(self, nombre, edad): 5 | self.nombre = nombre 6 | self.edad = edad 7 | 8 | @classmethod 9 | def habla(cls): 10 | print("Guau!") 11 | 12 | @classmethod 13 | def factory(cls): 14 | return cls("Canchito feliz", 4) 15 | 16 | 17 | perro1 = Perro("Chanchito", 2) 18 | perro2 = Perro("Felipe", 3) 19 | perro3 = Perro.factory() 20 | print(perro3.edad, perro3.nombre) 21 | -------------------------------------------------------------------------------- /paquetes-populares/.env.example: -------------------------------------------------------------------------------- 1 | SENDGRID_API_KEY = "SG.2MMw8CWDzoHNHDb5tQImPj7ujcPsZyw.PIgp4C2_NafSjjoAUkv0tabBw6I8i1LS8k" #Esta es la apikey que obtendras en el servicio sendgrid para poder enviar correos 2 | SENDGRID_EMAIL = "mail@mail.com" # Te email autorizado en sendgrid como sender 3 | TWILIO_SID = "AC7235313753953137e3uhp3137c401a0b" 4 | TWILIO_TOKEN = "ryget7b199dyy8b82f2debc47da6ec2b" 5 | TWILIO_N = "+12345678910" 6 | GH_USER = "tuCorreoDeGithub@mail.com" 7 | GH_PASS = "tuContraseñaDeGithub" 8 | -------------------------------------------------------------------------------- /productly_django/productly/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for productly project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'productly.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /productly_django/productly/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for productly project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'productly.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /tipos/08-calculadora.py: -------------------------------------------------------------------------------- 1 | n1 = input("Ingresa primer número: ") 2 | n2 = input("Ingresa segundo número: ") 3 | 4 | n1 = int(n1) 5 | n2 = int(n2) 6 | 7 | suma = n1 + n2 8 | resta = n1 - n2 9 | multi = n1 * n2 10 | div = n1 / n2 11 | 12 | mensaje = f""" 13 | Para los números {n1} y {n2}, 14 | El resultado de la suma es {suma}, 15 | El resultado de la resta es {resta}, 16 | El resultado de la multiplicación es {multi}, 17 | El resultado de la división es {div} 18 | """ 19 | 20 | print(mensaje) 21 | -------------------------------------------------------------------------------- /clases/07-decorador-properties.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | def __init__(self, nombre): 3 | self.nombre = (nombre) 4 | 5 | @property 6 | def nombre(self): 7 | print("Pasando por getter") 8 | return self.__nombre 9 | 10 | @nombre.setter 11 | def nombre(self, nombre): 12 | print("Pasando por setter") 13 | if nombre.strip(): 14 | self.__nombre = nombre 15 | return nombre 16 | 17 | 18 | perro = Perro("Choclo") 19 | print(perro.nombre) 20 | -------------------------------------------------------------------------------- /excepciones/05-excepciones-custom.py: -------------------------------------------------------------------------------- 1 | class MiError(Exception): 2 | "Esta clase es para representar mi error" 3 | 4 | def __init__(self, mensaje, codigo): 5 | self.mensaje = mensaje 6 | self.codigo = codigo 7 | 8 | def __str__(self): 9 | return f"{self.mensaje} - código: {self.codigo}" 10 | 11 | 12 | def division(n=0): 13 | if n == 0: 14 | raise MiError("No se puede dividir por 0", 805) 15 | return 5 / n 16 | 17 | 18 | try: 19 | division() 20 | except MiError as e: 21 | print(e) 22 | -------------------------------------------------------------------------------- /clases/06-privados.py: -------------------------------------------------------------------------------- 1 | class Perro: 2 | def __init__(self, nombre, edad): 3 | self.__nombre = nombre 4 | self.edad = edad 5 | 6 | def __get_nombre(self): 7 | return self.__nombre 8 | 9 | def set_nombre(self, nombre): 10 | self.__nombre = nombre 11 | 12 | def habla(self): 13 | print(f"{self.__nombre} dice: Guau!") 14 | 15 | @classmethod 16 | def factory(cls): 17 | return cls("Chanchito feliz", 4) 18 | 19 | 20 | perro1 = Perro.factory() 21 | perro1.habla() 22 | print(perro1._Perro__nombre) 23 | -------------------------------------------------------------------------------- /clases/14-ejemplo-real.py: -------------------------------------------------------------------------------- 1 | class Model(): 2 | tabla = False 3 | 4 | def __init__(self): 5 | if not self.tabla: 6 | print("Error, tienes que definir una tabla") 7 | 8 | def guardar(self): 9 | print(f"Guardando {self.tabla} en BBDD") 10 | 11 | @classmethod 12 | def buscar_por_id(self, _id): 13 | print(f"Buscando por id {_id} en la tabla {self.tabla}") 14 | 15 | 16 | class Usuario(Model): 17 | tabla = "Usuario" 18 | 19 | 20 | usuario = Usuario() 21 | usuario.guardar() 22 | Usuario.buscar_por_id(123) 23 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "Python: Current File", 9 | "type": "python", 10 | "request": "launch", 11 | "program": "${file}", 12 | "console": "integratedTerminal", 13 | "justMyCode": true 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /paquetes-populares/04-scrapper.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from bs4 import BeautifulSoup 3 | 4 | url = "https://stackoverflow.com/questions" 5 | respuesta = requests.get(url) 6 | texto = respuesta.text 7 | soup = BeautifulSoup(texto, "html.parser") 8 | 9 | preguntas = soup.select(".s-post-summary") 10 | print(preguntas[0]["data-post-id"]) 11 | 12 | for pregunta in preguntas: 13 | titulo = pregunta.select_one(".s-link").get_text() 14 | usuario = pregunta.select_one(".s-user-card--link").get_text() 15 | # print(f"{usuario.strip()} - Titulo: \n{titulo.strip()}") 16 | -------------------------------------------------------------------------------- /productly_django/productos/migrations/0002_producto_creado_en.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.7 on 2023-03-27 22:53 2 | 3 | from django.db import migrations, models 4 | import django.utils.timezone 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('productos', '0001_initial'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='producto', 16 | name='creado_en', 17 | field=models.DateTimeField(default=django.utils.timezone.now), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rutas/01-path.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | # Path(r"C:\Archivos de programa\Minecraft") 4 | # Path("/usr/bin") 5 | # Path() 6 | # Path.home() 7 | # Path("one/__init__.py") 8 | 9 | path = Path("hola-mundo/mi-archivo.py") 10 | path.is_file() 11 | path.is_dir() 12 | path.exists() 13 | 14 | print( 15 | path.name, 16 | path.stem, 17 | path.suffix, 18 | path.parent, 19 | path.absolute() 20 | ) 21 | 22 | p = path.with_name("chanchito.exe") 23 | print(p) 24 | p = path.with_suffix(".bat") 25 | print(p) 26 | p = path.with_stem("feliz") 27 | print(p) 28 | -------------------------------------------------------------------------------- /clases/09-comparacion.py: -------------------------------------------------------------------------------- 1 | class Coordenadas: 2 | def __init__(self, lat, lon): 3 | self.lat = lat 4 | self.lon = lon 5 | 6 | def __eq__(self, otro): 7 | return self.lat == otro.lat and self.lon == otro.lon 8 | 9 | def __lt__(self, otro): 10 | return self.lat + self.lon < otro.lat + otro.lon 11 | 12 | def __le__(self, otro): 13 | return self.lat + self.lon <= otro.lat + otro.lon 14 | 15 | 16 | coords = Coordenadas(45, 27) 17 | coords2 = Coordenadas(45, 27) 18 | 19 | # print(coords != coords2) 20 | print(coords >= coords2) 21 | -------------------------------------------------------------------------------- /productly_django/productos/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Producto, Categoria 3 | # Register your models here. 4 | 5 | class CaterogiaAdmin(admin.ModelAdmin): 6 | list_display = ("id", "nombre") 7 | 8 | class ProductoModel(admin.ModelAdmin): 9 | # fields, campos que quiero mostrar 10 | # exclude, campos que no quiero mostrar 11 | exclude = ("creado_en",) 12 | list_display = ("id", "nombre", "stock", "creado_en") 13 | 14 | admin.site.register(Producto, ProductoModel) 15 | admin.site.register(Categoria, CaterogiaAdmin) 16 | 17 | -------------------------------------------------------------------------------- /archivos/06-comprimidos.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from zipfile import ZipFile 3 | 4 | # with ZipFile("archivos/comprimidos.zip", "w") as zip: 5 | # for path in Path().rglob("*.*"): 6 | # print(path) 7 | # if str(path) != "archivos/comprimidos.zip": 8 | # zip.write(path) 9 | 10 | with ZipFile("archivos/comprimidos.zip") as zip: 11 | # print(zip.namelist()) 12 | info = zip.getinfo("archivos/06-comprimidos.py") 13 | print( 14 | info.file_size, 15 | info.compress_size 16 | ) 17 | zip.extractall("archivos/descomprimidos") 18 | -------------------------------------------------------------------------------- /modulos-nativos/04-random.py: -------------------------------------------------------------------------------- 1 | import random 2 | import string 3 | 4 | lista = [1, 2, 3, 4, 5, 6, 7, 8] 5 | lista2 = [1, 2, 3, 4, 5, 6, 7, 8] 6 | random.shuffle(lista) 7 | print( 8 | random.random(), 9 | random.randint(1, 10), 10 | lista, 11 | random.choice(lista2), 12 | random.choices(lista2, k=3), 13 | "".join(random.choices("abcdefghi.,123", k=3)) 14 | ) 15 | 16 | chars = string.ascii_letters 17 | digitos = string.digits 18 | seleccion = random.choices(chars + digitos, k=16) 19 | # print(seleccion) 20 | 21 | contrasena = "".join(seleccion) 22 | print(contrasena) 23 | -------------------------------------------------------------------------------- /archivos/05-json.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | 4 | # escribir JSON 5 | # productos = [ 6 | # {"id": 1, "name": "Surfboard"}, 7 | # {"id": 2, "name": "Bicicleta"}, 8 | # {"id": 3, "name": "Skate"} 9 | # ] 10 | 11 | # data = json.dumps(productos) 12 | # Path("archivos/productos.json").write_text(data) 13 | 14 | # leer JSON 15 | data = Path("archivos/productos.json").read_text(encoding="utf-8") 16 | productos = json.loads(data) 17 | print(productos) 18 | 19 | # modificar JSON 20 | productos[0]["name"] = "Chanchito Feliz" 21 | Path("archivos/productos.json").write_text(json.dumps(productos)) 22 | -------------------------------------------------------------------------------- /clases/15-clases-abstractas.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | 3 | 4 | class Model(ABC): 5 | @property 6 | @abstractmethod 7 | def tabla(self): 8 | pass 9 | 10 | @abstractmethod 11 | def guardar(self): 12 | pass 13 | 14 | @classmethod 15 | def buscar_por_id(self, _id): 16 | print(f"Buscando por id {_id} en la tabla {self.tabla}") 17 | 18 | 19 | class Usuario(Model): 20 | tabla = "Usuario" 21 | 22 | def guardar(self): 23 | print("guardando usuario") 24 | 25 | 26 | usuario = Usuario() 27 | usuario.guardar() 28 | Usuario.buscar_por_id(123) 29 | -------------------------------------------------------------------------------- /tipos-avanzados/08-compresion-listas.py: -------------------------------------------------------------------------------- 1 | usuarios = [ 2 | ["Chanchito", 4], 3 | ["Felipe", 1], 4 | ["Pulga", 5] 5 | ] 6 | 7 | # nombres = [] 8 | # for usuario in usuarios: 9 | # nombres.append(usuario[0]) 10 | # print(nombres) 11 | # map 12 | # nombres = [usuario[0] for usuario in usuarios] 13 | 14 | # filter 15 | # nombres = [usuario for usuario in usuarios if usuario[1] > 2] 16 | 17 | # nombres = [usuario[0] for usuario in usuarios if usuario[1] > 2] 18 | # nombres = list(map(lambda usuario: usuario[0], usuarios)) 19 | 20 | menosUsuarios = list(filter(lambda usuario: usuario[1] > 2, usuarios)) 21 | print(menosUsuarios) 22 | -------------------------------------------------------------------------------- /rutas/03-inyeccion-deps.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | # import db 3 | # import graphql 4 | # import api 5 | 6 | # dependencias = { 7 | # "db": db, 8 | # "api": graphql, 9 | # "graphql": api 10 | # } 11 | 12 | path = Path() 13 | paths = [p for p in path.iterdir() if p.is_dir()] 14 | 15 | dependencias = { 16 | "db": "base de datos", 17 | "api": "esta es la api", 18 | "graphql": "esto es graphql" 19 | } 20 | 21 | 22 | def load(p): 23 | paquete = __import__(str(p).replace("/", ".")) 24 | try: 25 | paquete.init(**dependencias) 26 | except: 27 | print("el paquete no tiene función init") 28 | 29 | 30 | list(map(load, paths)) 31 | -------------------------------------------------------------------------------- /holamundoplayer/holamundoplayer/player.py: -------------------------------------------------------------------------------- 1 | """ 2 | Esta es el modulo que incluye 3 | la clase del reproductor de música 4 | """ 5 | 6 | class Player: 7 | """ 8 | Esta clase crea un reproductor 9 | de música 10 | """ 11 | 12 | def play(self, song): 13 | """ 14 | Reproduce la canción que recibió como parámetro 15 | 16 | Parameters: 17 | song(str): este es un string con el path de la canción 18 | 19 | Returns: 20 | int: devuelve 1 si reproduce con éxito, en el caso de fracaso devuelve 0 21 | """ 22 | print("reproduciendo canción") 23 | 24 | def stop(self): 25 | print("stopping") -------------------------------------------------------------------------------- /paquetes-populares/01-env.py: -------------------------------------------------------------------------------- 1 | # Varibles de entorno 2 | 3 | import os 4 | from sendgrid.helpers.mail import Mail 5 | from sendgrid import SendGridAPIClient 6 | 7 | email = os.environ.get("SENDGRID_EMAIL") 8 | 9 | mensaje = Mail( 10 | from_email=email, 11 | to_emails=email, 12 | subject="Correo de Pureba", 13 | html_content="Curso de Ultimate Python" 14 | ) 15 | 16 | try: 17 | apikey = os.environ.get("SENDGRID_API_KEY") 18 | sg = SendGridAPIClient(apikey) 19 | respuesta = sg.send(mensaje) 20 | print( 21 | respuesta.status_code, 22 | respuesta.body, 23 | respuesta.headers 24 | ) 25 | except Exception as e: 26 | print(e) 27 | 28 | -------------------------------------------------------------------------------- /modulos-nativos/05-cli.py: -------------------------------------------------------------------------------- 1 | import os 2 | from pathlib import Path 3 | import sys 4 | 5 | 6 | def cli(args): 7 | if len(args) == 1: 8 | print("no se pasaron argumentos") 9 | return 10 | if len(args) != 3: 11 | print("se necesitan 2 argumentos") 12 | return 13 | 14 | origen = args[1] 15 | o = Path(origen) 16 | if not o.exists(): 17 | print("Origen no existe") 18 | return 19 | 20 | destino = args[2] 21 | d = Path(destino) 22 | if d.exists(): 23 | print("el destino no puede existir") 24 | return 25 | 26 | os.rename(origen, destino) 27 | print("Archivo renombrado con exito") 28 | 29 | cli(sys.argv) -------------------------------------------------------------------------------- /productly_django/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | """Run administrative tasks.""" 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'productly.settings') 10 | try: 11 | from django.core.management import execute_from_command_line 12 | except ImportError as exc: 13 | raise ImportError( 14 | "Couldn't import Django. Are you sure it's installed and " 15 | "available on your PYTHONPATH environment variable? Did you " 16 | "forget to activate a virtual environment?" 17 | ) from exc 18 | execute_from_command_line(sys.argv) 19 | 20 | 21 | if __name__ == '__main__': 22 | main() 23 | -------------------------------------------------------------------------------- /modulos-nativos/06-email.py: -------------------------------------------------------------------------------- 1 | from email.mime.multipart import MIMEMultipart 2 | from email.mime.text import MIMEText 3 | import smtplib 4 | from email.mime.image import MIMEImage 5 | from pathlib import Path 6 | 7 | path = Path("modulos-nativos/holamundo.png") 8 | mime_image = MIMEImage(path.read_bytes()) 9 | mensaje = MIMEMultipart() 10 | mensaje["from"] = "Hola Mundo" 11 | mensaje["to"] = "ultimatepython@holamundo.io" 12 | mensaje["subject"] = "Esta es una prueba" 13 | cuerpo = MIMEText("Cuerpo del mensaje") 14 | mensaje.attach(cuerpo) 15 | mensaje.attach(mime_image) 16 | 17 | with smtplib.SMTP(host="smtp.gmail.com", port=587) as smtp: 18 | smtp.ehlo() 19 | smtp.starttls() 20 | 21 | smtp.login("ultimatepython@holamundo.io", "holamundo123") 22 | smtp.send_message(mensaje) 23 | print("Mensaje enviado") -------------------------------------------------------------------------------- /productly_django/productos/templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block content %} 4 | 5 | 6 |

Productos

7 | 8 | Nuevo Producto 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% for producto in productos %} 22 | 23 | 28 | 29 | 30 | 31 | 32 | {% endfor %} 33 | 34 |
NombreStockPuntajeCategoria
24 | 25 | {{producto.nombre}} 26 | 27 | {{producto.stock}}{{producto.puntaje}}{{producto.categoria}}
35 | 36 | {%endblock%} -------------------------------------------------------------------------------- /clases/10-contenedores.py: -------------------------------------------------------------------------------- 1 | class Producto: 2 | def __init__(self, nombre, precio): 3 | self.nombre = nombre 4 | self.precio = precio 5 | 6 | def __str__(self): 7 | return f"Producto: {self.nombre} - Precio {self.precio}" 8 | 9 | 10 | class Categoria: 11 | productos = [] 12 | 13 | def __init__(self, nombre, productos): 14 | self.nombre = nombre 15 | self.productos = productos 16 | 17 | def agregar(self, producto): 18 | self.productos.append(producto) 19 | 20 | def imprimir(self): 21 | for producto in self.productos: 22 | print(producto) 23 | 24 | 25 | kayak = Producto("Kayak", 1000) 26 | bicicleta = Producto("Bicicleta", 750) 27 | surfboard = Producto("Sufboard", 500) 28 | deportes = Categoria("Deportes", [kayak, bicicleta]) 29 | deportes.agregar(surfboard) 30 | deportes.imprimir() 31 | -------------------------------------------------------------------------------- /tipos-avanzados/11-diccionarios.py: -------------------------------------------------------------------------------- 1 | punto = {"x": 25, "y": 50} 2 | print(punto) 3 | print(punto["x"]) 4 | print(punto["y"]) 5 | 6 | punto["z"] = 45 7 | # print(punto, punto["lala"]) 8 | 9 | if "lala" in punto: 10 | print("encontré lala", punto["lala"]) 11 | 12 | print(punto.get("x")) 13 | print(punto.get("lala", 97)) 14 | 15 | del punto["x"] 16 | del (punto["y"]) 17 | 18 | print(punto) 19 | 20 | punto["x"] = 25 21 | 22 | for valor in punto: 23 | print(valor, punto[valor]) 24 | 25 | for valor in punto.items(): 26 | print(valor) 27 | 28 | for llave, valor in punto.items(): 29 | print(llave, valor) 30 | 31 | usuarios = [ 32 | {"id": 1, "nombre": "Chanchito"}, 33 | {"id": 2, "nombre": "Feliz"}, 34 | {"id": 3, "nombre": "Nicolas"}, 35 | {"id": 4, "nombre": "Felipe"}, 36 | ] 37 | 38 | for usuario in usuarios: 39 | print(usuario["nombre"]) 40 | -------------------------------------------------------------------------------- /pypi-test/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "b5eecef8c164cce84d649a167da22ab8a97556b98511f3ad136794baaecaf948" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.10" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "holamundoplayer": { 20 | "hashes": [ 21 | "sha256:a33dcccf8ff386e4cf63213c1a00ae96e9051724123c5e440c4a8181e5b485ad", 22 | "sha256:fcedeb64aca8a09a8647dc11210baf602390b7bdcf7c201a0e1d9f93730512f6" 23 | ], 24 | "index": "pypi", 25 | "version": "==0.0.1" 26 | } 27 | }, 28 | "develop": {} 29 | } 30 | -------------------------------------------------------------------------------- /funciones/07-ejercicio.py: -------------------------------------------------------------------------------- 1 | def no_space(texto): 2 | nuevo_texto = "" 3 | for char in texto: 4 | if char != " ": 5 | nuevo_texto += char 6 | return nuevo_texto 7 | 8 | 9 | def reverse(texto): 10 | texto_al_reves = "" 11 | for char in texto: 12 | texto_al_reves = char + texto_al_reves 13 | return texto_al_reves 14 | 15 | 16 | def es_palindromo(texto): 17 | texto = no_space(texto) 18 | texto_al_reves = reverse(texto) 19 | return texto.lower() == texto_al_reves.lower() 20 | 21 | 22 | print(es_palindromo("Amo la paloma")) 23 | print(es_palindromo("Hola Mundo")) 24 | print(es_palindromo("Reconocer")) 25 | print(es_palindromo("Somos o no somos")) 26 | 27 | # print("Abba", es_palindromo("Abba")) 28 | # print("Reconocer", es_palindromo("Reconocer")) 29 | # print("Amo la paloma", es_palindromo("Amo la paloma")) 30 | # print("Hola mundo", es_palindromo("Hola mundo")) 31 | -------------------------------------------------------------------------------- /productly_django/productos/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | 4 | # Create your models here. 5 | class Categoria(models.Model): 6 | nombre = models.CharField(max_length=255) 7 | 8 | def __str__(self): 9 | return self.nombre 10 | 11 | class Producto(models.Model): 12 | nombre = models.CharField(max_length=255) 13 | stock = models.IntegerField() 14 | puntaje = models.FloatField() 15 | # CASCADE: Si borro una categoria, borro todos los productos de esa categoria 16 | # PROTECT: No deja borrar la categoria 17 | # RESTRICT: Error si se borra sin antes borrar los productos 18 | # SET_NULL: Si borro la categoria, pone el campo categoria en null 19 | categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE) 20 | creado_en = models.DateTimeField(default=timezone.now) 21 | 22 | def __str__(self): 23 | return self.nombre -------------------------------------------------------------------------------- /productly_django/productos/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponseRedirect 2 | from django.shortcuts import render, get_object_or_404 3 | 4 | from productos.forms import ProductoForm 5 | from .models import Producto 6 | 7 | # Create your views here. 8 | def index(request): 9 | productos = Producto.objects.all() 10 | return render(request, 'index.html', context={'productos': productos}) 11 | 12 | def detalle(request, producto_id): 13 | producto = get_object_or_404(Producto, id=producto_id) 14 | return render(request, 'detalle.html', context={'producto': producto}) 15 | 16 | def formulario(request): 17 | if request.method == "POST": 18 | form = ProductoForm(request.POST) 19 | if form.is_valid(): 20 | form.save() 21 | return HttpResponseRedirect('/productos') 22 | else: 23 | form = ProductoForm() 24 | return render(request, 'producto_form.html', context={'form': form}) -------------------------------------------------------------------------------- /paquetes-populares/05-excel.py: -------------------------------------------------------------------------------- 1 | import openpyxl 2 | 3 | wb = openpyxl.load_workbook("planilla.xlsx") 4 | 5 | hoja = wb.active 6 | 7 | wb.create_sheet("Hoja 3") 8 | 9 | hoja3 = wb["Hoja 3"] 10 | hoja3.title = "Nuevo titulo" 11 | 12 | # print( 13 | # hoja.max_row, 14 | # hoja.max_column, 15 | # ) 16 | 17 | celda = hoja["A1"] 18 | celda.value = "Nombre completo" 19 | # print(celda.value) 20 | 21 | celda2 = hoja.cell(row=2, column=1) 22 | # print( 23 | # celda2.value, 24 | # celda2.row, 25 | # celda2.column, 26 | # celda2.coordinate 27 | # ) 28 | 29 | for fila in range(1, hoja.max_row + 1): 30 | for columna in range(1, hoja.max_column + 1): 31 | celda = hoja.cell(row=fila, column=columna) 32 | # print(fila, columna, celda.value) 33 | 34 | columna = hoja["A"] 35 | fila = hoja["1"] 36 | # print(columna) 37 | # print(fila) 38 | 39 | hoja.append([1, 2, 3]) 40 | print(hoja.rows) 41 | hoja.delete_rows(1, 1) 42 | wb.save("nuevo_excel.xlsx") 43 | -------------------------------------------------------------------------------- /control-flujo/09-calculadora.py: -------------------------------------------------------------------------------- 1 | print("Bienvenidos a la calculadora") 2 | print("Para salir escribe salir") 3 | print("Las operaciones son suma, resta, multi y div") 4 | 5 | resultado ="" 6 | while True: 7 | if not resultado: 8 | resultado = input("Ingrese número: ") 9 | if resultado.lower() == "salir": 10 | break 11 | resultado = int(resultado) 12 | op = input("Ingresa operación: ") 13 | if op.lower() == "salir": 14 | break 15 | n2 = input("Ingresa siguiente número: ") 16 | if n2.lower() == "salir": 17 | break 18 | n2 = int(n2) 19 | 20 | if op.lower() == "suma": 21 | resultado += n2 22 | elif op.lower() == "resta": 23 | resultado -= n2 24 | elif op.lower() == "multi": 25 | resultado *= n2 26 | elif op.lower() == "div": 27 | resultado /= n2 28 | else: 29 | print("Operación no válida") 30 | break 31 | 32 | print(f"El resultado es {resultado}") -------------------------------------------------------------------------------- /productly_django/productly/urls.py: -------------------------------------------------------------------------------- 1 | """productly URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/4.1/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | from . import views 19 | 20 | urlpatterns = [ 21 | path("", views.inicio, name="inicio"), 22 | path('admin/', admin.site.urls), 23 | path("productos/", include("productos.urls")) 24 | ] 25 | -------------------------------------------------------------------------------- /paquetes-populares/06-selenium.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | from selenium.webdriver.common.by import By 3 | from selenium.webdriver.common.keys import Keys 4 | import os 5 | 6 | # options = webdriver.ChromeOptions() 7 | # options.add_experimental_option('detach', True) 8 | # browser = webdriver.Chrome(options=options) 9 | browser = webdriver.Chrome() 10 | browser.implicitly_wait(10) 11 | browser.get('https://www.github.com') 12 | 13 | link = browser.find_element(By.LINK_TEXT, "Sign in") 14 | link.click() 15 | 16 | user_input = browser.find_element(By.ID, "login_field") 17 | pass_input = browser.find_element(By.ID, "password") 18 | user_input.send_keys(os.environ.get('GH_USER')) 19 | pass_input.send_keys(os.environ.get('GH_PASS')) 20 | pass_input.send_keys(Keys.RETURN) 21 | 22 | profile = browser.find_element( 23 | By.CLASS_NAME, "css-truncate.css-truncate-target.ml-1") 24 | 25 | label = profile.get_attribute('innerHTML') 26 | print(label) 27 | 28 | assert "tu usuario" in label 29 | 30 | browser.quit() -------------------------------------------------------------------------------- /archivos/04-csv.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import os 3 | 4 | # Escribir 5 | # with open("archivos/archivo.csv", "w") as archivo: 6 | # writer = csv.writer(archivo) 7 | # writer.writerow({"twit_id", "user_id", "text"}) 8 | # writer.writerow({1000, 1, "este es un tweet"}) 9 | # writer.writerow({1001, 2, "otro twit!"}) 10 | 11 | # Leer 12 | # with open("archivos/archivo.csv") as archivo: 13 | # reader = csv.reader(archivo) 14 | # print(list(archivo)) 15 | # archivo.seek(0) 16 | # for linea in reader: 17 | # print(linea) 18 | 19 | # Actualizar 20 | with open("archivos/archivo.csv") as r, open("archivos/archivo_temp.csv", "w") as w: 21 | reader = csv.reader(r) 22 | writer = csv.writer(w) 23 | for linea in reader: 24 | if linea[0] == "1000": 25 | writer.writerow([1000, 1, "texto modificado"]) 26 | else: 27 | writer.writerow(linea) 28 | os.remove("archivos/archivo.csv") 29 | os.rename("archivos/archivo_temp.csv", "archivos/archivo.csv") 30 | -------------------------------------------------------------------------------- /paquetes-populares/03-requests.py: -------------------------------------------------------------------------------- 1 | import requests 2 | # url = "https://jsonplaceholder.typicode.com/users" 3 | 4 | # r = requests.get(url, timeout=10) 5 | # print(r.status_code, 6 | # r.text, 7 | # ) 8 | # r = r.json() 9 | 10 | # for user in r: 11 | # print(user["name"]) 12 | 13 | # url = "https://jsonplaceholder.typicode.com/users/1" 14 | # r = requests.get(url, timeout=10) 15 | # print(r.json()) 16 | 17 | # url = "https://jsonplaceholder.typicode.com/users" 18 | # user = { 19 | # "name": "Chanchito feliz" 20 | # } 21 | # r = requests.post(url, timeout=10, data=user) 22 | # print(r.status_code) 23 | 24 | # url = "https://jsonplaceholder.typicode.com/users/2" 25 | # user = { 26 | # "name": "Chanchito feliz" 27 | # } 28 | # r = requests.put(url, timeout=10, data=user) 29 | # print(r.status_code) 30 | 31 | url = "https://jsonplaceholder.typicode.com/users/2" 32 | apikey = "123456" 33 | headers = { 34 | "Authorization": f"Bearer {apikey}", 35 | } 36 | r = requests.delete(url, timeout=10, headers=headers) 37 | print(r.status_code) -------------------------------------------------------------------------------- /archivos/03-open.py: -------------------------------------------------------------------------------- 1 | from io import open 2 | 3 | # Escritura 4 | # texto = "Hola mundo!" 5 | 6 | # archivo = open("archivos/hola-mundo.txt", "w") 7 | # archivo.write(texto) 8 | # archivo.close() 9 | 10 | # Lectura 11 | # archivo = open("archivos/hola-mundo.txt", "r") 12 | # texto = archivo.read() 13 | # archivo.close() 14 | # print(texto) 15 | 16 | # Lectura como lista 17 | # archivo = open("archivos/hola-mundo.txt", "r") 18 | # texto = archivo.readlines() 19 | # archivo.close() 20 | # print(texto) 21 | 22 | # with y seek 23 | # with open("archivos/hola-mundo.txt", "r") as archivo: 24 | # print(archivo.readlines()) 25 | # archivo.seek(0) 26 | # for linea in archivo: 27 | # print(linea) 28 | 29 | # Agregar 30 | # archivo = open("archivos/hola-mundo.txt", "a+") 31 | # archivo.write("Chao mundo :(") 32 | # archivo.close() 33 | 34 | # lectura y escritura 35 | with open("archivos/hola-mundo.txt", "r+") as archivo: 36 | texto = archivo.readlines() 37 | archivo.seek(0) 38 | texto[0] = "Chanchito feliz la" 39 | archivo.writelines(texto) 40 | -------------------------------------------------------------------------------- /modulos-nativos/07-plantillas.py: -------------------------------------------------------------------------------- 1 | from email.mime.multipart import MIMEMultipart 2 | from email.mime.text import MIMEText 3 | import smtplib 4 | from email.mime.image import MIMEImage 5 | from string import Template 6 | from pathlib import Path 7 | 8 | plantilla = Path("modulos-nativos/plantilla.html").read_text("utf-8") 9 | template = Template(plantilla) 10 | # cuerpo = template.substitute({"usuario": "Chanchito Feliz"}) 11 | cuerpo = template.substitute(usuario="Chanchito Triste") 12 | 13 | path = Path("modulos-nativos/holamundo.png") 14 | mime_image = MIMEImage(path.read_bytes()) 15 | mensaje = MIMEMultipart() 16 | mensaje["from"] = "Hola Mundo" 17 | mensaje["to"] = "ultimatepython@holamundo.io" 18 | mensaje["subject"] = "Esta es una prueba" 19 | cuerpo = MIMEText(cuerpo, "html") 20 | mensaje.attach(cuerpo) 21 | mensaje.attach(mime_image) 22 | 23 | with smtplib.SMTP(host="smtp.gmail.com", port=587) as smtp: 24 | smtp.ehlo() 25 | smtp.starttls() 26 | 27 | smtp.login("ultimatepython@holamundo.io", "holamundo123") 28 | smtp.send_message(mensaje) 29 | print("Mensaje enviado") -------------------------------------------------------------------------------- /productly_django/productos/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.1.7 on 2023-03-27 22:35 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | initial = True 10 | 11 | dependencies = [ 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name='Categoria', 17 | fields=[ 18 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 19 | ('nombre', models.CharField(max_length=255)), 20 | ], 21 | ), 22 | migrations.CreateModel( 23 | name='Producto', 24 | fields=[ 25 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 26 | ('nombre', models.CharField(max_length=255)), 27 | ('stock', models.IntegerField()), 28 | ('puntaje', models.FloatField()), 29 | ('categoria', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='productos.categoria')), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /tipos-avanzados/15-ejercicio.py: -------------------------------------------------------------------------------- 1 | from pprint import pprint 2 | string = "Hola mundo este es mi stringe" 3 | 4 | 5 | def quita_espacios(texto): 6 | return [char for char in texto if char != " "] 7 | 8 | 9 | def cuenta_caracteres(lista): 10 | chars_dict = {} 11 | for char in lista: 12 | if char in chars_dict: 13 | chars_dict[char] += 1 14 | else: 15 | chars_dict[char] = 1 16 | return chars_dict 17 | 18 | 19 | def ordena(dict): 20 | return sorted( 21 | dict.items(), 22 | key=lambda key: key[1], 23 | reverse=True 24 | ) 25 | 26 | 27 | def mayores_tuplas(lista): 28 | maximo = lista[0][1] 29 | respuesta = {} 30 | for orden in lista: 31 | if maximo > orden[1]: 32 | break 33 | respuesta[orden[0]] = orden[1] 34 | return respuesta 35 | 36 | 37 | def crea_mensaje(diccionario): 38 | mensaje = "Los que más se repiten son: \n" 39 | for key, valor in diccionario.items(): 40 | mensaje += f"- {key} con {valor} repeticiones \n" 41 | return mensaje 42 | 43 | 44 | sin_espacios = quita_espacios(string) 45 | contados = cuenta_caracteres(sin_espacios) 46 | ordenados = ordena(contados) 47 | mayores = mayores_tuplas(ordenados) 48 | mensaje = crea_mensaje(mayores) 49 | print(mensaje) 50 | -------------------------------------------------------------------------------- /productly_django/templates/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Productly 9 | 11 | 12 | 13 | 14 | 28 | 29 | 30 |
31 | {% block content %} 32 | 33 | {% endblock %} 34 |
35 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /machine_learning/HolaMundo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 13, 6 | "id": "1a2214b1", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/plain": [ 12 | "array(['fps'], dtype=object)" 13 | ] 14 | }, 15 | "execution_count": 13, 16 | "metadata": {}, 17 | "output_type": "execute_result" 18 | } 19 | ], 20 | "source": [ 21 | "import pandas as p\n", 22 | "from sklearn.tree import DecisionTreeClassifier\n", 23 | "import joblib\n", 24 | "\n", 25 | "# data_juegos = p.read_csv(\"juegos-ml.csv\")\n", 26 | "# X = data_juegos.drop(columns=[\"juegos\"])\n", 27 | "# y = data_juegos[\"juegos\"]\n", 28 | "\n", 29 | " \n", 30 | "# modelo = DecisionTreeClassifier()\n", 31 | "# modelo.fit(X.values, y)\n", 32 | "# predicciones = modelo.predict([[14, 0]])\n", 33 | "\n", 34 | "modelo = joblib.load(\"recomendador-juegos.joblib\")\n", 35 | "modelo.predict([[14, 0]])\n", 36 | "predicciones" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "id": "75bb939e", 43 | "metadata": { 44 | "scrolled": true 45 | }, 46 | "outputs": [], 47 | "source": [] 48 | } 49 | ], 50 | "metadata": { 51 | "kernelspec": { 52 | "display_name": "Python 3 (ipykernel)", 53 | "language": "python", 54 | "name": "python3" 55 | }, 56 | "language_info": { 57 | "codemirror_mode": { 58 | "name": "ipython", 59 | "version": 3 60 | }, 61 | "file_extension": ".py", 62 | "mimetype": "text/x-python", 63 | "name": "python", 64 | "nbconvert_exporter": "python", 65 | "pygments_lexer": "ipython3", 66 | "version": "3.10.9" 67 | } 68 | }, 69 | "nbformat": 4, 70 | "nbformat_minor": 5 71 | } 72 | -------------------------------------------------------------------------------- /machine_learning/.ipynb_checkpoints/HolaMundo-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 8, 6 | "id": "1a2214b1", 7 | "metadata": {}, 8 | "outputs": [ 9 | { 10 | "data": { 11 | "text/plain": [ 12 | "1.0" 13 | ] 14 | }, 15 | "execution_count": 8, 16 | "metadata": {}, 17 | "output_type": "execute_result" 18 | } 19 | ], 20 | "source": [ 21 | "import pandas as p\n", 22 | "from sklearn.tree import DecisionTreeClassifier\n", 23 | "from sklearn.model_selection import train_test_split\n", 24 | "from sklearn.metrics import accuracy_score\n", 25 | "\n", 26 | "data_juegos = p.read_csv(\"juegos-ml.csv\")\n", 27 | "X = data_juegos.drop(columns=[\"juegos\"])\n", 28 | "y = data_juegos[\"juegos\"]\n", 29 | "X_entrenar, X_prueba, y_entrenar, y_prueba = train_test_split(X.values, y, test_size=0.1)\n", 30 | " \n", 31 | "modelo = DecisionTreeClassifier()\n", 32 | "modelo.fit(X_entrenar, y_entrenar)\n", 33 | "predicciones = modelo.predict(X_prueba)\n", 34 | "\n", 35 | "puntaje = accuracy_score(y_prueba, predicciones)\n", 36 | "puntaje" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": null, 42 | "id": "75bb939e", 43 | "metadata": { 44 | "scrolled": true 45 | }, 46 | "outputs": [], 47 | "source": [] 48 | } 49 | ], 50 | "metadata": { 51 | "kernelspec": { 52 | "display_name": "Python 3 (ipykernel)", 53 | "language": "python", 54 | "name": "python3" 55 | }, 56 | "language_info": { 57 | "codemirror_mode": { 58 | "name": "ipython", 59 | "version": 3 60 | }, 61 | "file_extension": ".py", 62 | "mimetype": "text/x-python", 63 | "name": "python", 64 | "nbconvert_exporter": "python", 65 | "pygments_lexer": "ipython3", 66 | "version": "3.10.9" 67 | } 68 | }, 69 | "nbformat": 4, 70 | "nbformat_minor": 5 71 | } 72 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Logo de HolaMundo](https://holamundo.io/wp-content/uploads/2022/12/logo-hola-mundo-horizontal.png) 2 | # Curso Ultimate Python 3 | ![Estado](https://badgen.net/badge/estado/terminado/green) 4 | ![Python](https://badgen.net/badge/lenguaje/Python/blue?icon=terminal) 5 | ![Ruta](https://badgen.net/badge/ruta/Backend/purple) 6 | 7 | Este repositorio complementa el **curso y libros de la saga Ultimate Python**. Python es uno de los lenguajes de programación más populares y es usado por grandes empresas. Entre sus usos más comunes están el desarrollo backend, ciencia de datos e inteligencia artificial. 8 | 9 | > [Página del curso en la Academia Hola Mundo](https://academia.holamundo.io/courses/ultimate-python) 10 | 11 | > [Libro (parte 1) en Amazon Estados Unidos 🇺🇸](https://www.amazon.com/Nicolas-Schurmann-ebook/dp/B0CXXXN585) 12 | > 13 | > [Libro (parte 2) en Amazon Estados Unidos 🇺🇸](https://www.amazon.com/Nicolas-Schurmann-ebook/dp/B0DNDVVB47) 14 | 15 | > [Libro (parte 1) en Amazon España 🇪🇸](https://www.amazon.es/Ultimate-Python-experto-principiantes-seguir-ebook/dp/B0CXXXN585) 16 | > 17 | > [Libro (parte 2) en Amazon España 🇪🇸](https://www.amazon.com.br/Ultimate-Python-experto-principiantes-Spanish-ebook/dp/B0CXXXN585) 18 | 19 | > [Libro (parte 1) en Amazon México 🇲🇽](https://www.amazon.com.mx/Ultimate-Python-experto-principiantes-seguir-ebook/dp/B0CXXXN585) 20 | > 21 | > [Libro (parte 2) en Amazon México 🇲🇽](https://www.amazon.com.mx/Ultimate-Python-Parte-avanzados-profesionales-ebook/dp/B0DNDVVB47) 22 | 23 | > [Libro (parte 1) en Amazon Brasil 🇧🇷](https://www.amazon.com.br/Ultimate-Python-Parte-avanzados-profesionales-ebook/dp/B0DNDVVB47) 24 | > 25 | > [Libro (parte 2) en Amazon Brasil 🇧🇷](https://www.amazon.com.br/Ultimate-Python-Parte-avanzados-profesionales-ebook/dp/B0DNDVVB47) 26 | 27 | ## Contenido del curso. 28 | - **Introducción**. 29 | - **Tipos básicos**. 30 | - **Control de flujo**. 31 | - **Funciones**. 32 | - **Tipos avanzados**. 33 | - **Clases**. 34 | - **Excepciones**. 35 | - **Módulos**. 36 | - **Rutas y directorios**. 37 | - **Gestión de archivos**. 38 | - **Bases de datos SQLite**. 39 | - **Paquetes nativos de Python**. 40 | - **Índice de paquetes de Python**. 41 | - **Las librerías más populares de Python**. 42 | - **Introducción a Django**. 43 | - **Machine Learning**. 44 | - **Integración y despliegue continuo**. 45 | 46 | ## Instalación y uso 47 | ```bash 48 | git clone https://github.com/HolaMundoDev/ultimate_python.git 49 | cd ultimate_python 50 | ``` 51 | -------------------------------------------------------------------------------- /productly_django/productly/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for productly project. 3 | 4 | Generated by 'django-admin startproject' using Django 4.1.7. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/4.1/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/4.1/ref/settings/ 11 | """ 12 | 13 | import os 14 | from pathlib import Path 15 | from django.forms.renderers import TemplatesSetting 16 | 17 | class CustomFormRenderer(TemplatesSetting): 18 | form_template_name = "form_snippet.html" 19 | 20 | FORM_RENDERER = "productly.settings.CustomFormRenderer" 21 | 22 | # Build paths inside the project like this: BASE_DIR / 'subdir'. 23 | BASE_DIR = Path(__file__).resolve().parent.parent 24 | 25 | 26 | # Quick-start development settings - unsuitable for production 27 | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ 28 | 29 | # SECURITY WARNING: keep the secret key used in production secret! 30 | SECRET_KEY = 'django-insecure-lb&hig^45y0+wpt-k*#y!0*kp#nwhj4g&c(hbq_b8e7(lm!iyn' 31 | 32 | # SECURITY WARNING: don't run with debug turned on in production! 33 | DEBUG = True 34 | 35 | ALLOWED_HOSTS = [] 36 | 37 | 38 | # Application definition 39 | 40 | INSTALLED_APPS = [ 41 | 'django.contrib.admin', 42 | 'django.contrib.auth', 43 | 'django.contrib.contenttypes', 44 | 'django.contrib.sessions', 45 | 'django.contrib.messages', 46 | 'django.contrib.staticfiles', 47 | 'django.forms', 48 | "productos.apps.ProductosConfig", 49 | ] 50 | 51 | MIDDLEWARE = [ 52 | 'django.middleware.security.SecurityMiddleware', 53 | 'django.contrib.sessions.middleware.SessionMiddleware', 54 | 'django.middleware.common.CommonMiddleware', 55 | 'django.middleware.csrf.CsrfViewMiddleware', 56 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 57 | 'django.contrib.messages.middleware.MessageMiddleware', 58 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 59 | ] 60 | 61 | ROOT_URLCONF = 'productly.urls' 62 | 63 | TEMPLATES = [ 64 | { 65 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 66 | 'DIRS': [os.path.join(BASE_DIR, 'templates')], 67 | 'APP_DIRS': True, 68 | 'OPTIONS': { 69 | 'context_processors': [ 70 | 'django.template.context_processors.debug', 71 | 'django.template.context_processors.request', 72 | 'django.contrib.auth.context_processors.auth', 73 | 'django.contrib.messages.context_processors.messages', 74 | ], 75 | }, 76 | }, 77 | ] 78 | 79 | WSGI_APPLICATION = 'productly.wsgi.application' 80 | 81 | 82 | # Database 83 | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases 84 | 85 | DATABASES = { 86 | 'default': { 87 | 'ENGINE': 'django.db.backends.sqlite3', 88 | 'NAME': BASE_DIR / 'db.sqlite3', 89 | } 90 | } 91 | 92 | 93 | # Password validation 94 | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators 95 | 96 | AUTH_PASSWORD_VALIDATORS = [ 97 | { 98 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 99 | }, 100 | { 101 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 102 | }, 103 | { 104 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 105 | }, 106 | { 107 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 108 | }, 109 | ] 110 | 111 | 112 | # Internationalization 113 | # https://docs.djangoproject.com/en/4.1/topics/i18n/ 114 | 115 | LANGUAGE_CODE = 'en-us' 116 | 117 | TIME_ZONE = 'UTC' 118 | 119 | USE_I18N = True 120 | 121 | USE_TZ = True 122 | 123 | 124 | # Static files (CSS, JavaScript, Images) 125 | # https://docs.djangoproject.com/en/4.1/howto/static-files/ 126 | 127 | STATIC_URL = 'static/' 128 | 129 | # Default primary key field type 130 | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field 131 | 132 | DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' 133 | -------------------------------------------------------------------------------- /package/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "a416d48a2c30d4acf425cb96d7ac6672753db8e8f6c962a328848db5b9a290a1" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.10" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "certifi": { 20 | "hashes": [ 21 | "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", 22 | "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" 23 | ], 24 | "markers": "python_version >= '3.6'", 25 | "version": "==2023.11.17" 26 | }, 27 | "charset-normalizer": { 28 | "hashes": [ 29 | "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", 30 | "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", 31 | "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", 32 | "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", 33 | "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", 34 | "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", 35 | "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", 36 | "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", 37 | "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", 38 | "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", 39 | "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", 40 | "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", 41 | "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", 42 | "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", 43 | "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", 44 | "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", 45 | "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", 46 | "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", 47 | "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", 48 | "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", 49 | "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", 50 | "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", 51 | "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", 52 | "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", 53 | "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", 54 | "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", 55 | "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", 56 | "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", 57 | "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", 58 | "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", 59 | "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", 60 | "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", 61 | "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", 62 | "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", 63 | "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", 64 | "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", 65 | "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", 66 | "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", 67 | "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", 68 | "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", 69 | "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", 70 | "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", 71 | "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", 72 | "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", 73 | "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", 74 | "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", 75 | "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", 76 | "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", 77 | "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", 78 | "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", 79 | "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", 80 | "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", 81 | "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", 82 | "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", 83 | "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", 84 | "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", 85 | "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", 86 | "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", 87 | "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", 88 | "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", 89 | "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", 90 | "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", 91 | "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", 92 | "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", 93 | "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", 94 | "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", 95 | "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", 96 | "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", 97 | "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", 98 | "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", 99 | "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", 100 | "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", 101 | "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", 102 | "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", 103 | "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", 104 | "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", 105 | "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", 106 | "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", 107 | "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", 108 | "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", 109 | "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", 110 | "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", 111 | "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", 112 | "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", 113 | "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", 114 | "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", 115 | "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", 116 | "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", 117 | "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", 118 | "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" 119 | ], 120 | "markers": "python_full_version >= '3.7.0'", 121 | "version": "==3.3.2" 122 | }, 123 | "idna": { 124 | "hashes": [ 125 | "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", 126 | "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" 127 | ], 128 | "markers": "python_version >= '3.5'", 129 | "version": "==3.6" 130 | }, 131 | "requests": { 132 | "hashes": [ 133 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 134 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 135 | ], 136 | "index": "pypi", 137 | "version": "==2.31.0" 138 | }, 139 | "urllib3": { 140 | "hashes": [ 141 | "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3", 142 | "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54" 143 | ], 144 | "markers": "python_version >= '3.8'", 145 | "version": "==2.1.0" 146 | } 147 | }, 148 | "develop": {} 149 | } 150 | -------------------------------------------------------------------------------- /productly_django/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "ce5681fa311abf6d3cf1b008b03aefa857d0e188afe4bc2d2ecd3e1fd6de18f7" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.9" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "asgiref": { 20 | "hashes": [ 21 | "sha256:71e68008da809b957b7ee4b43dbccff33d1b23519fb8344e33f049897077afac", 22 | "sha256:9567dfe7bd8d3c8c892227827c41cce860b368104c3431da67a0c5a65a949506" 23 | ], 24 | "markers": "python_version >= '3.7'", 25 | "version": "==3.6.0" 26 | }, 27 | "astroid": { 28 | "hashes": [ 29 | "sha256:89860bda98fe2bbd1f5d262229be7629d778ce280de68d95d4a73d1f592ad268", 30 | "sha256:af4e0aff46e2868218502789898269ed95b663fba49e65d91c1e09c966266c34" 31 | ], 32 | "markers": "python_full_version >= '3.7.2'", 33 | "version": "==2.15.1" 34 | }, 35 | "dill": { 36 | "hashes": [ 37 | "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0", 38 | "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373" 39 | ], 40 | "markers": "python_version < '3.11'", 41 | "version": "==0.3.6" 42 | }, 43 | "django": { 44 | "hashes": [ 45 | "sha256:44f714b81c5f190d9d2ddad01a532fe502fa01c4cb8faf1d081f4264ed15dcd8", 46 | "sha256:f2f431e75adc40039ace496ad3b9f17227022e8b11566f4b363da44c7e44761e" 47 | ], 48 | "index": "pypi", 49 | "version": "==4.1.7" 50 | }, 51 | "isort": { 52 | "hashes": [ 53 | "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", 54 | "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" 55 | ], 56 | "markers": "python_full_version >= '3.8.0'", 57 | "version": "==5.12.0" 58 | }, 59 | "lazy-object-proxy": { 60 | "hashes": [ 61 | "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382", 62 | "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82", 63 | "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9", 64 | "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494", 65 | "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46", 66 | "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30", 67 | "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63", 68 | "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4", 69 | "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae", 70 | "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be", 71 | "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701", 72 | "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd", 73 | "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006", 74 | "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a", 75 | "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586", 76 | "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8", 77 | "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821", 78 | "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07", 79 | "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b", 80 | "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171", 81 | "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b", 82 | "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2", 83 | "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7", 84 | "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4", 85 | "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8", 86 | "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e", 87 | "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f", 88 | "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda", 89 | "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4", 90 | "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e", 91 | "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671", 92 | "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11", 93 | "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455", 94 | "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734", 95 | "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb", 96 | "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59" 97 | ], 98 | "markers": "python_version >= '3.7'", 99 | "version": "==1.9.0" 100 | }, 101 | "mccabe": { 102 | "hashes": [ 103 | "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", 104 | "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" 105 | ], 106 | "markers": "python_version >= '3.6'", 107 | "version": "==0.7.0" 108 | }, 109 | "platformdirs": { 110 | "hashes": [ 111 | "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08", 112 | "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e" 113 | ], 114 | "markers": "python_version >= '3.7'", 115 | "version": "==3.2.0" 116 | }, 117 | "pylint": { 118 | "hashes": [ 119 | "sha256:8660a54e3f696243d644fca98f79013a959c03f979992c1ab59c24d3f4ec2700", 120 | "sha256:d4d009b0116e16845533bc2163493d6681846ac725eab8ca8014afb520178ddd" 121 | ], 122 | "markers": "python_full_version >= '3.7.2'", 123 | "version": "==2.17.1" 124 | }, 125 | "pylint-django": { 126 | "hashes": [ 127 | "sha256:0ac090d106c62fe33782a1d01bda1610b761bb1c9bf5035ced9d5f23a13d8591", 128 | "sha256:56b12b6adf56d548412445bd35483034394a1a94901c3f8571980a13882299d5" 129 | ], 130 | "index": "pypi", 131 | "version": "==2.5.3" 132 | }, 133 | "pylint-plugin-utils": { 134 | "hashes": [ 135 | "sha256:b3d43e85ab74c4f48bb46ae4ce771e39c3a20f8b3d56982ab17aa73b4f98d535", 136 | "sha256:ce48bc0516ae9415dd5c752c940dfe601b18fe0f48aa249f2386adfa95a004dd" 137 | ], 138 | "markers": "python_full_version >= '3.6.2'", 139 | "version": "==0.7" 140 | }, 141 | "sqlparse": { 142 | "hashes": [ 143 | "sha256:0323c0ec29cd52bceabc1b4d9d579e311f3e4961b98d174201d5622a23b85e34", 144 | "sha256:69ca804846bb114d2ec380e4360a8a340db83f0ccf3afceeb1404df028f57268" 145 | ], 146 | "markers": "python_version >= '3.5'", 147 | "version": "==0.4.3" 148 | }, 149 | "tomli": { 150 | "hashes": [ 151 | "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", 152 | "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" 153 | ], 154 | "markers": "python_version < '3.11'", 155 | "version": "==2.0.1" 156 | }, 157 | "tomlkit": { 158 | "hashes": [ 159 | "sha256:5325463a7da2ef0c6bbfefb62a3dc883aebe679984709aee32a317907d0a8d3c", 160 | "sha256:f392ef70ad87a672f02519f99967d28a4d3047133e2d1df936511465fbb3791d" 161 | ], 162 | "markers": "python_version >= '3.7'", 163 | "version": "==0.11.7" 164 | }, 165 | "typing-extensions": { 166 | "hashes": [ 167 | "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", 168 | "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" 169 | ], 170 | "markers": "python_version < '3.10'", 171 | "version": "==4.5.0" 172 | }, 173 | "wrapt": { 174 | "hashes": [ 175 | "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0", 176 | "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420", 177 | "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a", 178 | "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c", 179 | "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079", 180 | "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923", 181 | "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f", 182 | "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1", 183 | "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8", 184 | "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86", 185 | "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0", 186 | "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364", 187 | "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e", 188 | "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c", 189 | "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e", 190 | "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c", 191 | "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727", 192 | "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff", 193 | "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e", 194 | "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29", 195 | "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7", 196 | "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72", 197 | "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475", 198 | "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a", 199 | "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317", 200 | "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2", 201 | "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd", 202 | "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640", 203 | "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98", 204 | "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248", 205 | "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e", 206 | "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d", 207 | "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec", 208 | "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1", 209 | "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e", 210 | "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9", 211 | "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92", 212 | "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb", 213 | "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094", 214 | "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46", 215 | "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", 216 | "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd", 217 | "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705", 218 | "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8", 219 | "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975", 220 | "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb", 221 | "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e", 222 | "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b", 223 | "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418", 224 | "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019", 225 | "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1", 226 | "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba", 227 | "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6", 228 | "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2", 229 | "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3", 230 | "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7", 231 | "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752", 232 | "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416", 233 | "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f", 234 | "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1", 235 | "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc", 236 | "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145", 237 | "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee", 238 | "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a", 239 | "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7", 240 | "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b", 241 | "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653", 242 | "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0", 243 | "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90", 244 | "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29", 245 | "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6", 246 | "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034", 247 | "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09", 248 | "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559", 249 | "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639" 250 | ], 251 | "markers": "python_version < '3.11'", 252 | "version": "==1.15.0" 253 | } 254 | }, 255 | "develop": {} 256 | } 257 | -------------------------------------------------------------------------------- /holamundoplayer/LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . -------------------------------------------------------------------------------- /paquetes-populares/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "55bc262280c93dc34c20c2ec7caf4457d6e6e36666789e59b81ea2a188aef9a5" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.10" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiohttp": { 20 | "hashes": [ 21 | "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168", 22 | "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb", 23 | "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5", 24 | "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f", 25 | "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc", 26 | "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c", 27 | "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29", 28 | "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4", 29 | "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc", 30 | "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc", 31 | "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63", 32 | "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e", 33 | "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d", 34 | "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a", 35 | "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60", 36 | "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38", 37 | "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b", 38 | "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2", 39 | "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53", 40 | "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5", 41 | "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4", 42 | "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96", 43 | "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58", 44 | "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa", 45 | "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321", 46 | "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae", 47 | "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce", 48 | "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8", 49 | "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194", 50 | "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c", 51 | "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf", 52 | "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d", 53 | "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869", 54 | "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b", 55 | "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52", 56 | "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528", 57 | "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5", 58 | "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1", 59 | "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4", 60 | "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8", 61 | "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d", 62 | "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7", 63 | "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5", 64 | "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54", 65 | "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3", 66 | "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5", 67 | "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c", 68 | "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29", 69 | "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3", 70 | "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747", 71 | "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672", 72 | "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5", 73 | "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11", 74 | "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca", 75 | "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768", 76 | "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6", 77 | "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2", 78 | "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533", 79 | "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6", 80 | "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266", 81 | "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d", 82 | "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec", 83 | "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5", 84 | "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1", 85 | "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b", 86 | "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679", 87 | "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283", 88 | "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb", 89 | "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b", 90 | "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3", 91 | "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051", 92 | "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511", 93 | "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e", 94 | "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d", 95 | "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542", 96 | "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f" 97 | ], 98 | "markers": "python_version >= '3.8'", 99 | "version": "==3.9.3" 100 | }, 101 | "aiohttp-retry": { 102 | "hashes": [ 103 | "sha256:3aeeead8f6afe48272db93ced9440cf4eda8b6fd7ee2abb25357b7eb28525b45", 104 | "sha256:9a8e637e31682ad36e1ff9f8bcba912fcfc7d7041722bc901a4b948da4d71ea9" 105 | ], 106 | "markers": "python_version >= '3.7'", 107 | "version": "==2.8.3" 108 | }, 109 | "aiosignal": { 110 | "hashes": [ 111 | "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", 112 | "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" 113 | ], 114 | "markers": "python_version >= '3.7'", 115 | "version": "==1.3.1" 116 | }, 117 | "async-timeout": { 118 | "hashes": [ 119 | "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", 120 | "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" 121 | ], 122 | "markers": "python_version < '3.11'", 123 | "version": "==4.0.3" 124 | }, 125 | "attrs": { 126 | "hashes": [ 127 | "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", 128 | "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" 129 | ], 130 | "markers": "python_version >= '3.7'", 131 | "version": "==23.2.0" 132 | }, 133 | "beautifulsoup4": { 134 | "hashes": [ 135 | "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", 136 | "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" 137 | ], 138 | "index": "pypi", 139 | "version": "==4.12.3" 140 | }, 141 | "certifi": { 142 | "hashes": [ 143 | "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", 144 | "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" 145 | ], 146 | "markers": "python_version >= '3.6'", 147 | "version": "==2023.11.17" 148 | }, 149 | "charset-normalizer": { 150 | "hashes": [ 151 | "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", 152 | "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", 153 | "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", 154 | "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", 155 | "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", 156 | "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", 157 | "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", 158 | "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", 159 | "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", 160 | "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", 161 | "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", 162 | "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", 163 | "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", 164 | "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", 165 | "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", 166 | "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", 167 | "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", 168 | "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", 169 | "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", 170 | "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", 171 | "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", 172 | "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", 173 | "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", 174 | "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", 175 | "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", 176 | "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", 177 | "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", 178 | "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", 179 | "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", 180 | "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", 181 | "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", 182 | "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", 183 | "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", 184 | "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", 185 | "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", 186 | "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", 187 | "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", 188 | "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", 189 | "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", 190 | "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", 191 | "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", 192 | "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", 193 | "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", 194 | "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", 195 | "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", 196 | "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", 197 | "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", 198 | "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", 199 | "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", 200 | "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", 201 | "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", 202 | "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", 203 | "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", 204 | "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", 205 | "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", 206 | "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", 207 | "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", 208 | "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", 209 | "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", 210 | "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", 211 | "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", 212 | "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", 213 | "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", 214 | "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", 215 | "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", 216 | "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", 217 | "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", 218 | "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", 219 | "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", 220 | "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", 221 | "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", 222 | "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", 223 | "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", 224 | "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", 225 | "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", 226 | "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", 227 | "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", 228 | "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", 229 | "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", 230 | "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", 231 | "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", 232 | "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", 233 | "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", 234 | "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", 235 | "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", 236 | "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", 237 | "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", 238 | "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", 239 | "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", 240 | "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" 241 | ], 242 | "markers": "python_full_version >= '3.7.0'", 243 | "version": "==3.3.2" 244 | }, 245 | "et-xmlfile": { 246 | "hashes": [ 247 | "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", 248 | "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" 249 | ], 250 | "markers": "python_version >= '3.6'", 251 | "version": "==1.1.0" 252 | }, 253 | "exceptiongroup": { 254 | "hashes": [ 255 | "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", 256 | "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" 257 | ], 258 | "markers": "python_version < '3.11'", 259 | "version": "==1.2.0" 260 | }, 261 | "frozenlist": { 262 | "hashes": [ 263 | "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", 264 | "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", 265 | "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", 266 | "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5", 267 | "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", 268 | "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", 269 | "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a", 270 | "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701", 271 | "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d", 272 | "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6", 273 | "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", 274 | "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106", 275 | "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", 276 | "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", 277 | "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a", 278 | "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0", 279 | "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", 280 | "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826", 281 | "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec", 282 | "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6", 283 | "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", 284 | "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19", 285 | "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0", 286 | "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", 287 | "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", 288 | "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09", 289 | "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", 290 | "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", 291 | "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", 292 | "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b", 293 | "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b", 294 | "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d", 295 | "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0", 296 | "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea", 297 | "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", 298 | "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", 299 | "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897", 300 | "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7", 301 | "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", 302 | "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9", 303 | "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", 304 | "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", 305 | "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742", 306 | "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09", 307 | "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0", 308 | "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932", 309 | "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1", 310 | "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", 311 | "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49", 312 | "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d", 313 | "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7", 314 | "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", 315 | "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", 316 | "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e", 317 | "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", 318 | "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82", 319 | "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb", 320 | "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068", 321 | "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8", 322 | "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", 323 | "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", 324 | "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2", 325 | "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11", 326 | "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", 327 | "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", 328 | "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0", 329 | "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497", 330 | "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17", 331 | "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0", 332 | "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2", 333 | "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439", 334 | "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", 335 | "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", 336 | "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825", 337 | "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887", 338 | "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced", 339 | "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74" 340 | ], 341 | "markers": "python_version >= '3.8'", 342 | "version": "==1.4.1" 343 | }, 344 | "h11": { 345 | "hashes": [ 346 | "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", 347 | "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" 348 | ], 349 | "markers": "python_version >= '3.7'", 350 | "version": "==0.14.0" 351 | }, 352 | "idna": { 353 | "hashes": [ 354 | "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", 355 | "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" 356 | ], 357 | "markers": "python_version >= '3.5'", 358 | "version": "==3.6" 359 | }, 360 | "multidict": { 361 | "hashes": [ 362 | "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9", 363 | "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8", 364 | "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03", 365 | "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710", 366 | "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161", 367 | "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664", 368 | "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569", 369 | "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067", 370 | "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313", 371 | "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706", 372 | "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2", 373 | "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636", 374 | "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49", 375 | "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93", 376 | "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603", 377 | "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0", 378 | "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60", 379 | "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4", 380 | "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e", 381 | "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1", 382 | "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60", 383 | "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951", 384 | "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc", 385 | "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe", 386 | "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95", 387 | "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d", 388 | "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8", 389 | "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed", 390 | "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2", 391 | "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775", 392 | "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87", 393 | "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c", 394 | "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2", 395 | "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98", 396 | "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3", 397 | "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe", 398 | "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78", 399 | "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660", 400 | "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176", 401 | "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e", 402 | "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988", 403 | "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c", 404 | "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c", 405 | "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0", 406 | "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449", 407 | "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f", 408 | "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde", 409 | "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5", 410 | "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d", 411 | "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac", 412 | "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a", 413 | "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9", 414 | "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca", 415 | "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11", 416 | "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35", 417 | "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063", 418 | "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b", 419 | "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982", 420 | "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258", 421 | "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", 422 | "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52", 423 | "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480", 424 | "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7", 425 | "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461", 426 | "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d", 427 | "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc", 428 | "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779", 429 | "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a", 430 | "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547", 431 | "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0", 432 | "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171", 433 | "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf", 434 | "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d", 435 | "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba" 436 | ], 437 | "markers": "python_version >= '3.7'", 438 | "version": "==6.0.4" 439 | }, 440 | "openpyxl": { 441 | "hashes": [ 442 | "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", 443 | "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" 444 | ], 445 | "index": "pypi", 446 | "version": "==3.1.2" 447 | }, 448 | "outcome": { 449 | "hashes": [ 450 | "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", 451 | "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b" 452 | ], 453 | "markers": "python_version >= '3.7'", 454 | "version": "==1.3.0.post0" 455 | }, 456 | "pyjwt": { 457 | "hashes": [ 458 | "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", 459 | "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" 460 | ], 461 | "markers": "python_version >= '3.7'", 462 | "version": "==2.8.0" 463 | }, 464 | "pysocks": { 465 | "hashes": [ 466 | "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299", 467 | "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5", 468 | "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0" 469 | ], 470 | "version": "==1.7.1" 471 | }, 472 | "python-http-client": { 473 | "hashes": [ 474 | "sha256:ad371d2bbedc6ea15c26179c6222a78bc9308d272435ddf1d5c84f068f249a36", 475 | "sha256:bf841ee45262747e00dec7ee9971dfb8c7d83083f5713596488d67739170cea0" 476 | ], 477 | "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", 478 | "version": "==3.3.7" 479 | }, 480 | "requests": { 481 | "hashes": [ 482 | "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", 483 | "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" 484 | ], 485 | "index": "pypi", 486 | "version": "==2.31.0" 487 | }, 488 | "selenium": { 489 | "hashes": [ 490 | "sha256:5aee79026c07985dc1b0c909f34084aa996dfe5b307602de9016d7a621a473f2", 491 | "sha256:d43d6972e516855fb242ef9ce4ce759057b115070e702e7b1c1032fe7b38d87b" 492 | ], 493 | "index": "pypi", 494 | "version": "==4.17.2" 495 | }, 496 | "sendgrid": { 497 | "hashes": [ 498 | "sha256:43ecf5bb742ea5850c7cfe68f5e7d9948772352306d4e83e119899959538b884", 499 | "sha256:71424b2a97f5a034121ea3b2666c653ba0ed315982f0d57b7851c0c9503dc5ab" 500 | ], 501 | "index": "pypi", 502 | "version": "==6.11.0" 503 | }, 504 | "sniffio": { 505 | "hashes": [ 506 | "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", 507 | "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" 508 | ], 509 | "markers": "python_version >= '3.7'", 510 | "version": "==1.3.0" 511 | }, 512 | "sortedcontainers": { 513 | "hashes": [ 514 | "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", 515 | "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0" 516 | ], 517 | "version": "==2.4.0" 518 | }, 519 | "soupsieve": { 520 | "hashes": [ 521 | "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", 522 | "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" 523 | ], 524 | "markers": "python_version >= '3.8'", 525 | "version": "==2.5" 526 | }, 527 | "starkbank-ecdsa": { 528 | "hashes": [ 529 | "sha256:9399c3371b899d4a235b68a1ed7919d202fbf024bd2c863ae8ebdad343c2a63a" 530 | ], 531 | "version": "==2.2.0" 532 | }, 533 | "trio": { 534 | "hashes": [ 535 | "sha256:c3bd3a4e3e3025cd9a2241eae75637c43fe0b9e88b4c97b9161a55b9e54cd72c", 536 | "sha256:ffa09a74a6bf81b84f8613909fb0beaee84757450183a7a2e0b47b455c0cac5d" 537 | ], 538 | "markers": "python_version >= '3.8'", 539 | "version": "==0.24.0" 540 | }, 541 | "trio-websocket": { 542 | "hashes": [ 543 | "sha256:18c11793647703c158b1f6e62de638acada927344d534e3c7628eedcb746839f", 544 | "sha256:520d046b0d030cf970b8b2b2e00c4c2245b3807853ecd44214acd33d74581638" 545 | ], 546 | "markers": "python_version >= '3.7'", 547 | "version": "==0.11.1" 548 | }, 549 | "twilio": { 550 | "hashes": [ 551 | "sha256:28e3a743da18d5b298c9b9fb9e922404a60f8091441c5e0aa35bfefc46411370", 552 | "sha256:ccdf78b634dff13fd50b33bafd254a9dc2fb492c6b06839683e73f09ec110ec6" 553 | ], 554 | "index": "pypi", 555 | "version": "==8.12.0" 556 | }, 557 | "typing-extensions": { 558 | "hashes": [ 559 | "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", 560 | "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" 561 | ], 562 | "markers": "python_version >= '3.8'", 563 | "version": "==4.9.0" 564 | }, 565 | "urllib3": { 566 | "hashes": [ 567 | "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20", 568 | "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224" 569 | ], 570 | "markers": "python_version >= '3.8'", 571 | "version": "==2.2.0" 572 | }, 573 | "wsproto": { 574 | "hashes": [ 575 | "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", 576 | "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" 577 | ], 578 | "markers": "python_full_version >= '3.7.0'", 579 | "version": "==1.2.0" 580 | }, 581 | "yarl": { 582 | "hashes": [ 583 | "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", 584 | "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", 585 | "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", 586 | "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", 587 | "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", 588 | "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", 589 | "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", 590 | "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", 591 | "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", 592 | "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", 593 | "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", 594 | "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", 595 | "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", 596 | "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", 597 | "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", 598 | "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", 599 | "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", 600 | "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", 601 | "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", 602 | "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", 603 | "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", 604 | "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", 605 | "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", 606 | "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", 607 | "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", 608 | "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", 609 | "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", 610 | "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", 611 | "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", 612 | "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", 613 | "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", 614 | "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", 615 | "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", 616 | "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", 617 | "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", 618 | "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", 619 | "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", 620 | "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", 621 | "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", 622 | "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", 623 | "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", 624 | "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", 625 | "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", 626 | "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", 627 | "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", 628 | "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", 629 | "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", 630 | "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", 631 | "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", 632 | "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", 633 | "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", 634 | "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", 635 | "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", 636 | "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", 637 | "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", 638 | "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", 639 | "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", 640 | "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", 641 | "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", 642 | "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", 643 | "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", 644 | "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", 645 | "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", 646 | "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", 647 | "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", 648 | "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", 649 | "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", 650 | "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", 651 | "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", 652 | "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", 653 | "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", 654 | "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", 655 | "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", 656 | "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", 657 | "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", 658 | "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", 659 | "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", 660 | "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", 661 | "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", 662 | "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", 663 | "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", 664 | "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", 665 | "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", 666 | "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", 667 | "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", 668 | "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", 669 | "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", 670 | "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", 671 | "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", 672 | "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" 673 | ], 674 | "markers": "python_version >= '3.7'", 675 | "version": "==1.9.4" 676 | } 677 | }, 678 | "develop": {} 679 | } 680 | --------------------------------------------------------------------------------