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