From 780c3b3f00a2ad4fc0e70f83f2ee2590e29c6644 Mon Sep 17 00:00:00 2001 From: Alexander Kampf Date: Thu, 5 Jun 2025 13:09:49 +0200 Subject: [PATCH 1/4] chore: Add release --- .github/workflows/release.yml | 17 +++++++++ Cargo.lock | 4 +-- Cargo.toml | 6 ++-- README.md | 2 +- src/client.rs | 64 ++++++++++++++++----------------- src/container.rs | 8 ++--- tests/essentials.rs | 2 +- tests/metadata_and_discovery.rs | 2 +- tests/observe_events.rs | 2 +- tests/read_events.rs | 2 +- tests/run_eventql_query.rs | 2 +- tests/testcontainer.rs | 4 +-- tests/utils/mod.rs | 2 +- tests/write_events.rs | 2 +- 14 files changed, 68 insertions(+), 51 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ffe90ab..8879192 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,5 +27,22 @@ jobs: - name: Create new version if: ${{ steps.get_next_version.outputs.hasNextVersion == 'true' }} run: | + cargo install cargo-set-version + cargo set-version ${{ steps.get_next_version.outputs.version }} + git config --global user.email "hello@thenativeweb.io" + git config --global user.name "${{ github.actor }}" + git add . + git commit -m 'chore: Bump version to ${{ steps.get_next_version.outputs.version }}. [skip ci]' + git push git tag v${{steps.get_next_version.outputs.version}} git push origin v${{steps.get_next_version.outputs.version}} + - name: Build artifacts + if: ${{ steps.get_next_version.outputs.hasNextVersion == 'true' }} + run: | + cargo build + - name: Publish new version + if: ${{ steps.get_next_version.outputs.hasNextVersion == 'true' }} + run: | + echo "${{ secrets.TOKEN_GITHUB_TO_NPM_RW }}" | cargo login + cargo package + cargo publish diff --git a/Cargo.lock b/Cargo.lock index ecb3324..82c7551 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -461,12 +461,12 @@ dependencies = [ ] [[package]] -name = "eventsourcingdb-client-rust" +name = "eventsourcingdb" version = "0.1.0" dependencies = [ "chrono", "cloudevents-sdk", - "eventsourcingdb-client-rust", + "eventsourcingdb", "futures", "futures-util", "jsonschema", diff --git a/Cargo.toml b/Cargo.toml index 5ddfb32..376eea2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "eventsourcingdb-client-rust" +name = "eventsourcingdb" version = "0.1.0" edition = "2024" description = "A client library for the EventsourcingDB by the native web." @@ -33,11 +33,11 @@ typed-builder = "0.21.0" url = "2.5.4" [dev-dependencies] -eventsourcingdb-client-rust = { path = ".", features = ["testcontainer"] } +eventsourcingdb = { path = ".", features = ["testcontainer"] , version = "0.1.0" } testcontainers = { version = "0.24.0", features = ["http_wait"] } tokio = { version = "1.45.1", features = ["full"] } tokio-test = "0.4.4" # This is metadata required for working docs on docs.rs [package.metadata.docs.rs] -features = ["testcontainer"] +features = ["testcontainer"] \ No newline at end of file diff --git a/README.md b/README.md index 8e7d9da..1cb81a6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# eventsourcingdb-client-rust +# eventsourcingdb The official Rust client SDK for [EventSourcingDB](https://www.eventsourcingdb.io/). diff --git a/src/client.rs b/src/client.rs index 592bec4..8377cc3 100644 --- a/src/client.rs +++ b/src/client.rs @@ -3,12 +3,12 @@ //! To use the client, create it with the base URL and API token of your [EventsourcingDB](https://www.eventsourcingdb.io/) instance. //! ``` //! # tokio_test::block_on(async { -//! # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); +//! # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); //! let db_url = "http://localhost:3000/"; //! let api_token = "secrettoken"; //! # let db_url = container.get_base_url().await.unwrap(); //! # let api_token = container.get_api_token(); -//! let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); +//! let client = eventsourcingdb::client::Client::new(db_url, api_token); //! client.ping().await.expect("Failed to ping"); //! client.verify_api_token().await.expect("Failed to verify API token"); //! # }) @@ -57,7 +57,7 @@ impl Client { /// Get the base URL of the client to use for API calls /// ``` /// # use url::Url; - /// # use eventsourcingdb_client_rust::client::Client; + /// # use eventsourcingdb::client::Client; /// # let client = Client::new("http://localhost:8080/".parse().unwrap(), "token"); /// let base_url = client.get_base_url(); /// # assert_eq!(base_url.as_str(), "http://localhost:8080/"); @@ -69,7 +69,7 @@ impl Client { /// Get the API token of the client to use for API calls /// ``` - /// # use eventsourcingdb_client_rust::client::Client; + /// # use eventsourcingdb::client::Client; /// # use url::Url; /// # let client = Client::new("http://localhost:8080/".parse().unwrap(), "secrettoken"); /// let api_token = client.get_api_token(); @@ -161,12 +161,12 @@ impl Client { /// /// ``` /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// client.ping().await.expect("Failed to ping"); /// # }) /// ``` @@ -181,16 +181,16 @@ impl Client { /// Reads events from the DB instance. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let mut event_stream = client.read_events("/", None).await.expect("Failed to read events"); /// while let Some(event) = event_stream.next().await { /// println!("Found Type {:?}", event.expect("Error while reading events")); @@ -214,16 +214,16 @@ impl Client { /// Observe events from the DB instance. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// # client.write_events( /// # vec![ /// # EventCandidate::builder() @@ -261,12 +261,12 @@ impl Client { /// /// ``` /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// client.verify_api_token().await.expect("Failed to ping"); /// # }) /// ``` @@ -281,16 +281,16 @@ impl Client { /// Registers an event schema with the DB instance. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let event_type = "io.eventsourcingdb.test"; /// let schema = json!({ /// "type": "object", @@ -323,16 +323,16 @@ impl Client { /// /// To get all subjects in the DB, just pass `None` as the `base_subject`. /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let mut subject_stream = client.list_subjects(None).await.expect("Failed to list event types"); /// while let Some(subject) = subject_stream.next().await { /// println!("Found Type {}", subject.expect("Error while reading types")); @@ -342,16 +342,16 @@ impl Client { /// /// To get all subjects under /test in the DB, just pass `Some("/test")` as the `base_subject`. /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let mut subject_stream = client.list_subjects(Some("/test")).await.expect("Failed to list event types"); /// while let Some(subject) = subject_stream.next().await { /// println!("Found Type {}", subject.expect("Error while reading types")); @@ -376,16 +376,16 @@ impl Client { /// List all event types in the DB instance. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let mut type_stream = client.list_event_types().await.expect("Failed to list event types"); /// while let Some(ty) = type_stream.next().await { /// println!("Found Type {}", ty.expect("Error while reading types").name); @@ -405,15 +405,15 @@ impl Client { /// Writes events to the DB instance. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let candidates = vec![ /// EventCandidate::builder() /// .source("https://www.eventsourcingdb.io".to_string()) @@ -443,16 +443,16 @@ impl Client { /// Run an eventql query against the DB. /// /// ``` - /// use eventsourcingdb_client_rust::event::EventCandidate; + /// use eventsourcingdb::event::EventCandidate; /// use futures::StreamExt; /// # use serde_json::json; /// # tokio_test::block_on(async { - /// # let container = eventsourcingdb_client_rust::container::Container::start_default().await.unwrap(); + /// # let container = eventsourcingdb::container::Container::start_default().await.unwrap(); /// let db_url = "http://localhost:3000/"; /// let api_token = "secrettoken"; /// # let db_url = container.get_base_url().await.unwrap(); /// # let api_token = container.get_api_token(); - /// let client = eventsourcingdb_client_rust::client::Client::new(db_url, api_token); + /// let client = eventsourcingdb::client::Client::new(db_url, api_token); /// let query = "FROM e IN events ORDER BY e.time DESC TOP 100 PROJECT INTO e"; /// let mut row_stream = client.run_eventql_query(query).await.expect("Failed to list event types"); /// while let Some(row) = row_stream.next().await { diff --git a/src/container.rs b/src/container.rs index 7be9804..01d1312 100644 --- a/src/container.rs +++ b/src/container.rs @@ -9,7 +9,7 @@ //! ## Shortcut suitable for most use cases //! This starts a container with the default settings which is most likely what you want. //! ``` -//! # use eventsourcingdb_client_rust::container::Container; +//! # use eventsourcingdb::container::Container; //! # tokio_test::block_on(async { //! let container = Container::start_default().await; //! // let client = container.get_client().await; @@ -19,7 +19,7 @@ //! ## Custom configuration //! This allows you to configure the container to your needs. //! ``` -//! # use eventsourcingdb_client_rust::container::Container; +//! # use eventsourcingdb::container::Container; //! # tokio_test::block_on(async { //! let container = Container::builder() //! .with_image_tag("v1.0.0") @@ -48,7 +48,7 @@ use crate::{client::Client, error::ContainerError}; /// /// By default this container is the same as running this: /// ``` -/// # use eventsourcingdb_client_rust::container::Container; +/// # use eventsourcingdb::container::Container; /// # tokio_test::block_on(async { /// let builder = Container::builder() /// .with_image_tag("latest") @@ -144,7 +144,7 @@ impl ContainerBuilder { /// You'll most likely want to use the [`Container::start_default`] method to create a new container instance for your tests. /// For more details, see the [`crate::container`] module documentation. /// ``` -/// # use eventsourcingdb_client_rust::container::Container; +/// # use eventsourcingdb::container::Container; /// # tokio_test::block_on(async { /// let container = Container::start_default().await; /// // let client = container.get_client().await; diff --git a/tests/essentials.rs b/tests/essentials.rs index f4a835d..34a447f 100644 --- a/tests/essentials.rs +++ b/tests/essentials.rs @@ -1,4 +1,4 @@ -use eventsourcingdb_client_rust::{client::Client, container::Container}; +use eventsourcingdb::{client::Client, container::Container}; #[tokio::test] async fn ping() { diff --git a/tests/metadata_and_discovery.rs b/tests/metadata_and_discovery.rs index b32fe8b..a3abc56 100644 --- a/tests/metadata_and_discovery.rs +++ b/tests/metadata_and_discovery.rs @@ -1,4 +1,4 @@ -use eventsourcingdb_client_rust::container::Container; +use eventsourcingdb::container::Container; use futures::StreamExt; use serde_json::json; diff --git a/tests/observe_events.rs b/tests/observe_events.rs index 8d3c699..87d5ae1 100644 --- a/tests/observe_events.rs +++ b/tests/observe_events.rs @@ -1,6 +1,6 @@ mod utils; -use eventsourcingdb_client_rust::container::Container; +use eventsourcingdb::container::Container; use futures::stream::StreamExt; use serde_json::json; use utils::create_test_eventcandidate; diff --git a/tests/read_events.rs b/tests/read_events.rs index 4fa4cb8..f74c5c6 100644 --- a/tests/read_events.rs +++ b/tests/read_events.rs @@ -1,6 +1,6 @@ mod utils; -use eventsourcingdb_client_rust::{ +use eventsourcingdb::{ client::request_options::{ EventMissingStrategy, FromLatestEventOptions, Ordering, ReadEventsRequestOptions, }, diff --git a/tests/run_eventql_query.rs b/tests/run_eventql_query.rs index d76661a..1022711 100644 --- a/tests/run_eventql_query.rs +++ b/tests/run_eventql_query.rs @@ -1,4 +1,4 @@ -use eventsourcingdb_client_rust::container::Container; +use eventsourcingdb::container::Container; use futures::stream::TryStreamExt; #[tokio::test] diff --git a/tests/testcontainer.rs b/tests/testcontainer.rs index 9ef8208..0de7530 100644 --- a/tests/testcontainer.rs +++ b/tests/testcontainer.rs @@ -1,4 +1,4 @@ -use eventsourcingdb_client_rust::container::Container; +use eventsourcingdb::container::Container; #[tokio::test] async fn start_stop_testcontainer() { @@ -31,7 +31,7 @@ async fn generate_client() { let generated_client = c.get_client().await.unwrap(); let base_url = c.get_base_url().await.unwrap(); let api_token = c.get_api_token(); - let client = eventsourcingdb_client_rust::client::Client::new(base_url, api_token); + let client = eventsourcingdb::client::Client::new(base_url, api_token); assert_eq!(client.get_base_url(), generated_client.get_base_url()); assert_eq!(client.get_api_token(), generated_client.get_api_token()); } diff --git a/tests/utils/mod.rs b/tests/utils/mod.rs index 8b97d20..5f577ff 100644 --- a/tests/utils/mod.rs +++ b/tests/utils/mod.rs @@ -1,5 +1,5 @@ use chrono::{TimeDelta, Utc}; -use eventsourcingdb_client_rust::event::{Event, EventCandidate}; +use eventsourcingdb::event::{Event, EventCandidate}; use serde_json::{Value, json}; pub fn create_test_eventcandidate( diff --git a/tests/write_events.rs b/tests/write_events.rs index ff38cf4..92eaf72 100644 --- a/tests/write_events.rs +++ b/tests/write_events.rs @@ -1,6 +1,6 @@ mod utils; -use eventsourcingdb_client_rust::{ +use eventsourcingdb::{ client::Precondition, container::Container, event::{EventCandidate, TraceInfo}, From e1fc7a6a8805aa96c5cc831152eb9e8eb107960f Mon Sep 17 00:00:00 2001 From: Alexander Kampf Date: Tue, 10 Jun 2025 13:35:30 +0200 Subject: [PATCH 2/4] fix: Remove self dependecy for release --- .github/workflows/release.yml | 2 +- Cargo.lock | 1 - Cargo.toml | 3 +-- Makefile | 2 +- 4 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8879192..d32a2a6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,7 @@ jobs: - name: Create new version if: ${{ steps.get_next_version.outputs.hasNextVersion == 'true' }} run: | - cargo install cargo-set-version + cargo install cargo-edit cargo set-version ${{ steps.get_next_version.outputs.version }} git config --global user.email "hello@thenativeweb.io" git config --global user.name "${{ github.actor }}" diff --git a/Cargo.lock b/Cargo.lock index 3465213..84d60ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -466,7 +466,6 @@ version = "0.1.0" dependencies = [ "chrono", "cloudevents-sdk", - "eventsourcingdb", "futures", "futures-util", "jsonschema", diff --git a/Cargo.toml b/Cargo.toml index 7356479..c6ce896 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,11 +33,10 @@ typed-builder = "0.21.0" url = "2.5.4" [dev-dependencies] -eventsourcingdb = { path = ".", features = ["testcontainer"] , version = "0.1.0" } testcontainers = { version = "0.24.0", features = ["http_wait"] } tokio = { version = "1.45.1", features = ["full"] } tokio-test = "0.4.4" # This is metadata required for working docs on docs.rs [package.metadata.docs.rs] -features = ["testcontainer"] \ No newline at end of file +features = ["testcontainer"] diff --git a/Makefile b/Makefile index 3f50d9a..03af5d8 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ analyze: @cargo doc --all-features --no-deps --document-private-items test: - @cargo test + @cargo test --features testcontainer format: @cargo fmt From 0373136710f0a64a8bcb2a2d29bf254f4779692f Mon Sep 17 00:00:00 2001 From: Alexander Kampf Date: Tue, 10 Jun 2025 13:54:10 +0200 Subject: [PATCH 3/4] fix: fix indendation --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d32a2a6..78db961 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -30,7 +30,7 @@ jobs: cargo install cargo-edit cargo set-version ${{ steps.get_next_version.outputs.version }} git config --global user.email "hello@thenativeweb.io" - git config --global user.name "${{ github.actor }}" + git config --global user.name "${{ github.actor }}" git add . git commit -m 'chore: Bump version to ${{ steps.get_next_version.outputs.version }}. [skip ci]' git push From e2817452f14421b3f8223d1809f72bb4fed31dbe Mon Sep 17 00:00:00 2001 From: Alexander Kampf Date: Tue, 10 Jun 2025 13:59:10 +0200 Subject: [PATCH 4/4] fix: rename creates token --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78db961..163f73a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -43,6 +43,6 @@ jobs: - name: Publish new version if: ${{ steps.get_next_version.outputs.hasNextVersion == 'true' }} run: | - echo "${{ secrets.TOKEN_GITHUB_TO_NPM_RW }}" | cargo login + echo "${{ secrets.TOKEN_GITHUB_TO_CRATES_RW }}" | cargo login cargo package cargo publish