practice_terraforming 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ <% iam_role_policy_attachments.each do |role_policy_attachment| -%>
2
+ resource "aws_iam_role_policy_attachment" "<%= module_name_of(role_policy_attachment) %>" {
3
+ policy_arn = "<%= role_policy_attachment[:policy_arn] %>"
4
+ role = "<%= role_policy_attachment[:role] %>"
5
+ }
6
+
7
+ <% end -%>
@@ -0,0 +1,12 @@
1
+ <% buckets.each do |bucket| -%>
2
+ resource "aws_s3_bucket" "<%= module_name_of(bucket) %>" {
3
+ bucket = "<%= bucket.name %>"
4
+ acl = "private"
5
+ <%- unless (policy = bucket_policy_of(bucket)).nil? -%>
6
+ policy = <<POLICY
7
+ <%= prettify_policy(policy.policy.read) %>
8
+ POLICY
9
+ <%- end -%>
10
+ }
11
+
12
+ <% end -%>
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PracticeTerraforming
4
+ module Util
5
+ def apply_template(client, erb)
6
+ ERB.new(open(template_path(erb)).read, nil, "-").result(binding)
7
+ end
8
+
9
+ def name_from_tag(resource, default_name)
10
+ name_tag = resource.tags.find { |tag| tag.key == "Name" }
11
+ name_tag ? name_tag.value : default_name
12
+ end
13
+
14
+ def normalize_module_name(name)
15
+ name.gsub(/[^a-zA-Z0-9_-]/, "-")
16
+ end
17
+
18
+ def template_path(template_name)
19
+ File.join(__dir__, "template", template_name) << ".erb"
20
+ end
21
+
22
+ def prettify_policy(document, breakline: false, unescape: false)
23
+ json = JSON.pretty_generate(JSON.parse(unescape ? CGI.unescape(document) : document))
24
+
25
+ if breakline
26
+ json[-1] != "\n" ? json << "\n" : json
27
+ else
28
+ json.strip
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PracticeTerraforming
4
+ VERSION = '0.1.3'
5
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'practice_terraforming/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'practice_terraforming'
9
+ spec.version = PracticeTerraforming::VERSION
10
+ spec.authors = ['masatonaka']
11
+ spec.email = ['masatonaka1989@gmail.com']
12
+
13
+ spec.summary = 'practice terraforming'
14
+ spec.description = 'practice terraforming'
15
+ spec.homepage = 'https://github.com/nakamasato/practice_terraforming'
16
+ spec.license = 'MIT'
17
+
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = 'bin'
22
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_dependency "aws-sdk-iam", "~> 1"
26
+ spec.add_dependency "aws-sdk-s3", "~> 1"
27
+ spec.add_dependency "multi_json", "~> 1.12.1"
28
+ spec.add_dependency "thor"
29
+
30
+ spec.add_development_dependency 'bundler', '~> 2.0'
31
+ spec.add_development_dependency "coveralls", "~> 0.8.13"
32
+ spec.add_development_dependency 'rake', '~> 10.0'
33
+ spec.add_development_dependency 'rspec', '~> 3.0'
34
+ spec.add_development_dependency "simplecov", "~> 0.14.1"
35
+ end
data/script/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "practice_terraforming"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start
data/script/generate ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "erb"
5
+
6
+ USAGE = <<~EOS
7
+ Usage: script/generate RESOURCE
8
+ RESOURCE must be snake_case
9
+
10
+ Example:
11
+ script/generate EC2
12
+ EOS
13
+
14
+ def camelize(string)
15
+ string
16
+ .sub(/^[a-z\d]*/) { |match| match.capitalize }
17
+ .gsub(%r{(?:_|(/))([a-z\d]*)}i) { "#{$1}#{$2.capitalize}" }
18
+ .gsub('/', '::')
19
+ end
20
+
21
+ def generate_resource_erb(resource)
22
+ template = File.join("templates", "resource.erb.erb")
23
+ ERB.new(open(template).read, nil, "-").result(binding)
24
+ end
25
+
26
+ def generate_resource_rb(resource)
27
+ template = File.expand_path(File.join("templates", "resource.rb.erb"))
28
+ ERB.new(open(template).read, nil, "-").result(binding)
29
+ end
30
+
31
+ def generate_resource_spec_rb(resource)
32
+ template = File.join("templates", "resource_spec.rb.erb")
33
+ ERB.new(open(template).read, nil, "-").result(binding)
34
+ end
35
+
36
+ def humanize(string)
37
+ string
38
+ .sub(/\A_+/, '')
39
+ .sub(/_id\z/, '')
40
+ .tr('_', ' ')
41
+ .gsub(/([a-z\d]*)/i) { |match| match.downcase }
42
+ .split(" ")
43
+ .map { |w| w[0].upcase + w[1..-1] }
44
+ .join(" ")
45
+ end
46
+
47
+ if ARGV.length != 1
48
+ warn USAGE
49
+ exit 1
50
+ end
51
+
52
+ resource = ARGV[0]
53
+
54
+ puts "==> Generate #{resource}.rb"
55
+ resource_rb = generate_resource_rb(resource)
56
+ File.open(File.join("lib", "practice_terraforming", "resource", "#{resource}.rb"), "w+") { |f| f.write(resource_rb) }
57
+
58
+ puts "==> Generate #{resource}_spec.rb"
59
+ resource_spec_rb = generate_resource_spec_rb(resource)
60
+ File.open(File.join("spec", "lib", "practice_terraforming", "resource", "#{resource}_spec.rb"), "w+") { |f| f.write(resource_spec_rb) }
61
+
62
+ puts "==> Generate #{resource}.erb"
63
+ resource_erb = generate_resource_erb(resource)
64
+ File.open(File.join("lib", "practice_terraforming", "template", "tf", "#{resource}.erb"), "w+") { |f| f.write(resource_erb) }
65
+
66
+ puts <<~EOS
67
+
68
+ Add below code by hand.
69
+
70
+ lib/practice_terraforming.rb:
71
+
72
+ require "practice_terraforming/resource/#{resource}"
73
+
74
+ lib/practice_terraforming/cli.rb:
75
+
76
+ module PracticeTerraforming
77
+ class CLI < Thor
78
+
79
+ # Subcommand name should be acronym.
80
+ desc "#{resource}", "#{humanize(resource)}"
81
+ def #{resource}
82
+ execute(PracticeTerraforming::Resource::#{camelize(resource)}, options)
83
+ end
84
+
85
+ spec/lib/practice_terraforming/cli_spec.rb:
86
+
87
+ module PracticeTerraforming
88
+ describe CLI do
89
+ context "resources" do
90
+ describe "#{resource}" do
91
+ let(:klass) { PracticeTerraforming::Resource::#{camelize(resource)} }
92
+ let(:command) { :#{resource} }
93
+
94
+ it_behaves_like "CLI examples"
95
+ end
96
+ EOS
data/script/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,3 @@
1
+ resource "aws_<%= resource %>" "resource_name" {
2
+
3
+ }
@@ -0,0 +1,31 @@
1
+ module PracticeTerraforming
2
+ module Resource
3
+ class <%= camelize(resource) %>
4
+ include PracticeTerraforming::Util
5
+
6
+ # TODO: Select appropriate Client class from here:
7
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
8
+ def self.tf(client: Aws::SomeResource::Client.new)
9
+ self.new(client).tf
10
+ end
11
+
12
+ # TODO: Select appropriate Client class from here:
13
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
14
+ def self.tfstate(client: Aws::SomeResource::Client.new)
15
+ self.new(client).tfstate
16
+ end
17
+
18
+ def initialize(client)
19
+ @client = client
20
+ end
21
+
22
+ def tf
23
+ apply_template(@client, "tf/<%= resource %>")
24
+ end
25
+
26
+ def tfstate
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,39 @@
1
+ require "spec_helper"
2
+
3
+ module PracticeTerraforming
4
+ module Resource
5
+ describe <%= camelize(resource) %> do
6
+ let(:client) do
7
+ # TODO: Select appropriate Client class from here:
8
+ # http://docs.aws.amazon.com/sdkforruby/api/index.html
9
+ Aws::SomeResource::Client.new(stub_responses: true)
10
+ end
11
+
12
+ describe ".tf" do
13
+ xit "should generate tf" do
14
+ expect(described_class.tf(client: client)).to eq <<-EOS
15
+ resource "aws_<%= resource %>" "resource_name" {
16
+
17
+ }
18
+
19
+ EOS
20
+ end
21
+ end
22
+
23
+ describe ".tfstate" do
24
+ xit "should generate tfstate" do
25
+ expect(described_class.tfstate(client: client)).to eq({
26
+ "aws_<%= resource %>.resource_name" => {
27
+ "type" => "aws_<%= resource %>",
28
+ "primary" => {
29
+ "id" => "",
30
+ "attributes" => {
31
+ }
32
+ }
33
+ }
34
+ })
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,202 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: practice_terraforming
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - masatonaka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-11-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: aws-sdk-iam
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: aws-sdk-s3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: multi_json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.12.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.12.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: bundler
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '2.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '2.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: coveralls
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.8.13
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.8.13
97
+ - !ruby/object:Gem::Dependency
98
+ name: rake
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '10.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '10.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: simplecov
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.14.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.14.1
139
+ description: practice terraforming
140
+ email:
141
+ - masatonaka1989@gmail.com
142
+ executables:
143
+ - practice_terraforming
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".circleci/config.yml"
148
+ - ".gitignore"
149
+ - ".rspec"
150
+ - ".rubocop.yml"
151
+ - ".travis.yml"
152
+ - CODE_OF_CONDUCT.md
153
+ - Gemfile
154
+ - Gemfile.lock
155
+ - LICENSE.txt
156
+ - README.md
157
+ - Rakefile
158
+ - bin/practice_terraforming
159
+ - lib/practice_terraforming.rb
160
+ - lib/practice_terraforming/cli.rb
161
+ - lib/practice_terraforming/resource/iam_policy_attachment.rb
162
+ - lib/practice_terraforming/resource/iam_role.rb
163
+ - lib/practice_terraforming/resource/iam_role_policy_attachment.rb
164
+ - lib/practice_terraforming/resource/s3.rb
165
+ - lib/practice_terraforming/template/tf/iam_policy_attachment.erb
166
+ - lib/practice_terraforming/template/tf/iam_role.erb
167
+ - lib/practice_terraforming/template/tf/iam_role_policy_attachment.erb
168
+ - lib/practice_terraforming/template/tf/s3.erb
169
+ - lib/practice_terraforming/util.rb
170
+ - lib/practice_terraforming/version.rb
171
+ - practice_terraforming.gemspec
172
+ - script/console
173
+ - script/generate
174
+ - script/setup
175
+ - templates/resource.erb.erb
176
+ - templates/resource.rb.erb
177
+ - templates/resource_spec.rb.erb
178
+ homepage: https://github.com/nakamasato/practice_terraforming
179
+ licenses:
180
+ - MIT
181
+ metadata: {}
182
+ post_install_message:
183
+ rdoc_options: []
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ requirements:
188
+ - - ">="
189
+ - !ruby/object:Gem::Version
190
+ version: '0'
191
+ required_rubygems_version: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ requirements: []
197
+ rubyforge_project:
198
+ rubygems_version: 2.5.1
199
+ signing_key:
200
+ specification_version: 4
201
+ summary: practice terraforming
202
+ test_files: []