{"id":19091682,"url":"https://github.com/etrange02/ivet","last_synced_at":"2026-03-07T15:01:17.271Z","repository":{"id":206736046,"uuid":"717582896","full_name":"etrange02/Ivet","owner":"etrange02","description":"Janusgraph schema generator and updator","archived":false,"fork":false,"pushed_at":"2026-02-26T16:46:00.000Z","size":151,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-02-26T17:33:06.025Z","etag":null,"topics":["database-management","database-migrations","database-schema","dotnet-core","graph","gremlin","janusgraph"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/etrange02.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-11-11T22:52:55.000Z","updated_at":"2026-02-26T16:45:34.000Z","dependencies_parsed_at":"2024-02-03T00:24:02.483Z","dependency_job_id":"257c8f8b-6bb5-450d-9b6f-5d43055a3ed5","html_url":"https://github.com/etrange02/Ivet","commit_stats":null,"previous_names":["etrange02/ivet"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/etrange02/Ivet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etrange02%2FIvet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etrange02%2FIvet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etrange02%2FIvet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etrange02%2FIvet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/etrange02","download_url":"https://codeload.github.com/etrange02/Ivet/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/etrange02%2FIvet/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30219250,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T14:02:48.375Z","status":"ssl_error","status_checked_at":"2026-03-07T14:02:43.192Z","response_time":53,"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":["database-management","database-migrations","database-schema","dotnet-core","graph","gremlin","janusgraph"],"created_at":"2024-11-09T03:16:41.456Z","updated_at":"2026-03-07T15:01:17.262Z","avatar_url":"https://github.com/etrange02.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"Summary\n=======\n\nIvet is a command line tool created to generate a schema for a janusgraph database and apply this schema. It has been inspired from Doctrine behaviour.\nThe **generate** command creates a json file containing commands to execute. The file can be manually modified if you find migration is not complete or does not cover all you deserves.\nTo keep trace of all applied migrations, migration names are saved into janusgraph server when **upgrade** is called.\nYou can check at any moment the **list** of migrations both applied and not.\n\nAvailable commands\n=======\n* **generate**\n\t* **dir** Dlls to analyze. If not set look in current working directory.\n\t* **output** Directory where to put migration file. If not set files are created in current directory.\n\t* **ip** _localhost_\n\t* **port** _8182_\n\t* **ssl** Use SSL/TLS for JanusGraph connection (default: false)\n    * **sprintno** Add a subdirectory when generating. Use it as you want\n    * **onefile** Create one file per script\n    * **description** Add a description to your migration\n* **list** Display list of all migrations\n\t* **input** Directory where to find migration files. If not set look in current working directory.\n\t* **ip** _localhost_\n\t* **port** _8182_\n\t* **ssl** Use SSL/TLS for JanusGraph connection (default: false)\n* **upgrade**\n\t* **input** Can be a file or a directory containing migrations to be applied. If not set look in current working directory.\n\t* **ip** _localhost_\n\t* **port** _8182_\n\t* **ssl** Use SSL/TLS for JanusGraph connection (default: false)\n\t* **timeout** Default evaluation timeout in milliseconds for Gremlin scripts. Can be overridden per script or per migration file in JSON\n\nDocker image\n=======\nDocker image is available there:\n- https://hub.docker.com/r/dlecoconnier/ivet\n- https://github.com/etrange02/Ivet/pkgs/container/ivet\n\nTo use Docker image, run the following command replacing `MyDir` with your local directory\n\n```\ndocker run -v MyDir:/app/Migrations -e ip=localhost ivet\n```\nSee upgrade command to add your own parameters.\n\nDotnet Tool\n=======\nYou can install Ivet as a dotnet tool\n```\ndotnet tool install --global Ivet\n```\nAll versions are available on https://www.nuget.org/packages/Ivet\n\nAfter the package is installed you can use it like\n```\nIvet list --input \"C:\\MigrationFiles\"\n```\n\nHow to tag code?\n=======\nAdd `Ivet.Model` (https://www.nuget.org/packages/Ivet.Model) to your project. You are now ready to tag your code.\nAll names and possibilities are listed in Janusgraph documentation at https://docs.janusgraph.org/schema/.\n\nTag a Vertex:\n```\n[Vertex]\npublic class MyVertex\n{\n    [PropertyKey]\n    [PrimaryKey()]\n    public string Id { get; set; }\n\n    [PropertyKey(Name=\"NewName\", Cardinality=Cardinality.SINGLE)]\n    public string ANamedProperty { get; set; }\n\n    [EdgeProperty]\n    public List\u003cVertex3\u003e AListProperty { get; private set; } = new List\u003cVertex3\u003e();\n\n    [EdgeProperty]\n    public Vertex3[] AnArrayProperty { get; private set; } = Array.Empty\u003cVertex3\u003e(); \n}\n```\n\n\nYou can also specify a different name or a cardinality (details at https://docs.janusgraph.org/schema/#property-key-cardinality):\n```\n[PropertyKey(Name=\"NewName\", Cardinality=Cardinality.SINGLE)]\npublic string ANamedProperty { get; set; }\n```\n\n\nTag an Edge:\n```\n[Edge(typeof(MyVertex1), typeof(MyVertex2))]\n[Edge(typeof(MyVertex1), typeof(MyVertex3))]\npublic class EdgeWithProperties\n{\n    [PropertyKey]\n    public int AProperty { get; set; }\n}\n```\n\n\nYou can also tag a property to be used with an index (https://docs.janusgraph.org/schema/index-management/index-performance/):\n```\n[Vertex]\npublic class MyVertex\n{\n    [PropertyKey]\n    [CompositeIndex(\"unicity_index\", IsUnique = true)] // Set unicity of the data\n    public string ACompositeIndexProperty { get; set; }\n\n    [PropertyKey]\n    [MixedIndex(\"vertex2_mixed\", Backend = \"search\", Mapping = MappingType.TEXTSTRING)]\n    public string SearchProperty { get; set; }\n}\n```\n\n\nTimeout \u0026 Resilience\n=======\nIndex operations (`awaitGraphIndexStatus`, `REINDEX`) can take a long time. By default, generated index scripts include a 5-minute evaluation timeout (300000 ms).\n\nYou can control the timeout at three levels (highest priority first):\n1. **Per script** in JSON: `\"evaluationTimeout\": 600000` inside a script entry\n2. **Per file** in JSON: `\"evaluationTimeout\": 600000` at the migration file level\n3. **CLI flag**: `--timeout 600000` on the `upgrade` command\n\n```\nIvet upgrade --input \".\\Migrations\" --timeout 600000\n```\n\n\u003e [!NOTE]\n\u003e If an index script times out, the migration is still marked as applied. JanusGraph registers the index operation and will complete it on restart. Re-running the same script would fail with \"index already exists\". Scripts without an explicit timeout (e.g., entity creation scripts) are NOT marked as applied on timeout — the error propagates normally.\n\nWhat's next?\n=======\nYou can now run a `generate` command in order to create migration files.\n\n\u003e [!NOTE]\n\u003e Many files are created by the `generate` command. One contains vertices and edges and properties. Indices are in different files to avoid timeout at migration time.\n\nYou can have some details of migrations with `list`.\n\n\u003e [!TIP]\n\u003e You can open and manually edit your migration files. In particular there is a description field whose content can be seen with `list` command\n\n```\n\u003e Ivet list --input \".\\Migrations\"\n\nDirectory: D:\\Migrations\n\nMigrations:\n --------------------------------------------------------------------------------------------------------------------------\n | Name                      | Relative path                  | Description | Date                | Multi? | Timeout  |\n --------------------------------------------------------------------------------------------------------------------------\n | Migration_202403032330_#0 | 12\\Migration_202403032330.json | [0]         | 10/03/2024 14:21:54 | True   |          |\n --------------------------------------------------------------------------------------------------------------------------\n | Migration_202403032330_#1 | 12\\Migration_202403032330.json | [1]         | 10/03/2024 14:22:04 | True   | 300000ms |\n --------------------------------------------------------------------------------------------------------------------------\n | Migration_202403032330_#2 | 12\\Migration_202403032330.json | [2]         | 10/03/2024 14:22:14 | True   | 300000ms |\n --------------------------------------------------------------------------------------------------------------------------\n\n Count:3\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetrange02%2Fivet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fetrange02%2Fivet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fetrange02%2Fivet/lists"}