ferroapi 0.0.1__tar.gz → 0.0.2__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 (64) hide show
  1. {ferroapi-0.0.1 → ferroapi-0.0.2}/Cargo.lock +4 -4
  2. {ferroapi-0.0.1 → ferroapi-0.0.2}/Cargo.toml +4 -4
  3. {ferroapi-0.0.1 → ferroapi-0.0.2}/PKG-INFO +1 -1
  4. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/lib.rs +20 -7
  5. {ferroapi-0.0.1 → ferroapi-0.0.2}/LICENSE +0 -0
  6. {ferroapi-0.0.1 → ferroapi-0.0.2}/README.md +0 -0
  7. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/Cargo.toml +0 -0
  8. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/queue.rs +0 -0
  9. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/request.rs +0 -0
  10. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-core/src/websocket.rs +0 -0
  11. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/Cargo.toml +0 -0
  12. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/benches/http.rs +0 -0
  13. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/form.rs +0 -0
  14. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/lib.rs +0 -0
  15. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/middleware.rs +0 -0
  16. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/queue.rs +0 -0
  17. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/ranges.rs +0 -0
  18. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/reply.rs +0 -0
  19. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/server.rs +0 -0
  20. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-http/src/statics.rs +0 -0
  21. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-python/Cargo.toml +0 -0
  22. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-python/src/lib.rs +0 -0
  23. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/Cargo.toml +0 -0
  24. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/benches/lookup.rs +0 -0
  25. {ferroapi-0.0.1 → ferroapi-0.0.2}/crates/ferroapi-router/src/lib.rs +0 -0
  26. {ferroapi-0.0.1 → ferroapi-0.0.2}/pyproject.toml +0 -0
  27. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/__init__.py +0 -0
  28. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/_core.pyi +0 -0
  29. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/annotations.py +0 -0
  30. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/applications.py +0 -0
  31. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/background.py +0 -0
  32. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/concurrency.py +0 -0
  33. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/datastructures.py +0 -0
  34. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/dependencies.py +0 -0
  35. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/encoders.py +0 -0
  36. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/exceptions.py +0 -0
  37. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/__init__.py +0 -0
  38. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/_native.py +0 -0
  39. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/cors.py +0 -0
  40. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/gzip.py +0 -0
  41. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/middleware/trustedhost.py +0 -0
  42. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/__init__.py +0 -0
  43. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/docs.py +0 -0
  44. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/forms.py +0 -0
  45. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/openapi/utils.py +0 -0
  46. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/param_models.py +0 -0
  47. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/params.py +0 -0
  48. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/py.typed +0 -0
  49. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/requests.py +0 -0
  50. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/responses.py +0 -0
  51. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/routing.py +0 -0
  52. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/__init__.py +0 -0
  53. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/api_key.py +0 -0
  54. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/base.py +0 -0
  55. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/http.py +0 -0
  56. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/oauth2.py +0 -0
  57. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/open_id_connect_url.py +0 -0
  58. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/security/utils.py +0 -0
  59. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/solving.py +0 -0
  60. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/sse.py +0 -0
  61. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/staticfiles.py +0 -0
  62. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/status.py +0 -0
  63. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/testclient.py +0 -0
  64. {ferroapi-0.0.1 → ferroapi-0.0.2}/src/ferroapi/websockets.py +0 -0
@@ -300,7 +300,7 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
300
300
 
301
301
  [[package]]
302
302
  name = "ferroapi-core"
303
- version = "0.0.1"
303
+ version = "0.0.2"
304
304
  dependencies = [
305
305
  "bytes",
306
306
  "ferroapi-http",
@@ -321,7 +321,7 @@ dependencies = [
321
321
 
322
322
  [[package]]
323
323
  name = "ferroapi-http"
324
- version = "0.0.1"
324
+ version = "0.0.2"
325
325
  dependencies = [
326
326
  "bytes",
327
327
  "codspeed-divan-compat",
@@ -346,7 +346,7 @@ dependencies = [
346
346
 
347
347
  [[package]]
348
348
  name = "ferroapi-python"
349
- version = "0.0.1"
349
+ version = "0.0.2"
350
350
  dependencies = [
351
351
  "bytes",
352
352
  "ferroapi-core",
@@ -358,7 +358,7 @@ dependencies = [
358
358
 
359
359
  [[package]]
360
360
  name = "ferroapi-router"
361
- version = "0.0.1"
361
+ version = "0.0.2"
362
362
  dependencies = [
363
363
  "codspeed-divan-compat",
364
364
  ]
@@ -3,16 +3,16 @@ resolver = "2"
3
3
  members = ["crates/ferroapi-http", "crates/ferroapi-router", "crates/ferroapi-core", "crates/ferroapi-python"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.0.1"
6
+ version = "0.0.2"
7
7
  edition = "2024"
8
8
  rust-version = "1.85"
9
9
  license = "MIT"
10
10
  repository = "https://github.com/Kludex/ferroapi"
11
11
 
12
12
  [workspace.dependencies]
13
- ferroapi-http = { path = "crates/ferroapi-http", version = "=0.0.1" }
14
- ferroapi-core = { path = "crates/ferroapi-core", version = "=0.0.1" }
15
- ferroapi-router = { path = "crates/ferroapi-router", version = "=0.0.1" }
13
+ ferroapi-http = { path = "crates/ferroapi-http", version = "=0.0.2" }
14
+ ferroapi-core = { path = "crates/ferroapi-core", version = "=0.0.2" }
15
+ ferroapi-router = { path = "crates/ferroapi-router", version = "=0.0.2" }
16
16
  bytes = "1"
17
17
  http-body-util = "0.1"
18
18
  hyper = { version = "1", features = ["http1", "http2", "server"] }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ferroapi
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Classifier: Development Status :: 2 - Pre-Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3
@@ -387,7 +387,7 @@ impl App {
387
387
  .push(Box::new(move |py| start(py, &plan.plan, &spawn, raw, &started)));
388
388
  let guard = Abandon {
389
389
  task,
390
- queue: self.queue.clone(),
390
+ queue: Some(self.queue.clone()),
391
391
  };
392
392
  let reply = receiver
393
393
  .await
@@ -456,19 +456,22 @@ fn too_large() -> Reply {
456
456
  /// Cancels the endpoint's task when hyper drops the request before it was answered: the client went away.
457
457
  struct Abandon {
458
458
  task: Arc<Mutex<Option<Py<PyAny>>>>,
459
- queue: Arc<Queue>,
459
+ queue: Option<Arc<Queue>>,
460
460
  }
461
461
 
462
462
  impl Abandon {
463
- fn disarm(self) {
464
- let _ = std::mem::ManuallyDrop::new(self);
463
+ fn disarm(mut self) {
464
+ self.queue = None;
465
465
  }
466
466
  }
467
467
 
468
468
  impl Drop for Abandon {
469
469
  fn drop(&mut self) {
470
+ let Some(queue) = self.queue.take() else {
471
+ return;
472
+ };
470
473
  let task = self.task.clone();
471
- self.queue.push(Box::new(move |py| {
474
+ queue.push(Box::new(move |py| {
472
475
  let task = task.lock().unwrap_or_else(std::sync::PoisonError::into_inner).take();
473
476
  if let Some(Err(err)) = task.map(|task| task.call_method0(py, intern!(py, "cancel"))) {
474
477
  report(py, err, None);
@@ -585,12 +588,16 @@ impl App {
585
588
  }
586
589
  }
587
590
 
588
- fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, task: &Mutex<Option<Py<PyAny>>>) {
591
+ fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, task: &Arc<Mutex<Option<Py<PyAny>>>>) {
589
592
  let raw = match Py::new(py, raw) {
590
593
  Ok(raw) => raw,
591
594
  Err(err) => return report(py, err, Some(plan.bind(py))),
592
595
  };
593
- let started = Py::new(py, Done { raw: raw.clone_ref(py) }).and_then(|done| {
596
+ let done = Done {
597
+ raw: raw.clone_ref(py),
598
+ task: task.clone(),
599
+ };
600
+ let started = Py::new(py, done).and_then(|done| {
594
601
  let coroutine = plan.call1(py, (raw.clone_ref(py),))?;
595
602
  spawn.call1(py, (coroutine, done))
596
603
  });
@@ -607,11 +614,17 @@ fn start(py: Python<'_>, plan: &Py<PyAny>, spawn: &Py<PyAny>, raw: RawRequest, t
607
614
  #[pyclass(frozen, module = "ferroapi._core")]
608
615
  struct Done {
609
616
  raw: Py<RawRequest>,
617
+ /// Shared with the request's `Abandon` guard, and emptied here so the task is released while the GIL is held.
618
+ task: Arc<Mutex<Option<Py<PyAny>>>>,
610
619
  }
611
620
 
612
621
  #[pymethods]
613
622
  impl Done {
614
623
  fn __call__(&self, py: Python<'_>, task: &Bound<'_, PyAny>) {
624
+ self.task
625
+ .lock()
626
+ .unwrap_or_else(std::sync::PoisonError::into_inner)
627
+ .take();
615
628
  let raw = self.raw.get();
616
629
  report_task(py, raw.bridge.event_loop.bind(py), task);
617
630
  raw.fail();
File without changes
File without changes
File without changes
File without changes
File without changes