diff --git a/.github/workflows/ci_v30.1.yml b/.github/workflows/ci_v30.1.yml index dd394ed..c51ae27 100644 --- a/.github/workflows/ci_v30.1.yml +++ b/.github/workflows/ci_v30.1.yml @@ -1,7 +1,8 @@ name: CI v30.1 on: - workflow_call: + pull_request: + branches: ["main"] concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -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- @@ -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') }} diff --git a/.github/workflows/llm.yml b/.github/workflows/llm.yml deleted file mode 100644 index 8260681..0000000 --- a/.github/workflows/llm.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: LLM -on: - pull_request: - branches: ["main"] - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -jobs: - llm: - runs-on: ubuntu-latest - environment: review - - env: - MIX_ENV: test - GOOGLE_GEMINI_API: ${{ secrets.GOOGLE_GEMINI_API }} - - strategy: - matrix: - include: - - typesense: '30.1' - otp: '25' - elixir: '1.14' - - typesense: '30.1' - otp: '28' - elixir: '1.18' - - typesense: '30.0' - otp: '25' - elixir: '1.14' - - typesense: '30.0' - otp: '28' - elixir: '1.18' - - typesense: '29.0' - otp: '25' - elixir: '1.14' - - typesense: '29.0' - otp: '28' - elixir: '1.18' - - steps: - - name: Start Typesense - run: | - docker run -id \ - -p 8108:8108 \ - --name typesense \ - -v /tmp/typesense-data:/data \ - -v /tmp/typesense-analytics-data:/analytics-data \ - typesense/typesense:${{ matrix.typesense}} \ - --api-key xyz \ - --data-dir /data \ - --enable-search-analytics=true \ - --analytics-dir=/analytics-data \ - --analytics-flush-interval=60 \ - --analytics-minute-rate-limit=100 \ - --enable-cors - - - name: Wait for Typesense to be healthy - shell: bash - run: | - start_time=$(date +%s) - timeout=30 - counter=0 - until curl -s http://localhost:8108/health | grep -q '"ok":true'; do - if [ $counter -eq $timeout ]; then - echo "Timed out waiting for Typesense to be healthy" - exit 1 - fi - echo "Waiting for Typesense to be healthy..." - sleep 1 - counter=$((counter + 1)) - done - end_time=$(date +%s) - elapsed=$((end_time - start_time)) - echo "Typesense healthcheck elapsed: ${elapsed}s" - - - name: Checkout repo - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - - name: Setup Elixir/OTP - uses: erlef/setup-beam@fc68ffb90438ef2936bbb3251622353b3dcb2f93 - with: - otp-version: ${{matrix.otp}} - elixir-version: ${{matrix.elixir}} - - - name: Cache typesense-data - uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 - with: - path: | - typesense-data - key: ${{ runner.os }}-typesense-data - restore-keys: | - ${{ runner.os }}-typesense-data - - - name: Test natural language search - run: mix test --only nls:true --trace - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} - - - name: Post test coverage to Coveralls - run: mix coveralls.github - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cae36e..2746f1b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index fe1ebad..df41e4d 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index 5eb9fff..c15dca2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/guides/running_local_typesense.md b/guides/running_local_typesense.md index 47b986c..72ca64c 100644 --- a/guides/running_local_typesense.md +++ b/guides/running_local_typesense.md @@ -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: diff --git a/lib/ex_typesense/analytics.ex b/lib/ex_typesense/analytics.ex index dc3dc9b..209fb13 100644 --- a/lib/ex_typesense/analytics.ex +++ b/lib/ex_typesense/analytics.ex @@ -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()] + ) :: {:ok, OpenApiTypesense.AnalyticsRuleSchema.t()} | {:ok, OpenApiTypesense.AnalyticsRule.t() @@ -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 """ @@ -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 @@ -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 """ @@ -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()} @@ -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()} @@ -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 @@ -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 @@ -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) diff --git a/lib/ex_typesense/collection.ex b/lib/ex_typesense/collection.ex index 09acff2..8841ca8 100644 --- a/lib/ex_typesense/collection.ex +++ b/lib/ex_typesense/collection.ex @@ -165,7 +165,7 @@ defmodule ExTypesense.Collection do }} """ @doc since: "1.0.0" - @spec create_collection(map() | module()) :: + @spec create_collection(map() | module() | OpenApiTypesense.CollectionSchema.t()) :: {:ok, OpenApiTypesense.CollectionResponse.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_collection(schema) do @@ -191,7 +191,7 @@ defmodule ExTypesense.Collection do iex> ExTypesense.create_collection(schema, opts) """ @doc since: "1.0.0" - @spec create_collection(map() | module(), keyword()) :: + @spec create_collection(map() | module() | OpenApiTypesense.CollectionSchema.t(), keyword()) :: {:ok, OpenApiTypesense.CollectionResponse.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_collection(module, opts) when is_atom(module) do @@ -333,7 +333,10 @@ defmodule ExTypesense.Collection do } """ @doc since: "1.0.0" - @spec update_collection_fields(String.t() | module(), map()) :: + @spec update_collection_fields( + String.t() | module(), + map() | OpenApiTypesense.CollectionUpdateSchema.t() + ) :: {:ok, OpenApiTypesense.CollectionUpdateSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def update_collection_fields(name, fields) do @@ -358,7 +361,11 @@ defmodule ExTypesense.Collection do iex> ExTypesense.get_collection("persons", fields, opts) """ @doc since: "1.0.0" - @spec update_collection_fields(String.t() | module(), map(), keyword()) :: + @spec update_collection_fields( + String.t() | module(), + map() | OpenApiTypesense.CollectionUpdateSchema.t(), + keyword() + ) :: {:ok, OpenApiTypesense.CollectionUpdateSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def update_collection_fields(module, fields, opts) when is_atom(module) do diff --git a/lib/ex_typesense/conversation.ex b/lib/ex_typesense/conversation.ex index 81b04f8..cbefcd7 100644 --- a/lib/ex_typesense/conversation.ex +++ b/lib/ex_typesense/conversation.ex @@ -30,7 +30,7 @@ defmodule ExTypesense.Conversation do iex> ExTypesense.create_model(body) """ @doc since: "1.0.0" - @spec create_model(map()) :: + @spec create_model(map() | OpenApiTypesense.ConversationModelCreateSchema.t()) :: {:ok, OpenApiTypesense.ConversationModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_model(body) do @@ -55,7 +55,7 @@ defmodule ExTypesense.Conversation do iex> ExTypesense.create_model(body, opts) """ @doc since: "1.0.0" - @spec create_model(map(), keyword()) :: + @spec create_model(map() | OpenApiTypesense.ConversationModelCreateSchema.t(), keyword()) :: {:ok, OpenApiTypesense.ConversationModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_model(body, opts) do @@ -111,7 +111,7 @@ defmodule ExTypesense.Conversation do iex> ExTypesense.update_model(model_id, body) """ @doc since: "1.0.0" - @spec update_model(String.t(), map()) :: + @spec update_model(String.t(), map() | OpenApiTypesense.ConversationModelUpdateSchema.t()) :: {:ok, OpenApiTypesense.ConversationModelSchema.t()} | :error def update_model(model_id, body) do update_model(model_id, body, []) @@ -135,7 +135,11 @@ defmodule ExTypesense.Conversation do iex> ExTypesense.update_model(model_id, body, opts) """ @doc since: "1.0.0" - @spec update_model(String.t(), map(), keyword()) :: + @spec update_model( + String.t(), + map() | OpenApiTypesense.ConversationModelUpdateSchema.t(), + keyword() + ) :: {:ok, OpenApiTypesense.ConversationModelSchema.t()} | :error def update_model(model_id, body, opts) do OpenApiTypesense.Conversations.update_conversation_model(model_id, body, opts) diff --git a/lib/ex_typesense/curation.ex b/lib/ex_typesense/curation.ex index f6a083a..662c127 100644 --- a/lib/ex_typesense/curation.ex +++ b/lib/ex_typesense/curation.ex @@ -78,7 +78,11 @@ defmodule ExTypesense.Curation do iex> ExTypesense.upsert_override("companies", "cust-company", body) """ @doc since: "1.0.0" - @spec upsert_override(String.t() | module(), String.t(), map()) :: + @spec upsert_override( + String.t() | module(), + String.t(), + map() | OpenApiTypesense.SearchOverrideSchema.t() + ) :: {:ok, OpenApiTypesense.SearchOverride.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_override(coll_name, override_id, body) do upsert_override(coll_name, override_id, body, []) @@ -102,7 +106,12 @@ defmodule ExTypesense.Curation do iex> ExTypesense.upsert_override(MyApp.Wearables.Helmet, "custom-helmet", body, opts) """ @doc since: "1.0.0" - @spec upsert_override(String.t() | module(), String.t(), map(), keyword()) :: + @spec upsert_override( + String.t() | module(), + String.t(), + map() | OpenApiTypesense.SearchOverrideSchema.t(), + keyword() + ) :: {:ok, OpenApiTypesense.SearchOverride.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_override(module, override_id, body, opts) when is_atom(module) do coll_name = module.__schema__(:source) diff --git a/lib/ex_typesense/curation_sets.ex b/lib/ex_typesense/curation_sets.ex index 9da8e1f..dcadb74 100644 --- a/lib/ex_typesense/curation_sets.ex +++ b/lib/ex_typesense/curation_sets.ex @@ -11,7 +11,7 @@ defmodule ExTypesense.CurationSets do Delete a specific curation set by its name """ @doc since: "2.2.0" - @spec delete_curation_set(curation_set_name :: String.t()) :: + @spec delete_curation_set(String.t()) :: {:ok, OpenApiTypesense.CurationSetDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_curation_set(curation_set_name) do @@ -27,7 +27,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec delete_curation_set(curation_set_name :: String.t(), opts :: keyword) :: + @spec delete_curation_set(String.t(), keyword()) :: {:ok, OpenApiTypesense.CurationSetDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_curation_set(curation_set_name, opts) do @@ -40,10 +40,7 @@ defmodule ExTypesense.CurationSets do Delete a specific curation item by its id """ @doc since: "2.2.0" - @spec delete_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t() - ) :: + @spec delete_curation_set_item(String.t(), String.t()) :: {:ok, OpenApiTypesense.CurationItemDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_curation_set_item(curation_set_name, item_id) do @@ -59,11 +56,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec delete_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t(), - opts :: keyword - ) :: + @spec delete_curation_set_item(String.t(), String.t(), keyword()) :: {:ok, OpenApiTypesense.CurationItemDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_curation_set_item(curation_set_name, item_id, opts) do @@ -76,7 +69,7 @@ defmodule ExTypesense.CurationSets do Retrieve a specific curation set by its name """ @doc since: "2.2.0" - @spec retrieve_curation_set(curation_set_name :: String.t()) :: + @spec retrieve_curation_set(String.t()) :: {:ok, OpenApiTypesense.CurationSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set(curation_set_name) do @@ -92,7 +85,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec retrieve_curation_set(curation_set_name :: String.t(), opts :: keyword) :: + @spec retrieve_curation_set(String.t(), keyword()) :: {:ok, OpenApiTypesense.CurationSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set(curation_set_name, opts) do @@ -105,10 +98,7 @@ defmodule ExTypesense.CurationSets do Retrieve a specific curation item by its id """ @doc since: "2.2.0" - @spec retrieve_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t() - ) :: + @spec retrieve_curation_set_item(String.t(), String.t()) :: {:ok, OpenApiTypesense.CurationItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set_item(curation_set_name, item_id) do @@ -124,11 +114,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec retrieve_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t(), - opts :: keyword - ) :: + @spec retrieve_curation_set_item(String.t(), String.t(), keyword()) :: {:ok, OpenApiTypesense.CurationItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set_item(curation_set_name, item_id, opts) do @@ -141,7 +127,7 @@ defmodule ExTypesense.CurationSets do Retrieve all curation items in a set """ @doc since: "2.2.0" - @spec retrieve_curation_set_items(curation_set_name :: String.t()) :: + @spec retrieve_curation_set_items(String.t()) :: {:ok, [OpenApiTypesense.CurationItemSchema.t()]} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set_items(curation_set_name) do @@ -157,7 +143,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec retrieve_curation_set_items(curation_set_name :: String.t(), opts :: keyword) :: + @spec retrieve_curation_set_items(String.t(), keyword()) :: {:ok, [OpenApiTypesense.CurationItemSchema.t()]} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_curation_set_items(curation_set_name, opts) do @@ -185,7 +171,7 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" - @spec retrieve_curation_sets(opts :: keyword) :: + @spec retrieve_curation_sets(keyword()) :: {:ok, [OpenApiTypesense.CurationSetSchema.t()]} | :error def retrieve_curation_sets(opts) do OpenApiTypesense.CurationSets.retrieve_curation_sets(opts) @@ -204,8 +190,8 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" @spec upsert_curation_set( - curation_set_name :: String.t(), - body :: OpenApiTypesense.CurationSetCreateSchema.t() + String.t(), + map() | OpenApiTypesense.CurationSetCreateSchema.t() ) :: {:ok, OpenApiTypesense.CurationSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -223,9 +209,9 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" @spec upsert_curation_set( - curation_set_name :: String.t(), - body :: OpenApiTypesense.CurationSetCreateSchema.t(), - opts :: keyword + String.t(), + map() | OpenApiTypesense.CurationSetCreateSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.CurationSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -246,9 +232,9 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" @spec upsert_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t(), - body :: OpenApiTypesense.CurationItemCreateSchema.t() + String.t(), + String.t(), + map() | OpenApiTypesense.CurationItemCreateSchema.t() ) :: {:ok, OpenApiTypesense.CurationItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -266,10 +252,10 @@ defmodule ExTypesense.CurationSets do """ @doc since: "2.2.0" @spec upsert_curation_set_item( - curation_set_name :: String.t(), - item_id :: String.t(), - body :: OpenApiTypesense.CurationItemCreateSchema.t(), - opts :: keyword + String.t(), + String.t(), + map() | OpenApiTypesense.CurationItemCreateSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.CurationItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} diff --git a/lib/ex_typesense/document.ex b/lib/ex_typesense/document.ex index c6a5213..48fe0c5 100644 --- a/lib/ex_typesense/document.ex +++ b/lib/ex_typesense/document.ex @@ -161,7 +161,7 @@ defmodule ExTypesense.Document do Enum.map(structs, fn record -> record |> Map.from_struct() - |> Map.drop([:id, :__meta__, :__struct__]) + |> Map.drop([:id, :__meta__, :__metadata__, :__struct__]) end) import_documents(coll_name, body, opts) @@ -264,7 +264,7 @@ defmodule ExTypesense.Document do {:ok, map} | {:error, OpenApiTypesense.ApiResponse.t()} def index_document(record, opts) when is_struct(record) do collection_name = record.__struct__.__schema__(:source) - document = Map.from_struct(record) |> Map.drop([:id, :__meta__, :__struct__]) + document = Map.from_struct(record) |> Map.drop([:id, :__meta__, :__metadata__, :__struct__]) OpenApiTypesense.Documents.index_document(collection_name, document, opts) end @@ -386,7 +386,7 @@ defmodule ExTypesense.Document do field_name = coll_name <> "_id" id = Map.get(record, String.to_existing_atom(field_name)) opts = Keyword.put_new(opts, :filter_by, "#{field_name}:#{id}") - body = record |> Map.from_struct() |> Map.drop([:id, :__meta__, :__struct__]) + body = record |> Map.from_struct() |> Map.drop([:id, :__meta__, :__metadata__, :__struct__]) update_documents_by_query(coll_name, body, opts) end diff --git a/lib/ex_typesense/key.ex b/lib/ex_typesense/key.ex index be41dd7..1582e2c 100644 --- a/lib/ex_typesense/key.ex +++ b/lib/ex_typesense/key.ex @@ -94,7 +94,7 @@ defmodule ExTypesense.Key do iex> ExTypesense.create_key(body) """ @doc since: "1.0.0" - @spec create_key(map()) :: + @spec create_key(map() | OpenApiTypesense.ApiKeySchema.t()) :: {:ok, OpenApiTypesense.ApiKey.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_key(body) do create_key(body, []) diff --git a/lib/ex_typesense/natural_language.ex b/lib/ex_typesense/natural_language.ex index 2b65e1e..a491c87 100644 --- a/lib/ex_typesense/natural_language.ex +++ b/lib/ex_typesense/natural_language.ex @@ -21,7 +21,7 @@ defmodule ExTypesense.NaturalLanguage do The NL search model to be created """ @doc since: "2.1.0" - @spec create_nl_search_model(body :: OpenApiTypesense.NLSearchModelCreateSchema.t()) :: + @spec create_nl_search_model(map() | OpenApiTypesense.NLSearchModelCreateSchema.t()) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def create_nl_search_model(body) do @@ -38,8 +38,8 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" @spec create_nl_search_model( - body :: OpenApiTypesense.NLSearchModelCreateSchema.t(), - opts :: keyword + map() | OpenApiTypesense.NLSearchModelCreateSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -53,7 +53,7 @@ defmodule ExTypesense.NaturalLanguage do Delete a specific NL search model by its ID. """ @doc since: "2.1.0" - @spec delete_nl_search_model(model_id :: String.t()) :: + @spec delete_nl_search_model(String.t()) :: {:ok, OpenApiTypesense.NLSearchModelDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_nl_search_model(model_id) do @@ -69,7 +69,7 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" - @spec delete_nl_search_model(model_id :: String.t(), opts :: keyword) :: + @spec delete_nl_search_model(String.t(), keyword()) :: {:ok, OpenApiTypesense.NLSearchModelDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_nl_search_model(model_id, opts) do @@ -98,7 +98,7 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" - @spec retrieve_all_nl_search_models(opts :: keyword) :: + @spec retrieve_all_nl_search_models(keyword()) :: {:ok, [OpenApiTypesense.NLSearchModelSchema.t()]} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_all_nl_search_models(opts) do @@ -111,7 +111,7 @@ defmodule ExTypesense.NaturalLanguage do Retrieve a specific NL search model by its ID. """ @doc since: "2.1.0" - @spec retrieve_nl_search_model(model_id :: String.t()) :: + @spec retrieve_nl_search_model(String.t()) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_nl_search_model(model_id) do @@ -127,7 +127,7 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" - @spec retrieve_nl_search_model(model_id :: String.t(), opts :: keyword) :: + @spec retrieve_nl_search_model(String.t(), keyword()) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_nl_search_model(model_id, opts) do @@ -147,8 +147,8 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" @spec update_nl_search_model( - model_id :: String.t(), - body :: OpenApiTypesense.NLSearchModelCreateSchema.t() + String.t(), + map() | OpenApiTypesense.NLSearchModelCreateSchema.t() ) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -166,9 +166,9 @@ defmodule ExTypesense.NaturalLanguage do """ @doc since: "2.1.0" @spec update_nl_search_model( - model_id :: String.t(), - body :: OpenApiTypesense.NLSearchModelCreateSchema.t(), - opts :: keyword + String.t(), + map() | OpenApiTypesense.NLSearchModelCreateSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.NLSearchModelSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} diff --git a/lib/ex_typesense/preset.ex b/lib/ex_typesense/preset.ex index 72286f7..1ef180a 100644 --- a/lib/ex_typesense/preset.ex +++ b/lib/ex_typesense/preset.ex @@ -64,7 +64,7 @@ defmodule ExTypesense.Preset do iex> ExTypesense.upsert_preset("listing_view", body) """ @doc since: "1.0.0" - @spec upsert_preset(String.t(), map()) :: + @spec upsert_preset(String.t(), map() | OpenApiTypesense.PresetUpsertSchema.t()) :: {:ok, OpenApiTypesense.PresetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_preset(preset_id, body) do upsert_preset(preset_id, body, []) @@ -88,7 +88,7 @@ defmodule ExTypesense.Preset do iex> ExTypesense.upsert_preset("listing_view", body, opts) """ @doc since: "1.0.0" - @spec upsert_preset(String.t(), map(), keyword()) :: + @spec upsert_preset(String.t(), map() | OpenApiTypesense.PresetUpsertSchema.t(), keyword()) :: {:ok, OpenApiTypesense.PresetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_preset(preset_id, body, opts) do OpenApiTypesense.Presets.upsert_preset(preset_id, body, opts) diff --git a/lib/ex_typesense/stopwords.ex b/lib/ex_typesense/stopwords.ex index fa1c4f7..2a297db 100644 --- a/lib/ex_typesense/stopwords.ex +++ b/lib/ex_typesense/stopwords.ex @@ -64,7 +64,7 @@ defmodule ExTypesense.Stopwords do iex> ExTypesense.upsert_override("stopwords-famous-person", body) """ @doc since: "1.0.0" - @spec upsert_stopword(String.t(), map()) :: + @spec upsert_stopword(String.t(), map() | OpenApiTypesense.StopwordsSetUpsertSchema.t()) :: {:ok, OpenApiTypesense.StopwordsSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_stopword(stop_id, body) do @@ -89,7 +89,11 @@ defmodule ExTypesense.Stopwords do iex> ExTypesense.upsert_stopword("stopword_set_countries", body, opts) """ @doc since: "1.0.0" - @spec upsert_stopword(String.t(), map(), keyword()) :: + @spec upsert_stopword( + String.t(), + map() | OpenApiTypesense.StopwordsSetUpsertSchema.t(), + keyword() + ) :: {:ok, OpenApiTypesense.StopwordsSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_stopword(stop_id, body, opts) do diff --git a/lib/ex_typesense/synonym.ex b/lib/ex_typesense/synonym.ex index 58ac3f5..fc7a015 100644 --- a/lib/ex_typesense/synonym.ex +++ b/lib/ex_typesense/synonym.ex @@ -85,7 +85,7 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" - @spec retrieve_synonym_sets(opts :: keyword) :: + @spec retrieve_synonym_sets(keyword()) :: {:ok, [OpenApiTypesense.SynonymSetSchema.t()]} | :error def retrieve_synonym_sets(opts) do OpenApiTypesense.Synonyms.retrieve_synonym_sets(opts) @@ -97,7 +97,7 @@ defmodule ExTypesense.Synonym do Retrieve all synonym items in a set """ @doc since: "2.2.0" - @spec retrieve_synonym_set_items(synonym_set_name :: String.t()) :: + @spec retrieve_synonym_set_items(String.t()) :: {:ok, [OpenApiTypesense.SynonymItemSchema.t()]} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_synonym_set_items(synonym_set_name) do @@ -113,7 +113,7 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" - @spec retrieve_synonym_set_items(synonym_set_name :: String.t(), opts :: keyword) :: + @spec retrieve_synonym_set_items(String.t(), keyword()) :: {:ok, [OpenApiTypesense.SynonymItemSchema.t()]} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_synonym_set_items(synonym_set_name, opts) do @@ -167,7 +167,7 @@ defmodule ExTypesense.Synonym do Retrieve a specific synonym set by its name """ @doc since: "2.2.0" - @spec retrieve_synonym_set(synonym_set_name :: String.t()) :: + @spec retrieve_synonym_set(String.t()) :: {:ok, OpenApiTypesense.SynonymSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_synonym_set(synonym_set_name) do @@ -183,7 +183,7 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" - @spec retrieve_synonym_set(synonym_set_name :: String.t(), opts :: keyword) :: + @spec retrieve_synonym_set(String.t(), keyword()) :: {:ok, OpenApiTypesense.SynonymSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_synonym_set(synonym_set_name, opts) do @@ -197,8 +197,8 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" @spec retrieve_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t() + String.t(), + String.t() ) :: {:ok, OpenApiTypesense.SynonymItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -215,11 +215,7 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" - @spec retrieve_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t(), - opts :: keyword - ) :: + @spec retrieve_synonym_set_item(String.t(), String.t(), keyword()) :: {:ok, OpenApiTypesense.SynonymItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def retrieve_synonym_set_item(synonym_set_name, item_id, opts) do @@ -275,7 +271,7 @@ defmodule ExTypesense.Synonym do Delete a specific synonym set by its name """ @doc since: "2.2.0" - @spec delete_synonym_set(synonym_set_name :: String.t()) :: + @spec delete_synonym_set(String.t()) :: {:ok, OpenApiTypesense.SynonymSetDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_synonym_set(synonym_set_name) do @@ -288,7 +284,7 @@ defmodule ExTypesense.Synonym do Delete a specific synonym set by its name """ @doc since: "2.2.0" - @spec delete_synonym_set(synonym_set_name :: String.t(), opts :: keyword) :: + @spec delete_synonym_set(String.t(), keyword()) :: {:ok, OpenApiTypesense.SynonymSetDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_synonym_set(synonym_set_name, opts) do @@ -301,10 +297,7 @@ defmodule ExTypesense.Synonym do Delete a specific synonym item by its id """ @doc since: "2.2.0" - @spec delete_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t() - ) :: + @spec delete_synonym_set_item(String.t(), String.t()) :: {:ok, OpenApiTypesense.SynonymItemDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_synonym_set_item(synonym_set_name, item_id) do @@ -320,11 +313,7 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" - @spec delete_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t(), - opts :: keyword - ) :: + @spec delete_synonym_set_item(String.t(), String.t(), keyword()) :: {:ok, OpenApiTypesense.SynonymItemDeleteSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def delete_synonym_set_item(synonym_set_name, item_id, opts) do @@ -343,7 +332,11 @@ defmodule ExTypesense.Synonym do """ @doc since: "1.0.0" @deprecated "Please use `upsert_synonym_set` or `upsert_synonym_set_item` when using Typesense v30.0+" - @spec upsert_synonym(String.t() | module(), String.t(), map()) :: + @spec upsert_synonym( + String.t() | module(), + String.t(), + map() | OpenApiTypesense.SearchSynonymSchema.t() + ) :: {:ok, OpenApiTypesense.SearchSynonym.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_synonym(coll_name, syn_id, body) do upsert_synonym(coll_name, syn_id, body, []) @@ -368,7 +361,12 @@ defmodule ExTypesense.Synonym do """ @doc since: "1.0.0" @deprecated "Please use `upsert_synonym_set` or `upsert_synonym_set_item` when using Typesense v30.0+" - @spec upsert_synonym(String.t() | module(), String.t(), map(), keyword()) :: + @spec upsert_synonym( + String.t() | module(), + String.t(), + map() | OpenApiTypesense.SearchSynonymSchema.t(), + keyword() + ) :: {:ok, OpenApiTypesense.SearchSynonym.t()} | {:error, OpenApiTypesense.ApiResponse.t()} def upsert_synonym(module, syn_id, body, opts) when is_atom(module) do coll_name = module.__schema__(:source) @@ -392,8 +390,8 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" @spec upsert_synonym_set( - synonym_set_name :: String.t(), - body :: OpenApiTypesense.SynonymSetCreateSchema.t() + String.t(), + map() | OpenApiTypesense.SynonymSetCreateSchema.t() ) :: {:ok, OpenApiTypesense.SynonymSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -411,9 +409,9 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" @spec upsert_synonym_set( - synonym_set_name :: String.t(), - body :: OpenApiTypesense.SynonymSetCreateSchema.t(), - opts :: keyword + String.t(), + map() | OpenApiTypesense.SynonymSetCreateSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.SynonymSetSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -434,9 +432,9 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" @spec upsert_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t(), - body :: OpenApiTypesense.SynonymItemUpsertSchema.t() + String.t(), + String.t(), + map() | OpenApiTypesense.SynonymItemUpsertSchema.t() ) :: {:ok, OpenApiTypesense.SynonymItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} @@ -454,10 +452,10 @@ defmodule ExTypesense.Synonym do """ @doc since: "2.2.0" @spec upsert_synonym_set_item( - synonym_set_name :: String.t(), - item_id :: String.t(), - body :: OpenApiTypesense.SynonymItemUpsertSchema.t(), - opts :: keyword + String.t(), + String.t(), + map() | OpenApiTypesense.SynonymItemUpsertSchema.t(), + keyword() ) :: {:ok, OpenApiTypesense.SynonymItemSchema.t()} | {:error, OpenApiTypesense.ApiResponse.t()} diff --git a/mix.exs b/mix.exs index a9a65c7..274d27c 100644 --- a/mix.exs +++ b/mix.exs @@ -2,7 +2,7 @@ defmodule ExTypesense.MixProject do use Mix.Project @source_url "https://github.com/jaeyson/ex_typesense" - @version "2.3.0" + @version "2.3.1" def project do [ diff --git a/mix.lock b/mix.lock index 9069c8a..2f4e54f 100644 --- a/mix.lock +++ b/mix.lock @@ -21,7 +21,7 @@ "nimble_options": {:hex, :nimble_options, "1.1.1", "e3a492d54d85fc3fd7c5baf411d9d2852922f66e69476317787a7b2bb000a61b", [:mix], [], "hexpm", "821b2470ca9442c4b6984882fe9bb0389371b8ddec4d45a9504f00a66f650b44"}, "nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"}, "nimble_pool": {:hex, :nimble_pool, "1.1.0", "bf9c29fbdcba3564a8b800d1eeb5a3c58f36e1e11d7b7fb2e084a643f645f06b", [:mix], [], "hexpm", "af2e4e6b34197db81f7aad230c1118eac993acc0dae6bc83bac0126d4ae0813a"}, - "open_api_typesense": {:hex, :open_api_typesense, "1.3.1", "13aa8b996428c9d44a9b4e23b0393aad5574e7b880195ba9606056f5be159c70", [:mix], [{:poison, "~> 6.0", [hex: :poison, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "2b5e944e29439727096a489c748cf4ad006c36b81864c59740635e486486ede3"}, + "open_api_typesense": {:hex, :open_api_typesense, "1.3.2", "92c3df90a50d27db5303ee5fc80c3d610cc61ca7b391a245d23fb82088ee8d31", [:mix], [{:poison, "~> 6.0", [hex: :poison, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "316624badbb80484ecfdf21321c0c1156ab7b001618aa7f83e82683fdd3bb73f"}, "poison": {:hex, :poison, "6.0.0", "9bbe86722355e36ffb62c51a552719534257ba53f3271dacd20fbbd6621a583a", [:mix], [{:decimal, "~> 2.1", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "bb9064632b94775a3964642d6a78281c07b7be1319e0016e1643790704e739a2"}, "req": {:hex, :req, "0.5.17", "0096ddd5b0ed6f576a03dde4b158a0c727215b15d2795e59e0916c6971066ede", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.17", [hex: :finch, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:mime, "~> 2.0.6 or ~> 2.1", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_csv, "~> 1.0", [hex: :nimble_csv, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "0b8bc6ffdfebbc07968e59d3ff96d52f2202d0536f10fef4dc11dc02a2a43e39"}, "telemetry": {:hex, :telemetry, "1.4.1", "ab6de178e2b29b58e8256b92b382ea3f590a47152ca3651ea857a6cae05ac423", [:rebar3], [], "hexpm", "2172e05a27531d3d31dd9782841065c50dd5c3c7699d95266b2edd54c2dafa1c"},