Skip to content

Commit

Permalink
Remove circular imports
Browse files Browse the repository at this point in the history
  • Loading branch information
yngve-sk authored Dec 1, 2023
1 parent b05c2e9 commit 8fa3b8f
Show file tree
Hide file tree
Showing 29 changed files with 278 additions and 230 deletions.
71 changes: 3 additions & 68 deletions res2df/__init__.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,8 @@
import importlib
import logging
import sys
from typing import Dict, List, Optional, Union
from typing import List

try:
from .version import version # type: ignore

__version__ = version
except ImportError:
__version__ = "v0.0.0"

from .constants import MAGIC_STDOUT
from .__version__ import __version__
from .res2csvlogger import getLogger_res2csv
from .resdatafiles import ResdataFiles

SUBMODULES: List[str] = [
Expand All @@ -34,62 +26,5 @@
]


def getLogger_res2csv(
module_name: str = "res2df", args_dict: Optional[Dict[str, Union[str, bool]]] = None
) -> logging.Logger:
# pylint: disable=invalid-name
"""Provide a custom logger for res2csv and csv2res
Logging output is by default split by logging levels (split between WARNING and
ERROR) to stdout and stderr, each log occurs in only one of the streams.
This deviates from Unix standard, but is accepted here because the code
often writes it main output to a dedicated filename.
Args:
module_name: A suggested name for the logger, usually
__name__ should be supplied
args_dict: Dictionary with contents from the argparse namespace object.
Only keys "output", "verbose" and "debug" will be looked at.
Use vars(args) in caller code to convert from argparse Namespace object.
"""
logger = logging.getLogger(module_name)

if args_dict is None:
args_dict = {}

formatter = logging.Formatter("%(levelname)s:%(name)s:%(message)s")

# In case this logger has been initialized earlier, clear it:
logger.handlers.clear()

if args_dict.get("output", "") == MAGIC_STDOUT:
# If main output is to stdout, we must send all logs to stderr:
default_handler = logging.StreamHandler(sys.stderr)
default_handler.setFormatter(formatter)
logger.addHandler(default_handler)
else:
# Split log messages to either stdout or stderr based on log level:
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.addFilter(lambda record: record.levelno < logging.ERROR)
stdout_handler.setFormatter(formatter)

stderr_handler = logging.StreamHandler(sys.stderr)
stderr_handler.addFilter(lambda record: record.levelno >= logging.ERROR)
stderr_handler.setFormatter(formatter)

logger.addHandler(stdout_handler)
logger.addHandler(stderr_handler)

# --debug overrides --verbose
if args_dict.get("debug", False):
logger.setLevel(logging.DEBUG)
elif args_dict.get("verbose", False):
logger.setLevel(logging.INFO)
else:
logger.setLevel(logging.WARNING)

return logger


for submodule in SUBMODULES + ["res2csv", "csv2res"]:
importlib.import_module("res2df." + submodule)
6 changes: 6 additions & 0 deletions res2df/__version__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
try:
from .version import version # type: ignore

__version__ = version
except ImportError:
__version__ = "v0.0.0"
3 changes: 1 addition & 2 deletions res2df/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@
# Allow parts of res2df to work without OPM:
pass

from res2df import __version__

from .__version__ import __version__
from .constants import MAGIC_STDOUT

# Parse named JSON files, this exposes a dict of dictionary describing the contents
Expand Down
3 changes: 1 addition & 2 deletions res2df/compdat.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,6 @@
# Allow parts of res2df to work without OPM:
pass

from res2df import getLogger_res2csv

from .common import (
get_wells_matching_template,
merge_zones,
Expand All @@ -36,6 +34,7 @@
write_dframe_stdout_file,
)
from .grid import merge_initvectors
from .res2csvlogger import getLogger_res2csv
from .resdatafiles import ResdataFiles

logger = logging.getLogger(__name__)
Expand Down
32 changes: 21 additions & 11 deletions res2df/csv2res.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,17 @@
import argparse
import sys

from res2df import __version__, equil, pvt, satfunc, summary, vfp
from .__version__ import __version__
from .equil import equil_reverse_main
from .equil import fill_reverse_parser as equil_fill_reverse_parser
from .pvt import fill_reverse_parser as pvt_fill_reverse_parser
from .pvt import pvt_reverse_main
from .satfunc import fill_reverse_parser as satfunc_fill_reverse_parser
from .satfunc import satfunc_reverse_main
from .summary import fill_reverse_parser as summary_fill_reverse_parser
from .summary import summary_reverse_main
from .vfp import fill_reverse_parser as vfp_fill_reverse_parser
from .vfp import vfp_reverse_main

# String constants in use for generating ERT forward model documentation:
DESCRIPTION: str = """Convert CSV files into include files. Uses the command
Expand Down Expand Up @@ -54,8 +64,8 @@ def get_parser() -> argparse.ArgumentParser:
help="Write UNSMRY files",
description=("Write UNSMRY files from CSV files."),
)
summary.fill_reverse_parser(summary_parser)
summary_parser.set_defaults(func=summary.summary_reverse_main)
summary_fill_reverse_parser(summary_parser)
summary_parser.set_defaults(func=summary_reverse_main)

equil_parser = subparsers.add_parser(
"equil",
Expand All @@ -65,16 +75,16 @@ def get_parser() -> argparse.ArgumentParser:
"to include files from CSV in res2df format."
),
)
equil.fill_reverse_parser(equil_parser)
equil_parser.set_defaults(func=equil.equil_reverse_main)
equil_fill_reverse_parser(equil_parser)
equil_parser.set_defaults(func=equil_reverse_main)

pvt_parser = subparsers.add_parser(
"pvt",
help="Write PVT include files",
description=("Write include files from CSV files with res2df format."),
)
pvt.fill_reverse_parser(pvt_parser)
pvt_parser.set_defaults(func=pvt.pvt_reverse_main)
pvt_fill_reverse_parser(pvt_parser)
pvt_parser.set_defaults(func=pvt_reverse_main)

satfunc_parser = subparsers.add_parser(
"satfunc",
Expand All @@ -84,8 +94,8 @@ def get_parser() -> argparse.ArgumentParser:
"res2df format."
),
)
satfunc.fill_reverse_parser(satfunc_parser)
satfunc_parser.set_defaults(func=satfunc.satfunc_reverse_main)
satfunc_fill_reverse_parser(satfunc_parser)
satfunc_parser.set_defaults(func=satfunc_reverse_main)

vfp_parser = subparsers.add_parser(
"vfp",
Expand All @@ -94,8 +104,8 @@ def get_parser() -> argparse.ArgumentParser:
"Write VFPPROD/VFPINJ include files from CSV files with res2df format."
),
)
vfp.fill_reverse_parser(vfp_parser)
vfp_parser.set_defaults(func=vfp.vfp_reverse_main)
vfp_fill_reverse_parser(vfp_parser)
vfp_parser.set_defaults(func=vfp_reverse_main)

return parser

Expand Down
54 changes: 32 additions & 22 deletions res2df/equil.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,18 @@

import pandas as pd

from res2df import common, getLogger_res2csv, inferdims

from .common import comment_formatter
from .common import df2res as common_df2res
from .common import fill_reverse_parser as common_fill_reverse_parser
from .common import (
generic_deck_table,
handle_wanted_keywords,
keyworddata_to_df,
write_dframe_stdout_file,
write_inc_stdout_file,
)
from .inferdims import DIMS_POS, inject_xxxdims_ntxxx
from .res2csvlogger import getLogger_res2csv
from .resdatafiles import ResdataFiles

try:
Expand Down Expand Up @@ -104,10 +114,10 @@ def df(
if isinstance(deck, ResdataFiles):
deck = deck.get_deck()

deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
ntequl = deck["EQLDIMS"][0][inferdims.DIMS_POS["NTEQUL"]].get_int(0)
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
ntequl = deck["EQLDIMS"][0][DIMS_POS["NTEQUL"]].get_int(0)

wanted_keywords = common.handle_wanted_keywords(keywords, deck, SUPPORTED_KEYWORDS)
wanted_keywords = handle_wanted_keywords(keywords, deck, SUPPORTED_KEYWORDS)

frames = []
for keyword in wanted_keywords:
Expand Down Expand Up @@ -140,8 +150,8 @@ def rsvd_fromdeck(
be inferred if not present in :term:`deck`
"""
if "EQLDIMS" not in deck:
deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return common.keyworddata_to_df(
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return keyworddata_to_df(
deck, "RSVD", renamer=RENAMERS["RSVD"], recordcountername="EQLNUM"
)

Expand All @@ -157,8 +167,8 @@ def rvvd_fromdeck(
be inferred if not present in :term:`deck`
"""
if "EQLDIMS" not in deck:
deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return common.keyworddata_to_df(
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return keyworddata_to_df(
deck, "RVVD", renamer=RENAMERS["RVVD"], recordcountername="EQLNUM"
)

Expand All @@ -174,8 +184,8 @@ def pbvd_fromdeck(
be inferred if not present in :term:`deck`
"""
if "EQLDIMS" not in deck:
deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return common.keyworddata_to_df(
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return keyworddata_to_df(
deck, "PBVD", renamer=RENAMERS["PBVD"], recordcountername="EQLNUM"
)

Expand All @@ -191,8 +201,8 @@ def pdvd_fromdeck(
be inferred if not present in :term:`deck`
"""
if "EQLDIMS" not in deck:
deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return common.keyworddata_to_df(
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
return keyworddata_to_df(
deck, "PDVD", renamer=RENAMERS["PDVD"], recordcountername="EQLNUM"
)

Expand Down Expand Up @@ -257,14 +267,14 @@ def equil_fromdeck(
ntequl: Number of EQLNUM regions in :term:`deck`.
"""
if "EQLDIMS" not in deck:
deck = inferdims.inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)
deck = inject_xxxdims_ntxxx("EQLDIMS", "NTEQUL", deck, ntequl)

phases = phases_from_deck(deck)
if not phases or phases not in RENAMERS:
raise ValueError(f"Could not determine phase configuration, got '{phases}'")
columnrenamer = RENAMERS[phases_from_deck(deck)]

dataframe = common.keyworddata_to_df(
dataframe = keyworddata_to_df(
deck, "EQUIL", renamer=columnrenamer, recordcountername="EQLNUM"
)

Expand Down Expand Up @@ -308,7 +318,7 @@ def fill_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:

def fill_reverse_parser(parser: argparse.ArgumentParser) -> argparse.ArgumentParser:
"""Fill a parser for the operation dataframe -> resdata :term:`include file`"""
return common.fill_reverse_parser(parser, "EQUIL, RSVD++", "solution.inc")
return common_fill_reverse_parser(parser, "EQUIL, RSVD++", "solution.inc")


def equil_main(args) -> None:
Expand All @@ -334,7 +344,7 @@ def equil_main(args) -> None:
else:
eqlnums = "-"
keywords = "-"
common.write_dframe_stdout_file(
write_dframe_stdout_file(
equil_df,
args.output,
index=False,
Expand All @@ -353,7 +363,7 @@ def equil_reverse_main(args) -> None:
equil_df = pd.read_csv(args.csvfile)
logger.info("Parsed %s", args.csvfile)
inc_string = df2res(equil_df, keywords=args.keywords)
common.write_inc_stdout_file(inc_string, args.output)
write_inc_stdout_file(inc_string, args.output)


def df2res(
Expand Down Expand Up @@ -385,7 +395,7 @@ def df2res(
string += (
phases_from_columns(equil_df.columns).upper().replace("-", "\n") + "\n\n"
)
string += common.df2res(
string += common_df2res(
equil_df,
keywords=keywords,
comments=comments,
Expand All @@ -406,7 +416,7 @@ def df2res_equil(dframe: pd.DataFrame, comment: Optional[str] = None) -> str:
if dframe.empty:
return "-- No data!"
string = "EQUIL\n"
string += common.comment_formatter(comment)
string += comment_formatter(comment)

if "KEYWORD" not in dframe:
# Use everything..
Expand All @@ -422,7 +432,7 @@ def df2res_equil(dframe: pd.DataFrame, comment: Optional[str] = None) -> str:

phases = phases_from_columns(subset.columns)

return common.generic_deck_table(
return generic_deck_table(
subset,
"EQUIL",
renamer=RENAMERS[phases], # type: ignore
Expand Down Expand Up @@ -494,7 +504,7 @@ def _df2res_equilfuncs(
if dframe.empty:
return "-- No data!"
string = f"{keyword}\n"
string += common.comment_formatter(comment)
string += comment_formatter(comment)
col_headers = RENAMERS[keyword]["DATA"]

string += f"-- {'DEPTH':^21} {col_headers[1]:^21} \n"
Expand Down
5 changes: 3 additions & 2 deletions res2df/faults.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@

import pandas as pd

from res2df import ResdataFiles, getLogger_res2csv
from res2df.common import parse_opmio_deckrecord, write_dframe_stdout_file
from .common import parse_opmio_deckrecord, write_dframe_stdout_file
from .res2csvlogger import getLogger_res2csv
from .resdatafiles import ResdataFiles

try:
# Needed for mypy
Expand Down
5 changes: 3 additions & 2 deletions res2df/fipreports.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
import numpy as np
import pandas as pd

from res2df import ResdataFiles, getLogger_res2csv
from res2df.common import parse_month, write_dframe_stdout_file
from .common import parse_month, write_dframe_stdout_file
from .res2csvlogger import getLogger_res2csv
from .resdatafiles import ResdataFiles

logger = logging.getLogger(__name__)

Expand Down
Loading

0 comments on commit 8fa3b8f

Please # to comment.