memwal 0.1.6.dev2__tar.gz → 0.1.7.dev0__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 (27) hide show
  1. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/CHANGELOG.md +7 -0
  2. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/PKG-INFO +1 -1
  3. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/__init__.py +1 -1
  4. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/mock.py +26 -8
  5. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/pyproject.toml +1 -1
  6. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_mock.py +2 -0
  7. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/.gitignore +0 -0
  8. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/README.md +0 -0
  9. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/examples/.env.example +0 -0
  10. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/examples/.gitignore +0 -0
  11. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/examples/async_remember_demo.py +0 -0
  12. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/examples/interactive_demo.py +0 -0
  13. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/examples/verify_credentials.py +0 -0
  14. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/client.py +0 -0
  15. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/compatibility.py +0 -0
  16. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/middleware.py +0 -0
  17. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/types.py +0 -0
  18. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/memwal/utils.py +0 -0
  19. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/notebooks/walrus_memory_python_sdk.ipynb +0 -0
  20. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/run_tests.py +0 -0
  21. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/__init__.py +0 -0
  22. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_auth_rejected_message.py +0 -0
  23. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_client.py +0 -0
  24. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_env_presets.py +0 -0
  25. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_integration.py +0 -0
  26. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_middleware.py +0 -0
  27. {memwal-0.1.6.dev2 → memwal-0.1.7.dev0}/tests/test_signing.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # memwal
2
2
 
3
+ ## 0.1.7
4
+
5
+ ### Added
6
+
7
+ - Added deterministic async and sync mock clients for credential-free tests.
8
+ - Added idempotency keys to collapse retries onto one paid remember job.
9
+
3
10
  ## 0.1.6
4
11
 
5
12
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: memwal
3
- Version: 0.1.6.dev2
3
+ Version: 0.1.7.dev0
4
4
  Summary: Python SDK for Walrus Memory — Privacy-first AI memory with Ed25519 signing
5
5
  Project-URL: Homepage, https://memory.walrus.xyz
6
6
  Project-URL: Documentation, https://memory.walrus.xyz
@@ -120,4 +120,4 @@ __all__ = [
120
120
  "RecallManualResult",
121
121
  ]
122
122
 
123
- __version__ = "0.1.6.dev2"
123
+ __version__ = "0.1.7.dev0"
@@ -114,15 +114,22 @@ class MemWalMock:
114
114
  await self.close()
115
115
 
116
116
  async def remember(
117
- self, text: str, namespace: Optional[str] = None
117
+ self,
118
+ text: str,
119
+ namespace: Optional[str] = None,
120
+ idempotency_key: Optional[str] = None,
118
121
  ) -> RememberAcceptedResult:
122
+ del idempotency_key
119
123
  memory = self._store(text, namespace)
120
124
  return RememberAcceptedResult(job_id=memory.job_id, status="done")
121
125
 
122
126
  async def remember_async(
123
- self, text: str, namespace: Optional[str] = None
127
+ self,
128
+ text: str,
129
+ namespace: Optional[str] = None,
130
+ idempotency_key: Optional[str] = None,
124
131
  ) -> RememberAcceptedResult:
125
- return await self.remember(text, namespace)
132
+ return await self.remember(text, namespace, idempotency_key)
126
133
 
127
134
  async def wait_for_remember_job(
128
135
  self,
@@ -142,8 +149,9 @@ class MemWalMock:
142
149
  namespace: Optional[str] = None,
143
150
  poll_interval_ms: int = 1500,
144
151
  timeout_ms: int = 60_000,
152
+ idempotency_key: Optional[str] = None,
145
153
  ) -> RememberResult:
146
- accepted = await self.remember(text, namespace)
154
+ accepted = await self.remember(text, namespace, idempotency_key)
147
155
  return await self.wait_for_remember_job(
148
156
  accepted.job_id, poll_interval_ms, timeout_ms
149
157
  )
@@ -448,13 +456,21 @@ class MemWalMockSync:
448
456
  return pool.submit(asyncio.run, coro).result()
449
457
  return asyncio.run(coro)
450
458
 
451
- def remember(self, text: str, namespace: Optional[str] = None) -> RememberAcceptedResult:
452
- return self._run(self._inner.remember(text, namespace))
459
+ def remember(
460
+ self,
461
+ text: str,
462
+ namespace: Optional[str] = None,
463
+ idempotency_key: Optional[str] = None,
464
+ ) -> RememberAcceptedResult:
465
+ return self._run(self._inner.remember(text, namespace, idempotency_key))
453
466
 
454
467
  def remember_async(
455
- self, text: str, namespace: Optional[str] = None
468
+ self,
469
+ text: str,
470
+ namespace: Optional[str] = None,
471
+ idempotency_key: Optional[str] = None,
456
472
  ) -> RememberAcceptedResult:
457
- return self.remember(text, namespace)
473
+ return self.remember(text, namespace, idempotency_key)
458
474
 
459
475
  def wait_for_remember_job(
460
476
  self,
@@ -479,6 +495,7 @@ class MemWalMockSync:
479
495
  namespace: Optional[str] = None,
480
496
  poll_interval_ms: int = 1500,
481
497
  timeout_ms: int = 60_000,
498
+ idempotency_key: Optional[str] = None,
482
499
  ) -> RememberResult:
483
500
  return self._run(
484
501
  self._inner.remember_and_wait(
@@ -486,6 +503,7 @@ class MemWalMockSync:
486
503
  namespace,
487
504
  poll_interval_ms=poll_interval_ms,
488
505
  timeout_ms=timeout_ms,
506
+ idempotency_key=idempotency_key,
489
507
  )
490
508
  )
491
509
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "memwal"
7
- version = "0.1.6.dev2"
7
+ version = "0.1.7.dev0"
8
8
  description = "Python SDK for Walrus Memory — Privacy-first AI memory with Ed25519 signing"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -131,6 +131,8 @@ def test_sync_mock_wraps_core_flows_and_accepts_production_options():
131
131
 
132
132
  def test_sync_mock_polling_and_analyze_signatures_match_production():
133
133
  methods = (
134
+ "remember",
135
+ "remember_async",
134
136
  "wait_for_remember_job",
135
137
  "remember_and_wait",
136
138
  "wait_for_remember_jobs",
File without changes
File without changes
File without changes
File without changes
File without changes