{"id":15695925,"url":"https://github.com/biobuddies/helicopyter","last_synced_at":"2026-01-18T15:08:52.202Z","repository":{"id":179441686,"uuid":"654998920","full_name":"biobuddies/helicopyter","owner":"biobuddies","description":"Python-defined infrastructure","archived":false,"fork":false,"pushed_at":"2026-01-02T18:51:59.000Z","size":282,"stargazers_count":6,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-09T04:55:15.205Z","etag":null,"topics":["ansible","cdktf","python","terraform"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/biobuddies.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-06-17T15:10:56.000Z","updated_at":"2025-12-18T14:12:16.000Z","dependencies_parsed_at":"2024-01-13T22:45:38.969Z","dependency_job_id":"275ebb3b-4fe8-413f-abf1-8d1eb1827668","html_url":"https://github.com/biobuddies/helicopyter","commit_stats":{"total_commits":33,"total_committers":1,"mean_commits":33.0,"dds":0.0,"last_synced_commit":"99e5d01e9eeebc681fc37e8f6da7522270cb9b06"},"previous_names":["covracer/helicopyter"],"tags_count":29,"template":false,"template_full_name":null,"purl":"pkg:github/biobuddies/helicopyter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/biobuddies%2Fhelicopyter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/biobuddies%2Fhelicopyter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/biobuddies%2Fhelicopyter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/biobuddies%2Fhelicopyter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/biobuddies","download_url":"https://codeload.github.com/biobuddies/helicopyter/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/biobuddies%2Fhelicopyter/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28539025,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T14:59:57.589Z","status":"ssl_error","status_checked_at":"2026-01-18T14:59:46.540Z","response_time":98,"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":["ansible","cdktf","python","terraform"],"created_at":"2024-10-03T19:05:25.031Z","updated_at":"2026-01-18T15:08:52.184Z","avatar_url":"https://github.com/biobuddies.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Helicopyter\n\nHelicopyter allows people to conveniently describe infrastructure using Python.\n\nPerhaps like a helicopter hovering between the clouds and the ground, it allows this in a way that's\nless like the AWS Cloud Development Kit (CDK) and more like Terraform.\n\n## Background\nHelicopyter uses [CDKTF](https://github.com/hashicorp/terraform-cdk) and is inspired by\n[Configerator](https://research.facebook.com/file/877841159827226/holistic-configuration-management-at-facebook.pdf) and\n[Terraformpy](https://github.com/NerdWalletOSS/terraformpy).\n\n## What Helicopyter does (goals)\n- Name in the resource-prefix Terraform style, instead of the hash-suffix CDK style. This makes\n  reviewing plan output easier, and aligns with \"Namespaces are one honking great idea -- let's do\n  more of those!\"\n- Simplify `main.py` files by\n    * Removing the `App` class, which does not correspond to a Terraform concept. Instead\n        - A string attribute provides name information\n        - Resource-specific scopes are provided by `HeliStack.push()`\n        - The `synth` method is replaced by a module-level function, and called from a central\n          location instead of distributed boilerplate.\n    * Making custom TerraformStack/HeliStack subclasses optional instead of required. Defining a\n      subclass only to instantiate one instance of it is more complicated than instantiating the\n      base class and modifying the instance.\n```diff\n--- documentation/learn_cdktf_docker.py   2024-08-05 08:47:30\n+++ documentation/learn_helicopyter_docker.py     2024-08-05 08:47:25\n@@ -1,28 +1,18 @@\n-from cdktf import App, TerraformStack\n from cdktf_cdktf_provider_docker.container import Container\n from cdktf_cdktf_provider_docker.image import Image\n-from cdktf_cdktf_provider_docker.provider import DockerProvider\n-from constructs import Construct\n+from helicopyter import HeliStack\n \n-class MyStack(TerraformStack):\n-    def __init__(self, scope: Construct, ns: str):\n-        super().__init__(scope, ns)\n+def synth(stack: HeliStack):\n- \n-        DockerProvider(self, 'docker')\n+    stack.provide('docker')\n \n-        docker_image = Image(self, 'nginxImage', name='nginx:latest', keep_locally=False)\n+    docker_image = stack.push(Image, 'nginxImage', name='nginx:latest', keep_locally=False)\n \n-        Container(\n-            self,\n-            'nginxContainer',\n-            name='tutorial',\n-            image=docker_image.name,\n-            ports=[{'internal': 80, 'external': 8000}],\n-        )\n+    stack.push(\n+        Container,\n+        'nginxContainer',\n+        name='tutorial',\n+        image=docker_image.name,\n+        ports=[{'internal': 80, 'external': 8000}],\n+    )\n-\n-\n-app = App()\n-MyStack(app, 'learn-cdktf-docker')\n-\n-app.synth()\n```\n- Enable hand-written and auto-generated Hashicorp Configuration Language (HCL) files to\n  co-exist, allowing incremental adoption.\n- Separate object instantiation from synthesis, allowing Python script to import the objects/data\n  and do completely different things with them.\n- Golang Terraform has a pretty good command line interface. The `ht[aip]` recipes in\n  `.biobuddies/justfile` try to wrap it very lightly.\n\n### Importing and Renaming\nOut of ignorance, early versions of Helicopyter carried custom support for generating `import`\nblocks. The upstream CDKTF project [added support in fall of 2023](\nhttps://www.hashicorp.com/en/blog/cdktf-0-19-adds-support-for-config-driven-import-and-refactoring\n), although the documentation [1](\nhttps://developer.hashicorp.com/terraform/cdktf/concepts/resources#refactoring-renaming-resources\n) [2](\nhttps://developer.hashicorp.com/terraform/cdktf/examples-and-guides/refactoring#moving-renaming-resources-within-a-stack\n) unfortunately focuses on Javascript and its camelCase function names rather than Python and its\nsnake_case method names.\n\n## Import Existing Resource Into Terraform State\n```python\n    stack.push(\n        Resource,\n        'new_name',\n        ...,\n    ).import_from('provider_resource.old_name')\n```\n\n## Rename or Move Within Terraform State\n```python\n    stack.push(\n        Resource,\n        'new_name',\n        ...\n    ).move_from_id('provider_resource.old_name')\n```\n\n## What Helicopyter will probably never do (non-goals)\n- Support languages other than Python\n- Use CDKTF's command line interface. Integration with it is untested and not recommended.\n\n## What Helicopyter might do in the future\n- Support multiple backend configurations per codename\n- Iterate on supported directory structures. For hysterical raisins, the currently supported\n  directory structure is `f'deploys/{cona}/terraform'`, grouping\n    * Primarily by COdeNAme (CONA), which is probably synonymous with application, deployment, and service\n    * Secondarily by tool, such as `ansible`, `docker`, `terraform`, `python`\n- Why do we need a Node.js server? Can we build dataclasses or Pydantic models out of the type annotations already being\n  generated?\n- Provide helper classes or functions for useful but annoyingly verbose patterns such as local-exec provisioner command\n- Backend / state file linter such as: prod must exist, and region/bucket/workspace_key_prefix/key must follow pattern\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbiobuddies%2Fhelicopyter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbiobuddies%2Fhelicopyter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbiobuddies%2Fhelicopyter/lists"}