fastled 1.2.83__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.83"
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,28 @@
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
+
8
26
  _DRAWF_SOURCE_PREFIX = "drawfsource/js/fastled/src/"
9
27
 
10
28
 
@@ -24,170 +42,317 @@ def _run_flask_server(
24
42
  keyfile: Path to the SSL key file
25
43
  """
26
44
  try:
27
- from flask import Flask, Response, send_from_directory
45
+ from flask import Flask, Response, request, send_from_directory
28
46
 
29
47
  app = Flask(__name__)
30
48
 
31
49
  # Must be a full path or flask will fail to find the file.
32
50
  fastled_js = fastled_js.resolve()
33
51
 
34
- 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}")
35
68
 
36
69
  @app.route("/")
37
70
  def serve_index():
38
- return send_from_directory(fastled_js, "index.html")
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}")
76
+ return response
39
77
 
40
78
  @app.route("/sourcefiles/<path:path>")
41
79
  def serve_source_files(path):
42
80
  """Proxy requests to /sourcefiles/* to the compile server"""
43
81
  from flask import request
44
82
 
83
+ start_time = time.time()
84
+ logger.info(f"Serving source file: {path}")
85
+
45
86
  # Forward the request to the compile server
46
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}")
47
95
 
48
96
  # Forward the request with the same method, headers, and body
49
- resp = requests.request(
50
- method=request.method,
51
- url=target_url,
52
- headers={key: value for key, value in request.headers if key != "Host"},
53
- data=request.get_data(),
54
- cookies=request.cookies,
55
- allow_redirects=True,
56
- stream=False,
57
- )
58
-
59
- # Create a Flask Response object from the requests response
60
- response = Response(
61
- resp.raw.read(), status=resp.status_code, headers=dict(resp.headers)
62
- )
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
+ )
63
107
 
64
- return response
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)
65
127
 
66
128
  def handle_dwarfsource(path: str) -> Response:
67
129
  """Handle requests to /drawfsource/js/fastled/src/"""
68
130
  from flask import request
69
131
 
70
- print("\n##################################")
71
- print(f"# Serving source file /drawfsource/ {path}")
72
- print("##################################\n")
132
+ start_time = time.time()
133
+ logger.info(f"Processing request: {request.method} {request.url}")
73
134
 
74
135
  if not path.startswith(_DRAWF_SOURCE_PREFIX):
75
136
  # unexpected
76
- print(f"Unexpected path: {path}")
137
+ error_msg = f"Unexpected path: {path}"
138
+ logger.error(error_msg)
139
+ # Logging disabled
77
140
  return Response("Malformed path", status=400)
78
141
 
79
142
  path = path.replace("drawfsource/js/fastled/src/", "")
143
+ logger.info(f"Transformed path: {path}")
80
144
 
81
145
  # Forward the request to the compile server
82
146
  target_url = f"http://localhost:{compile_server_port}/sourcefiles/{path}"
83
-
84
- # Forward the request with the same method, headers, and body
85
- resp = requests.request(
86
- method=request.method,
87
- url=target_url,
88
- headers={key: value for key, value in request.headers if key != "Host"},
89
- data=request.get_data(),
90
- cookies=request.cookies,
91
- allow_redirects=True,
92
- stream=False,
93
- )
94
-
95
- # Create a Flask Response object from the requests response
96
- response = Response(
97
- resp.raw.read(), status=resp.status_code, headers=dict(resp.headers)
98
- )
99
-
100
- return response
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)
101
192
 
102
193
  def handle_sourcefile(path: str) -> Response:
103
194
  """Handle requests to /sourcefiles/*"""
104
195
  from flask import Response, request
105
196
 
106
- print("\n##################################")
107
- print(f"# Serving source file /sourcefiles/ {path}")
108
- print("##################################\n")
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}")
109
203
 
110
204
  # Forward the request to the compile server
111
205
  target_url = f"http://localhost:{compile_server_port}/sourcefiles/{path}"
112
-
113
- # Forward the request with the same method, headers, and body
114
- resp = requests.request(
115
- method=request.method,
116
- url=target_url,
117
- headers={key: value for key, value in request.headers if key != "Host"},
118
- data=request.get_data(),
119
- cookies=request.cookies,
120
- allow_redirects=True,
121
- stream=False,
122
- )
123
-
124
- # Create a Flask Response object from the requests response
125
- response = Response(
126
- resp.raw.read(), status=resp.status_code, headers=dict(resp.headers)
127
- )
128
-
129
- return response
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)
130
245
 
131
246
  def handle_local_file_fetch(path: str) -> Response:
132
-
133
- print("\n##################################")
134
- print(f"# Servering generic file {path}")
135
- print("##################################\n")
136
-
137
- response = send_from_directory(fastled_js, path)
138
- # Some servers don't set the Content-Type header for a bunch of files.
139
- if path.endswith(".js"):
140
- response.headers["Content-Type"] = "application/javascript"
141
- if path.endswith(".css"):
142
- response.headers["Content-Type"] = "text/css"
143
- if path.endswith(".wasm"):
144
- response.headers["Content-Type"] = "application/wasm"
145
- if path.endswith(".json"):
146
- response.headers["Content-Type"] = "application/json"
147
- if path.endswith(".png"):
148
- response.headers["Content-Type"] = "image/png"
149
- if path.endswith(".jpg"):
150
- response.headers["Content-Type"] = "image/jpeg"
151
- if path.endswith(".jpeg"):
152
- response.headers["Content-Type"] = "image/jpeg"
153
- if path.endswith(".gif"):
154
- response.headers["Content-Type"] = "image/gif"
155
- if path.endswith(".svg"):
156
- response.headers["Content-Type"] = "image/svg+xml"
157
- if path.endswith(".ico"):
158
- response.headers["Content-Type"] = "image/x-icon"
159
- if path.endswith(".html"):
160
- response.headers["Content-Type"] = "text/html"
161
-
162
- # now also add headers to force no caching
163
- response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
164
- response.headers["Pragma"] = "no-cache"
165
- response.headers["Expires"] = "0"
166
- return 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)
167
314
 
168
315
  @app.route("/<path:path>")
169
316
  def serve_files(path: str):
170
-
171
- if path.startswith("drawfsource/"):
172
- return handle_dwarfsource(path)
173
- elif path.startswith("sourcefiles/"):
174
- return handle_sourcefile(path)
175
- else:
176
- return handle_local_file_fetch(path)
177
-
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")
178
340
  server = Server(app.wsgi_app)
179
341
  # Watch index.html for changes
180
342
  server.watch(str(fastled_js / "index.html"))
181
343
  # server.watch(str(fastled_js / "index.js"))
182
344
  # server.watch(str(fastled_js / "index.css"))
183
345
  # Start the server
346
+ logger.info(f"Starting server on port {port}")
184
347
  server.serve(port=port, debug=True)
185
348
  except KeyboardInterrupt:
349
+ logger.info("Server stopped by keyboard interrupt")
186
350
  import _thread
187
351
 
188
352
  _thread.interrupt_main()
189
353
  except Exception as e:
190
- 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")
191
356
  import _thread
192
357
 
193
358
  _thread.interrupt_main()
@@ -202,15 +367,24 @@ def run_flask_in_thread(
202
367
  ) -> None:
203
368
  """Run the Flask server."""
204
369
  try:
205
- _run_flask_server(cwd, port, compile_server_port, certfile, keyfile)
206
- 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}")
207
378
 
208
- warnings.warn("Flask server has stopped")
379
+ _run_flask_server(cwd, port, compile_server_port, certfile, keyfile)
209
380
  except KeyboardInterrupt:
381
+ logger.info("Flask server thread stopped by keyboard interrupt")
210
382
  import _thread
211
383
 
212
384
  _thread.interrupt_main()
213
385
  pass
386
+ except Exception as e:
387
+ logger.error(f"Error in Flask server thread: {e}", exc_info=True)
214
388
 
215
389
 
216
390
  def parse_args() -> argparse.Namespace:
@@ -249,18 +423,39 @@ def run_flask_server_process(
249
423
  keyfile: Path | None = None,
250
424
  ) -> Process:
251
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
+
252
431
  process = Process(
253
432
  target=run_flask_in_thread,
254
433
  args=(port, cwd, compile_server_port, certfile, keyfile),
255
434
  )
256
435
  process.start()
436
+ if _ENABLE_LOGGING:
437
+ logger.info(f"Flask server process started with PID {process.pid}")
257
438
  return process
258
439
 
259
440
 
260
441
  def main() -> None:
261
442
  """Main function."""
443
+ if _ENABLE_LOGGING:
444
+ logger.info("Starting main function")
262
445
  args = parse_args()
263
- 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")
264
459
 
265
460
 
266
461
  if __name__ == "__main__":
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastled
3
- Version: 1.2.83
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=GFW1WwdYsAv_gygWIQ047oPRT6sjzh7WgDAYVNyInSo,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=qPY72qJ4qOI3Llj3VG0CGvEnJ0ibMcprykAG6o9Sexk,9050
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.83.dist-info/licenses/LICENSE,sha256=b6pOoifSXiUaz_lDS84vWlG3fr4yUKwB8fzkrH9R8bQ,1064
37
- fastled-1.2.83.dist-info/METADATA,sha256=XPce-fPL-Jl0e7rpYRuf-JHiyIJZe44nZiARcxX4S8c,21940
38
- fastled-1.2.83.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
39
- fastled-1.2.83.dist-info/entry_points.txt,sha256=RCwmzCSOS4-C2i9EziANq7Z2Zb4KFnEMR1FQC0bBwAw,101
40
- fastled-1.2.83.dist-info/top_level.txt,sha256=Bbv5kpJpZhWNCvDF4K0VcvtBSDMa8B7PTOrZa9CezHY,8
41
- fastled-1.2.83.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,,