Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
736a87a
Initial commit: Elixir wrapper for cross-SDK tests
claude Feb 21, 2026
95c5cca
docs: add Phoenix, LiveView, Plug examples and Task patterns to Elixi…
Jan 30, 2026
46b0767
test: add canonical test parity (136 → 295 tests)
Feb 6, 2026
40d45f6
fix: resolve 13 cross-SDK test failures (137/138 passing)
Feb 21, 2026
ece605c
refactor: remove _build artifacts and elixir_wrapper, add application…
joalves Feb 24, 2026
36cce1e
docs: restructure README to match standard SDK documentation structure
joalves Feb 24, 2026
e12f426
fix: remove finalized guard from set_override handlers to match JS SD…
joalves Mar 15, 2026
6ae1cb7
feat(elixir): add ready_error, fix custom_field_keys to global scope,…
joalves Mar 15, 2026
b2429c6
feat: add close/is_closed?/is_closing? aliases and standardize error …
joalves Mar 15, 2026
986b602
test(elixir): replace refresh(ctx, data) bypass with data_fetcher + p…
joalves Mar 15, 2026
d840a59
fix: return safe defaults when finalized, selective exposed reset on …
joalves Mar 16, 2026
1736f6a
fix(context): keep overridden assignment exposed flag on refresh
joalves Mar 16, 2026
86b009a
fix(context): fix refresh exposed guard and treatment no-op when not …
joalves Mar 16, 2026
ddbb76e
feat: cross-SDK consistency fixes — all 201 scenarios passing
joalves Mar 17, 2026
afb4de2
refactor: rename ContextEventHandler to ContextPublisher
joalves Mar 18, 2026
8fa0349
fix: address coderabbit review issues in vendored deps
joalves Mar 18, 2026
00c8c6f
feat(jsonexpr): make IN haystack-first and add CONTAINS alias
joalves Jun 15, 2026
8210782
fix(context): deliver events synchronously
joalves Jun 16, 2026
dc89cad
fix(context): fetch data on async context creation
joalves Jun 16, 2026
f4befb7
fix(jsonexpr): eq(null, null) returns null (canonical null-operand ha…
joalves Jun 16, 2026
d345b7a
fix: start_link_async accepts data_fetcher so async fetch emits one r…
joalves Jun 16, 2026
87c7d66
test: add canonical astral/multibyte hashUnit regression test
joalves Jun 17, 2026
dcee7ea
fix: publish to PUT /context with full header set (was POST /events)
joalves Jun 25, 2026
17e3182
test: add hermetic local-HTTP integration test + CI workflow
joalves Jun 25, 2026
d5a6614
fix(context): keep events on failed publish and emit error events
joalves Oct 18, 2026
33bff2b
test: load HTTP.Client before checking fetch_context/5 is exported
joalves Oct 18, 2026
6db2929
fix: address review feedback (untrack deps, async fetch errors, emit_…
joalves Oct 20, 2026
274c652
fix(sdk): start async contexts via start_link_async with an HTTP data…
joalves Oct 20, 2026
110261b
fix: honor SDK timeout/retries on fetch, refresh and publish; align c…
joalves Oct 20, 2026
e738aa1
fix: 5s floor for publish/6 custom publishers; timeout-aware terminat…
joalves Oct 20, 2026
7ba65c2
feat(context): add dispose/1 to release request-scoped context proces…
joalves Oct 20, 2026
caa1c2f
fix(context): dispose/2 retries bounded then always releases the process
joalves Oct 20, 2026
b6554a7
docs: describe dispose retry/release policy
joalves Oct 20, 2026
224e51d
fix(context): dispose discards unpublished events (no termination pub…
joalves Oct 20, 2026
bc1fd7a
chore(deps): upgrade httpoison to 3.0 (hackney 4.8.5) to clear hackne…
joalves Oct 20, 2026
f08a911
fix: raise Elixir floor to 1.17 (httpoison 3), drop misplaced Dockerf…
joalves Oct 21, 2026
49eef3d
fix: malformed context data returns errors in create_context and refr…
joalves Oct 21, 2026
1611fc8
fix: validate nested context data (dry-run index build) so refresh/cr…
joalves Oct 21, 2026
4f83198
fix: validate assignment fields, recalc on unit add, invalidate on au…
joalves Oct 21, 2026
60c0596
fix: reset exposure dedup on unit add/audience change; validate custo…
joalves Oct 21, 2026
84267e8
fix: set_unit dedup on unchanged uid, recovery refresh restores readi…
joalves Oct 21, 2026
1aacfd0
fix: publisher-aware shutdown budget on all creation paths; refresh r…
joalves Oct 21, 2026
bc88d71
fix: brutal-kill timed-out publisher on shutdown; real queue overflow…
joalves Oct 21, 2026
6a182bb
fix: evict oldest on queue overflow; in-flight publish honors supervi…
joalves Oct 21, 2026
3f13e0b
fix: strict audience vs custom assignment, stop variable exposure aft…
joalves Oct 21, 2026
728cb05
test: order-sensitive variable index test; normalize unit uids at cre…
joalves Oct 21, 2026
96f3b1d
fix(http): stop following redirects so a redirected event PUT is neve…
joalves Oct 21, 2026
e75d975
fix(http): use unpooled connections to avoid hackney checkout_timeout…
joalves Oct 21, 2026
2e8d1de
fix(http): pass pool: false via hackney options so requests bypass th…
joalves Oct 21, 2026
f43df38
fix: keep nil initial UID as a missing unit
joalves Oct 21, 2026
02f6cfc
Align context semantics with cross-SDK maintainer decisions
joalves Oct 23, 2026
e99bbdd
fix: pin audience-refresh stickiness test; match JS parseFloat/toFixe…
joalves Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]
44 changes: 44 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: CI

on:
push:
pull_request:

jobs:
test:
name: mix test
runs-on: ubuntu-latest

strategy:
matrix:
include:
- elixir: "1.17"
otp: "26"

steps:
- name: Checkout
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
with:
persist-credentials: false

- name: Set up Elixir
uses: erlef/setup-beam@54075bcc5e249e4758d363f27d099f55d843f124 # v1
with:
elixir-version: ${{ matrix.elixir }}
otp-version: ${{ matrix.otp }}

- name: Restore deps cache
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
with:
path: |
deps
_build
key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-mix-

- name: Install dependencies
run: mix deps.get

- name: Run tests
run: mix test
50 changes: 50 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# The directory Mix will write compiled artifacts to.
/_build/

# If you run "mix test --cover", coverage assets end up here.
/cover/

# The directory Mix downloads your dependencies sources to.
/deps/

# Where third-party dependencies like ExDoc output generated docs.
/doc/

# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch

# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump

# Also ignore archive artifacts (built via "mix archive.build").
*.ez

# Ignore package tarball (built via "mix hex.build").
absmartly-*.tar

# Temporary files, for example, from tests.
/tmp/

# Editor and OS files
.DS_Store
.vscode/
.idea/
*.swp
*.swo
*~

.claude/
.DS_Store
AUDIT_REPORT.md
FIXES_SUMMARY.md
AUDIT_FIXES_COMPLETE.md
BEFORE_AFTER.md
CHANGELOG.md
CONTRIBUTING.md
DOCUMENTATION_CHECKLIST.md
IMPLEMENTATION.md
IMPLEMENTATION_REPORT.md
README_AUDIT_FIXES.md
SDK_COMPARISON.md
test_murmur_libs.exs
verify_murmur_library.md
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 ABsmartly

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Loading
Loading