self._client[database] can raise InvalidName after the client is already
built, leaking it via any exception traceback the caller holds. close it
before re-raising, matching the __aenter__ leak fix. also compresses essay
docstrings/comments across the module with no behavior change, keeping the
swallow-and-default contract note and the matched_count/nInserted footguns.
Signed-off-by: disqualifier <dev@disqualifier.me>
upsert_document_field returned False for an idempotent no-op upsert on an
existing document (modified_count=0, upserted_id=None) even though the doc
matched the requested state; switch to matched_count like its update_document_field
and update_document_operator siblings.
create_documents returned 0 on a partial insert_many failure, discarding the
BulkWriteError's nInserted count and inviting callers to retry the whole batch
on a wrongly-reported failure, duplicating documents that had already landed.
Catch BulkWriteError specifically and return e.details['nInserted'].
Bump to v0.1.7.
Signed-off-by: disqualifier <dev@disqualifier.me>
- mongo-3: create_collection param renamed indexes -> index (it seeds ONE index; a key-spec
builds one compound index, not two). update keyword call sites indexes= -> index=.
- mongo-4: docstring notes an instance is single-use after close() (pymongo 4.x close is
irreversible; connect() only pings).
- mongo-5: docstring notes construction may raise InvalidURI for a malformed URI.
- README: create_collection index note. bump v0.1.5 -> v0.1.6
Signed-off-by: disqualifier <dev@disqualifier.me>
__aenter__ delegated to connect(); when the ping raised on a bad server, __aexit__ was not
called so the eagerly-constructed motor client (with its background topology monitor + pool)
leaked. a retry loop against a flapping DB accumulated live clients. now close-on-failure.
verified: 5 failed async-with blocks leave 0 open clients (was 5). bump v0.1.4 -> v0.1.5
Signed-off-by: disqualifier <dev@disqualifier.me>
additive only — every existing name preserved, swallow contract unchanged. brings mongo
in line with the redis/psql/mysql datastore trio's naming/lifecycle. bump v0.1.3 -> v0.1.4
Signed-off-by: disqualifier <dev@disqualifier.me>
mongo-1: document_push_array and document_push_and_set still returned modified_count>0
while the v0.1.2 wave moved the sibling single-doc update helpers to matched_count>0.
$push always mutates so the two agree in practice (no reachable behavioral change), but
the helpers now match the documented 'True when a document matched' contract uniformly.
sibling-grep: zero consumers of either push helper.
Signed-off-by: disqualifier <dev@disqualifier.me>
- update_document_field/update_document_operator/document_pop_array return
matched_count > 0, so an idempotent write that matched a doc but changed nothing
( to the same value, of an absent value) reports success instead of False
(L19)
- document the bare-proxy escape hatch is mongo.collection(name) not mongo[name], and
that get_document_hashmap/get_document_fields skip docs missing the key (nits).
Signed-off-by: disqualifier <dev@disqualifier.me>
added check_document_exists(collection, target) -> bool (count_documents(target, limit=1) > 0) — it existed only in the talos origin and was not carried over, but the talos caller relies on it. renamed the do_upsert param to upsert on update_document/find_one_and_update/find_one_and_replace, standardizing on motor's name (the talos caller already passes upsert=). param rename is breaking; patch is fine under the no-consumer policy. bump to v0.1.1.
Signed-off-by: disqualifier <dev@disqualifier.me>
point install at git.rethinkstudios.io; show both the requirements.txt
line and the direct pip install command.
Signed-off-by: disqualifier <dev@disqualifier.me>
src/ layout package making the repo pip-installable
(git+ssh@vX.Y.Z). Mongo class with both usage patterns (object +
module proxy), wrapped methods log-and-swallow, raw collection escape
hatch raises.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Signed-off-by: disqualifier <dev@disqualifier.me>