terrafile 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,157 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Terrafile
4
+ RSpec.describe Installer do
5
+ let(:yml) { '' }
6
+
7
+ before { allow(Kernel).to receive(:puts) }
8
+ before { allow(YAML).to receive(:safe_load) }
9
+ before { allow(File).to receive(:read).and_return(yml) }
10
+ before { allow(FileUtils).to receive(:makedirs) }
11
+
12
+ describe 'initialisation' do
13
+ before { allow(Kernel).to receive(:exit) }
14
+
15
+ context 'when the expected Terrafile is found' do
16
+ before do
17
+ allow(File).to receive(:exist?)
18
+ .with(TERRAFILE_PATH).and_return(true)
19
+ end
20
+
21
+ it 'reads the file from the conventional location' do
22
+ Installer.new
23
+ expect(File).to have_received(:read).with(TERRAFILE_PATH)
24
+ end
25
+
26
+ it 'loads the read yml safely' do
27
+ Installer.new
28
+ expect(YAML).to have_received(:safe_load).with(yml)
29
+ end
30
+ end
31
+
32
+ context 'when the expected Terrafile is not found' do
33
+ before do
34
+ allow(Helper).to receive(:file_exists?)
35
+ .with(TERRAFILE_PATH).and_return(false)
36
+ end
37
+
38
+ it 'tells us that the file is missing' do
39
+ Installer.new
40
+ expect(Kernel).to have_received(:puts).with(/Terrafile does not exist/)
41
+ end
42
+
43
+ it 'does not attempt to read the file' do
44
+ Installer.new
45
+ expect(File).not_to have_received(:read)
46
+ end
47
+
48
+ it 'does not attempt to load the yml' do
49
+ Installer.new
50
+ expect(YAML).not_to have_received(:safe_load)
51
+ end
52
+ end
53
+ end
54
+
55
+ describe '#call' do
56
+ before do
57
+ allow(Helper).to receive(:file_exists?).with(TERRAFILE_PATH).and_return(true)
58
+ allow(Dir).to receive(:chdir).and_yield
59
+ end
60
+
61
+ describe 'creating the modules directory' do
62
+ before { allow(FileUtils).to receive(:makedirs) }
63
+ before { allow(YAML).to receive(:safe_load).and_return([]) }
64
+
65
+ context 'when the directory already exists' do
66
+ before do
67
+ allow(Helper).to receive(:dir_exists?)
68
+ .with(Installer::MODULES_PATH).and_return(true)
69
+ end
70
+
71
+ it 'does not attempt to make the directory' do
72
+ Installer.new.call
73
+ expect(FileUtils).not_to have_received(:makedirs)
74
+ end
75
+ end
76
+
77
+ context 'when the directory does NOT exist' do
78
+ before do
79
+ allow(Helper).to receive(:dir_exists?)
80
+ .with(Installer::MODULES_PATH).and_return(false)
81
+ end
82
+
83
+ it 'notifies us of its intention to make the directory' do
84
+ Installer.new.call
85
+ expect(Kernel).to have_received(:puts).with(/Creating .+ modules directory/)
86
+ end
87
+
88
+ it 'makes the directory' do
89
+ Installer.new.call
90
+ expect(FileUtils).to have_received(:makedirs).with(Installer::MODULES_PATH)
91
+ end
92
+ end
93
+ end
94
+
95
+ describe 'fetching the listed modules' do
96
+ let(:dependencies) do
97
+ [
98
+ instance_double(
99
+ Dependency,
100
+ name: 'terraform-aws-name1',
101
+ source: 'git@github.com:org1/repo1',
102
+ version: '0.8.0',
103
+ fetch: true,
104
+ checkout: true
105
+ ),
106
+ instance_double(
107
+ Dependency,
108
+ name: 'terraform-aws-name2',
109
+ source: 'git@github.com:org2/repo2',
110
+ version: '004e5791',
111
+ fetch: true,
112
+ checkout: true
113
+ ),
114
+ ]
115
+ end
116
+
117
+ before do
118
+ allow(Dependency).to receive(:build_from_terrafile).and_return(dependencies)
119
+ end
120
+ before { allow(Dir).to receive(:chdir).and_yield }
121
+ before { allow(Helper).to receive(:fetch) }
122
+ before { allow(Helper).to receive(:checkout) }
123
+
124
+ it 'notifies its intention to checkout the dependency' do
125
+ msg1 = 'Checking out 0.8.0 from git@github.com:org1/repo1'
126
+ msg2 = 'Checking out 004e5791 from git@github.com:org2/repo2'
127
+
128
+ Installer.new.call
129
+
130
+ expect(Kernel).to have_received(:puts).with(/#{msg1}/)
131
+ expect(Kernel).to have_received(:puts).with(/#{msg2}/)
132
+ end
133
+
134
+ it 'changes to the module installation directory' do
135
+ Installer.new.call
136
+ expect(Dir).to have_received(:chdir).with(Installer::MODULES_PATH)
137
+ end
138
+
139
+ describe 'for each dependency' do
140
+ it 'fetches the latest version of the dependency\'s code' do
141
+ Installer.new.call
142
+
143
+ expect(dependencies.first).to have_received(:fetch)
144
+ expect(dependencies.last).to have_received(:fetch)
145
+ end
146
+
147
+ it 'checks out the latest version of the dependency\'s code' do
148
+ Installer.new.call
149
+
150
+ expect(dependencies.first).to have_received(:checkout)
151
+ expect(dependencies.last).to have_received(:checkout)
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
data/terrafile.gemspec ADDED
@@ -0,0 +1,48 @@
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'terrafile/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'terrafile'
8
+ spec.version = Terrafile::VERSION
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.required_ruby_version = '>= 2.5.1'
11
+ spec.authors = ['dxw']
12
+ spec.email = ['systems@dxw.com']
13
+ spec.summary = 'Installs the modules listed in Terrafile'
14
+ spec.description = 'Terraform modules listed in Terrafile are installed in ' \
15
+ 'vendor/terraform_modules'
16
+ # spec.homepage = "TODO: Put your gem's website or public repo URL here."
17
+ spec.license = 'MIT'
18
+ spec.post_install_message = 'Thanks for installing terrafile.'
19
+
20
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
21
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
22
+ # if spec.respond_to?(:metadata)
23
+ spec.metadata['credit'] = 'Original code and rationale found at: ' \
24
+ 'http://bensnape.com/2016/01/14/terraform-design-patterns-the-terrafile/'
25
+ # spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
26
+
27
+ # spec.metadata["homepage_uri"] = spec.homepage
28
+ # spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
29
+ # spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
30
+ # else
31
+ # raise "RubyGems 2.0 or newer is required to protect against " \
32
+ # "public gem pushes."
33
+ # end
34
+
35
+ spec.files = `git ls-files`.split("\n")
36
+ spec.test_files = `git ls-files -- spec/*`.split("\n")
37
+ spec.bindir = 'bin'
38
+ spec.require_paths = ['lib']
39
+ spec.executables = ['terrafile']
40
+
41
+ spec.add_development_dependency 'aruba', '~> 0.14'
42
+ spec.add_development_dependency 'bundler', '~> 1.17'
43
+ spec.add_development_dependency 'pry-byebug', '~> 3.6'
44
+ spec.add_development_dependency 'rake', '~> 10.5'
45
+ spec.add_development_dependency 'rspec', '~> 3.8'
46
+ spec.add_development_dependency 'rubocop', '~> 0.58'
47
+ spec.add_development_dependency 'simplecov', '~> 0.16'
48
+ end
metadata ADDED
@@ -0,0 +1,176 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: terrafile
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - dxw
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-11-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aruba
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.17'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.17'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry-byebug
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.6'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.8'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.8'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.58'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.58'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.16'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.16'
111
+ description: Terraform modules listed in Terrafile are installed in vendor/terraform_modules
112
+ email:
113
+ - systems@dxw.com
114
+ executables:
115
+ - terrafile
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - ".gitignore"
120
+ - ".rspec"
121
+ - ".rubocop.yml"
122
+ - ".ruby-version"
123
+ - ".travis.yml"
124
+ - CODE_OF_CONDUCT.md
125
+ - Gemfile
126
+ - Gemfile.lock
127
+ - LICENSE.txt
128
+ - README.md
129
+ - Rakefile
130
+ - bin/setup
131
+ - bin/terrafile
132
+ - lib/terrafile.rb
133
+ - lib/terrafile/dependency.rb
134
+ - lib/terrafile/errors.rb
135
+ - lib/terrafile/helper.rb
136
+ - lib/terrafile/installer.rb
137
+ - lib/terrafile/version.rb
138
+ - spec/integration/runs_terrafile_executable_spec.rb
139
+ - spec/spec_helper.rb
140
+ - spec/terrafile_spec.rb
141
+ - spec/unit/dependency_spec.rb
142
+ - spec/unit/helper_spec.rb
143
+ - spec/unit/installer_spec.rb
144
+ - terrafile.gemspec
145
+ homepage:
146
+ licenses:
147
+ - MIT
148
+ metadata:
149
+ credit: 'Original code and rationale found at: http://bensnape.com/2016/01/14/terraform-design-patterns-the-terrafile/'
150
+ post_install_message: Thanks for installing terrafile.
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: 2.5.1
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.7.6
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: Installs the modules listed in Terrafile
170
+ test_files:
171
+ - spec/integration/runs_terrafile_executable_spec.rb
172
+ - spec/spec_helper.rb
173
+ - spec/terrafile_spec.rb
174
+ - spec/unit/dependency_spec.rb
175
+ - spec/unit/helper_spec.rb
176
+ - spec/unit/installer_spec.rb