fastled 1.2.73__tar.gz → 1.2.75__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. {fastled-1.2.73 → fastled-1.2.75}/Dockerfile +2 -2
  2. {fastled-1.2.73 → fastled-1.2.75}/PKG-INFO +1 -1
  3. {fastled-1.2.73 → fastled-1.2.75}/compiler/compile.py +76 -32
  4. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/__init__.py +1 -1
  5. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/docker_manager.py +16 -2
  6. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/parse_args.py +3 -2
  7. fastled-1.2.75/src/fastled/print_filter.py +47 -0
  8. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/select_sketch_directory.py +3 -1
  9. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/PKG-INFO +1 -1
  10. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/SOURCES.txt +2 -0
  11. fastled-1.2.75/tests/unit/test_print_filter.py +26 -0
  12. {fastled-1.2.73 → fastled-1.2.75}/.aiderignore +0 -0
  13. {fastled-1.2.73 → fastled-1.2.75}/.dockerignore +0 -0
  14. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/build_multi_docker_image.yml +0 -0
  15. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/build_webpage.yml +0 -0
  16. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/lint.yml +0 -0
  17. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/publish_release.yml +0 -0
  18. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/template_build_docker_image.yml +0 -0
  19. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_build_exe.yml +0 -0
  20. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_macos.yml +0 -0
  21. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_ubuntu.yml +0 -0
  22. {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_win.yml +0 -0
  23. {fastled-1.2.73 → fastled-1.2.75}/.gitignore +0 -0
  24. {fastled-1.2.73 → fastled-1.2.75}/.pylintrc +0 -0
  25. {fastled-1.2.73 → fastled-1.2.75}/.vscode/launch.json +0 -0
  26. {fastled-1.2.73 → fastled-1.2.75}/.vscode/settings.json +0 -0
  27. {fastled-1.2.73 → fastled-1.2.75}/.vscode/tasks.json +0 -0
  28. {fastled-1.2.73 → fastled-1.2.75}/LICENSE +0 -0
  29. {fastled-1.2.73 → fastled-1.2.75}/MANIFEST.in +0 -0
  30. {fastled-1.2.73 → fastled-1.2.75}/README.md +0 -0
  31. {fastled-1.2.73 → fastled-1.2.75}/RELEASE.md +0 -0
  32. {fastled-1.2.73 → fastled-1.2.75}/TODO.md +0 -0
  33. {fastled-1.2.73 → fastled-1.2.75}/build_exe.py +0 -0
  34. {fastled-1.2.73 → fastled-1.2.75}/build_site.py +0 -0
  35. {fastled-1.2.73 → fastled-1.2.75}/clean +0 -0
  36. {fastled-1.2.73 → fastled-1.2.75}/compiler/CMakeLists.txt +0 -0
  37. {fastled-1.2.73 → fastled-1.2.75}/compiler/__init__.py +0 -0
  38. {fastled-1.2.73 → fastled-1.2.75}/compiler/arduino-pre-process.sh +0 -0
  39. {fastled-1.2.73 → fastled-1.2.75}/compiler/build.sh +0 -0
  40. {fastled-1.2.73 → fastled-1.2.75}/compiler/build_archive.sh +0 -0
  41. {fastled-1.2.73 → fastled-1.2.75}/compiler/build_fast.sh +0 -0
  42. {fastled-1.2.73 → fastled-1.2.75}/compiler/code_sync.py +0 -0
  43. {fastled-1.2.73 → fastled-1.2.75}/compiler/compile_lock.py +0 -0
  44. {fastled-1.2.73 → fastled-1.2.75}/compiler/entrypoint.sh +0 -0
  45. {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/100dots.html +0 -0
  46. {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/demo_threejs.html +0 -0
  47. {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/micdemo.html +0 -0
  48. {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/mp3upload.html +0 -0
  49. {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/webgl_postprocessing_unreal_bloom.html +0 -0
  50. {fastled-1.2.73 → fastled-1.2.75}/compiler/final_prewarm.sh +0 -0
  51. {fastled-1.2.73 → fastled-1.2.75}/compiler/init_runtime.py +0 -0
  52. {fastled-1.2.73 → fastled-1.2.75}/compiler/install-arduino-cli.sh +0 -0
  53. {fastled-1.2.73 → fastled-1.2.75}/compiler/libcompile/CMakeLists.txt +0 -0
  54. {fastled-1.2.73 → fastled-1.2.75}/compiler/paths.py +0 -0
  55. {fastled-1.2.73 → fastled-1.2.75}/compiler/pre-process.sh +0 -0
  56. {fastled-1.2.73 → fastled-1.2.75}/compiler/prewarm.sh +0 -0
  57. {fastled-1.2.73 → fastled-1.2.75}/compiler/process-ino.py +0 -0
  58. {fastled-1.2.73 → fastled-1.2.75}/compiler/process_extended.py +0 -0
  59. {fastled-1.2.73 → fastled-1.2.75}/compiler/pyproject.toml +0 -0
  60. {fastled-1.2.73 → fastled-1.2.75}/compiler/run.py +0 -0
  61. {fastled-1.2.73 → fastled-1.2.75}/compiler/server.py +0 -0
  62. {fastled-1.2.73 → fastled-1.2.75}/compiler/sketch_hasher.py +0 -0
  63. {fastled-1.2.73 → fastled-1.2.75}/compiler/wasm_compiler_flags.py +0 -0
  64. {fastled-1.2.73 → fastled-1.2.75}/docker-compose.yml +0 -0
  65. {fastled-1.2.73 → fastled-1.2.75}/install +0 -0
  66. {fastled-1.2.73 → fastled-1.2.75}/install_linux.sh +0 -0
  67. {fastled-1.2.73 → fastled-1.2.75}/lint +0 -0
  68. {fastled-1.2.73 → fastled-1.2.75}/pyproject.toml +0 -0
  69. {fastled-1.2.73 → fastled-1.2.75}/requirements.testing.txt +0 -0
  70. {fastled-1.2.73 → fastled-1.2.75}/setup.cfg +0 -0
  71. {fastled-1.2.73 → fastled-1.2.75}/setup.py +0 -0
  72. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/app.py +0 -0
  73. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/example.txt +0 -0
  74. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/localhost-key.pem +0 -0
  75. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/localhost.pem +0 -0
  76. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/cli.py +0 -0
  77. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/cli_test.py +0 -0
  78. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/client_server.py +0 -0
  79. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/compile_server.py +0 -0
  80. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/compile_server_impl.py +0 -0
  81. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/filewatcher.py +0 -0
  82. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/interactive_srcs.py +0 -0
  83. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/keyboard.py +0 -0
  84. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/keyz.py +0 -0
  85. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/live_client.py +0 -0
  86. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/open_browser.py +0 -0
  87. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/paths.py +0 -0
  88. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/project_init.py +0 -0
  89. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_fastapi.py +0 -0
  90. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_fastapi_cli.py +0 -0
  91. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_flask.py +0 -0
  92. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_start.py +0 -0
  93. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/settings.py +0 -0
  94. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/site/build.py +0 -0
  95. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/site/examples.py +0 -0
  96. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/sketch.py +0 -0
  97. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/spinner.py +0 -0
  98. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/string_diff.py +0 -0
  99. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/test/can_run_local_docker_tests.py +0 -0
  100. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/test/examples.py +0 -0
  101. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/types.py +0 -0
  102. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/util.py +0 -0
  103. {fastled-1.2.73 → fastled-1.2.75}/src/fastled/web_compile.py +0 -0
  104. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/dependency_links.txt +0 -0
  105. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/entry_points.txt +0 -0
  106. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/requires.txt +0 -0
  107. {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/top_level.txt +0 -0
  108. {fastled-1.2.73 → fastled-1.2.75}/test +0 -0
  109. {fastled-1.2.73 → fastled-1.2.75}/tests/integration/test_build_examples.py +0 -0
  110. {fastled-1.2.73 → fastled-1.2.75}/tests/integration/test_examples.py +0 -0
  111. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/html/index.html +0 -0
  112. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_api.py +0 -0
  113. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_bad_ino.py +0 -0
  114. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_cli.py +0 -0
  115. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_compile_server.py +0 -0
  116. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_docker_linux_on_windows.py +0 -0
  117. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_embedded_data.py +0 -0
  118. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_filechanger.py +0 -0
  119. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_http_server.py +0 -0
  120. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad/bad.ino +0 -0
  121. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad_platformio/bad_platformio.ino +0 -0
  122. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad_platformio/platformio.ini +0 -0
  123. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/embedded/data/bigdata.dat +0 -0
  124. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/embedded/wasm.ino +0 -0
  125. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/wasm/wasm.ino +0 -0
  126. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_project_init.py +0 -0
  127. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_server_and_client_seperatly.py +0 -0
  128. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_string_diff.py +0 -0
  129. {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_webcompile.py +0 -0
  130. {fastled-1.2.73 → fastled-1.2.75}/upload_package.sh +0 -0
@@ -41,8 +41,8 @@
41
41
 
42
42
  # This will be set to arm64 to support MacOS M1+ devices (and Linux-based arm64 devices)
43
43
  ARG PLATFORM_TAG=""
44
- # ARG EMSDK_VERSION_TAG="4.0.4"
45
- ARG EMSDK_VERSION_TAG="3.1.70"
44
+ ARG EMSDK_VERSION_TAG="4.0.8"
45
+ # ARG EMSDK_VERSION_TAG="3.1.70"
46
46
 
47
47
  # Use only Emscripten base image
48
48
  FROM emscripten/emsdk:${EMSDK_VERSION_TAG}${PLATFORM_TAG}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.2.73
3
+ Version: 1.2.75
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -89,6 +89,33 @@ def copy_files(src_dir: Path, js_src: Path) -> None:
89
89
  shutil.copy2(item, js_src / item.name)
90
90
 
91
91
 
92
+ def _banner(msg: str) -> str:
93
+ """
94
+ Create a banner for the given message.
95
+ Example:
96
+ msg = "Hello, World!"
97
+ print -> "#################"
98
+ "# Hello, World! #"
99
+ "#################"
100
+ """
101
+ lines = msg.split("\n")
102
+ # Find the width of the widest line
103
+ max_width = max(len(line) for line in lines)
104
+ width = max_width + 4 # Add 4 for "# " and " #"
105
+
106
+ # Create the top border
107
+ banner = "\n" + "#" * width + "\n"
108
+
109
+ # Add each line with proper padding
110
+ for line in lines:
111
+ padding = max_width - len(line)
112
+ banner += f"# {line}{' ' * padding} #\n"
113
+
114
+ # Add the bottom border
115
+ banner += "#" * width + "\n"
116
+ return banner
117
+
118
+
92
119
  def compile(
93
120
  compiler_root: Path, build_mode: BuildMode, auto_clean: bool, no_platformio: bool
94
121
  ) -> int:
@@ -96,7 +123,7 @@ def compile(
96
123
  max_attempts = 1
97
124
  env = os.environ.copy()
98
125
  env["BUILD_MODE"] = build_mode.name
99
- print(f"Build mode: {build_mode.name}")
126
+ print(_banner(f"WASM is building in mode: {build_mode.name}"))
100
127
  cmd_list: list[str] = []
101
128
  if no_platformio:
102
129
  # execute build_archive.syh
@@ -113,6 +140,7 @@ def compile(
113
140
  cmd_list.append("-v")
114
141
 
115
142
  def _open_process(cmd_list: list[str] = cmd_list) -> subprocess.Popen:
143
+ print(_banner("Running command:\n " + subprocess.list2cmdline(cmd_list)))
116
144
  out = subprocess.Popen(
117
145
  cmd_list,
118
146
  cwd=compiler_root,
@@ -138,7 +166,7 @@ def compile(
138
166
  relative_output = _make_timestamps_relative("\n".join(output_lines))
139
167
  print(relative_output)
140
168
  if process.returncode == 0:
141
- print(f"Compilation successful on attempt {attempt}")
169
+ print(_banner(f"Compilation successful on attempt {attempt}"))
142
170
  return 0
143
171
  else:
144
172
  raise subprocess.CalledProcessError(process.returncode, ["pio", "run"])
@@ -199,7 +227,7 @@ def transform_to_cpp(src_dir: Path) -> None:
199
227
  def insert_headers(
200
228
  src_dir: Path, exclusion_folders: List[Path], file_extensions: List[str]
201
229
  ) -> None:
202
- print("Inserting headers in source files...")
230
+ print(_banner("Inserting headers in source files..."))
203
231
  for file in src_dir.rglob("*"):
204
232
  if (
205
233
  file.suffix in file_extensions
@@ -213,7 +241,7 @@ def process_ino_files(src_dir: Path) -> None:
213
241
  transform_to_cpp(src_dir)
214
242
  exclusion_folders: List[Path] = []
215
243
  insert_headers(src_dir, exclusion_folders, _FILE_EXTENSIONS)
216
- print("Transform to cpp and insert header operations completed.")
244
+ print(_banner("Transform to cpp and insert header operations completed."))
217
245
 
218
246
 
219
247
  def _make_timestamps_relative(stdout: str) -> str:
@@ -381,7 +409,7 @@ def process_compile(
381
409
  if rtn != 0:
382
410
  print("Compilation failed.")
383
411
  raise RuntimeError("Compilation failed.")
384
- print("Compilation successful.")
412
+ print(_banner("Compilation successful."))
385
413
 
386
414
 
387
415
  def cleanup(args: Args, js_src: Path) -> None:
@@ -422,9 +450,15 @@ def run(args: Args) -> int:
422
450
  print(f"Using mapped directory: {args.mapped_dir}")
423
451
 
424
452
  if args.profile:
425
- print("Enabling profiling for compilation.")
453
+ print(_banner("Enabling profiling for compilation."))
426
454
  # Profile linking
427
455
  os.environ["EMPROFILE"] = "2"
456
+ else:
457
+ print(
458
+ _banner(
459
+ "Build process profiling is disabled\nuse --profile to get metrics on how long the build process took."
460
+ )
461
+ )
428
462
 
429
463
  try:
430
464
 
@@ -477,6 +511,8 @@ def run(args: Args) -> int:
477
511
  return 1
478
512
 
479
513
  def _get_build_dir_platformio() -> Path:
514
+ # First assert there is only one build artifact directory.
515
+ # The name is dynamic: it's your sketch folder name.
480
516
  build_dirs = [d for d in PIO_BUILD_DIR.iterdir() if d.is_dir()]
481
517
  if len(build_dirs) != 1:
482
518
  raise RuntimeError(
@@ -493,16 +529,17 @@ def run(args: Args) -> int:
493
529
  else:
494
530
  build_dir = _get_build_dir_platformio()
495
531
 
496
- print("Copying output files...")
532
+ print(_banner("Copying output files..."))
497
533
  out_dir: Path = src_dir / _FASTLED_OUTPUT_DIR_NAME
498
534
  out_dir.mkdir(parents=True, exist_ok=True)
499
535
 
500
- for file in ["fastled.js", "fastled.wasm"]:
501
- _src = build_dir / file
502
- _dst = out_dir / file
503
- print(f"Copying {_src} to {_dst}")
504
- shutil.copy2(_src, _dst)
536
+ # Copy all fastled.* build artifacts
537
+ for file_path in build_dir.glob("fastled.*"):
538
+ _dst = out_dir / file_path.name
539
+ print(f"Copying {file_path} to {_dst}")
540
+ shutil.copy2(file_path, _dst)
505
541
 
542
+ # Copy static files.
506
543
  print(f"Copying {_INDEX_HTML_SRC} to output directory")
507
544
  shutil.copy2(_INDEX_HTML_SRC, out_dir / "index.html")
508
545
  print(f"Copying {_INDEX_CSS_SRC} to output directory")
@@ -510,23 +547,30 @@ def run(args: Args) -> int:
510
547
 
511
548
  # copy all js files in _FASTLED_COMPILER_DIR to output directory
512
549
  Path(out_dir / "modules").mkdir(parents=True, exist_ok=True)
513
- for _file in _FASTLED_MODULES_DIR.iterdir():
514
- if _file.suffix == ".js":
515
- print(f"Copying {_file} to output directory")
516
- shutil.copy2(_file, out_dir / "modules" / _file.name)
517
-
518
- fastled_js_mem = build_dir / "fastled.js.mem"
519
- fastled_wasm_map = build_dir / "fastled.wasm.map"
520
- fastled_js_symbols = build_dir / "fastled.js.symbols"
521
- if fastled_js_mem.exists():
522
- print(f"Copying {fastled_js_mem} to output directory")
523
- shutil.copy2(fastled_js_mem, out_dir / fastled_js_mem.name)
524
- if fastled_wasm_map.exists():
525
- print(f"Copying {fastled_wasm_map} to output directory")
526
- shutil.copy2(fastled_wasm_map, out_dir / fastled_wasm_map.name)
527
- if fastled_js_symbols.exists():
528
- print(f"Copying {fastled_js_symbols} to output directory")
529
- shutil.copy2(fastled_js_symbols, out_dir / fastled_js_symbols.name)
550
+
551
+ # Recursively copy all non-hidden files and directories
552
+ print(f"Copying files from {_FASTLED_MODULES_DIR} to {out_dir / 'modules'}")
553
+ shutil.copytree(
554
+ src=_FASTLED_MODULES_DIR,
555
+ dst=out_dir / "modules",
556
+ dirs_exist_ok=True,
557
+ ignore=shutil.ignore_patterns(".*"),
558
+ ) # Ignore hidden files
559
+
560
+ # Now long needed since now we do glob copy.
561
+ # fastled_js_mem = build_dir / "fastled.js.mem"
562
+ # fastled_wasm_map = build_dir / "fastled.wasm.map"
563
+ # fastled_js_symbols = build_dir / "fastled.js.symbols"
564
+ # if fastled_js_mem.exists():
565
+ # print(f"Copying {fastled_js_mem} to output directory")
566
+ # shutil.copy2(fastled_js_mem, out_dir / fastled_js_mem.name)
567
+ # if fastled_wasm_map.exists():
568
+ # print(f"Copying {fastled_wasm_map} to output directory")
569
+ # shutil.copy2(fastled_wasm_map, out_dir / fastled_wasm_map.name)
570
+ # if fastled_js_symbols.exists():
571
+ # print(f"Copying {fastled_js_symbols} to output directory")
572
+ # shutil.copy2(fastled_js_symbols, out_dir / fastled_js_symbols.name)
573
+
530
574
  print("Copying index.js to output directory")
531
575
  shutil.copy2(_INDEX_JS_SRC, out_dir / "index.js")
532
576
  optional_input_data_dir = src_dir / "data"
@@ -546,7 +590,7 @@ def run(args: Args) -> int:
546
590
  if _file.is_file(): # Only copy files, not directories
547
591
  filename: str = _file.name
548
592
  if filename.endswith(".embedded.json"):
549
- print("Embedding data file")
593
+ print(_banner("Embedding data file"))
550
594
  filename_no_embedded = filename.replace(
551
595
  ".embedded.json", ""
552
596
  )
@@ -577,13 +621,13 @@ def run(args: Args) -> int:
577
621
  )
578
622
 
579
623
  # Write manifest file even if empty
580
- print("Writing manifest files.json")
624
+ print(_banner("Writing manifest files.json"))
581
625
  manifest_json_str = json.dumps(manifest, indent=2, sort_keys=True)
582
626
  with open(out_dir / "files.json", "w") as f:
583
627
  f.write(manifest_json_str)
584
628
  cleanup(args, SKETCH_SRC)
585
629
 
586
- print("Compilation process completed successfully")
630
+ print(_banner("Compilation process completed successfully"))
587
631
  return 0
588
632
 
589
633
  except Exception as e:
@@ -13,7 +13,7 @@ from .types import BuildMode, CompileResult, CompileServerError
13
13
  # IMPORTANT! There's a bug in github which will REJECT any version update
14
14
  # that has any other change in the repo. Please bump the version as the
15
15
  # ONLY change in a commit, or else the pypi update and the release will fail.
16
- __version__ = "1.2.73"
16
+ __version__ = "1.2.75"
17
17
 
18
18
  DOCKER_FILE = (
19
19
  "https://raw.githubusercontent.com/zackees/fastled-wasm/refs/heads/main/Dockerfile"
@@ -25,6 +25,7 @@ from docker.models.containers import Container
25
25
  from docker.models.images import Image
26
26
  from filelock import FileLock
27
27
 
28
+ from fastled.print_filter import PrintFilter
28
29
  from fastled.spinner import Spinner
29
30
 
30
31
  CONFIG_DIR = Path(user_data_dir("fastled", "fastled"))
@@ -99,8 +100,20 @@ class Volume:
99
100
  return volumes
100
101
 
101
102
 
103
+ # Override the default PrintFilter to use a custom one.
104
+ def make_default_print_filter() -> PrintFilter:
105
+ """Create a default PrintFilter instance."""
106
+ return PrintFilter()
107
+
108
+
102
109
  class RunningContainer:
103
- def __init__(self, container, first_run=False):
110
+ def __init__(
111
+ self,
112
+ container: Container,
113
+ first_run: bool = False,
114
+ filter: PrintFilter | None = None,
115
+ ) -> None:
116
+ self.filter = filter or make_default_print_filter()
104
117
  self.container = container
105
118
  self.first_run = first_run
106
119
  self.running = True
@@ -117,7 +130,8 @@ class RunningContainer:
117
130
  for log in self.container.logs(
118
131
  follow=False, since=from_date, until=to_date, stream=True
119
132
  ):
120
- print(log.decode("utf-8"), end="")
133
+ # print(log.decode("utf-8"), end="")
134
+ self.filter.print(log)
121
135
  time.sleep(0.1)
122
136
  from_date = to_date
123
137
  to_date = _utc_now_no_tz()
@@ -66,7 +66,7 @@ def parse_args() -> Args:
66
66
  parser.add_argument(
67
67
  "--profile",
68
68
  action="store_true",
69
- help="Enable profiling for web compilation",
69
+ help="Enable profiling of the C++ build system used for wasm compilation.",
70
70
  )
71
71
  parser.add_argument(
72
72
  "--force-compile",
@@ -79,6 +79,7 @@ def parse_args() -> Args:
79
79
  help="Disable automatic updates of the wasm compiler image when using docker.",
80
80
  )
81
81
  parser.add_argument(
82
+ "-u",
82
83
  "--update",
83
84
  "--upgrade",
84
85
  action="store_true",
@@ -89,7 +90,7 @@ def parse_args() -> Args:
89
90
  "--local",
90
91
  "-l",
91
92
  action="store_true",
92
- help="Use localhost for web compilation from an instance of fastled --server, creating it if necessary",
93
+ help="(Default): Use localhost for web compilation from an instance of fastled --server, creating it if necessary",
93
94
  )
94
95
  parser.add_argument(
95
96
  "--build",
@@ -0,0 +1,47 @@
1
+ import re
2
+
3
+
4
+ def _handle_ino_cpp(line: str) -> str:
5
+ if ".ino.cpp" in line[0:30]:
6
+ # Extract the filename without path and extension
7
+ match = re.search(r"src/([^/]+)\.ino\.cpp", line)
8
+ if match:
9
+ filename = match.group(1)
10
+ # Replace with examples/Filename/Filename.ino format
11
+ line = line.replace(
12
+ f"src/{filename}.ino.cpp", f"examples/{filename}/{filename}.ino"
13
+ )
14
+ else:
15
+ # Fall back to simple extension replacement if regex doesn't match
16
+ line = line.replace(".ino.cpp", ".ino")
17
+ return line
18
+
19
+
20
+ class PrintFilter:
21
+ """Provides filtering for text output so that source files match up with local names."""
22
+
23
+ def __init__(self, echo: bool = True) -> None:
24
+ self.echo = echo
25
+ self.build_started = False
26
+ pass
27
+
28
+ def _filter_all(self, text: str) -> str:
29
+ lines = text.splitlines()
30
+ out: list[str] = []
31
+ for line in lines:
32
+ if "# WASM is building" in line:
33
+ self.build_started = True
34
+ if self.build_started:
35
+ line = _handle_ino_cpp(line)
36
+ out.append(line)
37
+ text = "\n".join(out)
38
+ return text
39
+
40
+ def print(self, text: str | bytes) -> str:
41
+ """Prints the text to the console."""
42
+ if isinstance(text, bytes):
43
+ text = text.decode("utf-8")
44
+ text = self._filter_all(text)
45
+ if self.echo:
46
+ print(text, end="")
47
+ return text
@@ -20,7 +20,9 @@ def select_sketch_directory(
20
20
  print("\nMultiple Directories found, choose one:")
21
21
  for i, sketch_dir in enumerate(sketch_directories):
22
22
  print(f" [{i+1}]: {sketch_dir}")
23
- which = input("\nPlease specify a sketch directory: ").strip()
23
+ which = input(
24
+ "\nPlease specify a sketch directory\nYou can enter a number or type a fuzzy search: "
25
+ ).strip()
24
26
  try:
25
27
  index = int(which) - 1
26
28
  return str(sketch_directories[index])
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.2.73
3
+ Version: 1.2.75
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -77,6 +77,7 @@ src/fastled/live_client.py
77
77
  src/fastled/open_browser.py
78
78
  src/fastled/parse_args.py
79
79
  src/fastled/paths.py
80
+ src/fastled/print_filter.py
80
81
  src/fastled/project_init.py
81
82
  src/fastled/select_sketch_directory.py
82
83
  src/fastled/server_fastapi.py
@@ -113,6 +114,7 @@ tests/unit/test_docker_linux_on_windows.py
113
114
  tests/unit/test_embedded_data.py
114
115
  tests/unit/test_filechanger.py
115
116
  tests/unit/test_http_server.py
117
+ tests/unit/test_print_filter.py
116
118
  tests/unit/test_project_init.py
117
119
  tests/unit/test_server_and_client_seperatly.py
118
120
  tests/unit/test_string_diff.py
@@ -0,0 +1,26 @@
1
+ """
2
+ Unit test file.
3
+ """
4
+
5
+ import unittest
6
+
7
+ from fastled.print_filter import PrintFilter
8
+
9
+
10
+ class PrintFitlerTester(unittest.TestCase):
11
+ """Main tester class."""
12
+
13
+ def test_live_client(self) -> None:
14
+ """Tests that a project can be filtered"""
15
+ # Test the PrintFilter class
16
+ pf = PrintFilter(echo=False)
17
+ pf.print("# WASM is building") # This should trigger the filter.
18
+ result = pf.print("src/XYPath.ino.cpp") # This should now be transformed.
19
+ self.assertNotIn(".ino.cpp", result, "Expected .ino.cpp to be filtered out")
20
+ self.assertIn(
21
+ "examples/XYPath/XYPath.ino", result, "Expected path to be transformed"
22
+ )
23
+
24
+
25
+ if __name__ == "__main__":
26
+ unittest.main()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes