Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
24 changes: 5 additions & 19 deletions .github/workflows/ci_v30.1.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
name: CI v30.1

on:
workflow_call:
pull_request:
branches: ["main"]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
Expand Down Expand Up @@ -92,15 +93,14 @@ jobs:
otp-version: ${{matrix.otp}}
elixir-version: ${{matrix.elixir}}

- name: Restore cache
id: cache_restore
- name: Cache dependencies/builds
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7
if: ${{ matrix.lint }}
with:
path: |
deps
_build
priv/plts
typesense-data
key: ${{ runner.os }}-typesense-${{ matrix.typesense}}-${{ matrix.otp}}-${{ matrix.elixir}}-mix-${{ hashFiles('**/mix.lock') }}
restore-keys: |
${{ runner.os }}-typesense-${{ matrix.typesense}}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-
Expand Down Expand Up @@ -142,20 +142,6 @@ jobs:
run: mix dialyzer --format github --format dialyxir
if: ${{ matrix.lint }}

- name: Run tests
run: mix test --only ${{ matrix.typesense }}:true --only nls:true --trace

- name: Post test coverage to Coveralls
run: mix coveralls.github
run: mix coveralls.github --only ${{ matrix.typesense }}:true --only nls:true --trace
if: ${{ matrix.lint && github.event_name == 'push' && github.ref == 'refs/heads/main' }}

- name: Save cache
id: cache_save
uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7
if: ${{ matrix.lint }}
with:
path: |
deps
_build
priv/plts
key: ${{ runner.os }}-typesense-${{ matrix.typesense }}-${{ matrix.otp }}-${{ matrix.elixir }}-mix-${{ hashFiles('**/mix.lock') }}
101 changes: 0 additions & 101 deletions .github/workflows/llm.yml

This file was deleted.

15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## major.minor.patch (yyyy.mm.dd)

## 2.3.1 (2026.04.26)

### Fixed

* Mismatch on dialyzer types for create_key [#95](https://github.com/jaeyson/ex_typesense/issues/95), thanks [@evanob](https://github.com/evanob)

### Chore

* Bumped Typesense version in `docker-compose.yml` for local development (v30.1)

### Changed

* `README.md` to add an example docker compose file
* Typespecs to include map/struct as body/payload

## 2.3.0 (2026.04.14)

### Chore
Expand Down
24 changes: 24 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,30 @@ More info on spinning a local instance: https://typesense.org/docs/guide/install

Otherwise, go to step #1 if you're using [Cloud hosted](https://cloud.typesense.org) instance instead.

Example `docker-compose.yml` (see also [local Typesense](./guides/running_local_typesense.md))

```yaml
services:
typesense:
image: docker.io/typesense/typesense:30.1
container_name: typesense
restart: on-failure
ports:
- "8107:8107" # internal status
- "8108:8108" # typesense server
volumes:
- ./typesense-data:/data
- ./typesense-analytics-data:/analytics-data
command: |
--data-dir=/data
--api-key=xyz
--enable-search-analytics=true
--analytics-dir=/analytics-data
--analytics-flush-interval=60
--analytics-minute-rate-limit=100
--enable-cors
```

### 1. Add credential to config

After you have setup a [local](./guides/running_local_typesense.md) Typesense or
Expand Down
2 changes: 1 addition & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
services:
typesense:
image: docker.io/typesense/typesense:30.0
image: docker.io/typesense/typesense:30.1
container_name: typesense
restart: on-failure
ports:
Expand Down
24 changes: 24 additions & 0 deletions guides/running_local_typesense.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,30 @@ docker compose up -d

More info on spinning a local instance: https://typesense.org/docs/guide/install-typesense.html

Example `docker-compose.yml`:

```yaml
services:
typesense:
image: docker.io/typesense/typesense:30.1
container_name: typesense
restart: on-failure
ports:
- "8107:8107" # internal status
- "8108:8108" # typesense server
volumes:
- ./typesense-data:/data
- ./typesense-analytics-data:/analytics-data
command: |
--data-dir=/data
--api-key=xyz
--enable-search-analytics=true
--analytics-dir=/analytics-data
--analytics-flush-interval=60
--analytics-minute-rate-limit=100
--enable-cors
```

Once you've started Typesense, you can verify its installation by accessing the
health endpoint through a browser or `curl` in the terminal:

Expand Down
54 changes: 43 additions & 11 deletions lib/ex_typesense/analytics.ex
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@ defmodule ExTypesense.Analytics do
iex> ExTypesense.create_analytics_rule(body)
"""
@doc since: "1.0.0"
@spec create_analytics_rule(map()) ::
@spec create_analytics_rule(
map()
| OpenApiTypesense.AnalyticsRuleCreate.t()
| [OpenApiTypesense.AnalyticsRuleCreate.t()]
) ::
Comment thread
sourcery-ai[bot] marked this conversation as resolved.
{:ok, OpenApiTypesense.AnalyticsRuleSchema.t()}
| {:ok,
OpenApiTypesense.AnalyticsRule.t()
Expand Down Expand Up @@ -64,14 +68,37 @@ defmodule ExTypesense.Analytics do
iex> ExTypesense.create_analytics_rule(body, opts)
"""
@doc since: "1.0.0"
@spec create_analytics_rule(map(), keyword()) ::
@spec create_analytics_rule(
map()
| OpenApiTypesense.AnalyticsRuleCreate.t()
| [OpenApiTypesense.AnalyticsRuleCreate.t()],
keyword()
) ::
{:ok, OpenApiTypesense.AnalyticsRuleSchema.t()}
| {:ok,
OpenApiTypesense.AnalyticsRule.t()
| [map | OpenApiTypesense.AnalyticsRule.t()]}
| {:error, OpenApiTypesense.ApiResponse.t()}
def create_analytics_rule(body, opts) do
OpenApiTypesense.Analytics.create_analytics_rule(body, opts)
new_body =
case body do
%_{} ->
Map.from_struct(body)

rules when is_list(rules) ->
Enum.map(rules, fn rule ->
if is_struct(rule) do
Map.from_struct(rule)
else
rule
end
end)

_ ->
body
end

OpenApiTypesense.Analytics.create_analytics_rule(new_body, opts)
end

@doc """
Expand All @@ -93,7 +120,7 @@ defmodule ExTypesense.Analytics do
iex> ExTypesense.create_analytics_event(body)
"""
@doc since: "1.0.0"
@spec create_analytics_event(map()) ::
@spec create_analytics_event(map() | OpenApiTypesense.AnalyticsEvent.t()) ::
{:ok, OpenApiTypesense.AnalyticsEventCreateResponse.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
def create_analytics_event(body) do
Expand All @@ -118,11 +145,12 @@ defmodule ExTypesense.Analytics do
iex> ExTypesense.create_analytics_event(body, opts)
"""
@doc since: "1.0.0"
@spec create_analytics_event(map(), keyword()) ::
@spec create_analytics_event(map() | OpenApiTypesense.AnalyticsEvent.t(), keyword()) ::
{:ok, OpenApiTypesense.AnalyticsEventCreateResponse.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
def create_analytics_event(body, opts) do
OpenApiTypesense.Analytics.create_analytics_event(body, opts)
new_body = if is_struct(body), do: Map.from_struct(body), else: body
OpenApiTypesense.Analytics.create_analytics_event(new_body, opts)
end

@doc """
Expand Down Expand Up @@ -209,7 +237,7 @@ defmodule ExTypesense.Analytics do
Upserts an analytics rule with the given name.
"""
@doc since: "1.0.0"
@spec upsert_analytics_rule(String.t(), map()) ::
@spec upsert_analytics_rule(String.t(), map() | OpenApiTypesense.AnalyticsRuleUpdate.t()) ::
{:ok, OpenApiTypesense.AnalyticsRule.t()}
| {:ok, OpenApiTypesense.AnalyticsRuleSchema.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
Expand All @@ -235,7 +263,11 @@ defmodule ExTypesense.Analytics do
iex> ExTypesense.upsert_analytics_rule(rule_name, body, opts)
"""
@doc since: "1.0.0"
@spec upsert_analytics_rule(String.t(), map(), keyword()) ::
@spec upsert_analytics_rule(
String.t(),
map() | OpenApiTypesense.AnalyticsRuleUpdate.t(),
keyword()
) ::
{:ok, OpenApiTypesense.AnalyticsRule.t()}
| {:ok, OpenApiTypesense.AnalyticsRuleSchema.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
Expand Down Expand Up @@ -306,7 +338,7 @@ defmodule ExTypesense.Analytics do

"""
@doc since: "2.1.0"
@spec flush_analytics(opts :: keyword) ::
@spec flush_analytics(keyword()) ::
{:ok, OpenApiTypesense.AnalyticsEventCreateResponse.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
def flush_analytics(opts) do
Expand Down Expand Up @@ -342,7 +374,7 @@ defmodule ExTypesense.Analytics do

"""
@doc since: "2.1.0"
@spec get_analytics_events(opts :: keyword) ::
@spec get_analytics_events(keyword()) ::
{:ok, OpenApiTypesense.AnalyticsEventsResponse.t()}
| {:error, OpenApiTypesense.ApiResponse.t()}
def get_analytics_events(opts) do
Expand Down Expand Up @@ -370,7 +402,7 @@ defmodule ExTypesense.Analytics do

"""
@doc since: "2.1.0"
@spec get_analytics_status(opts :: keyword) ::
@spec get_analytics_status(keyword()) ::
{:ok, OpenApiTypesense.AnalyticsStatus.t()} | {:error, OpenApiTypesense.ApiResponse.t()}
def get_analytics_status(opts) do
OpenApiTypesense.Analytics.get_analytics_status(opts)
Expand Down
Loading
Loading