fastled 1.3.35__tar.gz → 1.3.37__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.3.35 → fastled-1.3.37}/PKG-INFO +1 -1
- {fastled-1.3.35 → fastled-1.3.37}/compiler/run.py +1 -1
- fastled-1.3.37/requirements.docker.txt +1 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/__init__.py +6 -1
- fastled-1.3.37/src/fastled/__main__.py +14 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/__version__.py +1 -1
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/client_server.py +8 -1
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/compile_server_impl.py +5 -1
- fastled-1.3.37/src/fastled/string_diff.py +165 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/web_compile.py +12 -2
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/PKG-INFO +1 -1
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/SOURCES.txt +2 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_cli_no_platformio.py +2 -0
- fastled-1.3.37/tests/unit/test_no_platformio_compile.py +427 -0
- fastled-1.3.37/tests/unit/test_string_diff_comprehensive.py +581 -0
- fastled-1.3.35/requirements.docker.txt +0 -1
- fastled-1.3.35/src/fastled/string_diff.py +0 -115
- fastled-1.3.35/tests/unit/test_no_platformio_compile.py +0 -472
- {fastled-1.3.35 → fastled-1.3.37}/.aiderignore +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.cursorrules +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.dockerignore +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/build_multi_docker_image.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/build_webpage.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/lint.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/publish_release.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/template_build_docker_image.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_build_exe.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_macos.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_ubuntu.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_win.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.gitignore +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.pylintrc +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.vscode/launch.json +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.vscode/settings.json +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/.vscode/tasks.json +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/DEBUGGER.md +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/Dockerfile +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/FAQ.md +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/LICENSE +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/MANIFEST.in +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/README.md +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/RELEASE.md +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/TODO.md +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/build_exe.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/build_local_docker.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/build_site.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/clean +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/compiler/debug.sh +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/demo/100dots.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/demo/demo_threejs.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/demo/micdemo.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/demo/mp3upload.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/demo/webgl_postprocessing_unreal_bloom.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/docker-compose.yml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/entrypoint.sh +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/install +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/install_linux.sh +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/lint +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/pyproject.toml +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/requirements.testing.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/setup.cfg +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/setup.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/app.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/args.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/example.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/localhost-key.pem +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/localhost.pem +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli_test.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli_test_interactive.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/compile_server.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/docker_manager.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/filewatcher.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/keyboard.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/keyz.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/live_client.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/open_browser.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/parse_args.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/paths.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/print_filter.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/project_init.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/select_sketch_directory.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/server_flask.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/server_start.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/settings.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/site/build.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/site/examples.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/sketch.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/spinner.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/test/can_run_local_docker_tests.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/test/examples.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/types.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/util.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled/version.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/dependency_links.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/entry_points.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/requires.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/top_level.txt +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/test +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/integration/test_build_examples.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/integration/test_examples.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/html/index.html +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_api.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_bad_ino.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_banner_string.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_cli.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_compile_server.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_debug_fetch_source_files.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_docker_linux_on_windows.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_embedded_data.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_filechanger.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_flask_headers.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_http_server.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad/bad.ino +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad_platformio/bad_platformio.ino +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad_platformio/platformio.ini +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/embedded/data/bigdata.dat +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/embedded/wasm.ino +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/wasm/wasm.ino +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_manual_api_invocation.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_project_init.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_server_and_client_seperatly.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_session_compile.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_string_diff.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_version.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_webcompile.py +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/upload_package.sh +0 -0
- {fastled-1.3.35 → fastled-1.3.37}/vscode-plugin/readme +0 -0
@@ -6,7 +6,7 @@ import warnings
|
|
6
6
|
from pathlib import Path
|
7
7
|
from typing import Tuple
|
8
8
|
|
9
|
-
from fastled_wasm_compiler
|
9
|
+
from fastled_wasm_compiler import Compiler
|
10
10
|
from fastled_wasm_compiler.paths import VOLUME_MAPPED_SRC
|
11
11
|
|
12
12
|
_PORT = os.environ.get("PORT", 80)
|
@@ -0,0 +1 @@
|
|
1
|
+
fastled-wasm-server>=1.0.97
|
@@ -39,6 +39,7 @@ class Api:
|
|
39
39
|
host: str | CompileServer | None = None,
|
40
40
|
build_mode: BuildMode = BuildMode.QUICK,
|
41
41
|
profile: bool = False, # When true then profile information will be enabled and included in the zip.
|
42
|
+
no_platformio: bool = False,
|
42
43
|
) -> CompileResult:
|
43
44
|
from fastled.web_compile import web_compile
|
44
45
|
|
@@ -47,7 +48,11 @@ class Api:
|
|
47
48
|
if isinstance(directory, str):
|
48
49
|
directory = Path(directory)
|
49
50
|
out: CompileResult = web_compile(
|
50
|
-
directory,
|
51
|
+
directory,
|
52
|
+
host,
|
53
|
+
build_mode=build_mode,
|
54
|
+
profile=profile,
|
55
|
+
no_platformio=no_platformio,
|
51
56
|
)
|
52
57
|
return out
|
53
58
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
FastLED Package Main Entry Point
|
4
|
+
Enables running the package as: python -m fastled
|
5
|
+
"""
|
6
|
+
|
7
|
+
import sys
|
8
|
+
|
9
|
+
from fastled.cli import main
|
10
|
+
|
11
|
+
if __name__ == "__main__":
|
12
|
+
# Pass execution to the main function from cli.py
|
13
|
+
# This enables 'python -m fastled' to work the same as 'fastled' command
|
14
|
+
sys.exit(main())
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# IMPORTANT! There's a bug in github which will REJECT any version update
|
2
2
|
# that has any other change in the repo. Please bump the version as the
|
3
3
|
# ONLY change in a commit, or else the pypi update and the release will fail.
|
4
|
-
__version__ = "1.3.
|
4
|
+
__version__ = "1.3.37"
|
5
5
|
|
6
6
|
__version_url_latest__ = "https://raw.githubusercontent.com/zackees/fastled-wasm/refs/heads/main/src/fastled/__version__.py"
|
@@ -76,12 +76,17 @@ def _run_web_compiler(
|
|
76
76
|
build_mode: BuildMode,
|
77
77
|
profile: bool,
|
78
78
|
last_hash_value: str | None,
|
79
|
+
no_platformio: bool = False,
|
79
80
|
) -> CompileResult:
|
80
81
|
input_dir = Path(directory)
|
81
82
|
output_dir = input_dir / "fastled_js"
|
82
83
|
start = time.time()
|
83
84
|
web_result = web_compile(
|
84
|
-
directory=input_dir,
|
85
|
+
directory=input_dir,
|
86
|
+
host=host,
|
87
|
+
build_mode=build_mode,
|
88
|
+
profile=profile,
|
89
|
+
no_platformio=no_platformio,
|
85
90
|
)
|
86
91
|
diff = time.time() - start
|
87
92
|
if not web_result.success:
|
@@ -287,6 +292,7 @@ def run_client(
|
|
287
292
|
build_mode: BuildMode = build_mode,
|
288
293
|
profile: bool = profile,
|
289
294
|
last_hash_value: str | None = None,
|
295
|
+
no_platformio: bool = no_platformio,
|
290
296
|
) -> CompileResult:
|
291
297
|
TEST_BEFORE_COMPILE(url)
|
292
298
|
return _run_web_compiler(
|
@@ -295,6 +301,7 @@ def run_client(
|
|
295
301
|
build_mode=build_mode,
|
296
302
|
profile=profile,
|
297
303
|
last_hash_value=last_hash_value,
|
304
|
+
no_platformio=no_platformio,
|
298
305
|
)
|
299
306
|
|
300
307
|
result: CompileResult = compile_function(last_hash_value=None)
|
@@ -107,7 +107,11 @@ class CompileServerImpl:
|
|
107
107
|
if not self.ping():
|
108
108
|
raise RuntimeError("Server is not running")
|
109
109
|
out: CompileResult = web_compile(
|
110
|
-
directory,
|
110
|
+
directory,
|
111
|
+
host=self.url(),
|
112
|
+
build_mode=build_mode,
|
113
|
+
profile=profile,
|
114
|
+
no_platformio=self.no_platformio,
|
111
115
|
)
|
112
116
|
return out
|
113
117
|
|
@@ -0,0 +1,165 @@
|
|
1
|
+
from pathlib import Path
|
2
|
+
|
3
|
+
from rapidfuzz import fuzz
|
4
|
+
|
5
|
+
|
6
|
+
def _filter_out_obvious_bad_choices(
|
7
|
+
input_str: str, string_list: list[str]
|
8
|
+
) -> list[str]:
|
9
|
+
"""
|
10
|
+
Filter out strings that are too different from the input string.
|
11
|
+
This is a heuristic and may not be perfect.
|
12
|
+
"""
|
13
|
+
if not input_str.strip(): # Handle empty input
|
14
|
+
return string_list
|
15
|
+
|
16
|
+
input_chars = set(input_str.lower())
|
17
|
+
filtered_list = []
|
18
|
+
for s in string_list:
|
19
|
+
# Check if at least half of the input characters are in the string
|
20
|
+
s_chars = set(s.lower())
|
21
|
+
common_chars = input_chars.intersection(s_chars)
|
22
|
+
if len(common_chars) >= len(input_chars) / 2:
|
23
|
+
filtered_list.append(s)
|
24
|
+
return filtered_list
|
25
|
+
|
26
|
+
|
27
|
+
def is_in_order_match(input_str: str, other: str) -> bool:
|
28
|
+
"""
|
29
|
+
Check if the input string is an in-order match for any string in the list.
|
30
|
+
An in-order match means that the characters of the input string appear
|
31
|
+
in the same order in the string from the list, ignoring spaces in the input.
|
32
|
+
"""
|
33
|
+
|
34
|
+
# Remove spaces from input string for matching
|
35
|
+
input_chars = [c.lower() for c in input_str if c != " "]
|
36
|
+
other_chars = [c.lower() for c in other]
|
37
|
+
input_index = 0
|
38
|
+
other_index = 0
|
39
|
+
while input_index < len(input_chars) and other_index < len(other_chars):
|
40
|
+
if input_chars[input_index] == other_chars[other_index]:
|
41
|
+
input_index += 1
|
42
|
+
other_index += 1
|
43
|
+
# If we reached the end of the input string, it means all characters were found in order
|
44
|
+
if input_index == len(input_chars):
|
45
|
+
return True
|
46
|
+
return False
|
47
|
+
|
48
|
+
|
49
|
+
# Returns the min distance strings. If there is a tie, it returns
|
50
|
+
# all the strings that have the same min distance.
|
51
|
+
# Returns a tuple of index and string.
|
52
|
+
def string_diff(
|
53
|
+
input_string: str, string_list: list[str], ignore_case=True
|
54
|
+
) -> list[tuple[float, str]]:
|
55
|
+
|
56
|
+
def normalize(s: str) -> str:
|
57
|
+
return s.lower() if ignore_case else s
|
58
|
+
|
59
|
+
# Handle empty input or empty list
|
60
|
+
if not input_string.strip():
|
61
|
+
# Return all strings with equal distance for empty input
|
62
|
+
return [(i, s) for i, s in enumerate(string_list)]
|
63
|
+
|
64
|
+
if not string_list:
|
65
|
+
return []
|
66
|
+
|
67
|
+
map_string: dict[str, str] = {}
|
68
|
+
|
69
|
+
if ignore_case:
|
70
|
+
map_string = {s.lower(): s for s in string_list}
|
71
|
+
else:
|
72
|
+
map_string = {s: s for s in string_list}
|
73
|
+
|
74
|
+
original_string_list = string_list.copy()
|
75
|
+
if ignore_case:
|
76
|
+
string_list = [s.lower() for s in string_list]
|
77
|
+
input_string = input_string.lower()
|
78
|
+
|
79
|
+
# Check for exact matches, but also check if there are other substring matches
|
80
|
+
exact_matches = [s for s in string_list if s == input_string]
|
81
|
+
substring_matches = [s for s in string_list if input_string in s]
|
82
|
+
|
83
|
+
# If there's an exact match AND other substring matches, return all substring matches
|
84
|
+
# This provides better user experience for partial matching
|
85
|
+
if exact_matches and len(substring_matches) > 1:
|
86
|
+
out: list[tuple[float, str]] = []
|
87
|
+
for i, s in enumerate(substring_matches):
|
88
|
+
s_mapped = map_string.get(s, s)
|
89
|
+
out.append((i, s_mapped))
|
90
|
+
return out
|
91
|
+
|
92
|
+
# If there's only an exact match and no other substring matches, return just the exact match
|
93
|
+
if exact_matches and len(substring_matches) == 1:
|
94
|
+
out: list[tuple[float, str]] = []
|
95
|
+
for i, s in enumerate(exact_matches):
|
96
|
+
s_mapped = map_string.get(s, s)
|
97
|
+
out.append((i, s_mapped))
|
98
|
+
return out
|
99
|
+
|
100
|
+
# Apply set membership filtering for queries with 3+ characters
|
101
|
+
if len(input_string.strip()) >= 3:
|
102
|
+
filtered = _filter_out_obvious_bad_choices(input_string, string_list)
|
103
|
+
if filtered: # Only apply filter if it doesn't eliminate everything
|
104
|
+
string_list = filtered
|
105
|
+
|
106
|
+
# Second filter: exact substring filtering if applicable
|
107
|
+
if substring_matches:
|
108
|
+
string_list = substring_matches
|
109
|
+
# Return all substring matches
|
110
|
+
out: list[tuple[float, str]] = []
|
111
|
+
for i, s in enumerate(string_list):
|
112
|
+
s_mapped = map_string.get(s, s)
|
113
|
+
out.append((i, s_mapped))
|
114
|
+
return out
|
115
|
+
|
116
|
+
# Third filter: in order exact match filtering if applicable.
|
117
|
+
in_order_matches = [s for s in string_list if is_in_order_match(input_string, s)]
|
118
|
+
if in_order_matches:
|
119
|
+
string_list = in_order_matches
|
120
|
+
|
121
|
+
# Calculate distances
|
122
|
+
distances: list[float] = []
|
123
|
+
for s in string_list:
|
124
|
+
dist = fuzz.token_sort_ratio(normalize(input_string), normalize(s))
|
125
|
+
distances.append(1.0 / (dist + 1.0))
|
126
|
+
|
127
|
+
# Handle case where no strings remain after filtering
|
128
|
+
if not distances:
|
129
|
+
# Fall back to original list and calculate distances
|
130
|
+
string_list = original_string_list.copy()
|
131
|
+
if ignore_case:
|
132
|
+
string_list = [s.lower() for s in string_list]
|
133
|
+
|
134
|
+
distances = []
|
135
|
+
for s in string_list:
|
136
|
+
dist = fuzz.token_sort_ratio(normalize(input_string), normalize(s))
|
137
|
+
distances.append(1.0 / (dist + 1.0))
|
138
|
+
|
139
|
+
min_distance = min(distances)
|
140
|
+
out: list[tuple[float, str]] = []
|
141
|
+
for i, d in enumerate(distances):
|
142
|
+
if d == min_distance:
|
143
|
+
s = string_list[i]
|
144
|
+
s_mapped = map_string.get(s, s)
|
145
|
+
out.append((i, s_mapped))
|
146
|
+
|
147
|
+
return out
|
148
|
+
|
149
|
+
|
150
|
+
def string_diff_paths(
|
151
|
+
input_string: str | Path, path_list: list[Path], ignore_case=True
|
152
|
+
) -> list[tuple[float, Path]]:
|
153
|
+
# Normalize path separators to forward slashes for consistent comparison
|
154
|
+
string_list = [str(p).replace("\\", "/") for p in path_list]
|
155
|
+
input_str = str(input_string).replace("\\", "/")
|
156
|
+
|
157
|
+
tmp = string_diff(input_str, string_list, ignore_case)
|
158
|
+
out: list[tuple[float, Path]] = []
|
159
|
+
for i, j in tmp:
|
160
|
+
# Find the original path that matches the normalized result
|
161
|
+
for idx, orig_path in enumerate(path_list):
|
162
|
+
if str(orig_path).replace("\\", "/") == j:
|
163
|
+
out.append((i, orig_path))
|
164
|
+
break
|
165
|
+
return out
|
@@ -195,6 +195,7 @@ def web_compile(
|
|
195
195
|
auth_token: str | None = None,
|
196
196
|
build_mode: BuildMode | None = None,
|
197
197
|
profile: bool = False,
|
198
|
+
no_platformio: bool = False,
|
198
199
|
) -> CompileResult:
|
199
200
|
start_time = time.time()
|
200
201
|
if isinstance(directory, str):
|
@@ -249,6 +250,7 @@ def web_compile(
|
|
249
250
|
else BuildMode.QUICK.value.lower()
|
250
251
|
),
|
251
252
|
"profile": "true" if profile else "false",
|
253
|
+
"no-platformio": "true" if no_platformio else "false",
|
252
254
|
}
|
253
255
|
|
254
256
|
url = f"{connection_result.host}/{ENDPOINT_COMPILED_WASM}"
|
@@ -292,8 +294,16 @@ def web_compile(
|
|
292
294
|
# Read stdout from out.txt if it exists
|
293
295
|
stdout_file = extract_path / "out.txt"
|
294
296
|
hash_file = extract_path / "hash.txt"
|
295
|
-
stdout =
|
296
|
-
|
297
|
+
stdout = (
|
298
|
+
stdout_file.read_text(encoding="utf-8", errors="replace")
|
299
|
+
if stdout_file.exists()
|
300
|
+
else ""
|
301
|
+
)
|
302
|
+
hash_value = (
|
303
|
+
hash_file.read_text(encoding="utf-8", errors="replace")
|
304
|
+
if hash_file.exists()
|
305
|
+
else None
|
306
|
+
)
|
297
307
|
|
298
308
|
# now rezip the extracted files since we added the embedded json files
|
299
309
|
out_buffer = io.BytesIO()
|
@@ -46,6 +46,7 @@ demo/micdemo.html
|
|
46
46
|
demo/mp3upload.html
|
47
47
|
demo/webgl_postprocessing_unreal_bloom.html
|
48
48
|
src/fastled/__init__.py
|
49
|
+
src/fastled/__main__.py
|
49
50
|
src/fastled/__version__.py
|
50
51
|
src/fastled/app.py
|
51
52
|
src/fastled/args.py
|
@@ -109,6 +110,7 @@ tests/unit/test_project_init.py
|
|
109
110
|
tests/unit/test_server_and_client_seperatly.py
|
110
111
|
tests/unit/test_session_compile.py
|
111
112
|
tests/unit/test_string_diff.py
|
113
|
+
tests/unit/test_string_diff_comprehensive.py
|
112
114
|
tests/unit/test_version.py
|
113
115
|
tests/unit/test_webcompile.py
|
114
116
|
tests/unit/html/index.html
|