Skip to content

Commit 15c6018

Browse files
committed
Use randonneur for writing datapackages
1 parent 311d4ac commit 15c6018

File tree

4 files changed

+83
-82
lines changed

4 files changed

+83
-82
lines changed

ecoinvent_migrate/datapackage.py

-62
This file was deleted.

ecoinvent_migrate/main.py

+64-20
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
11
import warnings
22
from pathlib import Path
3-
from typing import List, Optional
3+
from typing import List, Optional, Union
44

55
import pandas as pd
66
from ecoinvent_interface import EcoinventRelease, Settings
77
from loguru import logger
8+
from randonneur import Datapackage, MappingConstants
89

910
from .data_io import get_brightway_databases, get_change_report_filepath, setup_project
10-
from .datapackage import write_datapackage
1111
from .errors import VersionJump
12-
from .utils import configure_logs
12+
from .utils import configure_logs, setup_output_directory
1313
from .wrangling import (
1414
resolve_glo_row_rer_roe,
1515
source_target_biosphere_pair,
1616
source_target_pair_as_bw_dict,
1717
split_replace_disaggregate,
1818
)
19+
from . import __version__
1920

2021

2122
def get_change_report_context(
@@ -88,11 +89,12 @@ def generate_technosphere_mapping(
8889
ecoinvent_username: Optional[str] = None,
8990
ecoinvent_password: Optional[str] = None,
9091
write_logs: bool = True,
92+
write_file: bool = True,
9193
licenses: Optional[List[dict]] = None,
9294
output_directory: Optional[Path] = None,
93-
output_version: str = "1.0.0",
95+
output_version: str = "2.0.0",
9496
description: Optional[str] = None,
95-
) -> Path:
97+
) -> Union[Path, Datapackage]:
9698
"""Generate a Randonneur mapping file for technosphere edge attributes from source to target."""
9799
configure_logs(write_logs=write_logs)
98100

@@ -130,6 +132,10 @@ def generate_technosphere_mapping(
130132
source_db_name, target_db_name, source_lookup, target_lookup = get_brightway_databases(
131133
source_version=source_version, target_version=target_version, system_model=system_model
132134
)
135+
136+
if not description:
137+
description = f"Data migration file from {source_db_name} to {target_db_name} generated with `ecoinvent_migrate` version {__version__}"
138+
133139
data = resolve_glo_row_rer_roe(
134140
data=data,
135141
source_db_name=source_db_name,
@@ -149,15 +155,32 @@ def generate_technosphere_mapping(
149155
if not data["disaggregate"]:
150156
del data["disaggregate"]
151157

152-
return write_datapackage(
153-
data=data,
154-
source_db_name=source_db_name,
155-
target_db_name=target_db_name,
156-
licenses=licenses,
157-
output_directory=output_directory,
158-
version=output_version,
158+
dp = Datapackage(
159+
name=f"{source_db_name}-{target_db_name}",
159160
description=description,
161+
contributors=[
162+
{"title": "ecoinvent association", "path": "https://ecoinvent.org/", "role": "author"},
163+
{"title": "Chris Mutel", "path": "https://chris.mutel.org/", "role": "wrangler"},
164+
],
165+
mapping_source=MappingConstants.ECOSPOLD2,
166+
mapping_target=MappingConstants.ECOSPOLD2,
167+
homepage="https://github.com/brightway-lca/ecoinvent_migrate",
168+
version="2.0.0",
169+
source_id=source_db_name,
170+
target_id=target_db_name,
171+
licenses=licenses,
160172
)
173+
for key, value in data.items():
174+
dp.add_data(key, value)
175+
176+
if write_file:
177+
filename = f"{source_db_name}-{target_db_name}.json"
178+
output_directory = setup_output_directory(output_directory)
179+
fp = output_directory / filename
180+
logger.info("Writing output file {fp}", fp=str(fp))
181+
return dp.to_json(fp)
182+
else:
183+
return dp
161184

162185

163186
def generate_biosphere_mapping(
@@ -168,14 +191,18 @@ def generate_biosphere_mapping(
168191
ecoinvent_username: Optional[str] = None,
169192
ecoinvent_password: Optional[str] = None,
170193
write_logs: bool = True,
194+
write_file: bool = True,
171195
licenses: Optional[List[dict]] = None,
172196
output_directory: Optional[Path] = None,
173-
output_version: str = "1.0.0",
197+
output_version: str = "2.0.0",
174198
description: Optional[str] = None,
175199
) -> Path:
176200
"""Generate a Randonneur mapping file for biosphere edge attributes from source to target."""
177201
configure_logs(write_logs=write_logs)
178202

203+
source_db_name = f"ecoinvent-{source_version}-biosphere"
204+
target_db_name = f"ecoinvent-{target_version}-biosphere"
205+
179206
logger.info(
180207
"""The `EE Deletions` format is not consistent across versions.
181208
Please check the outputs carefully before applying them."""
@@ -212,12 +239,29 @@ def generate_biosphere_mapping(
212239
keep_deletions=keep_deletions,
213240
)
214241

215-
return write_datapackage(
216-
data=data,
217-
source_db_name=f"ecoinvent-{source_version}-biosphere",
218-
target_db_name=f"ecoinvent-{target_version}-biosphere",
219-
licenses=licenses,
220-
output_directory=output_directory,
221-
version=output_version,
242+
dp = Datapackage(
243+
name=f"{source_db_name}-{target_db_name}",
222244
description=description,
245+
contributors=[
246+
{"title": "ecoinvent association", "path": "https://ecoinvent.org/", "role": "author"},
247+
{"title": "Chris Mutel", "path": "https://chris.mutel.org/", "role": "wrangler"},
248+
],
249+
mapping_source=MappingConstants.ECOSPOLD2_BIO,
250+
mapping_target=MappingConstants.ECOSPOLD2_BIO,
251+
homepage="https://github.com/brightway-lca/ecoinvent_migrate",
252+
version="2.0.0",
253+
source_id=source_db_name,
254+
target_id=target_db_name,
255+
licenses=licenses,
223256
)
257+
for key, value in data.items():
258+
dp.add_data(key, value)
259+
260+
if write_file:
261+
filename = f"{source_db_name}-{target_db_name}.json"
262+
output_directory = setup_output_directory(output_directory)
263+
fp = output_directory / filename
264+
logger.info("Writing output file {fp}", fp=str(fp))
265+
return dp.to_json(fp)
266+
else:
267+
return dp

ecoinvent_migrate/utils.py

+18
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import datetime
22
import sys
33
from pathlib import Path
4+
from platformdirs import user_data_dir
5+
import os
6+
from typing import Optional
47

58
from loguru import logger
69
from platformdirs import user_log_dir
@@ -17,3 +20,18 @@ def configure_logs(write_logs: bool = True) -> None:
1720
logs_dir.mkdir(parents=True, exist_ok=True)
1821
logger.add(logs_dir / "debug.log", level="DEBUG")
1922
logger.add(logs_dir / "info.log", level="INFO")
23+
24+
25+
def setup_output_directory(output_directory: Optional[Path]) -> Path:
26+
if output_directory is None:
27+
output_directory = Path(user_data_dir("ecoinvent_migrate", "pylca"))
28+
if not output_directory.exists():
29+
logger.info(f"Creating output directory {output_directory}")
30+
output_directory.mkdir(parents=True)
31+
elif not isinstance(output_directory, Path):
32+
raise ValueError(
33+
f"`output_directory` must be a `Path` instance; got {type(output_directory)}"
34+
)
35+
elif not output_directory.is_dir() or not os.access(output_directory, os.W_OK):
36+
raise ValueError(f"`output_directory` {output_directory} must be a writable directory")
37+
return output_directory

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ dependencies = [
3434
"ecoinvent_interface",
3535
"loguru",
3636
"platformdirs",
37+
"randonneur",
3738
]
3839

3940
[project.urls]

0 commit comments

Comments
 (0)