fastled 1.2.82__py3-none-any.whl → 1.2.84__py3-none-any.whl

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/__init__.py CHANGED
@@ -14,7 +14,7 @@ from .types import BuildMode, CompileResult, CompileServerError, FileResponse
14
14
  # IMPORTANT! There's a bug in github which will REJECT any version update
15
15
  # that has any other change in the repo. Please bump the version as the
16
16
  # ONLY change in a commit, or else the pypi update and the release will fail.
17
- __version__ = "1.2.82"
17
+ __version__ = "1.2.84"
18
18
 
19
19
 
20
20
  class Api:
fastled/client_server.py CHANGED
@@ -63,6 +63,12 @@ def TEST_BEFORE_COMPILE(url) -> None:
63
63
  pass
64
64
 
65
65
 
66
+ def _chunked_print(stdout: str) -> None:
67
+ lines = stdout.splitlines()
68
+ for line in lines:
69
+ print(line)
70
+
71
+
66
72
  def _run_web_compiler(
67
73
  directory: Path,
68
74
  host: str,
@@ -80,7 +86,7 @@ def _run_web_compiler(
80
86
  if not web_result.success:
81
87
  print("\nWeb compilation failed:")
82
88
  print(f"Time taken: {diff:.2f} seconds")
83
- print(web_result.stdout)
89
+ _chunked_print(web_result.stdout)
84
90
  # Create error page
85
91
  output_dir.mkdir(exist_ok=True)
86
92
  error_html = _create_error_html(web_result.stdout)
@@ -117,7 +123,7 @@ def _run_web_compiler(
117
123
  # Extract zip contents
118
124
  shutil.unpack_archive(temp_zip, output_dir, "zip")
119
125
 
120
- print(web_result.stdout)
126
+ _chunked_print(web_result.stdout)
121
127
  print_results()
122
128
  return web_result
123
129
 
fastled/server_flask.py CHANGED
@@ -1,10 +1,30 @@
1
1
  import argparse
2
+ import logging
3
+ import time
2
4
  from multiprocessing import Process
3
5
  from pathlib import Path
4
6
 
5
- import requests
7
+ import httpx
6
8
  from livereload import Server
7
9
 
10
+ # Logging configuration
11
+ _ENABLE_LOGGING = False # Set to False to disable logging
12
+
13
+ if _ENABLE_LOGGING:
14
+ logging.basicConfig(
15
+ level=logging.INFO,
16
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
17
+ )
18
+ logger = logging.getLogger("flask_server")
19
+ else:
20
+ # Disable all logging
21
+ logging.getLogger("flask_server").addHandler(logging.NullHandler())
22
+ logging.getLogger("flask_server").propagate = False
23
+ logger = logging.getLogger("flask_server")
24
+ logger.disabled = True
25
+
26
+ _DRAWF_SOURCE_PREFIX = "drawfsource/js/fastled/src/"
27
+
8
28
 
9
29
  def _run_flask_server(
10
30
  fastled_js: Path,
@@ -22,117 +42,317 @@ def _run_flask_server(
22
42
  keyfile: Path to the SSL key file
23
43
  """
24
44
  try:
25
- from flask import Flask, send_from_directory
45
+ from flask import Flask, Response, request, send_from_directory
26
46
 
27
47
  app = Flask(__name__)
28
48
 
29
49
  # Must be a full path or flask will fail to find the file.
30
50
  fastled_js = fastled_js.resolve()
31
51
 
32
- print(f"Compile server port is at {compile_server_port}")
52
+ # logger.error(f"Server error: {e}")
53
+
54
+ @app.before_request
55
+ def log_request_info():
56
+ """Log details of each request before processing"""
57
+ if _ENABLE_LOGGING:
58
+ logger.info("=" * 80)
59
+ logger.info(f"Request: {request.method} {request.url}")
60
+ logger.info(f"Headers: {dict(request.headers)}")
61
+ logger.info(f"Args: {dict(request.args)}")
62
+ if request.is_json:
63
+ logger.info(f"JSON: {request.json}")
64
+ if request.form:
65
+ logger.info(f"Form: {dict(request.form)}")
66
+ logger.info(f"Remote addr: {request.remote_addr}")
67
+ logger.info(f"User agent: {request.user_agent}")
33
68
 
34
69
  @app.route("/")
35
70
  def serve_index():
36
- return send_from_directory(fastled_js, "index.html")
37
-
38
- @app.route("/static/<path:path>")
39
- def proxy_static(path):
40
- """Proxy requests to /static/* to the compile server"""
41
- from flask import Response, request
42
-
43
- # Forward the request to the compile server
44
- target_url = f"http://localhost:{compile_server_port}/static/{path}"
45
-
46
- # Forward the request with the same method, headers, and body
47
- resp = requests.request(
48
- method=request.method,
49
- url=target_url,
50
- headers={key: value for key, value in request.headers if key != "Host"},
51
- data=request.get_data(),
52
- cookies=request.cookies,
53
- allow_redirects=True,
54
- stream=False,
55
- )
56
-
57
- # Create a Flask Response object from the requests response
58
- response = Response(
59
- resp.raw.read(), status=resp.status_code, headers=dict(resp.headers)
60
- )
61
-
71
+ if _ENABLE_LOGGING:
72
+ logger.info("Serving index.html")
73
+ response = send_from_directory(fastled_js, "index.html")
74
+ if _ENABLE_LOGGING:
75
+ logger.info(f"Index response status: {response.status_code}")
62
76
  return response
63
77
 
64
78
  @app.route("/sourcefiles/<path:path>")
65
79
  def serve_source_files(path):
66
80
  """Proxy requests to /sourcefiles/* to the compile server"""
67
- from flask import Response, request
81
+ from flask import request
82
+
83
+ start_time = time.time()
84
+ logger.info(f"Serving source file: {path}")
68
85
 
69
86
  # Forward the request to the compile server
70
87
  target_url = f"http://localhost:{compile_server_port}/sourcefiles/{path}"
88
+ logger.info(f"Forwarding to: {target_url}")
89
+
90
+ # Log request headers
91
+ request_headers = {
92
+ key: value for key, value in request.headers if key != "Host"
93
+ }
94
+ logger.debug(f"Request headers: {request_headers}")
71
95
 
72
96
  # Forward the request with the same method, headers, and body
73
- resp = requests.request(
74
- method=request.method,
75
- url=target_url,
76
- headers={key: value for key, value in request.headers if key != "Host"},
77
- data=request.get_data(),
78
- cookies=request.cookies,
79
- allow_redirects=True,
80
- stream=False,
81
- )
82
-
83
- # Create a Flask Response object from the requests response
84
- response = Response(
85
- resp.raw.read(), status=resp.status_code, headers=dict(resp.headers)
86
- )
97
+ try:
98
+ with httpx.Client() as client:
99
+ resp = client.request(
100
+ method=request.method,
101
+ url=target_url,
102
+ headers=request_headers,
103
+ content=request.get_data(),
104
+ cookies=request.cookies,
105
+ follow_redirects=True,
106
+ )
107
+
108
+ logger.info(f"Response status: {resp.status_code}")
109
+ logger.debug(f"Response headers: {dict(resp.headers)}")
110
+
111
+ # Create a Flask Response object from the httpx response
112
+ raw_data = resp.content
113
+ logger.debug(f"Response size: {len(raw_data)} bytes")
114
+
115
+ response = Response(
116
+ raw_data, status=resp.status_code, headers=dict(resp.headers)
117
+ )
118
+
119
+ elapsed_time = time.time() - start_time
120
+ logger.info(f"Request completed in {elapsed_time:.3f} seconds")
121
+
122
+ return response
123
+
124
+ except Exception as e:
125
+ logger.error(f"Error forwarding request: {e}", exc_info=True)
126
+ return Response(f"Error: {str(e)}", status=500)
127
+
128
+ def handle_dwarfsource(path: str) -> Response:
129
+ """Handle requests to /drawfsource/js/fastled/src/"""
130
+ from flask import request
131
+
132
+ start_time = time.time()
133
+ logger.info(f"Processing request: {request.method} {request.url}")
134
+
135
+ if not path.startswith(_DRAWF_SOURCE_PREFIX):
136
+ # unexpected
137
+ error_msg = f"Unexpected path: {path}"
138
+ logger.error(error_msg)
139
+ # Logging disabled
140
+ return Response("Malformed path", status=400)
141
+
142
+ path = path.replace("drawfsource/js/fastled/src/", "")
143
+ logger.info(f"Transformed path: {path}")
87
144
 
88
- return response
145
+ # Forward the request to the compile server
146
+ target_url = f"http://localhost:{compile_server_port}/sourcefiles/{path}"
147
+ logger.info(f"Requesting: {target_url}")
148
+ logger.info(f"Processing dwarfsource request for {path}")
149
+
150
+ # Log request headers
151
+ request_headers = {
152
+ key: value for key, value in request.headers if key != "Host"
153
+ }
154
+ logger.debug(f"Request headers: {request_headers}")
155
+
156
+ try:
157
+ # Forward the request with the same method, headers, and body
158
+ with httpx.Client() as client:
159
+ resp = client.request(
160
+ method=request.method,
161
+ url=target_url,
162
+ headers=request_headers,
163
+ content=request.get_data(),
164
+ cookies=request.cookies,
165
+ follow_redirects=True,
166
+ )
167
+
168
+ logger.info(f"Response status: {resp.status_code}")
169
+ logger.debug(f"Response headers: {dict(resp.headers)}")
170
+
171
+ # Create a Flask Response object from the httpx response
172
+ payload = resp.content
173
+ assert isinstance(payload, bytes)
174
+
175
+ # Check if the payload is empty
176
+ if len(payload) == 0:
177
+ logger.error("Empty payload received from compile server")
178
+ return Response("Empty payload", status=400)
179
+
180
+ response = Response(
181
+ payload, status=resp.status_code, headers=dict(resp.headers)
182
+ )
183
+
184
+ elapsed_time = time.time() - start_time
185
+ logger.info(f"Request completed in {elapsed_time:.3f} seconds")
186
+
187
+ return response
188
+
189
+ except Exception as e:
190
+ logger.error(f"Error handling dwarfsource request: {e}", exc_info=True)
191
+ return Response(f"Error: {str(e)}", status=500)
192
+
193
+ def handle_sourcefile(path: str) -> Response:
194
+ """Handle requests to /sourcefiles/*"""
195
+ from flask import Response, request
89
196
 
90
- @app.route("/<path:path>")
91
- def serve_files(path):
92
- response = send_from_directory(fastled_js, path)
93
- # Some servers don't set the Content-Type header for a bunch of files.
94
- if path.endswith(".js"):
95
- response.headers["Content-Type"] = "application/javascript"
96
- if path.endswith(".css"):
97
- response.headers["Content-Type"] = "text/css"
98
- if path.endswith(".wasm"):
99
- response.headers["Content-Type"] = "application/wasm"
100
- if path.endswith(".json"):
101
- response.headers["Content-Type"] = "application/json"
102
- if path.endswith(".png"):
103
- response.headers["Content-Type"] = "image/png"
104
- if path.endswith(".jpg"):
105
- response.headers["Content-Type"] = "image/jpeg"
106
- if path.endswith(".jpeg"):
107
- response.headers["Content-Type"] = "image/jpeg"
108
- if path.endswith(".gif"):
109
- response.headers["Content-Type"] = "image/gif"
110
- if path.endswith(".svg"):
111
- response.headers["Content-Type"] = "image/svg+xml"
112
- if path.endswith(".ico"):
113
- response.headers["Content-Type"] = "image/x-icon"
114
- if path.endswith(".html"):
115
- response.headers["Content-Type"] = "text/html"
116
-
117
- # now also add headers to force no caching
118
- response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
119
- response.headers["Pragma"] = "no-cache"
120
- response.headers["Expires"] = "0"
121
- return response
197
+ start_time = time.time()
198
+ logger.info("\n##################################")
199
+ logger.info(f"# Serving source file /sourcefiles/ {path}")
200
+ logger.info("##################################\n")
201
+
202
+ logger.info(f"Processing sourcefile request for {path}")
203
+
204
+ # Forward the request to the compile server
205
+ target_url = f"http://localhost:{compile_server_port}/sourcefiles/{path}"
206
+ logger.info(f"Forwarding to: {target_url}")
207
+
208
+ # Log request headers
209
+ request_headers = {
210
+ key: value for key, value in request.headers if key != "Host"
211
+ }
212
+ logger.debug(f"Request headers: {request_headers}")
213
+
214
+ try:
215
+ # Forward the request with the same method, headers, and body
216
+ with httpx.Client() as client:
217
+ resp = client.request(
218
+ method=request.method,
219
+ url=target_url,
220
+ headers=request_headers,
221
+ content=request.get_data(),
222
+ cookies=request.cookies,
223
+ follow_redirects=True,
224
+ )
225
+
226
+ logger.info(f"Response status: {resp.status_code}")
227
+ logger.debug(f"Response headers: {dict(resp.headers)}")
228
+
229
+ # Create a Flask Response object from the httpx response
230
+ raw_data = resp.content
231
+ logger.debug(f"Response size: {len(raw_data)} bytes")
232
+
233
+ response = Response(
234
+ raw_data, status=resp.status_code, headers=dict(resp.headers)
235
+ )
236
+
237
+ elapsed_time = time.time() - start_time
238
+ logger.info(f"Request completed in {elapsed_time:.3f} seconds")
239
+
240
+ return response
241
+
242
+ except Exception as e:
243
+ logger.error(f"Error handling sourcefile request: {e}", exc_info=True)
244
+ return Response(f"Error: {str(e)}", status=500)
245
+
246
+ def handle_local_file_fetch(path: str) -> Response:
247
+ start_time = time.time()
248
+ logger.info("\n##################################")
249
+ logger.info(f"# Serving generic file {path}")
250
+ logger.info("##################################\n")
251
+
252
+ logger.info(f"Processing local file request for {path}")
253
+
254
+ try:
255
+ file_path = fastled_js / path
256
+ logger.info(f"Full file path: {file_path}")
257
+ logger.info(f"File exists: {file_path.exists()}")
258
+
259
+ # Check if file exists before trying to serve it
260
+ if not file_path.exists():
261
+ logger.warning(f"File not found: {file_path}")
262
+ return Response(f"File not found: {path}", status=404)
263
+
264
+ response = send_from_directory(fastled_js, path)
265
+
266
+ # Some servers don't set the Content-Type header for a bunch of files.
267
+ content_type = None
268
+ if path.endswith(".js"):
269
+ content_type = "application/javascript"
270
+ elif path.endswith(".css"):
271
+ content_type = "text/css"
272
+ elif path.endswith(".wasm"):
273
+ content_type = "application/wasm"
274
+ elif path.endswith(".json"):
275
+ content_type = "application/json"
276
+ elif path.endswith(".png"):
277
+ content_type = "image/png"
278
+ elif path.endswith(".jpg") or path.endswith(".jpeg"):
279
+ content_type = "image/jpeg"
280
+ elif path.endswith(".gif"):
281
+ content_type = "image/gif"
282
+ elif path.endswith(".svg"):
283
+ content_type = "image/svg+xml"
284
+ elif path.endswith(".ico"):
285
+ content_type = "image/x-icon"
286
+ elif path.endswith(".html"):
287
+ content_type = "text/html"
288
+
289
+ if content_type:
290
+ logger.info(f"Setting Content-Type to {content_type}")
291
+ response.headers["Content-Type"] = content_type
292
+
293
+ # now also add headers to force no caching
294
+ response.headers["Cache-Control"] = (
295
+ "no-cache, no-store, must-revalidate"
296
+ )
297
+ response.headers["Pragma"] = "no-cache"
298
+ response.headers["Expires"] = "0"
299
+
300
+ logger.info(f"Response status: {response.status_code}")
301
+ logger.debug(f"Response headers: {dict(response.headers)}")
302
+
303
+ elapsed_time = time.time() - start_time
304
+ logger.info(f"Request completed in {elapsed_time:.3f} seconds")
305
+
306
+ return response
307
+
308
+ except Exception as e:
309
+ logger.error(f"Error serving local file {path}: {e}", exc_info=True)
310
+ # Check if this is a FileNotFoundError (which can happen with send_from_directory)
311
+ if isinstance(e, FileNotFoundError):
312
+ return Response(f"File not found: {path}", status=404)
313
+ return Response(f"Error serving file: {str(e)}", status=500)
122
314
 
315
+ @app.route("/<path:path>")
316
+ def serve_files(path: str):
317
+ logger.info(f"Received request for path: {path}")
318
+
319
+ try:
320
+ if path.startswith("drawfsource/"):
321
+ logger.info(f"Handling as drawfsource: {path}")
322
+ return handle_dwarfsource(path)
323
+ elif path.startswith("sourcefiles/"):
324
+ logger.info(f"Handling as sourcefiles: {path}")
325
+ return handle_sourcefile(path)
326
+ else:
327
+ logger.info(f"Handling as local file: {path}")
328
+ return handle_local_file_fetch(path)
329
+ except Exception as e:
330
+ logger.error(f"Error in serve_files for {path}: {e}", exc_info=True)
331
+ return Response(f"Server error: {str(e)}", status=500)
332
+
333
+ @app.errorhandler(Exception)
334
+ def handle_exception(e):
335
+ """Log any uncaught exceptions"""
336
+ logger.error(f"Unhandled exception: {e}", exc_info=True)
337
+ return Response(f"Server error: {str(e)}", status=500)
338
+
339
+ logger.info("Setting up livereload server")
123
340
  server = Server(app.wsgi_app)
124
341
  # Watch index.html for changes
125
342
  server.watch(str(fastled_js / "index.html"))
126
343
  # server.watch(str(fastled_js / "index.js"))
127
344
  # server.watch(str(fastled_js / "index.css"))
128
345
  # Start the server
346
+ logger.info(f"Starting server on port {port}")
129
347
  server.serve(port=port, debug=True)
130
348
  except KeyboardInterrupt:
349
+ logger.info("Server stopped by keyboard interrupt")
131
350
  import _thread
132
351
 
133
352
  _thread.interrupt_main()
134
353
  except Exception as e:
135
- print(f"Failed to run Flask server: {e}")
354
+ logger.error(f"Failed to run Flask server: {e}", exc_info=True)
355
+ logger.info("Flask server thread running")
136
356
  import _thread
137
357
 
138
358
  _thread.interrupt_main()
@@ -147,15 +367,24 @@ def run_flask_in_thread(
147
367
  ) -> None:
148
368
  """Run the Flask server."""
149
369
  try:
150
- _run_flask_server(cwd, port, compile_server_port, certfile, keyfile)
151
- import warnings
370
+ if _ENABLE_LOGGING:
371
+ logger.info(f"Starting Flask server thread on port {port}")
372
+ logger.info(f"Serving files from {cwd}")
373
+ logger.info(f"Compile server port: {compile_server_port}")
374
+ if certfile:
375
+ logger.info(f"Using SSL certificate: {certfile}")
376
+ if keyfile:
377
+ logger.info(f"Using SSL key: {keyfile}")
152
378
 
153
- warnings.warn("Flask server has stopped")
379
+ _run_flask_server(cwd, port, compile_server_port, certfile, keyfile)
154
380
  except KeyboardInterrupt:
381
+ logger.info("Flask server thread stopped by keyboard interrupt")
155
382
  import _thread
156
383
 
157
384
  _thread.interrupt_main()
158
385
  pass
386
+ except Exception as e:
387
+ logger.error(f"Error in Flask server thread: {e}", exc_info=True)
159
388
 
160
389
 
161
390
  def parse_args() -> argparse.Namespace:
@@ -194,18 +423,39 @@ def run_flask_server_process(
194
423
  keyfile: Path | None = None,
195
424
  ) -> Process:
196
425
  """Run the Flask server in a separate process."""
426
+ if _ENABLE_LOGGING:
427
+ logger.info(f"Starting Flask server process on port {port}")
428
+ logger.info(f"Serving files from {cwd}")
429
+ logger.info(f"Compile server port: {compile_server_port}")
430
+
197
431
  process = Process(
198
432
  target=run_flask_in_thread,
199
433
  args=(port, cwd, compile_server_port, certfile, keyfile),
200
434
  )
201
435
  process.start()
436
+ if _ENABLE_LOGGING:
437
+ logger.info(f"Flask server process started with PID {process.pid}")
202
438
  return process
203
439
 
204
440
 
205
441
  def main() -> None:
206
442
  """Main function."""
443
+ if _ENABLE_LOGGING:
444
+ logger.info("Starting main function")
207
445
  args = parse_args()
208
- run_flask_in_thread(args.port, args.fastled_js, args.certfile, args.keyfile)
446
+ if _ENABLE_LOGGING:
447
+ logger.info(f"Arguments: port={args.port}, fastled_js={args.fastled_js}")
448
+ if args.certfile:
449
+ logger.info(f"Using SSL certificate: {args.certfile}")
450
+ if args.keyfile:
451
+ logger.info(f"Using SSL key: {args.keyfile}")
452
+ logger.warning("Note: main() is missing compile_server_port parameter")
453
+
454
+ # Note: This call is missing the compile_server_port parameter
455
+ # This is a bug in the original code
456
+ run_flask_in_thread(args.port, args.fastled_js, 0, args.certfile, args.keyfile)
457
+ if _ENABLE_LOGGING:
458
+ logger.info("Main function completed")
209
459
 
210
460
 
211
461
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.2.82
3
+ Version: 1.2.84
4
4
  Summary: FastLED Wasm Compiler
5
5
  Home-page: https://github.com/zackees/fastled-wasm
6
6
  Maintainer: Zachary Vorhies
@@ -1,9 +1,9 @@
1
- fastled/__init__.py,sha256=lMAq0izhqcQRZ-ei8s5OqQYEeOi5J6HlGvpxsICiQ4o,7044
1
+ fastled/__init__.py,sha256=hVVZOZS8MY35SzgumbD6jMLfUY0Kg34cBiADzA5cV3Q,7044
2
2
  fastled/app.py,sha256=0W8Mbplo5UCRzj7nMVgkmCBddQGufsUQjkUUT4pMp74,4611
3
3
  fastled/cli.py,sha256=FjVr31ht0UPlAcmX-84NwfAGMQHTkrCe4o744jCAxiw,375
4
4
  fastled/cli_test.py,sha256=qJB9yLRFR3OwOwdIWSQ0fQsWLnA37v5pDccufiP_hTs,512
5
5
  fastled/cli_test_interactive.py,sha256=BjNhveZOk5aCffHbcrxPQQjWmAuj4ClVKKcKX5eY6yM,542
6
- fastled/client_server.py,sha256=xQIWJEejZtafCnO2fnO4k_owIzPydvXpEJTjVHpzMlA,17183
6
+ fastled/client_server.py,sha256=4oRDccFMifTZPPtOYIfo4xJBJ8oE7gylVF75Rhytwig,17319
7
7
  fastled/compile_server.py,sha256=sRiXYzw7lv9vcWJWGPUkzOGZPmvZGV_TGwbHYoRc15s,3155
8
8
  fastled/compile_server_impl.py,sha256=t7y19DDB0auH1MmYLCi4yjc_ZyDUJ-WHy14QWTJ-pq8,13043
9
9
  fastled/docker_manager.py,sha256=SC_qV6grNTGh0QD1ubKrULQblrN-2PORocISlaZg9NQ,35156
@@ -17,7 +17,7 @@ fastled/paths.py,sha256=VsPmgu0lNSCFOoEC0BsTYzDygXqy15AHUfN-tTuzDZA,99
17
17
  fastled/print_filter.py,sha256=ZpebuqfWEraSBD3Dm0PVZhQVBnU_NSILniwBHwjC1qM,2342
18
18
  fastled/project_init.py,sha256=bBt4DwmW5hZkm9ICt9Qk-0Nr_0JQM7icCgH5Iv-bCQs,3984
19
19
  fastled/select_sketch_directory.py,sha256=-eudwCns3AKj4HuHtSkZAFwbnf005SNL07pOzs9VxnE,1383
20
- fastled/server_flask.py,sha256=IW8zgpv7qoV28qnd7BysnLnNmKHtT_JTRAjIpPUQw7U,6919
20
+ fastled/server_flask.py,sha256=a8IOX7cgXB9agwF9hlMuAk5fNMAoclSprl0iECcH4qo,17617
21
21
  fastled/server_start.py,sha256=W9yKStkRlRNuXeV6j_6O7HjjFPyVLBHMcF9Uy2QjDWQ,479
22
22
  fastled/settings.py,sha256=oezRvRUJWwauO-kpC4LDbKg6Q-ij4d09UtR2vkjSAPU,575
23
23
  fastled/sketch.py,sha256=tHckjDj8P6BI_LWzUFM071a9qcqPs-r-qFWIe50P5Xw,3391
@@ -33,9 +33,9 @@ fastled/site/build.py,sha256=2YKU_UWKlJdGnjdbAbaL0co6kceFMSTVYwH1KCmgPZA,13987
33
33
  fastled/site/examples.py,sha256=s6vj2zJc6BfKlnbwXr1QWY1mzuDBMt6j5MEBOWjO_U8,155
34
34
  fastled/test/can_run_local_docker_tests.py,sha256=LEuUbHctRhNNFWcvnz2kEGmjDJeXO4c3kNpizm3yVJs,400
35
35
  fastled/test/examples.py,sha256=GfaHeY1E8izBl6ZqDVjz--RHLyVR4NRnQ5pBesCFJFY,1673
36
- fastled-1.2.82.dist-info/licenses/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
- fastled-1.2.82.dist-info/METADATA,sha256=Kl4WgIrfZKi7_wsVnVOfQ_dLRiWxSGbeDA16HJDsJB4,21940
38
- fastled-1.2.82.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
39
- fastled-1.2.82.dist-info/entry_points.txt,sha256=RCwmzCSOS4-C2i9EziANq7Z2Zb4KFnEMR1FQC0bBwAw,101
40
- fastled-1.2.82.dist-info/top_level.txt,sha256=Bbv5kpJpZhWNCvDF4K0VcvtBSDMa8B7PTOrZa9CezHY,8
41
- fastled-1.2.82.dist-info/RECORD,,
36
+ fastled-1.2.84.dist-info/licenses/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
+ fastled-1.2.84.dist-info/METADATA,sha256=C02EyZg2HxA80WF2AV5tcPt7kxys7h9caPt_gYiEQCM,21940
38
+ fastled-1.2.84.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
39
+ fastled-1.2.84.dist-info/entry_points.txt,sha256=RCwmzCSOS4-C2i9EziANq7Z2Zb4KFnEMR1FQC0bBwAw,101
40
+ fastled-1.2.84.dist-info/top_level.txt,sha256=Bbv5kpJpZhWNCvDF4K0VcvtBSDMa8B7PTOrZa9CezHY,8
41
+ fastled-1.2.84.dist-info/RECORD,,