Metadata-Version: 2.1
Name: scratchrelaxtv
Version: 0.3.0
Summary: Terraform developer tool to extract variables and create variables.tf files.
Home-page: https://github.com/YakDriver/scratchrelaxtv
Author: YakDriver
Author-email: projects@plus3it.com
License: Apache Software License 2.0
Platform: Linux
Platform: Windows
Platform: Darwin
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: POSIX :: Linux
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Utilities
Description-Content-Type: text/markdown

![scratch relax tv](https://github.com/YakDriver/scratchrelaxtv/raw/master/assets/srt.gif "Extract HCL Vars")

<p>
    <a href="./LICENSE" alt="License">
        <img src="https://img.shields.io/github/license/YakDriver/scratchrelaxtv.svg" /></a>
    <a href="http://travis-ci.org/YakDriver/scratchrelaxtv" alt="Build status">
        <img src="https://travis-ci.org/YakDriver/scratchrelaxtv.svg?branch=master" /></a>
    <a href="https://pypi.python.org/pypi/scratchrelaxtv" alt="Python versions">
        <img src="https://img.shields.io/pypi/pyversions/scratchrelaxtv.svg" /></a>
    <a href="https://pypi.python.org/pypi/scratchrelaxtv" alt="Version">
        <img src="https://img.shields.io/pypi/v/scratchrelaxtv.svg" /></a>
</p>

Terraform module development tool.

1. Extract variables from `main.tf` and create `variables.tf` files
1. Find missing variables in `variables.tf` and `main.tf` based on each other
1. Create a module use stub from a `variables.tf` file
1. Delete extra *scratchrelaxtv* files

# workflows

**Original module development**: 
1. Write `main.tf` with whatever variables you need
1. Run *scratchrelaxtv* to generate `variables.tf`
1. Fill in descriptions, defaults, etc. in `variables.tf`
1. Run `terraform fmt` to prettify everything

**Cleanup module**:
1. Run *scratchrelaxtv* in folder with `main.tf` and `variables.tf` to find missing variables
1. Using `-cf` option, automatically add missing vars to `variables.tf`
1. Fill in descriptions, defaults, etc. in `variables.tf` for newly added vars
1. Run `terraform fmt` to prettify everything

# install

```
pip install scratchrelaxtv
```

# examples

## generate `variables.tf`

By default, *scratchrelaxtv* looks for `main.tf` and will generate a `variables.tf` file. Variables will be in the same order in `variables.tf` as they were in `main.tf`. There are options to sort variables. You can `--force` to overwrite an existing `variables.tf` file. Otherwise, *scratchrelaxtv* will create new `variables.tf` files with each run: `variables.1.tf`, `variables.2.tf` and so on.

Assume this `main.tf`:
```hcl
resource "aws_s3_bucket" "this" {
  count  = "${var.create_bucket ? 1 : 0}"
  bucket = "${var.bucket}"
  region = "${var.region}"
}
```

Run *scratchrelaxtv*:
```console
$ scratchrelaxtv
2019-04-26 08:02:54,011 - INFO - creating variables.tf file
2019-04-26 08:02:54,011 - INFO - input file: main.tf
2019-04-26 08:02:54,011 - INFO - output file: variables.tf
2019-04-26 08:02:54,011 - INFO - not forcing overwrite of output file
2019-04-26 08:02:54,011 - INFO - not ordering output file
```

The generated `variables.tf`:
```hcl
variable "create_bucket" {
  description = ""
  type        = "string"
  default     = ""
}

variable "bucket" {
  description = ""
  type        = "string"
  default     = ""
}

variable "region" {
  description = ""
  type        = "string"
  default     = ""
}
```

## Find and fix missing variables

Assume you already have a `main.tf` and a `variables.tf`. In this example, the `variables.tf` is missing the `region` variable.

`main.tf`:
```hcl
resource "aws_s3_bucket" "this" {
  bucket = "${var.bucket}"
  region = "${var.region}"
}
```

`variables.tf`:
```hcl
variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = "string"
  default     = ""
}
```

Run *scratchrelaxtv* to automatically add any missing variables:

```console
$ scratchrelaxtv -cf
2019-04-26 08:21:27,289 - INFO - checking for missing variables
2019-04-26 08:21:27,289 - INFO - input file: main.tf
2019-04-26 08:21:27,289 - INFO - output file: variables.tf
2019-04-26 08:21:27,289 - INFO - forcing overwrite of output file
2019-04-26 08:21:27,289 - INFO - not ordering output file
2019-04-26 08:21:27,290 - WARNING - input file main.tf is missing variables:
region
```

Now, the `variables.tf` looks like this:
```hcl
variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = "string"
  default     = ""
}

variable "region" {
  description = ""
  type        = "string"
  default     = ""
}
```

## Create a stub for using the module

By default, when creating a stub, *scratchrelaxtv* looks for `variables.tf`.

Assume this `variables.tf`:
```hcl
variable "id" {
  description = "The ID of the resource"
  type        = "string"
  default     = ""
}

variable "bucket" {
  description = "The bucket where the stuff will be stored"
  type        = "string"
  default     = ""
}

variable "region" {
  description = "The AWS region where the bucket lives"
  type        = "string"
  default     = ""
}
```

Run *scratchrelaxtv* with the module stub option:
```console
$ scratchrelaxtv -m
2019-04-26 08:09:27,147 - INFO - creating module usage stub
2019-04-26 08:09:27,147 - INFO - input file: variables.tf
2019-04-26 08:09:27,147 - INFO - output file: modstub.tf
2019-04-26 08:09:27,147 - INFO - not forcing overwrite of output file
2019-04-26 08:09:27,147 - INFO - not ordering output file
```

The generated `modstub.tf`:
```hcl
module "tests2" {
  source = "../tests2"

  providers = {
    aws = "aws"
  }

  id     = "${local.id}"
  bucket = "${local.bucket}"
  region = "${local.region}"
}
```


## remove files

```console
$ scratchrelaxtv -r
```

*scratchrelaxtv* can also tidy up your directories by removing its own extra generated files. Presumably it will only remove files you no longer need but *be careful*. This chart shows examples of what would be deleted or not. 

**NOTE**: *scratchrelaxtv* removes files in the current directory _and subdirectories_.

| Filename | Deleted? |
| -------- | ------ |
| variables.tf | no |
| modstub.tf | yes |
| modstub.1.tf | yes |
| variables.1.tf | yes |
| xyz.abc | no |
| variables.a.tf | no |
| variables.43.tf | yes |
| modstub | no |
| modstub..tf | no |

# help

*scratchrelaxtv* includes help:

```console
$ scratchrelaxtv --help
usage: scratchrelaxtv [-h] [-i INPUT] [-o OUTPUT] [-f] [-m] [-n MODNAME] [-r]
                      [-c] [-a | -d]

optional arguments:
  -h, --help            show this help message and exit
  -i INPUT, --input INPUT
                        file to extract vars from
  -o OUTPUT, --output OUTPUT
                        file to write extracted vars to
  -f, --force           overwrite existing out file
  -m, --modstub         create module usage stub
  -n MODNAME, --modname MODNAME
                        name to use in module stub
  -r, --remove          remove all modstub.tf, variables.#.tf files
  -c, --check           check that all vars are listed
  -a, --asc             sort output variables in ascending order
  -d, --desc            sort output variables in descending order
```

# CHANGE LOG

## 0.3.0 - 2019.04.25

* Add functionality to check existing `main.tf` and `variables.tf` for missing variables

## 0.2.1 - 2019.04.25

* Fix inconsequential error thrown when removing files

## 0.2.0 - 2019.04.25

* Add capability to delete extra working files

## 0.1.3 - 2019.04.17

* Add module stub capability

## 0.1.2 - 2019.04.17

* Add simple docs

## 0.1.1 - 2019.04.16

* Initial working version

## 0.1.0 - 2019.04.15

* Initial release!


