practice_terraforming 0.1.3

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,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: []