{"id":13795445,"url":"https://github.com/outr/scarango","last_synced_at":"2026-01-11T17:02:04.033Z","repository":{"id":17170093,"uuid":"81283314","full_name":"outr/scarango","owner":"outr","description":"ArangoDB client written in Scala","archived":false,"fork":false,"pushed_at":"2025-05-25T00:10:24.000Z","size":8687,"stargazers_count":59,"open_issues_count":26,"forks_count":20,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-05-26T04:13:01.908Z","etag":null,"topics":["arango","arangodb","arangodb-client","asynchronous","restful","scala"],"latest_commit_sha":null,"homepage":null,"language":"Scala","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/outr.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2017-02-08T03:28:15.000Z","updated_at":"2023-05-28T15:45:39.000Z","dependencies_parsed_at":"2023-10-01T22:54:43.282Z","dependency_job_id":"61a82233-002b-4a18-87ac-a643bf5895b1","html_url":"https://github.com/outr/scarango","commit_stats":null,"previous_names":["outr/arangodb-scala"],"tags_count":110,"template":false,"template_full_name":null,"purl":"pkg:github/outr/scarango","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fscarango","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fscarango/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fscarango/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fscarango/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/outr","download_url":"https://codeload.github.com/outr/scarango/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/outr%2Fscarango/sbom","scorecard":{"id":714972,"data":{"date":"2025-08-11","repo":{"name":"github.com/outr/scarango","commit":"603f73086d03f86eb55e8277ca1e72c01bfaf98b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/scala-steward.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":"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":"Code-Review","score":0,"reason":"Found 0/20 approved changesets -- score normalized to 0","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":"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":"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/ci.yml:11: update your workflow using https://app.stepsecurity.io/secureworkflow/outr/scarango/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/outr/scarango/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/outr/scarango/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/outr/scarango/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/scala-steward.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/outr/scarango/scala-steward.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 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":"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: MIT License: 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":"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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 20 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-22T09:20:08.243Z","repository_id":17170093,"created_at":"2025-08-22T09:20:08.243Z","updated_at":"2025-08-22T09:20:08.243Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28314260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T14:58:17.114Z","status":"ssl_error","status_checked_at":"2026-01-11T14:55:53.580Z","response_time":60,"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":["arango","arangodb","arangodb-client","asynchronous","restful","scala"],"created_at":"2024-08-03T23:00:56.993Z","updated_at":"2026-01-11T17:02:04.016Z","avatar_url":"https://github.com/outr.png","language":"Scala","funding_links":[],"categories":["Uncategorized"],"sub_categories":["Uncategorized"],"readme":"# Scarango\n\n[![CI](https://github.com/outr/scarango/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/outr/scarango/actions/workflows/ci.yml)\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/outr/scarango)\n[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.outr/scarango-driver_2.13/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.outr/scarango-driver_2.13)\n[![Latest version](https://index.scala-lang.org/outr/scarango/scarango-driver/latest.svg)](https://index.scala-lang.org/outr/scarango)\n\nArangoDB client written in Scala\n\n## Setup\n\nScarango is published to Sonatype OSS and Maven Central currently supporting Scala and Scala.js (core only) on 2.13 and 3.\n\nConfiguring the driver in SBT requires:\n\n```\nlibraryDependencies += \"com.outr\" %% \"scarango-driver\" % \"3.20.0\"\n```\n\nOr in Mill:\n\n```\nivy\"com.outr::scarango-driver:3.20.0\"\n```\n\n## Introduction\n\nScarango wraps ArangoDB's Java library to provide lots of additional features and Scala-specific functionality. We utilize\ncats-effect and fs2 for a more modern asynchronous approach. Previous to 3.0, we utilized direct HTTP RESTful calls and\nFutures, but the performance benefits of Java's library made a migration worthwhile.\n\n## Getting Started\n\nAlthough there are a few different ways we can utilize Scarango to interact with ArangoDB, the cleanest and most powerful\napproach is to utilize the Graph layer to set up our database structure and interact with it in a type-safe way. For example:\n\n### Database configuration\n```scala\nimport com.outr.arango.{Document, DocumentModel, Field, Graph, Id, Index}\nimport com.outr.arango.collection.DocumentCollection\nimport com.outr.arango.query._\nimport fabric.rw._\nimport cats.effect.unsafe.implicits.global\n\n// Case class to represent a person collection\ncase class Person(name: String, age: Int, _id: Id[Person] = Person.id()) extends Document[Person]\n\n// We use the companion object to represent additional information about the collection\nobject Person extends DocumentModel[Person] {\n  override implicit val rw: RW[Person] = RW.gen\n\n  val name: Field[String] = field(\"name\")\n  val age: Field[Int] = field(\"age\")\n\n  override def indexes: List[Index] = List(\n    name.index.persistent()\n  )\n\n  override val collectionName: String = \"people\"\n}\n\n// We represent our entire database here referencing all collections\nobject Database extends Graph(\"example\") {\n  val people: DocumentCollection[Person, Person.type] = vertex(Person)\n}\n```\nThis is the basic setup of a single-collection database. Notice the `RW` in the companion object. That is defined\nusing [Fabric](https://github.com/outr/fabric) for conversion to/from JSON for storage in the database. All fields aren't\nrequired to be defined, but it will help us when we want to write simple queries in a type-safe way or when defining things\nlike indexes.\n\n### Initialization\nThe next thing we need to do is initialize the database:\n```scala\nDatabase.init().unsafeRunSync()\n```\n\nNOTE: We're adding `.unsafeRunSync()` at the end of each call for the documentation generation to get the result. Under\nnormal circumstances this is not the ideal way to execute a cats-effect `IO`.\n\n### Truncate the database\nWe can easily clear out everything out of the database:\n```scala\nDatabase.truncate().unsafeRunSync()\n```\n\n### Inserting into the database\nA simple insert of a record into the database:\n```scala\nDatabase.people.insert(Person(\"User 1\", 30)).unsafeRunSync()\n// res2: com.outr.arango.core.CreateResult[Person] = CreateResult(\n//   key = None,\n//   id = None,\n//   rev = None,\n//   document = Person(\n//     name = \"User 1\",\n//     age = 30,\n//     _id = Id(value = \"Ncx2NMcIpYGtWe9sOd8byYLRuYOCPrnH\", collection = \"people\")\n//   ),\n//   newDocument = None,\n//   oldDocument = None\n// )\n```\nWe can also do batch record insertion:\n```scala\nDatabase.people.batch.insert(List(\n    Person(\"Adam\", 21),\n    Person(\"Bethany\", 19)\n)).unsafeRunSync()\n// res3: com.outr.arango.core.CreateResults[Person] = CreateResults(\n//   results = List()\n// )\n```\n\nYou can also use the `Database.people.stream` to cross-stream records into the database.\n\n### Querying\nIn order to get the data out that we just inserted we can do a simple AQL query:\n```scala\nDatabase\n  .people\n  .query(aql\"FOR p IN ${Database.people} RETURN p\")\n  .toList\n  .unsafeRunSync()\n// res4: List[Person] = List(\n//   Person(\n//     name = \"User 1\",\n//     age = 30,\n//     _id = Id(value = \"Ncx2NMcIpYGtWe9sOd8byYLRuYOCPrnH\", collection = \"people\")\n//   ),\n//   Person(\n//     name = \"Adam\",\n//     age = 21,\n//     _id = Id(value = \"b61wDJm3nMePIBhzHXpE8jOD52NRvL1V\", collection = \"people\")\n//   ),\n//   Person(\n//     name = \"Bethany\",\n//     age = 19,\n//     _id = Id(value = \"Ps4IYa9Wfge3y0lwMw3Yxs6ln3CsW3cg\", collection = \"people\")\n//   )\n// )\n```\n\nFor an example of data conversion in the result, if we want to only get the person's name back:\n```scala\nDatabase\n  .people\n  .query(aql\"FOR p IN ${Database.people} RETURN p.name\")\n  .as[String]\n  .toList\n  .unsafeRunSync()\n// res5: List[String] = List(\"Adam\", \"Bethany\", \"User 1\")\n```\n\nFor more examples see the specs: https://github.com/outr/scarango/blob/master/driver/src/test/scala/spec/GraphSpec.scala\n\n## TODO\n- Improved ScalaDocs\n- Add AQL compile-time validation support (revive from 2.x)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutr%2Fscarango","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foutr%2Fscarango","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foutr%2Fscarango/lists"}