Skip to content

Commit 61d9976

Browse files
WEB: Replace os.path with pathlib.Path in pandas_web.py (#61604)
REF: Replace os.path with pathlib.Path in pandas_web.py Co-authored-by: Marc Garcia <garcia.marc@gmail.com>
1 parent 41c63ab commit 61d9976

File tree

1 file changed

+30
-40
lines changed

1 file changed

+30
-40
lines changed

web/pandas_web.py

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -100,20 +100,15 @@ def blog_add_posts(context):
100100
posts = []
101101
# posts from the file system
102102
if context["blog"]["posts_path"]:
103-
posts_path = os.path.join(
104-
context["source_path"], *context["blog"]["posts_path"].split("/")
105-
)
106-
for fname in os.listdir(posts_path):
107-
if fname.startswith("index."):
103+
posts_path = context["source_path"] / context["blog"]["posts_path"]
104+
for fname in posts_path.iterdir():
105+
if fname.name.startswith("index."):
108106
continue
109-
link = (
110-
f"/{context['blog']['posts_path']}"
111-
f"/{os.path.splitext(fname)[0]}.html"
112-
)
107+
link = f"/{context['blog']['posts_path']}/{fname.stem}.html"
113108
md = markdown.Markdown(
114109
extensions=context["main"]["markdown_extensions"]
115110
)
116-
with open(os.path.join(posts_path, fname), encoding="utf-8") as f:
111+
with fname.open(encoding="utf-8") as f:
117112
html = md.convert(f.read())
118113
title = md.Meta["title"][0]
119114
summary = re.sub(tag_expr, "", html)
@@ -386,15 +381,15 @@ def get_callable(obj_as_str: str) -> object:
386381
return obj
387382

388383

389-
def get_context(config_fname: str, **kwargs):
384+
def get_context(config_fname: pathlib.Path, **kwargs):
390385
"""
391386
Load the config yaml as the base context, and enrich it with the
392387
information added by the context preprocessors defined in the file.
393388
"""
394-
with open(config_fname, encoding="utf-8") as f:
389+
with config_fname.open(encoding="utf-8") as f:
395390
context = yaml.safe_load(f)
396391

397-
context["source_path"] = os.path.dirname(config_fname)
392+
context["source_path"] = config_fname.parent
398393
context.update(kwargs)
399394

400395
preprocessors = (
@@ -409,14 +404,13 @@ def get_context(config_fname: str, **kwargs):
409404
return context
410405

411406

412-
def get_source_files(source_path: str) -> typing.Generator[str, None, None]:
407+
def get_source_files(source_path: pathlib.Path) -> typing.Generator[str, None, None]:
413408
"""
414409
Generate the list of files present in the source directory.
415410
"""
416-
for root, dirs, fnames in os.walk(source_path):
417-
root_rel_path = os.path.relpath(root, source_path)
418-
for fname in fnames:
419-
yield os.path.join(root_rel_path, fname)
411+
for path in source_path.rglob("*"):
412+
if path.is_file():
413+
yield path.relative_to(source_path)
420414

421415

422416
def extend_base_template(content: str, base_template: str) -> str:
@@ -432,26 +426,27 @@ def extend_base_template(content: str, base_template: str) -> str:
432426

433427

434428
def main(
435-
source_path: str,
436-
target_path: str,
429+
source_path: pathlib.Path,
430+
target_path: pathlib.Path,
437431
) -> int:
438432
"""
439433
Copy every file in the source directory to the target directory.
440434
441435
For ``.md`` and ``.html`` files, render them with the context
442436
before copying them. ``.md`` files are transformed to HTML.
443437
"""
438+
444439
# Sanity check: validate that versions.json is valid JSON
445-
versions_path = os.path.join(source_path, "versions.json")
446-
with open(versions_path, encoding="utf-8") as f:
440+
versions_path = source_path / "versions.json"
441+
with versions_path.open(encoding="utf-8") as f:
447442
try:
448443
json.load(f)
449444
except json.JSONDecodeError as e:
450445
raise RuntimeError(
451446
f"Invalid versions.json: {e}. Ensure it is valid JSON."
452447
) from e
453448

454-
config_fname = os.path.join(source_path, "config.yml")
449+
config_fname = source_path / "config.yml"
455450

456451
shutil.rmtree(target_path, ignore_errors=True)
457452
os.makedirs(target_path, exist_ok=True)
@@ -460,23 +455,22 @@ def main(
460455
context = get_context(config_fname, target_path=target_path)
461456
sys.stderr.write("Context generated\n")
462457

463-
templates_path = os.path.join(source_path, context["main"]["templates_path"])
458+
templates_path = source_path / context["main"]["templates_path"]
464459
jinja_env = jinja2.Environment(loader=jinja2.FileSystemLoader(templates_path))
465460

466461
for fname in get_source_files(source_path):
467-
if os.path.normpath(fname) in context["main"]["ignore"]:
462+
if fname.as_posix() in context["main"]["ignore"]:
468463
continue
469-
470464
sys.stderr.write(f"Processing {fname}\n")
471-
dirname = os.path.dirname(fname)
472-
os.makedirs(os.path.join(target_path, dirname), exist_ok=True)
465+
dirname = fname.parent
466+
(target_path / dirname).mkdir(parents=True, exist_ok=True)
473467

474-
extension = os.path.splitext(fname)[-1]
468+
extension = fname.suffix
475469
if extension in (".html", ".md"):
476-
with open(os.path.join(source_path, fname), encoding="utf-8") as f:
470+
with (source_path / fname).open(encoding="utf-8") as f:
477471
content = f.read()
478472
if extension == ".md":
479-
if "pdeps/" in fname:
473+
if len(fname.parts) > 1 and fname.parts[1] == "pdeps":
480474
from markdown.extensions.toc import TocExtension
481475

482476
body = markdown.markdown(
@@ -503,17 +497,13 @@ def main(
503497
# Python-Markdown doesn't let us config table attributes by hand
504498
body = body.replace("<table>", '<table class="table table-bordered">')
505499
content = extend_base_template(body, context["main"]["base_template"])
506-
context["base_url"] = "".join(["../"] * os.path.normpath(fname).count("/"))
500+
context["base_url"] = "../" * (len(fname.parents) - 1)
507501
content = jinja_env.from_string(content).render(**context)
508-
fname_html = os.path.splitext(fname)[0] + ".html"
509-
with open(
510-
os.path.join(target_path, fname_html), "w", encoding="utf-8"
511-
) as f:
502+
fname_html = fname.with_suffix(".html").name
503+
with (target_path / dirname / fname_html).open("w", encoding="utf-8") as f:
512504
f.write(content)
513505
else:
514-
shutil.copy(
515-
os.path.join(source_path, fname), os.path.join(target_path, dirname)
516-
)
506+
shutil.copy(source_path / fname, target_path / fname)
517507

518508

519509
if __name__ == "__main__":
@@ -525,4 +515,4 @@ def main(
525515
"--target-path", default="build", help="directory where to write the output"
526516
)
527517
args = parser.parse_args()
528-
sys.exit(main(args.source_path, args.target_path))
518+
sys.exit(main(pathlib.Path(args.source_path), pathlib.Path(args.target_path)))

0 commit comments

Comments
 (0)