Skip to content

Version 1.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 21 Aug 19:07
413c43e

First stable release of the C#/.NET SDK. The public API is covered by semantic
versioning from this version on: no breaking change ships without a major version bump.

Compliance work performed on the C#/.NET SDK after its donation by Omid Rad
(Exceptal) to Market Data. Changes are grouped by type and reference the
MarketData.app SDK requirements sections they satisfy.

Added

  • Real XML documentation across the entire endpoint surface (59 public methods on the
    five API classes): summaries, per-parameter docs, returns, the exceptions each method
    can actually throw, a usage example per endpoint, and the canonical docs-site URL as
    <seealso href>. Enforced in CI by a reflection test over the generated
    MarketDataApp.xml (guarding content, where CS1591 only guarantees presence) plus a
    live check that every canonical URL responds. (#21)
  • AddMarketDataClient service-collection extensions
    (Microsoft.Extensions.DependencyInjection) registering MarketDataClient as a
    singleton over an IHttpClientFactory-managed HttpClient.
  • MarketDataClient.CreateAsync(httpClient, options?, cancellationToken) async
    factory: when a token is present and ValidateTokenOnStartup is enabled
    (default), it awaits GET /user/ to fail fast on a bad token
    (AuthenticationException) and to seed the rate-limit snapshot. Demo mode and
    opt-out skip the call. (§§5, 8.1)
  • SupportInfo property that renders the mandated
    --- MARKET DATA SUPPORT INFO --- block: snake_case labels in spec order
    (request_id, request_url, status_code, timestamp, message,
    exception_type), column-aligned, with a (none) fallback. (§6.3)
  • AddMarketDataCanonicalConsole() logging-builder extension +
    MarketDataConsoleFormatter producing the canonical
    {timestamp} - {logger_name} - {level} - {message} log line (opt-in). (§7)
  • IsJson / IsCsv / IsHtml format-detection flags on every response via the
    IMarketDataResponse contract (typed JSON, CsvResponse, HtmlResponse).
    (§11.6)
  • Concise ToString() summaries on response wrappers (type, item count, HTTP
    status, no-data marker) and primary data records — no raw payload dumps.
    (§11.6)
  • Extension-aware SaveToFile / SaveToFileAsync that select content by file
    extension (.json / .csv / .html, falling back to the raw body) and
    return the written path. (§11.6)
  • Configuration cascade: client-level defaults (DefaultDateFormat, Mode,
    Columns, AddHeaders, Human, MinimumLogLevel, OutputFormat) merge into
    per-method parameters (method wins), plus new MARKETDATA_* formatting and
    diagnostics environment variables: MARKETDATA_DATE_FORMAT, MARKETDATA_MODE,
    MARKETDATA_COLUMNS, MARKETDATA_ADD_HEADERS, MARKETDATA_USE_HUMAN_READABLE,
    MARKETDATA_LOGGING_LEVEL, and MARKETDATA_OUTPUT_FORMAT. (§4)
  • Cached /status/ retry gate: before retrying a server error the SDK consults a
    per-service status snapshot (270s refresh / 300s validity); an OFFLINE
    service fails immediately instead of retrying. (§9.5)
  • IDisposable on MarketDataClient and ApiClient (disposes the concurrency
    semaphore; never the caller-owned HttpClient). (§1)
  • Packaging: git-tag-driven versioning via MinVer, deterministic builds,
    symbol package (.snupkg), Source Link (CI), package validation, and NuGet
    metadata (README, license, repository/project URLs). (§15)
  • Continuous integration: cross-OS unit-test matrix (ubuntu, windows, macOS), a
    line + branch coverage gate, a coverage-report artifact, and live integration
    tests wired to run on pull requests and releases. (§13)
  • CI/CD supply-chain and cost hardening, mirroring the sibling MarketData SDKs:
    Dependabot (github-actions + nuget, weekly) with an auto-merge workflow for
    semver-minor/patch bumps; least-privilege permissions: contents: read and a
    PR-only cancel concurrency group on CI; a Codecov coverage upload (opencover)
    plus CI/coverage README badges; OIDC Trusted Publishing to NuGet.org
    (NuGet/login, no long-lived API key) with SLSA build-provenance attestation
    of the .nupkg/.snupkg before push; a release-triggered changelog-update
    automation; and a PR-vs-post-merge matrix split (PRs build ubuntu-only, main /
    releases run the full OS matrix) that keeps the 100% coverage gate and PR
    integration tests on every run.
  • This CHANGELOG.md.

Changed

  • Logs and telemetry now include the full request URL, query string included (via the
    url.full activity tag and the request/response log lines), matching the URL already
    reported on exceptions. The API token is never placed in the URL — it is sent only as
    an Authorization: Bearer header and is redacted (last-4) wherever logged — so no
    credential is exposed.
  • AddMarketDataClient now auto-wires the container's ILogger<MarketDataClient>
    into the SDK when the application has logging configured, so SDK logs flow
    automatically in DI apps without extra wiring. An explicitly supplied
    MarketDataClientOptions.Logger is respected and never overridden, and the
    client still constructs silently when no logging is registered. Pairs with
    AddMarketDataCanonicalConsole(). (§7)
  • Request timeout is fixed at 99 seconds and is no longer configurable. (§10)
  • MaxConcurrentRequests is validated and capped to the range 1–50. (§12)
  • Automatic retries now apply only to HTTP 501–599 server errors and transient
    network failures; other responses are not retried.
  • request_id is read from the cf-ray response header first, then falls back
    to x-request-id. (§6.2)
  • Support-info and diagnostic timestamps are rendered in US/Eastern time.
  • SupportInfo is now a property, replacing the previous GetSupportInfo()
    method. (§6.3)
  • Package version is no longer a hardcoded <Version> literal; it is derived
    from git tags at build time (with a 0.0.0-alpha.0.N pre-release fallback for
    untagged local/dev builds). (§15)

Removed

  • Configurable Timeout option and the MARKETDATA_TIMEOUT environment variable
    (timeout is now fixed at 99s). (§10)
  • Undocumented nonstandard parameter on options/expirations (retained on the
    options chain, where it is documented). (§3)
  • Undocumented countback parameter on options/quotes. (§3)
  • Removed the deprecated stocks/bulkquotes methods
    (GetBulkQuotesAsync/GetBulkQuotesCsvAsync) and StockBulkQuotesRequest; use
    GetQuotesAsync with multiple symbols (the stocks/quotes endpoint now serves
    bulk retrieval). (§3)
  • Removed the deprecated options/strikes surface
    (GetStrikesAsync/GetStrikesCsvAsync, OptionsStrikesRequest, OptionStrikes,
    OptionsStrikesResponse); the /v1/options/strikes/ endpoint is deprecated and
    no longer documented. Use the options chain to discover available strikes.

Fixed

  • Constructors no longer perform synchronous-over-async network I/O; startup
    token validation moved to CreateAsync. (§§5, 8.1)
  • The news JSON endpoint now honors the columns projection. (§3)
  • Local dotnet build no longer emits the Source Link
    "Source control information is not available - the generated source link is
    empty" warning: Source Link and ContinuousIntegrationBuild are gated to CI,
    where the repository resolves normally.