django-environ: Diccionarios anidados

 Hace poco estaba tratando de encontrar la forma de cargar una serie de diccionarios anidados usando django-environ, al estilo de la configuración para la base de datos en django.

Para ser más preciso intentaba cargar una serie de nombres, llaves y secretos para buckets en S3.

# archivo: path/to/.env
AWS_S3_BUCKETS='BUCKET1=name=bucket1;key_id=key_id1;secret=secret1,BUCKET2=name=bucket2;key_id=key_id2,secret=secret2'

La cuestión es que django-environ no puede realizar la carga de diccionarios anidados, pero, sí puede cargar listas y "parsear" diccionarios anidados (al menos 1 nivel de anidación), si juntamos esas dos capacidades podemos crear una nueva definición de variables para este tipo.

Para cargar este nuevo tipo de valores necesitamos hacerlo en nuestro código de la siguiente manera: 


# archivo: settings.py
import environ
env = environ.Env()
env.read_env('path/to/.env')
...
AWS_S3_BUCKETS=dict([(var.split("=",1)[0], env.parse_value(var.split("=",1)[1], {})) for var in env.parse_value(value, list)])
...

Git Commit Amend - Tu mejor amigo

Cuando estamos iniciando un proyecto y lo mantenemos en git a veces no queremos tener tantos commits antes del primer release, por lo que, si queremos evitar esto, podemos ir haciendo modificaciones a nuestro código y cada vez que queramos actualizar nuestro primer commit llamar:
git commit --amend --no-edit
Si ya lo hemos enviado al repositorio remoto
git push -f
Nota: Usar esto en etapas avanzadas del proyecto después de haber realizado releases se debe realizar con sumo cuidado y solo en nuestra propia rama (Deberías tener una a estas alturas)

Remover Comentarios de HTML con RegEx

Solamente tenemos que usar la expresión:
<!--((\n.*)+\n|[\s\w\n\"\-\.\=\/\,]+)-->
Y reemplazarla con un string vacío.

Regex para URLs [Completa]

Esta regex sirve para verificar urls completas con protocolo, subdominio, dominio, superdominio, ruta y queryString

Regexr Example

var urlRegex = /(\w+):\/\/(([\w]+)@|(\w+):(\w+)@|)((.*)\.|)([\w\-]+)\.((\w{3}\.\w{2})|(\w{3}))(:([0-9]+)|)\/(([\w\/\.]+|)(\?([\w\=\%\&]+)|)(\#(.*)|)|)/

Con los siguientes datos y sus respectivos indices:
DatoIndice
Protocolo$1
Usuario$3 | $4
Contraseña$5
Subdominio$7
Dominio$8
Superdominio$9
Puerto$13
Ruta$15
Cadena de Consulta$16
Fragmento$19