Bagit.py
Biblioteca responsável na formatação da compactação de arquivo.
O código-fonte implementa a estrutura de diretório Bagit e as convenções de nomenclatura de arquivo, que fornece uma estrutura para agrupar um conjunto arbitrário de itens em um único pacote, junto com arquivos de metadados que descrevem o conteúdo do pacote. Ele fornece uma ferramenta de linha de comando e uma biblioteca Python para criar e trabalhar com diretórios Bagit. A biblioteca é usada para criar bags e armazenar metadados como pares chave-valor em um arquivo chamado bag-info.txt. A biblioteca oferece suporte ao uso de vários algoritmos de hash para criar somas de verificação dos arquivos do bag. O código contém cabeçalhos de metadados bag-info.txt padrão, suporta Unicode e tem suporte de internacionalização com gettext (biblioteca do Projeto GNU que faz a internacionalização de softwares).
O código define um objeto Bag, a finalidade deste objeto é fornecer uma interface para leitura e manipulação de arquivos bag. Bags são um tipo de pacote de dados que armazenam arquivos e metadados. A classe lê as informações necessárias de um bag, como sua versão e codificação, no arquivo Bagit.txt. Ele também carrega os dados do arquivo bag-info.txt em seu atributo info.
Possui módulo que inclui métodos para validar a estrutura e o conteúdo de um bag, para buscar entradas do arquivo fetch.txt, carregar arquivos de manifesto e verificar a presença do campo Payload no arquivo de informações do bag. O módulo gera um BagError se encontrar algum erro durante a validação e inclui um método is_valid para retornar um booleano indicando o sucesso ou falha da validação.
Se houver uma incompatibilidade, um BagValidationError será gerado. Em seguida, o código valida a completude do bag verificando se há alguma incompatibilidade entre os manifestos de arquivo e os arquivos reais no sistema de arquivos. Se houver uma incompatibilidade, um BagValidationError será gerado. O código então verifica se o conteúdo real dos arquivos corresponde aos hashes registrados armazenados nos arquivos de manifesto. Se houver uma incompatibilidade, um BagValidationError será gerado. Por fim, o código verifica se o arquivo Bagit.txt, que é um arquivo obrigatório em um pacote, está em conformidade com a especificação.
O código define funções para manipulação de normalização de nomes de arquivo e cálculo de hashes de arquivo:
- O ‘normalize_unicode’ normaliza nomes de arquivos para o formato Unicode e retorna um dicionário que mapeia os nomes de arquivos para seus valores conforme codificados. Isso evita conflitos entre o sistema de arquivos e os manifestos causados por alguns sistemas de arquivos que aplicam diferentes formas de normalização.
- O ‘get_hashers’ retorna um dicionário de instâncias hashlib dada uma lista de nomes de algoritmos.
- O ‘calc_hashes’ calcula hashes de arquivo usando os algoritmos especificados.
- O ‘load_tag_file’ carrega um arquivo de tags e retorna seu conteúdo como um dicionário.
O código usa a biblioteca argparse para fornecer uma interface de linha de comando. O código consiste em várias funções e classes, incluindo:
- O ‘can_bag’ que verifica se o diretório fornecido tem permissões suficientes para ser ensacado.
- O ‘can_read’ que verifica se o diretório ou arquivos fornecidos são ilegíveis.
- O ‘generate_manifest_lines’ que gera uma lista de valores de soma de verificação para um arquivo em formato de manifesto.
- O ‘encode_filename’ e ‘decode_filename’ que codificam/decodificam nomes de arquivos.
- O ‘force_unicode’ que retorna uma string Unicode dada uma string unicode ou byte.
- O ‘BagArgumentParser’ e ‘BagHeaderAction’ que são usados para a interface de linha de comando.
- O ‘make_parser’ que configura a interface de linha de comando.