Skip to content
Snippets Groups Projects
Commit 26177e15 authored by Mayr, Hannes's avatar Mayr, Hannes
Browse files

Initial support to export the installed modules.

parent 17311260
No related branches found
No related tags found
1 merge request!62Export imported modules
Pipeline #878670 passed with warnings
......@@ -8,6 +8,7 @@ the plot is based on. Additionally, the script that produced the plot will be
copied to the destination directory.
"""
import ast
import os
import shutil
import sys
......@@ -239,6 +240,53 @@ class PublishOptions:
os.path.join(destination, final_file_path),
)
def export_imports(self, file: str) -> None:
"""Export all imported modules in of a python script to file."""
with open(file, "r") as source:
tree = ast.parse(source.read())
analyzer = Analyzer()
analyzer.visit(tree)
analyzer.report()
class Analyzer(ast.NodeVisitor):
"""Visit and analyze nodes of Abstract Syntax Trees (AST)."""
def __init__(self) -> None:
self.stats = {"import": [], "from_module": [], "from": []}
def visit_Import(self, node) -> None:
"""Get modules that are imported with the 'import' statement."""
for alias in node.names:
self.stats["import"].append(alias.name)
self.generic_visit(node)
def visit_ImportFrom(self, node) -> None:
"""Get modules that are imported with the 'from X import Y' statement."""
for alias in node.names:
self.stats["from"].append(node.module)
self.generic_visit(node)
def report(self) -> None:
"""Create summary of imported modules."""
# Create set of imported modules
imports_as_set = set(
# Save the first part of import statement since it references the installed
# module.
[module.split(".", 1)[0] for module in self.stats["import"]]
)
imports_as_set.update(
# Add modules imported with "from X import Y".
[module.split(".", 1)[0] for module in self.stats["from"]]
)
# Write every item of the set to one line.
with open("required_imports.txt", "w") as output:
for item in imports_as_set:
output.write(f"{item}\n")
output.close()
kwargs_types_publish = TypedDict(
"kwargs_types_publish",
......@@ -288,3 +336,4 @@ def publish(
publish_container = PublishOptions(figs_and_ids, src_datapath, dst_path, **kwargs)
publish_container.validate_input()
publish_container.export()
publish_container.export_imports(sys.argv[0])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment