terraspace 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/lib/templates/base/git_hook/hook.sh +5 -0
  4. data/lib/templates/base/project/.gitignore +0 -1
  5. data/lib/templates/base/shim/terraspace +7 -0
  6. data/lib/templates/hcl/project/config/terraform/backend.tf.tt +3 -3
  7. data/lib/templates/plugin/lib/templates/hcl/project/config/terraform/backend.tf.tt +2 -2
  8. data/lib/terraspace/app.rb +6 -0
  9. data/lib/terraspace/builder.rb +2 -46
  10. data/lib/terraspace/cli.rb +34 -18
  11. data/lib/terraspace/cli/build/placeholder.rb +40 -0
  12. data/lib/terraspace/cli/cloud.rb +24 -0
  13. data/lib/terraspace/cli/commander.rb +8 -1
  14. data/lib/terraspace/cli/init.rb +67 -0
  15. data/lib/terraspace/cli/list.rb +13 -0
  16. data/lib/terraspace/cli/new.rb +8 -0
  17. data/lib/terraspace/cli/new/git_hook.rb +33 -0
  18. data/lib/terraspace/cli/new/shim.rb +58 -0
  19. data/lib/terraspace/cli/summary.rb +9 -12
  20. data/lib/terraspace/compiler/backend.rb +9 -37
  21. data/lib/terraspace/compiler/backend/parser.rb +42 -0
  22. data/lib/terraspace/compiler/builder.rb +6 -2
  23. data/lib/terraspace/compiler/cleaner.rb +19 -2
  24. data/lib/terraspace/compiler/cleaner/backend_change.rb +1 -1
  25. data/lib/terraspace/compiler/dsl/syntax/mod.rb +1 -0
  26. data/lib/terraspace/compiler/dsl/syntax/mod/backend.rb +16 -3
  27. data/lib/terraspace/compiler/expander.rb +28 -1
  28. data/lib/terraspace/compiler/writer.rb +1 -1
  29. data/lib/terraspace/core.rb +7 -1
  30. data/lib/terraspace/mod.rb +37 -12
  31. data/lib/terraspace/mod/remote.rb +1 -1
  32. data/lib/terraspace/plugin/expander/interface.rb +48 -5
  33. data/lib/terraspace/plugin/infer_provider.rb +15 -0
  34. data/lib/terraspace/plugin/layer/interface.rb +5 -0
  35. data/lib/terraspace/seeder.rb +4 -4
  36. data/lib/terraspace/terraform/api.rb +53 -0
  37. data/lib/terraspace/terraform/api/client.rb +10 -0
  38. data/lib/terraspace/terraform/api/http.rb +106 -0
  39. data/lib/terraspace/terraform/api/var.rb +72 -0
  40. data/lib/terraspace/terraform/api/vars.rb +38 -0
  41. data/lib/terraspace/terraform/api/vars/base.rb +7 -0
  42. data/lib/terraspace/terraform/api/vars/json.rb +14 -0
  43. data/lib/terraspace/terraform/api/vars/rb.rb +21 -0
  44. data/lib/terraspace/terraform/args/custom.rb +1 -1
  45. data/lib/terraspace/terraform/args/default.rb +16 -2
  46. data/lib/terraspace/terraform/cloud.rb +25 -0
  47. data/lib/terraspace/terraform/cloud/workspace.rb +95 -0
  48. data/lib/terraspace/terraform/runner.rb +1 -1
  49. data/lib/terraspace/util/sh.rb +1 -1
  50. data/lib/terraspace/version.rb +1 -1
  51. data/spec/fixtures/{cache_build_dir → cache_dir}/variables.tf +0 -0
  52. data/spec/fixtures/projects/hcl/aws/config/backend.tf +1 -1
  53. data/spec/fixtures/projects/hcl/google/config/backend.tf +1 -1
  54. data/spec/terraspace/seeder_spec.rb +1 -1
  55. data/spec/terraspace/terraform/hooks/builder_spec.rb +1 -1
  56. data/terraspace.gemspec +3 -3
  57. metadata +37 -17
  58. data/lib/terraspace/cli/build.rb +0 -7
@@ -0,0 +1,38 @@
1
+ class Terraspace::Terraform::Api
2
+ class Vars
3
+ extend Memoist
4
+ include Client
5
+
6
+ def initialize(mod, workspace)
7
+ @mod, @workspace = mod, workspace
8
+ end
9
+
10
+ def run
11
+ return unless exist?
12
+
13
+ vars = vars_class.new(@mod, vars_path).vars
14
+ vars.each do |attrs|
15
+ Var.new(@workspace, attrs).sync
16
+ end
17
+ end
18
+
19
+ # Return value examples:
20
+ #
21
+ # Terraspace::Terraform::Api::Vars::Json
22
+ # Terraspace::Terraform::Api::Vars::Rb
23
+ #
24
+ def vars_class
25
+ ext = File.extname(vars_path).sub('.','')
26
+ "Terraspace::Terraform::Api::Vars::#{ext.camelize}".constantize
27
+ end
28
+
29
+ def exist?
30
+ !!vars_path
31
+ end
32
+
33
+ def vars_path
34
+ # .rb takes higher precedence
35
+ Dir.glob("#{Terraspace.root}/config/terraform/cloud/vars.{rb,json}").first
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,7 @@
1
+ class Terraspace::Terraform::Api::Vars
2
+ class Base
3
+ def initialize(mod, vars_path)
4
+ @mod, @vars_path = mod, vars_path
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ class Terraspace::Terraform::Api::Vars
2
+ class Json < Base
3
+ def vars
4
+ context = Terraspace::Compiler::Erb::Context.new(@mod)
5
+ result = RenderMePretty.result(@vars_path, context: context)
6
+
7
+ data = JSON.load(result)
8
+ items = data.select do |item|
9
+ item['data']['type'] == 'vars'
10
+ end
11
+ items.map { |i| i['data']['attributes'] }
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ class Terraspace::Terraform::Api::Vars
2
+ class Rb < Base
3
+ include DslEvaluator
4
+
5
+ def initialize(*)
6
+ super
7
+ @vars = [] # holds results
8
+ end
9
+
10
+ def vars
11
+ evaluate_file(@vars_path)
12
+ @vars
13
+ end
14
+
15
+ def var(attrs={})
16
+ default = { category: "terraform" } # required field
17
+ var = default.deep_merge(attrs).deep_stringify_keys!
18
+ @vars << var
19
+ end
20
+ end
21
+ end
@@ -37,7 +37,7 @@ module Terraspace::Terraform::Args
37
37
  end
38
38
 
39
39
  def var_file_exist?(var_file)
40
- File.exist?("#{@mod.cache_build_dir}/#{var_file}")
40
+ File.exist?("#{@mod.cache_dir}/#{var_file}")
41
41
  end
42
42
 
43
43
  def dig(prop, default=[])
@@ -1,3 +1,5 @@
1
+ require "tempfile"
2
+
1
3
  module Terraspace::Terraform::Args
2
4
  class Default
3
5
  def initialize(mod, name, options={})
@@ -40,7 +42,7 @@ module Terraspace::Terraform::Args
40
42
  dest = src
41
43
  else
42
44
  src = "#{Dir.pwd}/#{plan}"
43
- dest = "#{@mod.cache_build_dir}/#{File.basename(src)}"
45
+ dest = "#{@mod.cache_dir}/#{File.basename(src)}"
44
46
  end
45
47
  FileUtils.cp(src, dest)
46
48
  args << " #{dest}"
@@ -58,9 +60,11 @@ module Terraspace::Terraform::Args
58
60
  args << " -input=#{input}"
59
61
  end
60
62
 
63
+ args << " -reconfigure" if @options[:reconfigure]
64
+
61
65
  # must be at the end
62
66
  if @quiet && !ENV['TS_INIT_LOUD']
63
- out_path = "#{Terraspace.tmp_root}/out/terraform-init.out"
67
+ out_path = self.class.terraform_init_log
64
68
  FileUtils.mkdir_p(File.dirname(out_path))
65
69
  args << " > #{out_path}"
66
70
  end
@@ -92,5 +96,15 @@ module Terraspace::Terraform::Args
92
96
  def auto_approve_arg
93
97
  @options[:yes] || @options[:auto] ? ["-auto-approve"] : []
94
98
  end
99
+
100
+ class << self
101
+ # Use different tmp log file in case uses run terraspace up in 2 terminals at the same time
102
+ @@terraform_init_log = nil
103
+ def terraform_init_log
104
+ return @@terraform_init_log if @@terraform_init_log
105
+ basename = File.basename(Tempfile.new('terraform-init').path)
106
+ @@terraform_init_log = "#{Terraspace.tmp_root}/out/#{basename}.out"
107
+ end
108
+ end
95
109
  end
96
110
  end
@@ -0,0 +1,25 @@
1
+ module Terraspace::Terraform
2
+ class Cloud < Terraspace::CLI::Base
3
+ extend Memoist
4
+
5
+ def run
6
+ return unless workspaces?
7
+ api = Api.new(@mod, remote)
8
+ api.set_working_dir
9
+ api.set_env_vars
10
+ end
11
+
12
+ def workspaces?
13
+ remote && remote['workspaces']
14
+ end
15
+
16
+ def remote
17
+ backend["remote"]
18
+ end
19
+
20
+ def backend
21
+ Terraspace::Compiler::Backend::Parser.new(@mod).result
22
+ end
23
+ memoize :backend
24
+ end
25
+ end
@@ -0,0 +1,95 @@
1
+ class Terraspace::Terraform::Cloud
2
+ class Workspace < Terraspace::CLI::Base
3
+ extend Memoist
4
+ include Terraspace::Util::Logging
5
+ include Terraspace::Terraform::Api::Client
6
+
7
+ # List will not have @mod set.
8
+ def list
9
+ @mod = Terraspace::CLI::Build::Placeholder.new(@options).build
10
+ unless remote && remote['organization']
11
+ logger.info "ERROR: There was no organization found. Are you sure you configured backend.tf with it?".color(:red)
12
+ exit 1
13
+ end
14
+
15
+ org = remote['organization']
16
+ payload = http.get("/organizations/#{org}/workspaces") # list using api client directly
17
+ names = payload['data'].map { |i| i['attributes']['name'] }.sort
18
+ logger.info "Workspaces for #{org}:"
19
+ logger.info names.join("\n")
20
+ end
21
+
22
+ def setup
23
+ build
24
+ unless backend.dig('remote','workspaces') # in case called by terraspace down demo -y --destroy-workspace with a non-remote backend
25
+ logger.info "ERROR: Workspace not configured in backend.tf"
26
+ exit 1
27
+ end
28
+ init
29
+ end
30
+
31
+ def init
32
+ Terraspace::CLI::Init.new(@options.merge(calling_command: "cloud-setup")).run
33
+ end
34
+
35
+ def destroy
36
+ build
37
+ return unless backend.dig('remote','workspaces') # in case called by terraspace down demo -y --destroy-workspace with a non-remote backend
38
+ api = Terraspace::Terraform::Api.new(@mod, remote)
39
+ workspace = api.workspace(exit_on_fail: false)
40
+ unless workspace
41
+ logger.info "Workspace #{workspace_name} not found for #{@mod.type}: #{@mod.name}"
42
+ exit 0
43
+ end
44
+ sure?
45
+ logger.info "Destroying workspace #{workspace_name}"
46
+ api.destroy_workspace
47
+ end
48
+
49
+ def build
50
+ Terraspace::Builder.new(@options).run
51
+ end
52
+
53
+ def workspace_name
54
+ remote['workspaces']['name']
55
+ end
56
+
57
+ def remote
58
+ backend["remote"]
59
+ end
60
+
61
+ def backend
62
+ Terraspace::Compiler::Backend::Parser.new(@mod).result
63
+ end
64
+ memoize :backend
65
+
66
+ def sure?
67
+ message = <<~EOL.chop + " " # chop to remove newline
68
+ You are about to delete the workspace: #{workspace_name}
69
+ All variables, settings, run history, and state history will be removed.
70
+ This cannot be undone.
71
+
72
+ This will NOT remove any infrastructure managed by this workspace.
73
+ If needed, destroy the infrastructure prior to deleting the workspace with:
74
+
75
+ terraspace down #{@mod.name}
76
+
77
+ This will delete the workspace: #{workspace_name}.
78
+ Are you sure? (y/N)
79
+ EOL
80
+
81
+ if @options[:yes]
82
+ sure = 'y'
83
+ else
84
+ print message
85
+ sure = $stdin.gets
86
+ end
87
+
88
+ unless sure =~ /^y/
89
+ puts "Whew! Exiting."
90
+ exit 0
91
+ end
92
+ end
93
+ end
94
+ end
95
+
@@ -28,7 +28,7 @@ module Terraspace::Terraform
28
28
  @@current_dir_message_shown = false
29
29
  def current_dir_message
30
30
  return if @@current_dir_message_shown
31
- logger.info "Current directory: #{Terraspace::Util.pretty_path(@mod.cache_build_dir)}"
31
+ logger.info "Current directory: #{Terraspace::Util.pretty_path(@mod.cache_dir)}"
32
32
  @@current_dir_message_shown = true
33
33
  end
34
34
 
@@ -9,7 +9,7 @@ module Terraspace::Util
9
9
  logger.info "=> #{command}"
10
10
  return if ENV['TS_TEST']
11
11
 
12
- success = system(env, command, chdir: @mod.cache_build_dir)
12
+ success = system(env, command, chdir: @mod.cache_dir)
13
13
  unless success
14
14
  logger.info "Error running command: #{command}".color(:red)
15
15
  exit $?.exitstatus if exit_on_fail
@@ -1,3 +1,3 @@
1
1
  module Terraspace
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  terraform {
2
2
  backend "s3" {
3
3
  bucket = "terraspace-state"
4
- key = "<%= backend_expand("s3", ":REGION/:ENV/:BUILD_DIR/terraform.tfstate") %>" # variable notation expanded by terraspace IE: us-west-2/dev/modules/vm/terraform.tfstate
4
+ key = "<%= expansion(":REGION/:ENV/:BUILD_DIR/terraform.tfstate") %>" # variable notation expanded by terraspace IE: us-west-2/dev/modules/vm/terraform.tfstate
5
5
  region = "<%= ENV["AWS_REGION"] %>"
6
6
  encrypt = true
7
7
  dynamodb_table = "terraform_locks"
@@ -1,6 +1,6 @@
1
1
  terraform {
2
2
  backend "gcs" {
3
3
  bucket = "terraspace-state"
4
- prefix = "<%= backend_expand("gcs", ":REGION/:ENV/:BUILD_DIR") %>" # variable notation expanded by terraspace IE: us-central1/dev/modules/vm
4
+ prefix = "<%= expansion(":REGION/:ENV/:BUILD_DIR") %>" # variable notation expanded by terraspace IE: us-central1/dev/modules/vm
5
5
  }
6
6
  }
@@ -2,7 +2,7 @@ describe Terraspace::Seeder do
2
2
  let(:seeder) { described_class.new(mod) }
3
3
  let(:mod) do
4
4
  mod = double(:mod).as_null_object
5
- allow(mod).to receive(:cache_build_dir).and_return("spec/fixtures/cache_build_dir")
5
+ allow(mod).to receive(:cache_dir).and_return("spec/fixtures/cache_dir")
6
6
  mod
7
7
  end
8
8
 
@@ -6,7 +6,7 @@ describe Terraspace::Terraform::Hooks::Builder do
6
6
  end
7
7
  let(:mod) do
8
8
  mod = double(:mod).as_null_object
9
- allow(mod).to receive(:cache_build_dir).and_return("/tmp")
9
+ allow(mod).to receive(:cache_dir).and_return("/tmp")
10
10
  mod
11
11
  end
12
12
 
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.add_dependency "zeitwerk"
31
31
 
32
32
  # core baseline plugins
33
- spec.add_dependency "terraspace_plugin_aws"
34
- spec.add_dependency "terraspace_plugin_azurerm"
35
- spec.add_dependency "terraspace_plugin_google"
33
+ spec.add_dependency "terraspace_plugin_aws", "~> 0.2.0"
34
+ spec.add_dependency "terraspace_plugin_azurerm", "~> 0.2.0"
35
+ spec.add_dependency "terraspace_plugin_google", "~> 0.2.0"
36
36
  spec.add_dependency "rspec-terraspace"
37
37
 
38
38
  spec.add_development_dependency "bundler"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: terraspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-29 00:00:00.000000000 Z
11
+ date: 2020-08-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -154,44 +154,44 @@ dependencies:
154
154
  name: terraspace_plugin_aws
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ">="
157
+ - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '0'
159
+ version: 0.2.0
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ">="
164
+ - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '0'
166
+ version: 0.2.0
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: terraspace_plugin_azurerm
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - ">="
171
+ - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '0'
173
+ version: 0.2.0
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - ">="
178
+ - - "~>"
179
179
  - !ruby/object:Gem::Version
180
- version: '0'
180
+ version: 0.2.0
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: terraspace_plugin_google
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">="
185
+ - - "~>"
186
186
  - !ruby/object:Gem::Version
187
- version: '0'
187
+ version: 0.2.0
188
188
  type: :runtime
189
189
  prerelease: false
190
190
  version_requirements: !ruby/object:Gem::Requirement
191
191
  requirements:
192
- - - ">="
192
+ - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '0'
194
+ version: 0.2.0
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: rspec-terraspace
197
197
  requirement: !ruby/object:Gem::Requirement
@@ -329,10 +329,12 @@ files:
329
329
  - README.md
330
330
  - Rakefile
331
331
  - exe/terraspace
332
+ - lib/templates/base/git_hook/hook.sh
332
333
  - lib/templates/base/project/.gitignore
333
334
  - lib/templates/base/project/Gemfile.tt
334
335
  - lib/templates/base/project/Terrafile
335
336
  - lib/templates/base/project/config/app.rb
337
+ - lib/templates/base/shim/terraspace
336
338
  - lib/templates/hcl/module/main.tf
337
339
  - lib/templates/hcl/module/outputs.tf
338
340
  - lib/templates/hcl/module/variables.tf
@@ -401,10 +403,11 @@ files:
401
403
  - lib/terraspace/bundle.rb
402
404
  - lib/terraspace/cli.rb
403
405
  - lib/terraspace/cli/base.rb
404
- - lib/terraspace/cli/build.rb
406
+ - lib/terraspace/cli/build/placeholder.rb
405
407
  - lib/terraspace/cli/bundle.rb
406
408
  - lib/terraspace/cli/check_setup.rb
407
409
  - lib/terraspace/cli/clean.rb
410
+ - lib/terraspace/cli/cloud.rb
408
411
  - lib/terraspace/cli/commander.rb
409
412
  - lib/terraspace/cli/help.rb
410
413
  - lib/terraspace/cli/help/bundle.md
@@ -412,7 +415,10 @@ files:
412
415
  - lib/terraspace/cli/help/completion_script.md
413
416
  - lib/terraspace/cli/help/update.md
414
417
  - lib/terraspace/cli/info.rb
418
+ - lib/terraspace/cli/init.rb
419
+ - lib/terraspace/cli/list.rb
415
420
  - lib/terraspace/cli/new.rb
421
+ - lib/terraspace/cli/new/git_hook.rb
416
422
  - lib/terraspace/cli/new/helper.rb
417
423
  - lib/terraspace/cli/new/helper/plugin_gem.rb
418
424
  - lib/terraspace/cli/new/module.rb
@@ -420,6 +426,7 @@ files:
420
426
  - lib/terraspace/cli/new/plugin/helper.rb
421
427
  - lib/terraspace/cli/new/project.rb
422
428
  - lib/terraspace/cli/new/sequence.rb
429
+ - lib/terraspace/cli/new/shim.rb
423
430
  - lib/terraspace/cli/new/source/core.rb
424
431
  - lib/terraspace/cli/new/source/plugin.rb
425
432
  - lib/terraspace/cli/new/source/test.rb
@@ -433,6 +440,7 @@ files:
433
440
  - lib/terraspace/cli/test.rb
434
441
  - lib/terraspace/command.rb
435
442
  - lib/terraspace/compiler/backend.rb
443
+ - lib/terraspace/compiler/backend/parser.rb
436
444
  - lib/terraspace/compiler/basename.rb
437
445
  - lib/terraspace/compiler/builder.rb
438
446
  - lib/terraspace/compiler/cleaner.rb
@@ -487,16 +495,28 @@ files:
487
495
  - lib/terraspace/plugin/expander/generic.rb
488
496
  - lib/terraspace/plugin/expander/interface.rb
489
497
  - lib/terraspace/plugin/finder.rb
498
+ - lib/terraspace/plugin/infer_provider.rb
499
+ - lib/terraspace/plugin/layer/interface.rb
490
500
  - lib/terraspace/plugin/meta.rb
491
501
  - lib/terraspace/plugin/summary/interface.rb
492
502
  - lib/terraspace/seeder.rb
493
503
  - lib/terraspace/seeder/actions.rb
494
504
  - lib/terraspace/seeder/content.rb
495
505
  - lib/terraspace/seeder/where.rb
506
+ - lib/terraspace/terraform/api.rb
507
+ - lib/terraspace/terraform/api/client.rb
508
+ - lib/terraspace/terraform/api/http.rb
509
+ - lib/terraspace/terraform/api/var.rb
510
+ - lib/terraspace/terraform/api/vars.rb
511
+ - lib/terraspace/terraform/api/vars/base.rb
512
+ - lib/terraspace/terraform/api/vars/json.rb
513
+ - lib/terraspace/terraform/api/vars/rb.rb
496
514
  - lib/terraspace/terraform/args/custom.rb
497
515
  - lib/terraspace/terraform/args/default.rb
498
516
  - lib/terraspace/terraform/args/dsl.rb
499
517
  - lib/terraspace/terraform/args/shorthands.rb
518
+ - lib/terraspace/terraform/cloud.rb
519
+ - lib/terraspace/terraform/cloud/workspace.rb
500
520
  - lib/terraspace/terraform/hooks/builder.rb
501
521
  - lib/terraspace/terraform/hooks/dsl.rb
502
522
  - lib/terraspace/terraform/runner.rb
@@ -509,7 +529,7 @@ files:
509
529
  - lib/terraspace/util/sure.rb
510
530
  - lib/terraspace/version.rb
511
531
  - spec/cli_spec.rb
512
- - spec/fixtures/cache_build_dir/variables.tf
532
+ - spec/fixtures/cache_dir/variables.tf
513
533
  - spec/fixtures/initialized/modules.json
514
534
  - spec/fixtures/orphans/config/backend.rb
515
535
  - spec/fixtures/orphans/config/provider.rb
@@ -638,7 +658,7 @@ specification_version: 4
638
658
  summary: 'Terraspace: The Terraspace Framework'
639
659
  test_files:
640
660
  - spec/cli_spec.rb
641
- - spec/fixtures/cache_build_dir/variables.tf
661
+ - spec/fixtures/cache_dir/variables.tf
642
662
  - spec/fixtures/initialized/modules.json
643
663
  - spec/fixtures/orphans/config/backend.rb
644
664
  - spec/fixtures/orphans/config/provider.rb