terrafile 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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