Skip to content

Commit 07cb78b

Browse files
committed
✨ Sort imports and separate from setup statements
1 parent 39f3d17 commit 07cb78b

File tree

2 files changed

+50
-3
lines changed

2 files changed

+50
-3
lines changed

src/vuegen/quarto_reportview.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import pandas as pd
88

99
from . import report as r
10-
from .utils import create_folder, is_url
10+
from .utils import create_folder, is_url, sort_imports
1111

1212

1313
class QuartoReportView(r.ReportView):
@@ -118,7 +118,16 @@ def generate_report(
118118
]
119119

120120
# Remove duplicated imports
121-
report_unique_imports = list(set(flattened_report_imports))
121+
report_unique_imports = set(flattened_report_imports)
122+
123+
# ! set leads to random import order
124+
# ! separate and sort import statements, separate from setup code
125+
126+
report_unique_imports, setup_statements = sort_imports(
127+
report_unique_imports
128+
)
129+
report_unique_imports += os.linesep
130+
report_unique_imports.extend(setup_statements)
122131

123132
# Format imports
124133
report_formatted_imports = "\n".join(report_unique_imports)

src/vuegen/utils.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from io import StringIO
1616
from pathlib import Path
17-
from typing import Type
17+
from typing import Iterable, Type
1818
from urllib.parse import urlparse
1919

2020
import networkx as nx
@@ -798,3 +798,41 @@ def generate_footer() -> str:
798798
</a>
799799
</footer>"""
800800
return footer
801+
802+
803+
def sort_imports(imp: Iterable[str]) -> tuple[list[str], list[str]]:
804+
"""Separte 'from' and 'import' statements from setup code.
805+
806+
Parameters
807+
----------
808+
imp : Iterable[str]
809+
A list of import statements and setup statements.
810+
811+
Returns
812+
-------
813+
Tuple[List[str], List[str]]
814+
A tuple of two lists: one for import statements and one for setup statements.
815+
816+
Examples
817+
--------
818+
>>> imp = [
819+
... 'import logging',
820+
... 'import shutil',
821+
... 'logging.basicConfig(level=logging.INFO)',
822+
... 'import pandas as pd',
823+
... 'import numpy as np',
824+
... ]
825+
>>> sort_imports(imp)
826+
(['import logging', 'import numpy as np', 'import pandas as pd', 'import shutil
827+
], ['logging.basicConfig(level=logging.INFO)'])
828+
"""
829+
imports_statements, setup_statements = [], []
830+
for line in imp:
831+
line = line.strip() # just for safety
832+
if line.startswith("from ") or line.startswith("import "):
833+
imports_statements.append(line)
834+
else:
835+
setup_statements.append(line)
836+
imports_statements.sort()
837+
setup_statements.sort()
838+
return imports_statements, setup_statements

0 commit comments

Comments
 (0)