qdrant / qdrant/rust-client

Consider using cargo-semver-checks

Open
#172 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Rust
Stars
415
Forks
83
Avg merge
2h 20m
Merged PRs (30d)
3

Description

There was a semver breakage mentioned in #87 and I was sceptical that a builder pattern would actually solve the issue because it doesn't stop you changing APIs in a semver incompatible manner at all. So as I saw qdrant-client had been updated again since I last checked I ran a cargo-semver-checks on it and it failed. Between 1.10.1 and 1.10.2 there was a "technically" breaking change.

cargo semver-checks --baseline-version 1.10.1
     Parsing qdrant-client v1.10.2 (current)
      Parsed [  28.700s] (current)
     Parsing qdrant-client v1.10.1 (baseline)
      Parsed [  37.051s] (baseline)
    Checking qdrant-client v1.10.1 -> v1.10.2 (patch change)
     Checked [   0.193s] 76 checks: 75 pass, 1 fail, 0 warn, 0 skip

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.33.0/src/lints/module_missing.ron

Failed in:
  mod qdrant_client::qdrant::payloads, previously in file /home/daniel/.cargo/registry/src/index.crates.io-6f17d22bba15001f/qdrant-client-1.10.1/src/qdrant_client/builders/payloads.rs:1

     Summary semver requires new major version: 1 major and 0 minor checks failed
    Finished [  66.212s] qdrant-client

So as it didn't list any items in the module it must be a public module with no public items was removed so the only code it can break is code doing: use qdrant_client::qdrant::payloads as payloads; This isn't a big breakage as a result and the lint is likely to become a warning instead of error lint in future. But I hope it goes some way to demonstrate the usefulness of cargo-semver checks.

We can also look at the 1.9.0 -> 1.10.2 change and see 3 major breakages:

cargo semver-checks --baseline-version 1.9.0
     Parsing qdrant-client v1.10.2 (current)
      Parsed [   4.369s] (current)
     Parsing qdrant-client v1.9.0 (baseline)
      Parsed [  36.069s] (baseline)
    Checking qdrant-client v1.9.0 -> v1.10.2 (minor change)
     Checked [   0.126s] 70 checks: 67 pass, 3 fail, 0 warn, 6 skip

--- failure constructible_struct_adds_field: externally-constructible struct adds field ---

Description:
A pub struct constructible with a struct literal has a new pub field. Existing struct literals must be updated to include the new field.
        ref: https://doc.rust-lang.org/reference/expressions/struct-expr.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.33.0/src/lints/constructible_struct_adds_field.ron

Failed in:
  field ScoredPoint.order_value in /home/daniel/rust/rust-client/src/qdrant.rs:4943
  field SparseVectorParams.modifier in /home/daniel/rust/rust-client/src/qdrant.rs:137
  field SparseIndexConfig.datatype in /home/daniel/rust/rust-client/src/qdrant.rs:287
  field VectorParams.multivector_config in /home/daniel/rust/rust-client/src/qdrant.rs:44
  field ShardTransferInfo.to_shard_id in /home/daniel/rust/rust-client/src/qdrant.rs:974
  field MoveShard.to_shard_id in /home/daniel/rust/rust-client/src/qdrant.rs:1017
  field Vector.vectors_count in /home/daniel/rust/rust-client/src/qdrant.rs:3079
  field RetrievedPoint.order_value in /home/daniel/rust/rust-client/src/qdrant.rs:5079
  field AbortShardTransfer.to_shard_id in /home/daniel/rust/rust-client/src/qdrant.rs:1069
  field RestartTransfer.to_shard_id in /home/daniel/rust/rust-client/src/qdrant.rs:1084

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.33.0/src/lints/enum_variant_added.ron

Failed in:
  variant ShardTransferMethod:ReshardingStreamRecords in /home/daniel/rust/rust-client/src/qdrant.rs:1635
  variant Datatype:Float16 in /home/daniel/rust/rust-client/src/qdrant.rs:1255
  variant ReplicaState:Resharding in /home/daniel/rust/rust-client/src/qdrant.rs:1591

--- failure module_missing: pub module removed or renamed ---

Description:
A publicly-visible module cannot be imported by its prior path. A `pub use` may have been removed, or the module may have been renamed, removed, or made non-public.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.33.0/src/lints/module_missing.ron

Failed in:
  mod qdrant_client::filters, previously in file /home/daniel/.cargo/registry/src/index.crates.io-6f17d22bba15001f/qdrant-client-1.9.0/src/filters.rs:1

     Summary semver requires new major version: 3 major and 0 minor checks failed
    Finished [  40.723s] qdrant-client

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by reproducing the reported cargo-semver-checks runs for qdrant-client versions 1.9.0, 1.10.1, and 1.10.2. Review the reported public API locations in src/qdrant.rs and builders/payloads.rs, then determine where compatibility checks could be integrated; done requires a documented, repeatable check and an agreed response to its failures.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
release, tooling
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
30/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.