Releases: Gremlinq/ExRam.Gremlinq
ExRam.Gremlinq 13.8.1
ExRam.Gremlinq 13.8.0
Changes
- Remove tests in DEBUG mode. (#2305)
- Individual coverage files per project. (#2303)
- Add extensions to configure AWSCredentials from the AWS SDK (#2302)
- Refine Copilot instructions (#2301)
- More explicit AI generated tests... (#2300)
- Switch back to coverlet code coverage now that coverlet.MTP is available (#2291)
New extension methods for configuring AWSCredentials from the AWS SDK (#2302)
This release adds first-class integration with the AWS SDK's AWSCredentials identity resolution infrastructure for the Neptune provider. Previously, IAM authentication required manually providing AccessKeyId and SecretAccessKey strings. Now you can leverage the AWS SDK's credential chain (IIdentityResolver<AWSCredentials>, DefaultAWSCredentialsIdentityResolver, or any AWSCredentials instance) to resolve credentials automatically.
The changes span two layers: the low-level signer extensions (Providers.Neptune) and the ASP.NET Core DI extensions (Providers.Neptune.AspNet).
New Extensions
1. WithCredentials — Configure signer from an AWSCredentials object
Resolves credentials synchronously from any AWS SDK AWSCredentials instance (e.g., BasicAWSCredentials, SessionAWSCredentials, AssumeRoleAWSCredentials).
using Amazon.Runtime;
using ExRam.Gremlinq.Providers.Neptune;
var signer = AWSSigner.EmptySigV4
.WithUri(new Uri("wss://my-neptune-cluster.us-east-1.neptune.amazonaws.com:8182"))
.WithRegion("us-east-1")
.WithCredentials(new BasicAWSCredentials("AKID", "SecretKey"));2. WithCredentialsFrom — Configure signer from an IIdentityResolver<AWSCredentials>
Resolves credentials from any custom or built-in IIdentityResolver<AWSCredentials>, with an optional IClientConfig.
using Amazon.Runtime;
using Amazon.Runtime.Identity;
using ExRam.Gremlinq.Providers.Neptune;
IIdentityResolver<AWSCredentials> myResolver = /* your custom resolver */;
var signer = AWSSigner.EmptySigV4
.WithUri(new Uri("wss://my-neptune-cluster.us-east-1.neptune.amazonaws.com:8182"))
.WithRegion("us-east-1")
.WithCredentialsFrom(myResolver);3. WithCredentialsFromDefaultAWSCredentialsIdentityResolver — Use the AWS default credential chain
Uses DefaultAWSCredentialsIdentityResolver which walks the standard AWS credential chain (environment variables, AWS profiles, IMDS, ECS task roles, etc.).
using ExRam.Gremlinq.Providers.Neptune;
var signer = AWSSigner.EmptySigV4
.WithUri(new Uri("wss://my-neptune-cluster.us-east-1.neptune.amazonaws.com:8182"))
.WithRegion("us-east-1")
.WithCredentialsFromDefaultAWSCredentialsIdentityResolver();4. UseAWSCredentialsIdentityResolver (ASP.NET Core DI) — Register a custom identity resolver
Registers a specific IIdentityResolver<AWSCredentials> as a singleton in the DI container. When UseIAMAuthentication is called, it will prefer this resolver over config-based AccessKeyId/SecretAccessKey.
using Amazon.Runtime;
using Amazon.Runtime.Identity;
using ExRam.Gremlinq.Providers.Neptune.AspNet;
// In Startup / Program.cs
builder.Services
.AddGremlinq(setup => setup
.UseNeptune<Vertex, Edge>()
.UseAWSCredentialsIdentityResolver(myCustomResolver)
.UseIAMAuthentication());5. UseDefaultAWSCredentialsIdentityResolver (ASP.NET Core DI) — Register the default AWS credential chain
Convenience shorthand that registers DefaultAWSCredentialsIdentityResolver into DI.
using ExRam.Gremlinq.Providers.Neptune.AspNet;
builder.Services
.AddGremlinq(setup => setup
.UseNeptune<Vertex, Edge>()
.UseDefaultAWSCredentialsIdentityResolver()
.UseIAMAuthentication());6. UseIAMAuthentication(IClientConfig) (ASP.NET Core DI) — IAM auth with client config
A new overload of UseIAMAuthentication that accepts an IClientConfig, passed through to the identity resolver when resolving credentials.
using Amazon.Runtime;
using ExRam.Gremlinq.Providers.Neptune.AspNet;
var clientConfig = new AmazonNeptunedataConfig { RegionEndpoint = RegionEndpoint.USEast1 };
builder.Services
.AddGremlinq(setup => setup
.UseNeptune<Vertex, Edge>()
.UseDefaultAWSCredentialsIdentityResolver()
.UseIAMAuthentication(clientConfig));ExRam.Gremlinq 13.7.1
The 13.7.1 release focuses on documentation improvements and code quality enhancements through static analysis.
Changes
ExRam.Gremlinq 13.7.0
Enhanced Type Filtering and OfType Operator
- Early contradiction detection: The
OfTypeoperator now throws early when detecting contradictory type constraints that would result in empty query results (#2274). This helps catch logic errors at query-build time rather than silently producing empty results. - Consolidated filter behavior: Type filter behavior for object types has been unified and consolidated (#2276).
- Encapsulated type filters: Internal type filter logic has been better encapsulated (#2275), improving code organization and reducing the risk of inconsistencies.
- More
OfTypeoverloads: Additional overloads have been added to theOfTypeoperator (#2273) for improved flexibility and type safety.
Type-system addition
- Single-adjacent-vertex-edge support: A new
IEdgeGremlinQueryinterface has been introduced for representing an edge with a known adjacent vertex type but not known to be an in- or out-edge (#2267) - Multi-type
BothEoverloads: Following the pattern established in version 13.6.0 and now possible thanks to #2267,BothEsupports multiple type parameters (#2270), eliminating the need forUnioncalls when traversing multiple edge types.
Changes
- Consolidate behaviour of filters for object-types (#2276) @danielcweber
- Encapsulate type filters (#2275) @danielcweber
- OfType: Throw early on contradictions. (#2274) @danielcweber
- More OfType overloads (#2273) @danielcweber
- Generate Out(E)/In(E)/Both(E) implementations. (#2272) @danielcweber
- Replace NullGuard.Fody with RuntimeNullables.Fody (#2271) @danielcweber
- Add BothE overloads with multiple type parameters (#2270) @danielcweber
- Add IEdgeGremlinQuery for a single adjacent vertex (#2267) @danielcweber
- Move to CosmosDb Emulator 2.14.27 (#2266) @danielcweber
ExRam.Gremlinq 13.6.0
New In/Out/Both/InE/OutE/BothE overloads with multiple type parameters
ExRam.Gremlinq now supports passing multiple type parameters to In, Out, Both, InE, OutE and BothE traversal steps, removing the need to use Union over multiple single .In/InE/Out/OutE/Both/BothE calls. (#2256, #2259, #2260, #2261)
Important
Possible compilation errors: If you have created equally-named extension methods for In, Out or Both (or InE/OutE/BothE) that accept 2 generic type parameters - possibly as a shortcut for chaining e.g. .In<…>().OfType<…>() - you may encounter compilation errors after upgrading, because the new built-in overloads will now be preffered over your extensions. In this case, please rename your custom extensions (e.g. to InOfType, OutOfType, BothOfType, InEOfType, OutEOfType, BothEOfType etc.) to resolve the ambiguity. Same goes for any other reasons your code might have extensions with any number of generic parameters that will conflict with the new overloads. Check before updating.
Early detection of unsatisfiable type constraints (#2255)
Gremlinq will now detect empty label sets that arise from unsatisfiable type constraints that would result in unsatisfiable label-sets at query-build time (that is still at runtime) and throw an informative exception. Previously, such queries would silently produce empty results, masking what is almost always a bug in the query or the type model. If you see a new exception after upgrading, it means the query in question was already broken before - it is now being called out explicitly so it can be fixed.
Changes
- .editorconfig review (#2264) @danielcweber
- Add copilot-instructions.md. (#2262) @danielcweber
- Add more InE/OutE overloads to IVertexGremlinQueryBase (#2261) @danielcweber
- Unify implementations for Both(E), In(E) and Out(E) for types and no types (#2260) @danielcweber
- Add support for multi-type-parameter InE/OutE/BothE (#2259) @danielcweber
- Support multiple In/Out/Both type parameters (#2256) @danielcweber
- Fail early on type mismatches (#2255) @danielcweber
- Review test type system (#2254) @danielcweber
ExRam.Gremlinq 13.5.2
Changes
- Replace T4 templates with Roslyn Source Generators (#2250) @danielcweber
- Add BenchmarkDotNet infrastructure for continuous performance tracking (#2243) @copilot-swe-agent[bot]
- Allow creating continuation-traversals on pooled arrays (#2240) @danielcweber
ExRam.Gremlinq 13.5.1
Changes
- PoolSlotGremlinqClient: Don't dispose the client when a single request is cancelled (#2238) @danielcweber
- More WebSocket review (#2237) @danielcweber
- Dont wrap OperationCanceledExceptions (#2235) @danielcweber
- Propagate deserialization exception (#2236) @danielcweber
ExRam.Gremlinq 13.5.0
This release introduces first-class support for date and time operations in Gremlin queries, along with improvements to the WebSocket client.
Date and Time Support
Gremlinq now provides dedicated query types and APIs for working with dates:
- AsDate() - Convert values to date representations
- DateAdd() - Perform date arithmetic (add time intervals)
- DateDiff() - Calculate differences between dates
Additionally, convenience extension methods are now available for IGremlinQueryBase<DateTimeOffset>, making date-based queries more ergonomic.
WebSocket Client
The WebSocket client implementation has been reviewed and cleaned up for improved reliability.
Changes
- Add convenience extensions for IGremlinQueryBase (#2219) @danielcweber
- Add dedicated queries and Apis for Date handling (AsDate, DateAdd, DateDiff) (#2218) @danielcweber
- Review WebSocket Client (#2217, #2220) @danielcweber
ExRam.Gremlinq 13.4.5
Changes
- Revert "Await WebSocket receive in any case, even when anything fails during deserialization." (#2216) @danielcweber
- Bump Microsoft.Testing.Extensions.CodeCoverage from 18.1.0 to 18.3.1 (#2209) @dependabot[bot]
- Review Public Api tests (#2208) @danielcweber
ExRam.Gremlinq 13.4.4
Changes
- More forward slashes. (#2207) @danielcweber
- Only check serialization of Drop. Remove stray snapshots. (#2206) @danielcweber
- Await WebSocket receive in any case, even when anything fails during deserialization. (#2205) @danielcweber
- ReSharper Review. (#2201) @danielcweber
- Rework AddOrUpdate (#2199) @danielcweber
- Optimize SideEffect for empty sub-traversals. (#2198) @danielcweber
- Remove catch for NREs thanks to fix in TestContainers (#2197) @danielcweber
- Forward slashes in csproj. (#2196) @danielcweber
- Dont drop database upfront (#2195) @danielcweber
- Handle "zero tests ran" differently. (#2194) @danielcweber
- Update .NET SDK. (#2193) @danielcweber
- Start next WebSocket read early (#2192) @danielcweber
- Increase WebSocket buffer size (#2191) @danielcweber
- Fix lowest common projection determination (#2190) @danielcweber