aboutsummaryrefslogtreecommitdiff
path: root/venv/lib/python3.8/site-packages/dash/development/update_components.py
diff options
context:
space:
mode:
authorsotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
committersotech117 <michael_foiani@brown.edu>2025-07-31 17:27:24 -0400
commit5bf22fc7e3c392c8bd44315ca2d06d7dca7d084e (patch)
tree8dacb0f195df1c0788d36dd0064f6bbaa3143ede /venv/lib/python3.8/site-packages/dash/development/update_components.py
parentb832d364da8c2efe09e3f75828caf73c50d01ce3 (diff)
add code for analysis of data
Diffstat (limited to 'venv/lib/python3.8/site-packages/dash/development/update_components.py')
-rw-r--r--venv/lib/python3.8/site-packages/dash/development/update_components.py179
1 files changed, 179 insertions, 0 deletions
diff --git a/venv/lib/python3.8/site-packages/dash/development/update_components.py b/venv/lib/python3.8/site-packages/dash/development/update_components.py
new file mode 100644
index 0000000..2789be2
--- /dev/null
+++ b/venv/lib/python3.8/site-packages/dash/development/update_components.py
@@ -0,0 +1,179 @@
+import sys
+import subprocess
+import shlex
+import os
+import argparse
+import shutil
+import logging
+import coloredlogs
+
+
+class _CombinedFormatter(
+ argparse.ArgumentDefaultsHelpFormatter, argparse.RawDescriptionHelpFormatter
+):
+ pass
+
+
+logger = logging.getLogger(__name__)
+coloredlogs.install(
+ fmt="%(asctime)s,%(msecs)03d %(levelname)s - %(message)s", datefmt="%H:%M:%S"
+)
+
+dest_dir_map = {
+ "dash-core-components": "dcc",
+ "dash-html-components": "html",
+ "dash-table": "dash_table",
+}
+
+
+def status_print(msg, **kwargs):
+ try:
+ print(msg, **kwargs)
+ except UnicodeEncodeError:
+ print(msg.encode("ascii", "ignore"), **kwargs)
+
+
+def bootstrap_components(components_source, concurrency, install_type):
+
+ is_windows = sys.platform == "win32"
+
+ source_glob = (
+ components_source
+ if components_source != "all"
+ else "{dash-core-components,dash-html-components,dash-table}"
+ )
+
+ cmdstr = f"npx lerna exec --concurrency {concurrency} --scope='{source_glob}' -- npm {install_type}"
+ cmd = shlex.split(cmdstr, posix=not is_windows)
+ status_print(cmdstr)
+
+ with subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows
+ ) as proc:
+ out, err = proc.communicate()
+ status = proc.poll()
+
+ if err:
+ status_print(("🛑 " if status else "") + err.decode(), file=sys.stderr)
+
+ if status or not out:
+ status_print(
+ f"🚨 Failed installing npm dependencies for component packages: {source_glob} (status={status}) 🚨",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+ else:
+ status_print(
+ f"🟢 Finished installing npm dependencies for component packages: {source_glob} 🟢",
+ file=sys.stderr,
+ )
+
+
+def build_components(components_source, concurrency):
+
+ is_windows = sys.platform == "win32"
+
+ source_glob = (
+ components_source
+ if components_source != "all"
+ else "{dash-core-components,dash-html-components,dash-table}"
+ )
+
+ cmdstr = f"npx lerna exec --concurrency {concurrency} --scope='{source_glob}' -- npm run build"
+ cmd = shlex.split(cmdstr, posix=not is_windows)
+ status_print(cmdstr)
+
+ with subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=is_windows
+ ) as proc:
+ out, err = proc.communicate()
+ status = proc.poll()
+
+ if err:
+ status_print(("🛑 " if status else "") + err.decode(), file=sys.stderr)
+
+ if status or not out:
+ status_print(
+ f"🚨 Finished updating component packages: {source_glob} (status={status}) 🚨",
+ file=sys.stderr,
+ )
+ sys.exit(1)
+
+ if "{" in source_glob:
+ source_glob = source_glob.split("{")[1].split("}")[0]
+
+ for package in source_glob.split(","):
+ build_directory = os.path.join(
+ "components", package, package.replace("-", "_").rstrip("/\\")
+ )
+
+ dest_dir = dest_dir_map.get(package) or package
+
+ dest_path = os.path.join("dash", dest_dir)
+
+ if not os.path.exists(dest_path):
+ try:
+ os.makedirs(dest_path)
+ except OSError:
+ logger.exception("🚨 Having issues manipulating %s", dest_path)
+ sys.exit(1)
+
+ if not os.path.exists(build_directory):
+ status_print(
+ "🚨 Could not locate build artifacts."
+ + " Check that the npm build process completed"
+ + f" successfully for package: {package} 🚨"
+ )
+ sys.exit(1)
+ else:
+ status_print(f"🚚 Moving build artifacts from {build_directory} to Dash 🚚")
+ shutil.rmtree(dest_path)
+ shutil.copytree(build_directory, dest_path)
+ with open(os.path.join(dest_path, ".gitkeep"), "w", encoding="utf-8"):
+ pass
+ status_print(
+ f"🟢 Finished moving build artifacts from {build_directory} to Dash 🟢"
+ )
+
+
+def cli():
+ parser = argparse.ArgumentParser(
+ prog="dash-update-components",
+ formatter_class=_CombinedFormatter,
+ description="Update the specified subcomponent libraries within Dash"
+ " by copying over build artifacts, dependencies, and dependency metadata.",
+ )
+ parser.add_argument(
+ "components_source",
+ help="A glob string that matches the Dash component libraries to be updated"
+ " (eg.'dash-table' // 'dash-core-components|dash-html-components' // 'all')."
+ " The default argument is 'all'.",
+ default="all",
+ )
+ parser.add_argument(
+ "--concurrency",
+ type=int,
+ default=3,
+ help="Maximum concurrent steps, up to 3 (ie all components in parallel)",
+ )
+ parser.add_argument(
+ "--ci",
+ help="For clean-install use '--ci True'",
+ default="False",
+ )
+
+ args = parser.parse_args()
+
+ if sys.platform == "win32":
+ args.components_source = args.components_source.replace('"', "").replace(
+ "'", ""
+ )
+
+ bootstrap_components(
+ args.components_source, args.concurrency, "ci" if args.ci == "True" else "i"
+ )
+ build_components(args.components_source, args.concurrency)
+
+
+if __name__ == "__main__":
+ cli()