Open fjuniorr opened 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:
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
A solução não consegue lidar com o caso em que existirem recursos em pastas e/ou extensões diferentes.
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:
Vamos criar mais uns data packages para documentar fontes de dados e depois revisitamos esse issue.
Atualmente a variável
EXT = txt
precisa ser alterada em cada projeto e precisamos manter a consistência entreresource.name
eresource.path
definidos nodatapackage.yaml
e o padrão$(INPUT_DIR)/%.$(EXT)
definido manualmente no makefile/