Tarefa 8 - Gerenciador de documentos

Prazo de entrega recomendado:

Nesta tarefa, você irá construir um de gerenciador de documentos. Para isso, será necessário escolher e utilizar estruturas de dados adequadas para representar conjuntos de dados.


Não muito tempo atrás, guardávamos nossos dados apenas nos computadores pessoais. Esses dados eram de todo tipo de arquivo, como fotos, documentos de texto, planilhas, e eram guardados no disco rígido, organizados na mais cuidadosa hierarquia do sistema de arquivos.

Uma hierarquia de diretórios, com os arquivos do diretório selecionado à direita.

Tudo muito bom, tudo muito bem, até precisarmos compartilhar um documento com algum colega. Então precisávamos comprar um pen drive disquete que poderíamos entregar a outra pessoa. O problema disso é que, não só o disquete não era um meio muito confiável, mas isso criava duas versões do mesmo arquivo. Quando recebíamos o arquivo de volta, tínhamos que ter certeza de que não havíamos modificado a versão original. Pior, se tivéssemos modificado, teríamos que comparar palavra por palavra.

Com a popularização da internet surgiu um alternativa: guardarmos o arquivo em um servidor centralizado e editarmos esse arquivo diretamente usando o navegador. São várias as opções disponíveis de gerenciadores de documentos e suítes de escritório online, Google Docs, Office Online, Dropbox, etc. Cada um com uma interface diferente.

Cada serviço é um produto diferente, com seu próprio desenho de interface.

Embora muito práticas e fáceis de usar, essas ferramentas trazem duas complicações importantes que não existiam antes.

  1. Como não existe mais uma hierarquia de arquivos pessoais bem organizada, precisamos encontrar, entre as centenas ou milhares de arquivos existentes, aqueles que contêm uma ou mais palavras de busca. E devemos fazer isso muito rapidamente.

  2. Como vários usuários podem editar um documento ao mesmo tempo, não podemos mais guardar um arquivo apenas quando terminamos de editá-lo. Ao invés disso, toda vez que fazemos qualquer edição em um arquivo, enviamos um comando ao servidor pela internet e aguardamos a resposta.

Nesta tarefa, você irá criar um novo gerenciador de documentos com o objetivo de desbancar as soluções existentes. O diferencial: seu gerenciador de documentos é voltado para programadores, então implementaremos apenas a interface de comandos — e cada programador pode criar a interface mais adequada para seus usuários! Você irá criar um programa chamado gerenciador.py que será capaz de executar uma série de comandos especificados neste enunciado.

Por enquanto, implementaremos apenas um protótipo com diversas simplificações. Uma delas é que nosso gerenciador de documentos não armazenará os arquivos de fato e guardará os dados apenas em memória. Além disso, ele permite apenas criar e editar arquivos de texto. Cada arquivo existente contém as seguintes propriedades:

Lembre-se de que você deve definir uma representação em memória adequada para cada tipo de objeto abstraído. Para cada tipo, você deve armazenar e escolher as estruturas de dados que julgar necessárias ou convenientes para implementar os diferentes comandos de seu gerenciador.

Entrada

A entrada consiste de uma sequência de comandos, um por linha. Em cada momento, deve haver exatamente um usuário ativo e cada comando será executado por esse usuário. Assim, o primeiro comando será sempre entrar <nome>, para descrever o primeiro usuário ativo. A entrada termina quando for executado o comando terminar.

entrar laura
criar frutas.txt
digitar frutas.txt banana
digitar frutas.txt abacaxi pera
digitar frutas.txt jabuticaba banana
substituir frutas.txt abacaxi goiaba
entrar pedro
buscar banana
mostrar frutas.txt
terminar

Saída

Cada uma dos comandos produz uma saída de texto. Por exemplo, o comando mostrar exibe o conteúdo de um arquivo.

laura entrou!
frutas.txt criado
frutas.txt modificado: 1 linhas
frutas.txt modificado: 2 linhas
frutas.txt modificado: 3 linhas
frutas.txt modificado: 3 linhas
pedro entrou!
frutas.txt contém banana
1 arquivos encontrados
--- início de frutas.txt ---
banana
goiaba pera
jabuticaba banana
--- final de frutas.txt ---
até mais!

Comandos

O conjunto completo de comandos está listado abaixo.

Simplificações

Nas substituições e buscas de palavras, serão consideradas apenas palavras completas. Por exemplo, os resultados de uma busca por ama não incluem amargo, grama. Você pode supor que não existem palavas com caracteres de pontuações adjacentes, como ama,. Além disso, as operações são case-sensitive, isto é, são consideradas diferentes as palavras ama e Ama.

Critérios

Nesta tarefa você deverá usar apenas as estruturas de dados fornecidas por padrão na linguagem Python.

Correção

Esta tarefa será corrigida automaticamente sempre que você realizar um git push. Depois de submetida a versão final da tarefa, você deverá apresentá-la a um monitor PED. Para isso, você deve procurar atendimento em algum horário com monitor PED e digitar apresentar 8 no canal fila-apresentar para entrar na fila.