fastled 1.4.39__tar.gz → 1.4.41__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 (148) hide show
  1. {fastled-1.4.39 → fastled-1.4.41}/PKG-INFO +1 -1
  2. {fastled-1.4.39 → fastled-1.4.41}/build_local_docker.py +0 -2
  3. {fastled-1.4.39 → fastled-1.4.41}/setup.py +0 -2
  4. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/__version__.py +1 -1
  5. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/string_diff.py +94 -8
  6. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/PKG-INFO +1 -1
  7. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_manual_api_invocation.py +1 -0
  8. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_string_diff_comprehensive.py +55 -0
  9. {fastled-1.4.39 → fastled-1.4.41}/.aiderignore +0 -0
  10. {fastled-1.4.39 → fastled-1.4.41}/.claude/settings.local.json +0 -0
  11. {fastled-1.4.39 → fastled-1.4.41}/.cursorrules +0 -0
  12. {fastled-1.4.39 → fastled-1.4.41}/.dockerignore +0 -0
  13. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/build_multi_docker_image.yml +0 -0
  14. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/build_webpage.yml +0 -0
  15. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/lint.yml +0 -0
  16. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/publish_release.yml +0 -0
  17. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/template_build_docker_image.yml +0 -0
  18. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/test_build_exe.yml +0 -0
  19. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/test_macos.yml +0 -0
  20. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/test_ubuntu.yml +0 -0
  21. {fastled-1.4.39 → fastled-1.4.41}/.github/workflows/test_win.yml +0 -0
  22. {fastled-1.4.39 → fastled-1.4.41}/.gitignore +0 -0
  23. {fastled-1.4.39 → fastled-1.4.41}/.pylintrc +0 -0
  24. {fastled-1.4.39 → fastled-1.4.41}/.vscode/launch.json +0 -0
  25. {fastled-1.4.39 → fastled-1.4.41}/.vscode/settings.json +0 -0
  26. {fastled-1.4.39 → fastled-1.4.41}/.vscode/tasks.json +0 -0
  27. {fastled-1.4.39 → fastled-1.4.41}/DEBUGGER.md +0 -0
  28. {fastled-1.4.39 → fastled-1.4.41}/Dockerfile +0 -0
  29. {fastled-1.4.39 → fastled-1.4.41}/EXTENDED_INO.md +0 -0
  30. {fastled-1.4.39 → fastled-1.4.41}/FAQ.md +0 -0
  31. {fastled-1.4.39 → fastled-1.4.41}/LICENSE +0 -0
  32. {fastled-1.4.39 → fastled-1.4.41}/MANIFEST.in +0 -0
  33. {fastled-1.4.39 → fastled-1.4.41}/README.md +0 -0
  34. {fastled-1.4.39 → fastled-1.4.41}/RELEASE.md +0 -0
  35. {fastled-1.4.39 → fastled-1.4.41}/TODO.md +0 -0
  36. {fastled-1.4.39 → fastled-1.4.41}/build_exe.py +0 -0
  37. {fastled-1.4.39 → fastled-1.4.41}/build_site.py +0 -0
  38. {fastled-1.4.39 → fastled-1.4.41}/chrome_vscode_bridge_design_task.md +0 -0
  39. {fastled-1.4.39 → fastled-1.4.41}/clean +0 -0
  40. {fastled-1.4.39 → fastled-1.4.41}/compiler/debug.sh +0 -0
  41. {fastled-1.4.39 → fastled-1.4.41}/compiler/run.py +0 -0
  42. {fastled-1.4.39 → fastled-1.4.41}/demo/100dots.html +0 -0
  43. {fastled-1.4.39 → fastled-1.4.41}/demo/demo_threejs.html +0 -0
  44. {fastled-1.4.39 → fastled-1.4.41}/demo/micdemo.html +0 -0
  45. {fastled-1.4.39 → fastled-1.4.41}/demo/mp3upload.html +0 -0
  46. {fastled-1.4.39 → fastled-1.4.41}/demo/webgl_postprocessing_unreal_bloom.html +0 -0
  47. {fastled-1.4.39 → fastled-1.4.41}/docker-compose.yml +0 -0
  48. {fastled-1.4.39 → fastled-1.4.41}/entrypoint.sh +0 -0
  49. {fastled-1.4.39 → fastled-1.4.41}/install +0 -0
  50. {fastled-1.4.39 → fastled-1.4.41}/install_linux.sh +0 -0
  51. {fastled-1.4.39 → fastled-1.4.41}/lint +0 -0
  52. {fastled-1.4.39 → fastled-1.4.41}/pyproject.toml +0 -0
  53. {fastled-1.4.39 → fastled-1.4.41}/requirements.docker.txt +0 -0
  54. {fastled-1.4.39 → fastled-1.4.41}/requirements.testing.txt +0 -0
  55. {fastled-1.4.39 → fastled-1.4.41}/setup.cfg +0 -0
  56. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/__init__.py +0 -0
  57. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/__main__.py +0 -0
  58. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/app.py +0 -0
  59. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/args.py +0 -0
  60. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/assets/example.txt +0 -0
  61. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/assets/localhost-key.pem +0 -0
  62. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/assets/localhost.pem +0 -0
  63. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/cli.py +0 -0
  64. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/cli_test.py +0 -0
  65. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/cli_test_interactive.py +0 -0
  66. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/client_server.py +0 -0
  67. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/compile_server.py +0 -0
  68. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/compile_server_impl.py +0 -0
  69. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/docker_manager.py +0 -0
  70. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/emoji_util.py +0 -0
  71. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/filewatcher.py +0 -0
  72. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/find_good_connection.py +0 -0
  73. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/header_dump.py +0 -0
  74. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/__init__.py +0 -0
  75. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/examples_manager.py +0 -0
  76. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/extension_manager.py +0 -0
  77. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/main.py +0 -0
  78. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/project_detection.py +0 -0
  79. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/test_install.py +0 -0
  80. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/install/vscode_config.py +0 -0
  81. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/interruptible_http.py +0 -0
  82. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/keyboard.py +0 -0
  83. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/keyz.py +0 -0
  84. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/live_client.py +0 -0
  85. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/open_browser.py +0 -0
  86. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/parse_args.py +0 -0
  87. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/paths.py +0 -0
  88. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/playwright/chrome_extension_downloader.py +0 -0
  89. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/playwright/playwright_browser.py +0 -0
  90. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/playwright/resize_tracking.py +0 -0
  91. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/print_filter.py +0 -0
  92. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/project_init.py +0 -0
  93. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/select_sketch_directory.py +0 -0
  94. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/server_flask.py +0 -0
  95. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/server_start.py +0 -0
  96. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/settings.py +0 -0
  97. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/site/build.py +0 -0
  98. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/site/examples.py +0 -0
  99. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/sketch.py +0 -0
  100. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/spinner.py +0 -0
  101. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/test/can_run_local_docker_tests.py +0 -0
  102. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/test/examples.py +0 -0
  103. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/types.py +0 -0
  104. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/util.py +0 -0
  105. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/version.py +0 -0
  106. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/web_compile.py +0 -0
  107. {fastled-1.4.39 → fastled-1.4.41}/src/fastled/zip_files.py +0 -0
  108. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/SOURCES.txt +0 -0
  109. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/dependency_links.txt +0 -0
  110. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/entry_points.txt +0 -0
  111. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/requires.txt +0 -0
  112. {fastled-1.4.39 → fastled-1.4.41}/src/fastled.egg-info/top_level.txt +0 -0
  113. {fastled-1.4.39 → fastled-1.4.41}/task.md +0 -0
  114. {fastled-1.4.39 → fastled-1.4.41}/task2.md +0 -0
  115. {fastled-1.4.39 → fastled-1.4.41}/test +0 -0
  116. {fastled-1.4.39 → fastled-1.4.41}/tests/integration/test_build_examples.py +0 -0
  117. {fastled-1.4.39 → fastled-1.4.41}/tests/integration/test_examples.py +0 -0
  118. {fastled-1.4.39 → fastled-1.4.41}/tests/integration/test_libcompile.py +0 -0
  119. {fastled-1.4.39 → fastled-1.4.41}/tests/integration/test_playwright_integration.py +0 -0
  120. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/html/index.html +0 -0
  121. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_api.py +0 -0
  122. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_bad_ino.py +0 -0
  123. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_banner_string.py +0 -0
  124. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_cli.py +0 -0
  125. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_cli_no_platformio.py +0 -0
  126. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_compile_server.py +0 -0
  127. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_debug_fetch_source_files.py +0 -0
  128. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_docker_linux_on_windows.py +0 -0
  129. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_embedded_data.py +0 -0
  130. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_filechanger.py +0 -0
  131. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_flask_headers.py +0 -0
  132. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_header_dump.py +0 -0
  133. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_http_server.py +0 -0
  134. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/bad/bad.ino +0 -0
  135. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/bad_platformio/bad_platformio.ino +0 -0
  136. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/bad_platformio/platformio.ini +0 -0
  137. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/embedded/data/bigdata.dat +0 -0
  138. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/embedded/wasm.ino +0 -0
  139. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_ino/wasm/wasm.ino +0 -0
  140. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_no_platformio_compile.py +0 -0
  141. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_project_init.py +0 -0
  142. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_server_and_client_seperatly.py +0 -0
  143. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_session_compile.py +0 -0
  144. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_string_diff.py +0 -0
  145. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_version.py +0 -0
  146. {fastled-1.4.39 → fastled-1.4.41}/tests/unit/test_webcompile.py +0 -0
  147. {fastled-1.4.39 → fastled-1.4.41}/upload_package.sh +0 -0
  148. {fastled-1.4.39 → fastled-1.4.41}/vscode-plugin/readme +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.4.39
3
+ Version: 1.4.41
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -9,8 +9,6 @@
9
9
  # "python-dateutil"
10
10
  # ]
11
11
 
12
- import os
13
- import shutil
14
12
  import subprocess
15
13
 
16
14
  def _exec(cmd: str) -> int:
@@ -3,8 +3,6 @@ Setup file.
3
3
  """
4
4
 
5
5
  import os
6
- import re
7
- from pathlib import Path
8
6
 
9
7
  from setuptools import setup
10
8
 
@@ -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.4.39"
4
+ __version__ = "1.4.41"
5
5
 
6
6
  __version_url_latest__ = "https://raw.githubusercontent.com/zackees/fastled-wasm/refs/heads/main/src/fastled/__version__.py"
@@ -80,14 +80,100 @@ def string_diff(
80
80
  exact_matches = [s for s in string_list if s == input_string]
81
81
  substring_matches = [s for s in string_list if input_string in s]
82
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
83
+ # If there's exactly one exact match, and there are substring matches,
84
+ # check if we should prioritize the exact match or return all variants
85
+ if len(exact_matches) == 1 and len(substring_matches) > 1:
86
+ exact_match = exact_matches[0]
87
+ other_substring_matches = [s for s in substring_matches if s != exact_match]
88
+
89
+ # Prioritize exact match only if it appears at the start of other matches
90
+ # AND those matches have a camelCase boundary (indicating compound words)
91
+ # We need to use the original (non-lowercased) strings for camelCase detection
92
+ should_prioritize_exact = True
93
+ original_exact_match = map_string[exact_match] # Get the original casing
94
+
95
+ for other_match in other_substring_matches:
96
+ original_other_match = map_string[other_match] # Get the original casing
97
+
98
+ if not original_other_match.lower().startswith(
99
+ original_exact_match.lower()
100
+ ):
101
+ # If the exact match isn't at the start, don't prioritize
102
+ should_prioritize_exact = False
103
+ break
104
+
105
+ # Check for camelCase boundary after the exact match in the ORIGINAL string
106
+ remainder = original_other_match[len(original_exact_match) :]
107
+ if remainder and remainder[0].isupper():
108
+ # Only prioritize exact match if the exact match is very short (4 chars or less)
109
+ # AND the remainder suggests a different concept
110
+ if len(original_exact_match) <= 4 and len(remainder) >= 6:
111
+ # This looks like a camelCase compound word (e.g., "wasm" -> "WasmScreenCoords")
112
+ continue
113
+ else:
114
+ # This looks like a variant (e.g., "Noise" -> "NoisePlayground", "Fire2012" -> "Fire2012WithPalette")
115
+ should_prioritize_exact = False
116
+ break
117
+ else:
118
+ # This looks like a variant/extension (e.g., "Blur" -> "Blur2d")
119
+ should_prioritize_exact = False
120
+ break
121
+
122
+ if should_prioritize_exact:
123
+ out: list[tuple[float, str]] = []
124
+ for i, s in enumerate(exact_matches):
125
+ s_mapped = map_string.get(s, s)
126
+ out.append((i, s_mapped))
127
+ return out
128
+ else:
129
+ # Apply character count filtering only for very specific compound terms
130
+ # Main criteria: contains numbers AND ends with numbers/letters (like Wave2d, Fire2012)
131
+ original_exact_match = map_string[exact_match]
132
+ should_apply_char_filter = (
133
+ len(original_exact_match) >= 5 # Longer terms
134
+ and any(c.isdigit() for c in original_exact_match) # Contains numbers
135
+ and (
136
+ original_exact_match[-1].isdigit()
137
+ or original_exact_match[-1].islower()
138
+ ) # Ends specifically (compound pattern)
139
+ )
140
+
141
+ if should_apply_char_filter:
142
+ # Filter substring matches based on extra character count
143
+ # Use a more lenient threshold for shorter base terms
144
+ if len(original_exact_match) <= 6:
145
+ # For short terms, allow more extra chars (e.g., "Wave2d" + "FxWave2d")
146
+ MAX_EXTRA_CHARS = min(10, len(original_exact_match) * 2)
147
+ else:
148
+ # For longer terms, allow significant extensions (e.g., "Fire2012" + "Fire2012WithPalette")
149
+ MAX_EXTRA_CHARS = 12
150
+
151
+ filtered_matches = []
152
+
153
+ for s in substring_matches:
154
+ original_s = map_string[s]
155
+ if s == exact_match:
156
+ # Always include the exact match
157
+ filtered_matches.append(s)
158
+ else:
159
+ # Calculate extra characters
160
+ extra_chars = len(original_s) - len(original_exact_match)
161
+ if extra_chars <= MAX_EXTRA_CHARS:
162
+ filtered_matches.append(s)
163
+
164
+ # Return filtered matches
165
+ out: list[tuple[float, str]] = []
166
+ for i, s in enumerate(filtered_matches):
167
+ s_mapped = map_string.get(s, s) or s
168
+ out.append((i, s_mapped))
169
+ return out
170
+ else:
171
+ # Return all substring matches (original behavior for base terms)
172
+ out: list[tuple[float, str]] = []
173
+ for i, s in enumerate(substring_matches):
174
+ s_mapped = map_string.get(s, s) or s
175
+ out.append((i, s_mapped))
176
+ return out
91
177
 
92
178
  # If there's only an exact match and no other substring matches, return just the exact match
93
179
  if exact_matches and len(substring_matches) == 1:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.4.39
3
+ Version: 1.4.41
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -1,3 +1,4 @@
1
+ # -*- coding: utf-8 -*-
1
2
  """
2
3
  Unit test file demonstrating manual API invocation of fastled-wasm-server.
3
4
 
@@ -511,6 +511,59 @@ class TestStringDiffComprehensive:
511
511
  results1 == results2 == results3
512
512
  ), f"Results inconsistent for '{test_case}'"
513
513
 
514
+ def test_wasm_disambiguation_issue(self):
515
+ """Test the specific Wasm disambiguation issue where exact matches should be prioritized."""
516
+ # This test exposes the bug where "Wasm" returns both "wasm" and "WasmScreenCoords"
517
+ # when it should prioritize the exact case-insensitive match "wasm"
518
+ results = string_diff("Wasm", self.fastled_examples)
519
+ result_names = [r[1] for r in results]
520
+
521
+ # The issue: currently returns both "wasm" and "WasmScreenCoords"
522
+ # Expected: should only return "wasm" since it's an exact case-insensitive match
523
+ assert (
524
+ len(result_names) == 1
525
+ ), f"Expected exactly 1 result for 'Wasm', got {len(result_names)}: {result_names}"
526
+ assert (
527
+ result_names[0] == "wasm"
528
+ ), f"Expected 'wasm' as the only result, got: {result_names[0]}"
529
+
530
+ def test_character_count_based_disambiguation(self):
531
+ """Test that disambiguation considers the number of extra characters."""
532
+ # Test cases where the exact match should include variants based on character count
533
+ test_data = ["Wave2d", "FxWave2d", "SuperLongPrefixWave2d"]
534
+
535
+ # Wave2d case: should return Wave2d and FxWave2d (Fx is only 2 chars - short prefix)
536
+ # but exclude SuperLongPrefixWave2d (SuperLongPrefix is 15 chars - long prefix)
537
+ results = string_diff("Wave2d", test_data)
538
+ result_names = [r[1] for r in results]
539
+
540
+ assert (
541
+ "Wave2d" in result_names
542
+ ), f"Expected 'Wave2d' in results, got: {result_names}"
543
+ assert (
544
+ "FxWave2d" in result_names
545
+ ), f"Expected 'FxWave2d' (short prefix) in results, got: {result_names}"
546
+
547
+ # The key test: should exclude long prefixes
548
+ assert (
549
+ "SuperLongPrefixWave2d" not in result_names
550
+ ), f"Did not expect 'SuperLongPrefixWave2d' (long prefix) in results, got: {result_names}"
551
+
552
+ # Test with Fire2012 example
553
+ fire_data = ["Fire2012", "FxFire2012", "VeryLongPrefixFire2012"]
554
+ results = string_diff("Fire2012", fire_data)
555
+ result_names = [r[1] for r in results]
556
+
557
+ assert (
558
+ "Fire2012" in result_names
559
+ ), f"Expected 'Fire2012' in results, got: {result_names}"
560
+ assert (
561
+ "FxFire2012" in result_names
562
+ ), f"Expected 'FxFire2012' (short prefix) in results, got: {result_names}"
563
+ assert (
564
+ "VeryLongPrefixFire2012" not in result_names
565
+ ), f"Did not expect 'VeryLongPrefixFire2012' (long prefix) in results, got: {result_names}"
566
+
514
567
  def test_investigate_multiple_results(self):
515
568
  """Investigate cases where multiple results are returned and understand why."""
516
569
  # Test cases that might return multiple results
@@ -564,6 +617,8 @@ if __name__ == "__main__":
564
617
  test_instance.test_special_characters_in_input,
565
618
  test_instance.test_performance_with_large_dataset,
566
619
  test_instance.test_consistency_across_runs,
620
+ test_instance.test_wasm_disambiguation_issue,
621
+ test_instance.test_character_count_based_disambiguation,
567
622
  test_instance.test_investigate_multiple_results,
568
623
  ]
569
624
 
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