diff --git a/.github/workflows/ci_v26.0.yml b/.github/workflows/ci_v26.0.yml index 4c833a9..cd66997 100644 --- a/.github/workflows/ci_v26.0.yml +++ b/.github/workflows/ci_v26.0.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '26.0' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '26.0' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v27.0.yml b/.github/workflows/ci_v27.0.yml index 76080a7..d883e5a 100644 --- a/.github/workflows/ci_v27.0.yml +++ b/.github/workflows/ci_v27.0.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '27.0' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '27.0' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v27.1.yml b/.github/workflows/ci_v27.1.yml index ea34b99..057868a 100644 --- a/.github/workflows/ci_v27.1.yml +++ b/.github/workflows/ci_v27.1.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '27.1' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '27.1' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v28.0.yml b/.github/workflows/ci_v28.0.yml index 07aa634..caf4d83 100644 --- a/.github/workflows/ci_v28.0.yml +++ b/.github/workflows/ci_v28.0.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '28.0' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '28.0' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v29.0.yml b/.github/workflows/ci_v29.0.yml index 8d6974d..40ffb7e 100644 --- a/.github/workflows/ci_v29.0.yml +++ b/.github/workflows/ci_v29.0.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '29.0' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '29.0' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v30.0.yml b/.github/workflows/ci_v30.0.yml index d03529b..5a7ae39 100644 --- a/.github/workflows/ci_v30.0.yml +++ b/.github/workflows/ci_v30.0.yml @@ -34,7 +34,7 @@ jobs: include: - typesense: '30.0' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '30.0' otp: '27' @@ -109,6 +109,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -121,9 +124,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} diff --git a/.github/workflows/ci_v30.1.yml b/.github/workflows/ci_v30.1.yml index dd394ed..d351bfb 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 }} @@ -33,7 +34,7 @@ jobs: include: - typesense: '30.1' otp: '25' - elixir: '1.14' + elixir: '1.15' lint: false - typesense: '30.1' otp: '27' @@ -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- @@ -111,6 +111,9 @@ jobs: mix local.hex --if-missing mix deps.get + - name: Compile project + run: mix compile --all-warnings + - name: Find unused dependencies run: mix deps.unlock --check-unused if: ${{ matrix.lint }} @@ -123,9 +126,6 @@ jobs: run: mix deps.audit if: ${{ matrix.lint }} - - name: Compile project - run: mix compile --all-warnings - - name: Run static analysis run: mix credo --all --strict if: ${{ matrix.lint }} @@ -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..56e5972 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.06.07) + +### 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..1052999 100644 --- a/mix.exs +++ b/mix.exs @@ -2,13 +2,13 @@ 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 [ app: :ex_typesense, version: @version, - elixir: "~> 1.14", + elixir: "~> 1.15", start_permanent: Mix.env() == :prod, consolidate_protocols: Mix.env() not in [:dev, :test], deps: deps(), @@ -46,7 +46,18 @@ defmodule ExTypesense.MixProject do {:mix_audit, "~> 2.1", only: :test, runtime: false}, {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false}, {:open_api_typesense, "~> 1.3"}, - {:ecto, "~> 3.12"} + {:ecto, "~> 3.12"}, + + # Name: decimal + # Version: 2.4.1 + # Lockfile: /home/runner/work/ex_typesense/ex_typesense/mix.lock + # URL: https://github.com/advisories/GHSA-rhv4-8758-jx7v + # Title: Decimal: Unbounded exponent in `Decimal.new` enables unauthenticated DoS + # Severity: moderate + # Vulnerable versions: >= 0.1.0, < 3.0.0 + # First patched versions: 3.0.0 + # Vulnerabilities found! + {:decimal, "~> 3.0", override: true} ] end diff --git a/mix.lock b/mix.lock index 9069c8a..8c89376 100644 --- a/mix.lock +++ b/mix.lock @@ -1,30 +1,30 @@ %{ "bunt": {:hex, :bunt, "1.0.0", "081c2c665f086849e6d57900292b3a161727ab40431219529f13c4ddcf3e7a44", [:mix], [], "hexpm", "dc5f86aa08a5f6fa6b8096f0735c4e76d54ae5c9fa2c143e5a1fc7c1cd9bb6b5"}, - "credo": {:hex, :credo, "1.7.18", "5c5596bf7aedf9c8c227f13272ac499fe8eae6237bd326f2f07dfc173786f042", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "a189d164685fd945809e862fe76a7420c4398fa288d76257662aecb909d6b3e5"}, - "decimal": {:hex, :decimal, "2.3.0", "3ad6255aa77b4a3c4f818171b12d237500e63525c2fd056699967a3e7ea20f62", [:mix], [], "hexpm", "a4d66355cb29cb47c3cf30e71329e58361cfcb37c34235ef3bf1d7bf3773aeac"}, + "credo": {:hex, :credo, "1.7.19", "cc52129665fc7c15143d47838fda0f9cd6dac9ceced7bf4da6f85fcbfe64b12a", [:mix], [{:bunt, "~> 0.2.1 or ~> 1.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2 or ~> 1.0", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "2d8bc95d5a7bb99dd2613621d4f08c6a3575c3fd4b62e6a2b48a100352a557b8"}, + "decimal": {:hex, :decimal, "3.1.1", "430d87b04011ce6cbd4fd205be758311a81f87d552d40904abd00f015935b1d0", [:mix], [], "hexpm", "c5f25f2ced74a0587d03e6023f595db8e924c9d3922c8c8ffd9edfc4498cf1f6"}, "dialyxir": {:hex, :dialyxir, "1.4.7", "dda948fcee52962e4b6c5b4b16b2d8fa7d50d8645bbae8b8685c3f9ecb7f5f4d", [:mix], [{:erlex, ">= 0.2.8", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "b34527202e6eb8cee198efec110996c25c5898f43a4094df157f8d28f27d9efe"}, "earmark_parser": {:hex, :earmark_parser, "1.4.44", "f20830dd6b5c77afe2b063777ddbbff09f9759396500cdbe7523efd58d7a339c", [:mix], [], "hexpm", "4778ac752b4701a5599215f7030989c989ffdc4f6df457c5f36938cc2d2a2750"}, "ecto": {:hex, :ecto, "3.13.5", "9d4a69700183f33bf97208294768e561f5c7f1ecf417e0fa1006e4a91713a834", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "df9efebf70cf94142739ba357499661ef5dbb559ef902b68ea1f3c1fabce36de"}, "erlex": {:hex, :erlex, "0.2.8", "cd8116f20f3c0afe376d1e8d1f0ae2452337729f68be016ea544a72f767d9c12", [:mix], [], "hexpm", "9d66ff9fedf69e49dc3fd12831e12a8a37b76f8651dd21cd45fcf5561a8a7590"}, - "ex_doc": {:hex, :ex_doc, "0.40.1", "67542e4b6dde74811cfd580e2c0149b78010fd13001fda7cfeb2b2c2ffb1344d", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "bcef0e2d360d93ac19f01a85d58f91752d930c0a30e2681145feea6bd3516e00"}, + "ex_doc": {:hex, :ex_doc, "0.40.3", "4a972ffe64bc07dc605af487e98fc19b72a4185f55ca031b94c0552d6071c1d9", [:mix], [{:earmark_parser, "~> 1.4.44", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_c, ">= 0.1.0", [hex: :makeup_c, repo: "hexpm", optional: true]}, {:makeup_elixir, "~> 0.14 or ~> 1.0", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1 or ~> 1.0", [hex: :makeup_erlang, repo: "hexpm", optional: false]}, {:makeup_html, ">= 0.1.0", [hex: :makeup_html, repo: "hexpm", optional: true]}], "hexpm", "2756e357742fecd9749b489b85d67c9ce99c465f2e75728d9e6dc8d704b973de"}, "excoveralls": {:hex, :excoveralls, "0.18.5", "e229d0a65982613332ec30f07940038fe451a2e5b29bce2a5022165f0c9b157e", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "523fe8a15603f86d64852aab2abe8ddbd78e68579c8525ae765facc5eae01562"}, "file_system": {:hex, :file_system, "1.1.1", "31864f4685b0148f25bd3fbef2b1228457c0c89024ad67f7a81a3ffbc0bbad3a", [:mix], [], "hexpm", "7a15ff97dfe526aeefb090a7a9d3d03aa907e100e262a0f8f7746b78f8f87a5d"}, - "finch": {:hex, :finch, "0.21.0", "b1c3b2d48af02d0c66d2a9ebfb5622be5c5ecd62937cf79a88a7f98d48a8290c", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.6.2 or ~> 1.7", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "87dc6e169794cb2570f75841a19da99cfde834249568f2a5b121b809588a4377"}, + "finch": {:hex, :finch, "0.22.0", "5c48fa6f9706a78eb9036cacb67b8b996b4e66d111c543f4c29bb0f879a6806b", [:mix], [{:mime, "~> 1.0 or ~> 2.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.8", [hex: :mint, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.4 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 1.1", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b94e83c47780fc6813f746a1f1a34ee65cda42da4c5ea26a68f0acc4498e23dc"}, "hpax": {:hex, :hpax, "1.0.3", "ed67ef51ad4df91e75cc6a1494f851850c0bd98ebc0be6e81b026e765ee535aa", [:mix], [], "hexpm", "8eab6e1cfa8d5918c2ce4ba43588e894af35dbd8e91e6e55c817bca5847df34a"}, - "jason": {:hex, :jason, "1.4.4", "b9226785a9aa77b6857ca22832cffa5d5011a667207eb2a0ad56adb5db443b8a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "c5eb0cab91f094599f94d55bc63409236a8ec69a21a67814529e8d5f6cc90b3b"}, + "jason": {:hex, :jason, "1.4.5", "2e3a008590b0b8d7388c20293e9dcc9cf3e5d642fd2a114e4cbbb52e595d940a", [:mix], [{:decimal, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b0c823996102bcd0239b3c2444eb00409b72f6a140c1950bc8b457d836b30684"}, "makeup": {:hex, :makeup, "1.2.1", "e90ac1c65589ef354378def3ba19d401e739ee7ee06fb47f94c687016e3713d1", [:mix], [{:nimble_parsec, "~> 1.4", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "d36484867b0bae0fea568d10131197a4c2e47056a6fbe84922bf6ba71c8d17ce"}, "makeup_elixir": {:hex, :makeup_elixir, "1.0.1", "e928a4f984e795e41e3abd27bfc09f51db16ab8ba1aebdba2b3a575437efafc2", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "7284900d412a3e5cfd97fdaed4f5ed389b8f2b4cb49efc0eb3bd10e2febf9507"}, - "makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"}, + "makeup_erlang": {:hex, :makeup_erlang, "1.1.0", "835f7e60792e08824cda445639555d7bf1bbbddb1b60b306e33cb6f6db24dc74", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "1cd6780fb1dd1a03979abaed0fe82712b0625118fd5257d3ebbf73f960c73c3c"}, "mime": {:hex, :mime, "2.0.7", "b8d739037be7cd402aee1ba0306edfdef982687ee7e9859bee6198c1e7e2f128", [:mix], [], "hexpm", "6171188e399ee16023ffc5b76ce445eb6d9672e2e241d2df6050f3c771e80ccd"}, - "mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"}, + "mint": {:hex, :mint, "1.8.0", "b964eaf4416f2dee2ba88968d52239fca5621b0402b9c95f55a08eb9d74803e9", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "f3c572c11355eccf00f22275e9b42463bc17bd28db13be1e28f8e0bb4adbc849"}, "mix_audit": {:hex, :mix_audit, "2.1.5", "c0f77cee6b4ef9d97e37772359a187a166c7a1e0e08b50edf5bf6959dfe5a016", [:make, :mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:yaml_elixir, "~> 2.11", [hex: :yaml_elixir, repo: "hexpm", optional: false]}], "hexpm", "87f9298e21da32f697af535475860dc1d3617a010e0b418d2ec6142bc8b42d69"}, "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.3", "1e7ba0228ba0378f86062ae08780dee989f8b88e4bcaa308eee5a3f7f586f017", [:mix], [{:poison, "~> 4.0 or ~> 5.0 or ~> 6.0", [hex: :poison, repo: "hexpm", optional: false]}, {:req, "~> 0.5", [hex: :req, repo: "hexpm", optional: false]}], "hexpm", "08c47313b02b548f8bcf3c6dcf70cbf0acdb8726dcd54a684e7783f33a4d7f2e"}, "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"}, + "req": {:hex, :req, "0.5.18", "48e6431cb4135e8a7815e745177485369a9b4a9924d5fe68ca00eb09ceaed1ef", [:mix], [{:brotli, "~> 0.3.1", [hex: :brotli, repo: "hexpm", optional: true]}, {:ezstd, "~> 1.0", [hex: :ezstd, repo: "hexpm", optional: true]}, {:finch, "~> 0.21.0 or ~> 0.22.0", [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", "fa03812c440a9754bf34355e0c5d4f3ed316458db62e3284b7a352ef8dc0b996"}, + "telemetry": {:hex, :telemetry, "1.4.2", "a0cb522801dffb1c49fe6e30561badffc7b6d0e180db1300df759faa22062855", [:rebar3], [], "hexpm", "928f6495066506077862c0d1646609eed891a4326bee3126ba54b60af61febb1"}, "yamerl": {:hex, :yamerl, "0.10.0", "4ff81fee2f1f6a46f1700c0d880b24d193ddb74bd14ef42cb0bcf46e81ef2f8e", [:rebar3], [], "hexpm", "346adb2963f1051dc837a2364e4acf6eb7d80097c0f53cbdc3046ec8ec4b4e6e"}, "yaml_elixir": {:hex, :yaml_elixir, "2.12.1", "d74f2d82294651b58dac849c45a82aaea639766797359baff834b64439f6b3f4", [:mix], [{:yamerl, "~> 0.10", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "d9ac16563c737d55f9bfeed7627489156b91268a3a21cd55c54eb2e335207fed"}, }