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.
- {fastled-1.2.73 → fastled-1.2.75}/Dockerfile +2 -2
- {fastled-1.2.73 → fastled-1.2.75}/PKG-INFO +1 -1
- {fastled-1.2.73 → fastled-1.2.75}/compiler/compile.py +76 -32
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/__init__.py +1 -1
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/docker_manager.py +16 -2
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/parse_args.py +3 -2
- fastled-1.2.75/src/fastled/print_filter.py +47 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/select_sketch_directory.py +3 -1
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/PKG-INFO +1 -1
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/SOURCES.txt +2 -0
- fastled-1.2.75/tests/unit/test_print_filter.py +26 -0
- {fastled-1.2.73 → fastled-1.2.75}/.aiderignore +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.dockerignore +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/build_multi_docker_image.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/build_webpage.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/lint.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/publish_release.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/template_build_docker_image.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_build_exe.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_macos.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_ubuntu.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.github/workflows/test_win.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.gitignore +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.pylintrc +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.vscode/launch.json +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.vscode/settings.json +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/.vscode/tasks.json +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/LICENSE +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/MANIFEST.in +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/README.md +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/RELEASE.md +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/TODO.md +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/build_exe.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/build_site.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/clean +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/CMakeLists.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/__init__.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/arduino-pre-process.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/build.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/build_archive.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/build_fast.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/code_sync.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/compile_lock.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/entrypoint.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/100dots.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/demo_threejs.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/micdemo.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/mp3upload.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/extra/webgl_postprocessing_unreal_bloom.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/final_prewarm.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/init_runtime.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/install-arduino-cli.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/libcompile/CMakeLists.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/paths.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/pre-process.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/prewarm.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/process-ino.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/process_extended.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/pyproject.toml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/run.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/server.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/sketch_hasher.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/compiler/wasm_compiler_flags.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/docker-compose.yml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/install +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/install_linux.sh +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/lint +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/pyproject.toml +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/requirements.testing.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/setup.cfg +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/setup.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/app.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/example.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/localhost-key.pem +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/assets/localhost.pem +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/cli.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/cli_test.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/client_server.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/compile_server.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/compile_server_impl.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/filewatcher.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/interactive_srcs.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/keyboard.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/keyz.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/live_client.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/open_browser.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/paths.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/project_init.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_fastapi.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_fastapi_cli.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_flask.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/server_start.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/settings.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/site/build.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/site/examples.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/sketch.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/spinner.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/string_diff.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/test/can_run_local_docker_tests.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/test/examples.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/types.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/util.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled/web_compile.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/dependency_links.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/entry_points.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/requires.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/src/fastled.egg-info/top_level.txt +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/test +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/integration/test_build_examples.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/integration/test_examples.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/html/index.html +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_api.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_bad_ino.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_cli.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_compile_server.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_docker_linux_on_windows.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_embedded_data.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_filechanger.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_http_server.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad/bad.ino +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad_platformio/bad_platformio.ino +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/bad_platformio/platformio.ini +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/embedded/data/bigdata.dat +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/embedded/wasm.ino +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_ino/wasm/wasm.ino +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_project_init.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_server_and_client_seperatly.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_string_diff.py +0 -0
- {fastled-1.2.73 → fastled-1.2.75}/tests/unit/test_webcompile.py +0 -0
- {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
|
-
|
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}
|
@@ -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"
|
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
|
-
|
501
|
-
|
502
|
-
_dst = out_dir /
|
503
|
-
print(f"Copying {
|
504
|
-
shutil.copy2(
|
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
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
if
|
528
|
-
|
529
|
-
|
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.
|
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__(
|
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
|
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(
|
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])
|
@@ -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
|
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
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|