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.
Files changed (128) hide show
  1. {fastled-1.3.35 → fastled-1.3.37}/PKG-INFO +1 -1
  2. {fastled-1.3.35 → fastled-1.3.37}/compiler/run.py +1 -1
  3. fastled-1.3.37/requirements.docker.txt +1 -0
  4. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/__init__.py +6 -1
  5. fastled-1.3.37/src/fastled/__main__.py +14 -0
  6. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/__version__.py +1 -1
  7. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/client_server.py +8 -1
  8. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/compile_server_impl.py +5 -1
  9. fastled-1.3.37/src/fastled/string_diff.py +165 -0
  10. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/web_compile.py +12 -2
  11. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/PKG-INFO +1 -1
  12. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/SOURCES.txt +2 -0
  13. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_cli_no_platformio.py +2 -0
  14. fastled-1.3.37/tests/unit/test_no_platformio_compile.py +427 -0
  15. fastled-1.3.37/tests/unit/test_string_diff_comprehensive.py +581 -0
  16. fastled-1.3.35/requirements.docker.txt +0 -1
  17. fastled-1.3.35/src/fastled/string_diff.py +0 -115
  18. fastled-1.3.35/tests/unit/test_no_platformio_compile.py +0 -472
  19. {fastled-1.3.35 → fastled-1.3.37}/.aiderignore +0 -0
  20. {fastled-1.3.35 → fastled-1.3.37}/.cursorrules +0 -0
  21. {fastled-1.3.35 → fastled-1.3.37}/.dockerignore +0 -0
  22. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/build_multi_docker_image.yml +0 -0
  23. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/build_webpage.yml +0 -0
  24. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/lint.yml +0 -0
  25. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/publish_release.yml +0 -0
  26. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/template_build_docker_image.yml +0 -0
  27. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_build_exe.yml +0 -0
  28. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_macos.yml +0 -0
  29. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_ubuntu.yml +0 -0
  30. {fastled-1.3.35 → fastled-1.3.37}/.github/workflows/test_win.yml +0 -0
  31. {fastled-1.3.35 → fastled-1.3.37}/.gitignore +0 -0
  32. {fastled-1.3.35 → fastled-1.3.37}/.pylintrc +0 -0
  33. {fastled-1.3.35 → fastled-1.3.37}/.vscode/launch.json +0 -0
  34. {fastled-1.3.35 → fastled-1.3.37}/.vscode/settings.json +0 -0
  35. {fastled-1.3.35 → fastled-1.3.37}/.vscode/tasks.json +0 -0
  36. {fastled-1.3.35 → fastled-1.3.37}/DEBUGGER.md +0 -0
  37. {fastled-1.3.35 → fastled-1.3.37}/Dockerfile +0 -0
  38. {fastled-1.3.35 → fastled-1.3.37}/FAQ.md +0 -0
  39. {fastled-1.3.35 → fastled-1.3.37}/LICENSE +0 -0
  40. {fastled-1.3.35 → fastled-1.3.37}/MANIFEST.in +0 -0
  41. {fastled-1.3.35 → fastled-1.3.37}/README.md +0 -0
  42. {fastled-1.3.35 → fastled-1.3.37}/RELEASE.md +0 -0
  43. {fastled-1.3.35 → fastled-1.3.37}/TODO.md +0 -0
  44. {fastled-1.3.35 → fastled-1.3.37}/build_exe.py +0 -0
  45. {fastled-1.3.35 → fastled-1.3.37}/build_local_docker.py +0 -0
  46. {fastled-1.3.35 → fastled-1.3.37}/build_site.py +0 -0
  47. {fastled-1.3.35 → fastled-1.3.37}/clean +0 -0
  48. {fastled-1.3.35 → fastled-1.3.37}/compiler/debug.sh +0 -0
  49. {fastled-1.3.35 → fastled-1.3.37}/demo/100dots.html +0 -0
  50. {fastled-1.3.35 → fastled-1.3.37}/demo/demo_threejs.html +0 -0
  51. {fastled-1.3.35 → fastled-1.3.37}/demo/micdemo.html +0 -0
  52. {fastled-1.3.35 → fastled-1.3.37}/demo/mp3upload.html +0 -0
  53. {fastled-1.3.35 → fastled-1.3.37}/demo/webgl_postprocessing_unreal_bloom.html +0 -0
  54. {fastled-1.3.35 → fastled-1.3.37}/docker-compose.yml +0 -0
  55. {fastled-1.3.35 → fastled-1.3.37}/entrypoint.sh +0 -0
  56. {fastled-1.3.35 → fastled-1.3.37}/install +0 -0
  57. {fastled-1.3.35 → fastled-1.3.37}/install_linux.sh +0 -0
  58. {fastled-1.3.35 → fastled-1.3.37}/lint +0 -0
  59. {fastled-1.3.35 → fastled-1.3.37}/pyproject.toml +0 -0
  60. {fastled-1.3.35 → fastled-1.3.37}/requirements.testing.txt +0 -0
  61. {fastled-1.3.35 → fastled-1.3.37}/setup.cfg +0 -0
  62. {fastled-1.3.35 → fastled-1.3.37}/setup.py +0 -0
  63. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/app.py +0 -0
  64. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/args.py +0 -0
  65. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/example.txt +0 -0
  66. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/localhost-key.pem +0 -0
  67. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/assets/localhost.pem +0 -0
  68. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli.py +0 -0
  69. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli_test.py +0 -0
  70. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/cli_test_interactive.py +0 -0
  71. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/compile_server.py +0 -0
  72. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/docker_manager.py +0 -0
  73. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/filewatcher.py +0 -0
  74. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/keyboard.py +0 -0
  75. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/keyz.py +0 -0
  76. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/live_client.py +0 -0
  77. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/open_browser.py +0 -0
  78. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/parse_args.py +0 -0
  79. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/paths.py +0 -0
  80. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/print_filter.py +0 -0
  81. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/project_init.py +0 -0
  82. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/select_sketch_directory.py +0 -0
  83. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/server_flask.py +0 -0
  84. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/server_start.py +0 -0
  85. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/settings.py +0 -0
  86. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/site/build.py +0 -0
  87. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/site/examples.py +0 -0
  88. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/sketch.py +0 -0
  89. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/spinner.py +0 -0
  90. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/test/can_run_local_docker_tests.py +0 -0
  91. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/test/examples.py +0 -0
  92. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/types.py +0 -0
  93. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/util.py +0 -0
  94. {fastled-1.3.35 → fastled-1.3.37}/src/fastled/version.py +0 -0
  95. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/dependency_links.txt +0 -0
  96. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/entry_points.txt +0 -0
  97. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/requires.txt +0 -0
  98. {fastled-1.3.35 → fastled-1.3.37}/src/fastled.egg-info/top_level.txt +0 -0
  99. {fastled-1.3.35 → fastled-1.3.37}/test +0 -0
  100. {fastled-1.3.35 → fastled-1.3.37}/tests/integration/test_build_examples.py +0 -0
  101. {fastled-1.3.35 → fastled-1.3.37}/tests/integration/test_examples.py +0 -0
  102. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/html/index.html +0 -0
  103. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_api.py +0 -0
  104. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_bad_ino.py +0 -0
  105. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_banner_string.py +0 -0
  106. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_cli.py +0 -0
  107. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_compile_server.py +0 -0
  108. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_debug_fetch_source_files.py +0 -0
  109. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_docker_linux_on_windows.py +0 -0
  110. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_embedded_data.py +0 -0
  111. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_filechanger.py +0 -0
  112. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_flask_headers.py +0 -0
  113. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_http_server.py +0 -0
  114. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad/bad.ino +0 -0
  115. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad_platformio/bad_platformio.ino +0 -0
  116. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/bad_platformio/platformio.ini +0 -0
  117. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/embedded/data/bigdata.dat +0 -0
  118. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/embedded/wasm.ino +0 -0
  119. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_ino/wasm/wasm.ino +0 -0
  120. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_manual_api_invocation.py +0 -0
  121. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_project_init.py +0 -0
  122. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_server_and_client_seperatly.py +0 -0
  123. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_session_compile.py +0 -0
  124. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_string_diff.py +0 -0
  125. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_version.py +0 -0
  126. {fastled-1.3.35 → fastled-1.3.37}/tests/unit/test_webcompile.py +0 -0
  127. {fastled-1.3.35 → fastled-1.3.37}/upload_package.sh +0 -0
  128. {fastled-1.3.35 → fastled-1.3.37}/vscode-plugin/readme +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.3.35
3
+ Version: 1.3.37
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -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.compiler import 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, host, build_mode=build_mode, profile=profile
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.35"
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, host=host, build_mode=build_mode, profile=profile
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, host=self.url(), build_mode=build_mode, profile=profile
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 = stdout_file.read_text() if stdout_file.exists() else ""
296
- hash_value = hash_file.read_text() if hash_file.exists() else None
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()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.3.35
3
+ Version: 1.3.37
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -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
@@ -110,6 +110,8 @@ class CLINoPlatformIOTest(unittest.TestCase):
110
110
  cwd=WORKSPACE_ROOT,
111
111
  capture_output=True,
112
112
  text=True,
113
+ encoding="utf-8",
114
+ errors="replace",
113
115
  timeout=180, # 3 minutes timeout
114
116
  )
115
117