Changelog
Ruby SDK changelog
Release history for `easy-sdk (Ruby gem)`.
Synced from CHANGELOG.md on the latest publish.
This is the canonical release history for easy-sdk (Ruby gem).
All notable changes to easy-sdk are documented in this file. The format
follows Keep a Changelog and the
project adheres to Semantic Versioning.
0.1.0 — Unreleased
Initial release of the Ruby SDK. Mirrors @easylabs/node 0.1.0 feature
surface with idiomatic Ruby APIs.
Added
EasyLabs::Client.new(api_key:)factory that validates the API key on construction and exposes resource namespaces (client.customers,client.subscriptions, etc.).- Full resource coverage: customers, payment instruments, transfers (incl. refunds), disputes, settlements, products, product prices, orders, subscriptions (full lifecycle: pause/resume, items, discounts, one-time charges, metered usage, proration preview), checkout, payment links, embedded checkout (incl. validate/confirm/config), webhook management, invoices, coupons, promotion codes, authorizations, analytics, compliance forms, dunning config, revenue-recovery automations.
EasyLabs::Webhooks.construct_eventHMAC-SHA256 verifier with the fullEVENT_TYPEScatalog.- Typed exception hierarchy under
EasyLabs::Error(AuthenticationError, PermissionError, NotFoundError, ConflictError, RateLimitError, InvalidRequestError, ServerError) withstatus,code,details,retry_after_seconds, andrawaccessors. - Sandbox auto-routing —
sk_test_*keys hitsandbox-api.itseasy.coautomatically.
Security
- Path-segment encoding: caller-supplied ids are now percent-encoded
before interpolation into URL paths and rejected if nil, empty, or
containing control characters. Stops
?,#,/, etc. in an id from rewriting the request URL. internal_api_urlis validated:https://is required for non-local hosts;http://is only accepted when the host islocalhost,127.0.0.1,::1,0.0.0.0, or*.localhost. Prevents accidental exfiltration of the API key over an unencrypted channel.EASY_DEV_API_URLenv var overrides the default dev URL so internal hostnames don't have to live in shipped source.- Webhook query encoding rejects array elements that contain a comma rather than silently splitting them — comma-joining was ambiguous.
EasyLabs::Webhooks.construct_eventaccepts an optionalreplay_window:(seconds) that rejects events whosecreated_atfalls outside the window. The HMAC binds the body, so the timestamp is trustworthy and the check provides genuine replay protection.
Supply chain
script/check-release-age.rb: CI gate that refuses gems in the lockfile that were published within the last 7 days (configurable viaMIN_RELEASE_AGE_DAYS, with a per-gemALLOWLIST). Provides the equivalent of npm'smin-release-age/ bun'sminimumReleaseAgefor Bundler, which lacks the feature natively.- Sinatra example: direct dependencies pinned to exact versions and
Gemfile.lockcommitted for reproducible installs. bundler-auditruns on every CI build and blocks PRs with known CVEs in the dependency tree..github/dependabot.ymlopens weekly PRs forbundler(gem root and example) andgithub-actionsupdates, so version bumps go through review and pass the cooldown gate.notify-public-docs.ymlgot an explicitpermissions: contents: readblock instead of inheriting the repo default.