{"id":16196303,"url":"https://github.com/nryanov/zio-tarantool","last_synced_at":"2026-01-28T12:11:32.846Z","repository":{"id":37038215,"uuid":"312388009","full_name":"nryanov/zio-tarantool","owner":"nryanov","description":"Scala connector for Tarantool","archived":false,"fork":false,"pushed_at":"2022-06-29T12:30:50.000Z","size":257,"stargazers_count":2,"open_issues_count":10,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-03T14:42:14.485Z","etag":null,"topics":["scala","scodec","tarantool","tarantool-connector","zio"],"latest_commit_sha":null,"homepage":"","language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nryanov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-12T20:28:02.000Z","updated_at":"2025-04-04T06:56:00.000Z","dependencies_parsed_at":"2022-08-18T02:05:24.740Z","dependency_job_id":null,"html_url":"https://github.com/nryanov/zio-tarantool","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/nryanov/zio-tarantool","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nryanov%2Fzio-tarantool","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nryanov%2Fzio-tarantool/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nryanov%2Fzio-tarantool/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nryanov%2Fzio-tarantool/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nryanov","download_url":"https://codeload.github.com/nryanov/zio-tarantool/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nryanov%2Fzio-tarantool/sbom","scorecard":{"id":696960,"data":{"date":"2025-08-11","repo":{"name":"github.com/nryanov/zio-tarantool","commit":"d1d27f0b6ee355c95b0ab06286dc62a1245cea21"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/scala.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scala.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scala.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scala.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scala.yml:67: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scala.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scala.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/nryanov/zio-tarantool/scala.yml/master?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T03:58:27.612Z","repository_id":37038215,"created_at":"2025-08-22T03:58:27.612Z","updated_at":"2025-08-22T03:58:27.612Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28845107,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T10:53:21.605Z","status":"ssl_error","status_checked_at":"2026-01-28T10:53:20.789Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["scala","scodec","tarantool","tarantool-connector","zio"],"created_at":"2024-10-10T08:47:10.916Z","updated_at":"2026-01-28T12:11:32.830Z","avatar_url":"https://github.com/nryanov.png","language":"Scala","funding_links":[],"categories":[],"sub_categories":[],"readme":"# zio-tarantool\n[![GitHub license](https://img.shields.io/github/license/nryanov/zio-tarantool)](https://github.com/nryanov/zio-tarantool/blob/master/LICENSE)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.nryanov.zio-tarantool/zio-tarantool-core_2.13/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.nryanov.zio-tarantool/zio-tarantool-core_2.13)\n[![zio-tarantool CI](https://github.com/nryanov/zio-tarantool/actions/workflows/scala.yml/badge.svg?branch=master)](https://github.com/nryanov/zio-tarantool/actions/workflows/scala.yml)\n\nScala connector for [Tarantool](https://www.tarantool.io/).\n\n## Table of contents\n* [Installation](#installation)\n* [Getting started](#getting-started)\n* [Configuration](#configuration)\n* [API reference](#api-reference)\n* [Schema](#schema)\n* [Codecs](#codecs)\n* [Update operations](#update-operations)\n* [Project status](#project-status)\n\n## Installation\n```sbt\nlibraryDependencies ++= Seq(\n  \"com.nryanov.zio-tarantool\" %% \"zio-tarantool-core\" % \"[version]\" \n)\n```\n\n## Getting started\n```scala\nimport zio._\nimport zio.clock.Clock\nimport zio.tarantool._\nimport zio.tarantool.codec.auto._\nimport zio.tarantool.protocol.IteratorCode\n\n/**\n * \u003e box.schema.create_space('users', {if_not_exists = true})\n * \u003e box.space.users:create_index('primary', {if_not_exists = true, unique = true, parts = {1, 'number'} })\n */\nobject HelloWorld extends zio.App {\n  final case class Address(street: String, number: Int)\n  final case class User(id: Long, name: String, age: Int, address: Address)\n\n  override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] = (for {\n    _ \u003c- TarantoolClient.insert(\"users\", User(1, \"Name1\", 10, Address(\"street1\", 1)))\n\n    user \u003c- TarantoolClient\n      .select(\"users\", \"primary\", 1, 0, IteratorCode.Eq, Tuple1(1L)) // response is Promise[TarantoolError, TarantoolResponse]\n      .flatMap(_.await)\n      .flatMap(_.head[User])\n\n    _ \u003c- zio.console.putStrLn(s\"User: $user\")\n  } yield ExitCode.success).provideLayer(tarantoolLayer()).orDie\n\n  def tarantoolLayer() = {\n    val config = ZLayer.succeed(TarantoolConfig(host = \"localhost\", port = 3301))\n\n    (Clock.live ++ config) \u003e\u003e\u003e TarantoolClient.live ++ zio.console.Console.live\n  }\n}\n```\n\nMore examples can be found in the [examples](examples/) folder.\n\n## Configuration\n`TarantoolConfiguration` consists of:\n- `ConnectionConfig`\n    - `host` -- tarantool instance host.\n    - `port` -- tarantool instance port.\n    - `connectionTimeoutMillis` -- maximum number of milliseconds to wait before giving up to connect (default: 3000).\n    - `retryTimeoutMillis` -- number of milliseconds to wait before retrying if a connection fails (default: 1000).\n    - `retries` -- maximum number of times to retry (default: 3).\n- `ClientConfig`\n    - `requestQueueSize` -- internal queue size for sent requests (default: 64).\n    - `useSchemaMetaCache` -- fetched space and index info will be saved in in-memory cache (default: true) .\n    - `schemaRequestTimeoutMillis` -- maximum number of milliseconds to wait before giving up to fetch space and index info (default: 10000).\n- `AuthInfo` (Without AuthInfo `guest` user will be used)\n    - `username` -- username to log into tarantool.\n    - `password` -- password to log into tarantool.\n\nIn the most cases defaults should be ok, and you can use simplified constructors which require only host, port and optionally auth info:\n```scala\nTarantoolConfig(host, port) // default user: guest\nTarantoolConfig(host, port, AuthInfo(username, password))\n```\n\n## API reference\n- `Ping` -- ping\n- `Insert` -- insert a tuple\n- `Select` -- search for a tuple or a set of tuples in the given space\n- `Update` -- update tuple\n- `Upsert` -- insert or update tuple\n- `Replace` -- replace tuple\n- `Delete` -- delete a tuple\n- `Eval` -- evaluates and executes the expression in Lua-string, which may be any statement or series of statements\n- `Call` -- remote stored-procedure call\n- `Execute` -- execute the SQL statement contained in the sql-statement parameter\n- `Prepare` -- prepare the SQL statement contained in the sql-statement parameter\n- `RefreshMeta` -- force schema cache update\n\nAll operations return `Promise[TarantoolError, TarantoolResponse]`. `TarantoolResponse` has methods for accessing the actual data:\n- `resultSet[A]`\n- `head[A]`\n- `headOption[A]`\n- `raw`\n\nType parameter `A` with implicit `TupleEncoder[A]` is needed to be able to decode raw messagepack into an actual object.\n\n## Schema\nIf `ClientConfig.useSchemaMetaCache` is set to `true` then space and index metas will be stored in in-memory cache.\nThis info will be used in cases where space name and index name are passed instead of their ids. \n\nSchema will be fetched at the beginning after connection is established, but there is an option to force update it.\nTo update the schema cache use `TarantoolClient.refreshMeta`.\n\n## Codecs\nThe core encoder type class is `TupleEncoder[A]`. \nFor tuples which consists only of a single primitive type it will be derived from `Encoder[A]`.\nFor case classes it also will be derived automatically whenever special import is added:\n```scala\nimport zio.tarantool.codec.auto._\n```\n\nThe data will be encoded as a `MpArray`. The nested types will be flattened and encoded as flat `MpArray`.\n\nBut you always can create your own `TupleEncoder[_]`:\n```scala\nfinal case class TestTuple(f1: String, f2: Int, f3: Long)\n\n  implicit val tupleEncoder: TupleEncoder[TestTuple] = new TupleEncoder[TestTuple] {\n\n    override def decode(v: ArrayValue, idx: Int): TestTuple = {\n      val f1Mp = Encoder[String].decode(v.get(idx))\n      val f2Mp = Encoder[Int].decode(v.get(idx + 1))\n      val f3Mp = Encoder[Long].decode(v.get(idx + 2))\n      TestTuple(f1Mp, f2Mp, f3Mp)\n    }\n\n    override def encode(v: TestTuple): Vector[Value] = {\n      val f1Mp = Encoder[String].encode(v.f1)\n      val f2Mp = Encoder[Int].encode(v.f2)\n      val f3Mp = Encoder[Long].encode(v.f3)\n\n      Vector(f1Mp, f2Mp, f3Mp)\n    }\n  }\n``` \n\n## Update operations\n**EXPERIMENTAL**\n\nInstead of manual construction of update operation you can generate it from special implicit builder:\n\n```scala\nimport zio.tarantool.codec.auto._\n\nfinal case class A(f1: String, f2: Int, f3: Long)\n\nval a = A(\"1\", 2, 3)\nval updateOps: Attempt[UpdateOperations] = user.builder.assign(\"f1\", \"test\").plus(\"f2\", 5).build()\n```\n\nCurrently, only fields which contains primitive data can be updated. If field does not exist then `Attempt.failure` will be returned.\nAlso, keep in mind that there is no additional checks for types which are passed into update operations, so there is no error for this:\n```scala\nuser.builder.assign(\"f1\", 12345).build() // tarantool will update field f1 and set value to 12345 \n```\nBut there are checks for operations and types:\n```scala\nuser.builder.minus(\"myField\", \"lalala\").build() // Attempt.failure because string value cannot be used in numeric operations\n```\n\n## Project status\nCurrently, project is under development, so don't expect full stability and that there are no bugs :)\nAlso, there may be API changes in the future.   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnryanov%2Fzio-tarantool","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnryanov%2Fzio-tarantool","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnryanov%2Fzio-tarantool/lists"}