Skip to content

Commit 82fc94e

Browse files
authored
Non random import order and separation from setup code (#92)
* 🐛 interactive itables were not working in browser - in some cases the exported html wasn't working without initializing itables * ✨ Sort imports and separate from setup statements
1 parent f629e84 commit 82fc94e

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

src/vuegen/quarto_reportview.py

Lines changed: 13 additions & 3 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)
@@ -801,8 +810,9 @@ def _generate_component_imports(self, component: r.Component) -> List[str]:
801810
r.PlotType.PLOTLY: ["import plotly.io as pio", "import requests"],
802811
},
803812
"dataframe": [
813+
"init_notebook_mode(all_interactive=True)", # ! somehow order is random in qmd file
804814
"import pandas as pd",
805-
"from itables import show",
815+
"from itables import show, init_notebook_mode",
806816
"import dataframe_image as dfi",
807817
],
808818
"markdown": ["import IPython.display as display", "import requests"],

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)