O título deste post faz uma referencia ao livro O Programador Apaixonado de Chad Fowler, (um livro muito bom, recomendo). No capitulo que leva o mesmo nome deste post, o autor fala da necessidade do desenvolvedor em praticar, tanto para apreender coisas novas, como para não esquecer e fortalecer esse aprendizado, dentre outras coisas.
Algo que muito me chamou a atenção neste capitulo foi a última dica passada na sessão faça algo, a dica “Pratique com Code Kata”. Não entrarei em detalhes sobre Code Kata, porém, recomendo a leitura do artigo O que é o Coding Dojo do meu grande amigo Márcio Bonfim.
Voltando ao tema, esse capítulo me motivou a praticar mais com Python. Como eu estava sem ideias sobre o que atacar, resolvi procurar alguns desafios simples, em um formato muito semelhante a um code kata, nesta busca me deparei com o site DojoPuzzles que consiste em uma coleção desses pequenos desafios.
O primeiro desafio que escolhi foi o Analisando URLs, um desafio simples o suficiente para validar se essa ideia maluca pode ser divertida. O desafio desse puzzle basicamente seria validar e interpretar as partes de uma url, seja uma url do protocolo HTTP ou uma url do protocolo SSH. O resultado do estudo/desafio ficou desta forma:
import re class UrlAnalyzing: def __init__(self, url=''): self.url = url def __get_protocol(self): m = re.match(r'\w+', self.url) if m: return m.group(0) else: raise Exception('Invalid url') def __get_http_information(self): m = re.match(r'(?P<protocol>\w+)://(?P<host>\w+)\.(?P<domain>[\w\.]+)/?(?P<path>\w*)/?(?P<parameter>[\w=]*)', self.url) if m: return {'url': self.url, 'protocol': m.group('protocol'), 'host': m.group('host'), 'domain': m.group('domain'), 'path': m.group('path'), 'parameter': m.group('parameter')} else: raise Exception('Invalid url') def __get_ssh_information(self): m = re.match(r'(?P<protocol>\w+)://(?P<user>\w+)%(?P<password>\w+)@(?P<domain>[^/]+)', self.url) if m: return {'url': self.url, 'protocol': m.group('protocol'), 'user': m.group('user'), 'password': m.group('password'), 'domain': m.group('domain')} def analyzing(self): protocol = self.__get_protocol().upper() if protocol == 'HTTP': return self.__get_http_information() elif protocol == 'SSH': return self.__get_ssh_information() else: raise Exception('Invalid url')
Basicamente fiz uma classe que realiza todas as validações e tratamentos utilizando RegEx (uma das coisas mais bacanas que eu apreendi no último ano). A utilização desta classe é algo muito simples, informe a url e execute o método analyzing(), veja os exemplos:
Chamada:
ua = UrlAnalyzing('http://www.google.com/mail/user=fulano') print(ua.analyzing())
Saída:
{'host': 'www', 'path': 'mail', 'protocol': 'http', 'domain': 'google.com', 'parameter': 'user=fulano', 'url': 'http://www.google.com/mail/user=fulano'}
Chamada:
ua.url = 'ssh://fulano%senha@git.com/' print(ua.analyzing())
Saída:
{'protocol': 'ssh', 'user': 'fulano', 'domain': 'git.com', 'password': 'senha', 'url': 'ssh://fulano%senha@git.com/'}
Chamada:
ua.url = 'htp://123@gmail.www&_.1' print(ua.analyzing())
Exception gerada pela url ser inválida:
Exception: Invalid url
Apesar de eu não estar fazendo um dojo (por estar desenvolvendo sozinho), ainda sim a experiência até agora foi muito divertida. Recomendo para você que esteja aprendendo uma nova linguagem mas não tem abertura para usa-la profissionalmente, procure por grupos de CodingDojo em sua cidade, ou seja independente e procure alguns pequenos desafios para praticar e testar seus conhecimentos.
Estarei mantendo o repositório python-puzzles no GitHub com todos os katas que eu for resolvendo, sinta-se à vontade para colaborar com o repositório, seja sugerindo melhores resoluções ou até mesmo sugerindo novos desafios para serem resolvidos.