splor-mg / dados-sigplan-planejamento

Conjunto de dados do PPAG Planejamento
0 stars 0 forks source link

Generalizar makefile entre projetos #43

Open fjuniorr opened 1 year ago

fjuniorr commented 1 year ago

Atualmente a variável EXT = txt precisa ser alterada em cada projeto e precisamos manter a consistência entre resource.name e resource.path definidos no datapackage.yaml e o padrão $(INPUT_DIR)/%.$(EXT) definido manualmente no makefile/

fjuniorr commented 1 year ago

É possível fazer isso usando o seguinte comando:

from typing_extensions import Annotated
from pathlib import Path

@app.command()
def resources(descriptor: str = 'datapackage.yaml', 
              path: Annotated[bool, typer.Option(help="Return resource path")] = False,
              dir: Annotated[bool, typer.Option(help="Return resource path folder")] = False,
              ext: Annotated[bool, typer.Option(help="Return resource path file extension")] = False):
    """
    Data package resource properties
    """
    package = Package(descriptor)
    if path:
        output = [resource.path for resource in package.resources]
    elif dir:
        output = set([str(Path(resource.path).parent) for resource in package.resources])
    elif ext:
        output = set([str(Path(resource.path).suffix) for resource in package.resources])
    else:
        output = [resource.name for resource in package.resources]
    print(' '.join(output))
    return 0

e alterando o Makefile nos seguintes locais:

20230707T093614

No entanto isso está me parecendo complexo demais e ainda temos o problema de que nem todos os projetos vão usar um schema por recurso. E aí nesse target aqui:

$(OUTPUT_FILES): $(OUTPUT_DIR)/%.csv: $(INPUT_DIR)/%$(EXT) schemas/%.yaml scripts/transform.py datapackage.yaml
    python main.py transform $* $@

o schemas/%.yaml precisa ser substituído por algo como schema.yaml.

cc: @labanca

fjuniorr commented 1 year ago

A solução não consegue lidar com o caso em que existirem recursos em pastas e/ou extensões diferentes.

fjuniorr commented 1 year ago

Aqui uma solução que funciona +- mas ainda está complexa e pode falhar caso a gente mude as convenções dos nomes das pastas:

No main.py:

@app.command()
def resources(descriptor: str = 'datapackage.yaml', 
              path: Annotated[bool, typer.Option(help="Return resource path")] = False,
              dir: Annotated[bool, typer.Option(help="Return resource path folder")] = False,
              ext: Annotated[bool, typer.Option(help="Return resource path file extension")] = False,
              schema: Annotated[bool, typer.Option(help="Return resource schema")] = False): # NOVO
    """
    Data package resource properties
    """
    package = Package(descriptor)
    if path:
        output = [resource.path for resource in package.resources]
    elif dir:
        output = set([str(Path(resource.path).parent) for resource in package.resources])
    elif ext:
        output = set([str(Path(resource.path).suffix) for resource in package.resources])
    elif schema:
        schemas = [resource.to_dict()['schema'] for resource in package.resources]
        if len(set(schemas)) == 1: # NOVO
            output = set([schemas])
        else:
            output = set(['schemas/%.yaml'])
    else:
        output = [resource.name for resource in package.resources]
    print(' '.join(output))
    return 0

e no Makefile:

20230707T100459

fjuniorr commented 1 year ago

Vamos criar mais uns data packages para documentar fontes de dados e depois revisitamos esse issue.