formatron 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +12 -0
- data/.rspec +2 -0
- data/.rubocop.yml +3 -0
- data/.simplecov +7 -0
- data/.travis.yml +17 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +6 -0
- data/Guardfile +16 -0
- data/LICENSE.txt +21 -0
- data/README.md +93 -0
- data/Rakefile +16 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/exe/formatron +20 -0
- data/formatron.gemspec +52 -0
- data/lib/formatron.rb +357 -0
- data/lib/formatron/aws.rb +197 -0
- data/lib/formatron/chef.rb +156 -0
- data/lib/formatron/chef/berkshelf.rb +55 -0
- data/lib/formatron/chef/keys.rb +48 -0
- data/lib/formatron/chef/knife.rb +169 -0
- data/lib/formatron/chef_clients.rb +73 -0
- data/lib/formatron/cli.rb +33 -0
- data/lib/formatron/cli/completion.rb +26 -0
- data/lib/formatron/cli/deploy.rb +57 -0
- data/lib/formatron/cli/destroy.rb +57 -0
- data/lib/formatron/cli/generators/bootstrap.rb +250 -0
- data/lib/formatron/cli/generators/credentials.rb +100 -0
- data/lib/formatron/cli/generators/instance.rb +118 -0
- data/lib/formatron/cli/provision.rb +59 -0
- data/lib/formatron/cloud_formation.rb +54 -0
- data/lib/formatron/cloud_formation/resources/cloud_formation.rb +27 -0
- data/lib/formatron/cloud_formation/resources/ec2.rb +336 -0
- data/lib/formatron/cloud_formation/resources/iam.rb +94 -0
- data/lib/formatron/cloud_formation/resources/route53.rb +54 -0
- data/lib/formatron/cloud_formation/scripts.rb +128 -0
- data/lib/formatron/cloud_formation/template.rb +114 -0
- data/lib/formatron/cloud_formation/template/parameters.rb +20 -0
- data/lib/formatron/cloud_formation/template/vpc.rb +181 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet.rb +187 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/acl.rb +147 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/bastion.rb +66 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/chef_server.rb +205 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/instance.rb +162 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/instance/policy.rb +74 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/instance/security_group.rb +117 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/instance/setup.rb +68 -0
- data/lib/formatron/cloud_formation/template/vpc/subnet/nat.rb +94 -0
- data/lib/formatron/completion.rb +26 -0
- data/lib/formatron/completion/completion.sh.erb +35 -0
- data/lib/formatron/config.rb +31 -0
- data/lib/formatron/config/reader.rb +29 -0
- data/lib/formatron/dsl.rb +15 -0
- data/lib/formatron/dsl/formatron.rb +25 -0
- data/lib/formatron/dsl/formatron/global.rb +19 -0
- data/lib/formatron/dsl/formatron/global/ec2.rb +17 -0
- data/lib/formatron/dsl/formatron/vpc.rb +17 -0
- data/lib/formatron/dsl/formatron/vpc/subnet.rb +27 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/acl.rb +18 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/chef_server.rb +32 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/chef_server/organization.rb +22 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance.rb +29 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/chef.rb +22 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/policy.rb +21 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/policy/statement.rb +23 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/security_group.rb +21 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/setup.rb +22 -0
- data/lib/formatron/dsl/formatron/vpc/subnet/instance/setup/variable.rb +23 -0
- data/lib/formatron/external.rb +61 -0
- data/lib/formatron/external/dsl.rb +171 -0
- data/lib/formatron/external/outputs.rb +25 -0
- data/lib/formatron/generators/bootstrap.rb +90 -0
- data/lib/formatron/generators/bootstrap/config.rb +62 -0
- data/lib/formatron/generators/bootstrap/ec2.rb +17 -0
- data/lib/formatron/generators/bootstrap/formatronfile.rb +52 -0
- data/lib/formatron/generators/bootstrap/formatronfile/Formatronfile.erb +79 -0
- data/lib/formatron/generators/bootstrap/ssl.rb +35 -0
- data/lib/formatron/generators/credentials.rb +17 -0
- data/lib/formatron/generators/instance.rb +64 -0
- data/lib/formatron/generators/instance/config.rb +47 -0
- data/lib/formatron/generators/instance/formatronfile.rb +47 -0
- data/lib/formatron/generators/instance/formatronfile/Formatronfile.erb +16 -0
- data/lib/formatron/generators/util.rb +14 -0
- data/lib/formatron/generators/util/cookbook.rb +65 -0
- data/lib/formatron/generators/util/gitignore.rb +16 -0
- data/lib/formatron/generators/util/readme.rb +18 -0
- data/lib/formatron/logger.rb +8 -0
- data/lib/formatron/s3/chef_server_cert.rb +85 -0
- data/lib/formatron/s3/chef_server_keys.rb +103 -0
- data/lib/formatron/s3/cloud_formation_template.rb +61 -0
- data/lib/formatron/s3/configuration.rb +58 -0
- data/lib/formatron/s3/path.rb +30 -0
- data/lib/formatron/util/dsl.rb +107 -0
- data/lib/formatron/util/shell.rb +20 -0
- data/lib/formatron/util/vpc.rb +15 -0
- data/lib/formatron/version.rb +4 -0
- data/support/cloudformation_describe_stacks_response.rb +36 -0
- data/support/dsl_test.rb +123 -0
- data/support/route53_get_hosted_zone_response.rb +21 -0
- data/support/s3_get_object_response.rb +21 -0
- data/support/template_test.rb +41 -0
- metadata +414 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
class Formatron
|
2
|
+
module Generators
|
3
|
+
module Util
|
4
|
+
# generates placeholder README.md
|
5
|
+
module Gitignore
|
6
|
+
def self.write(directory)
|
7
|
+
FileUtils.mkdir_p directory
|
8
|
+
readme = File.join directory, '.gitignore'
|
9
|
+
File.write readme, <<-EOH.gsub(/^ {12}/, '')
|
10
|
+
/.formatron/
|
11
|
+
EOH
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Formatron
|
2
|
+
module Generators
|
3
|
+
module Util
|
4
|
+
# generates placeholder README.md
|
5
|
+
module Readme
|
6
|
+
def self.write(directory, name)
|
7
|
+
FileUtils.mkdir_p directory
|
8
|
+
readme = File.join directory, 'README.md'
|
9
|
+
File.write readme, <<-EOH.gsub(/^ {12}/, '')
|
10
|
+
# #{name}
|
11
|
+
|
12
|
+
Formatron configuration
|
13
|
+
EOH
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require_relative 'path'
|
2
|
+
require 'formatron/logger'
|
3
|
+
|
4
|
+
class Formatron
|
5
|
+
module S3
|
6
|
+
# manage the Chef Server SSL certificate and key stored on S3
|
7
|
+
module ChefServerCert
|
8
|
+
CERT_NAME = 'ssl.cert'
|
9
|
+
KEY_NAME = 'ssl.key'
|
10
|
+
|
11
|
+
# rubocop:disable Metrics/ParameterLists
|
12
|
+
# rubocop:disable Metrics/MethodLength
|
13
|
+
def self.deploy(
|
14
|
+
aws:,
|
15
|
+
kms_key:,
|
16
|
+
bucket:,
|
17
|
+
name:,
|
18
|
+
target:,
|
19
|
+
guid:,
|
20
|
+
cert:,
|
21
|
+
key:
|
22
|
+
)
|
23
|
+
cert_key = self.cert_key name: name, target: target, guid: guid
|
24
|
+
Formatron::LOG.info do
|
25
|
+
"Upload Chef Server SSL certifcate to #{bucket}/#{cert_key}"
|
26
|
+
end
|
27
|
+
aws.upload_file(
|
28
|
+
kms_key: kms_key,
|
29
|
+
bucket: bucket,
|
30
|
+
key: cert_key,
|
31
|
+
content: cert
|
32
|
+
)
|
33
|
+
key_key = self.key_key name: name, target: target, guid: guid
|
34
|
+
Formatron::LOG.info do
|
35
|
+
"Upload Chef Server SSL key to #{bucket}/#{key_key}"
|
36
|
+
end
|
37
|
+
aws.upload_file(
|
38
|
+
kms_key: kms_key,
|
39
|
+
bucket: bucket,
|
40
|
+
key: key_key,
|
41
|
+
content: key
|
42
|
+
)
|
43
|
+
end
|
44
|
+
# rubocop:enable Metrics/MethodLength
|
45
|
+
# rubocop:enable Metrics/ParameterLists
|
46
|
+
|
47
|
+
# rubocop:disable Metrics/MethodLength
|
48
|
+
def self.destroy(aws:, bucket:, name:, target:, guid:)
|
49
|
+
cert_key = self.cert_key name: name, target: target, guid: guid
|
50
|
+
Formatron::LOG.info do
|
51
|
+
"Delete Chef Server SSL certificate from #{bucket}/#{cert_key}"
|
52
|
+
end
|
53
|
+
aws.delete_file(
|
54
|
+
bucket: bucket,
|
55
|
+
key: cert_key
|
56
|
+
)
|
57
|
+
key_key = self.key_key name: name, target: target, guid: guid
|
58
|
+
Formatron::LOG.info do
|
59
|
+
"Delete Chef Server SSL key from #{bucket}/#{key_key}"
|
60
|
+
end
|
61
|
+
aws.delete_file(
|
62
|
+
bucket: bucket,
|
63
|
+
key: key_key
|
64
|
+
)
|
65
|
+
end
|
66
|
+
# rubocop:enable Metrics/MethodLength
|
67
|
+
|
68
|
+
def self.cert_key(name:, target:, guid:)
|
69
|
+
Path.key(
|
70
|
+
name: name,
|
71
|
+
target: target,
|
72
|
+
sub_key: "#{guid}/#{CERT_NAME}"
|
73
|
+
)
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.key_key(name:, target:, guid:)
|
77
|
+
Path.key(
|
78
|
+
name: name,
|
79
|
+
target: target,
|
80
|
+
sub_key: "#{guid}/#{KEY_NAME}"
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require_relative 'path'
|
2
|
+
require 'formatron/logger'
|
3
|
+
|
4
|
+
class Formatron
|
5
|
+
module S3
|
6
|
+
# manage the Chef Server user and organization keys
|
7
|
+
module ChefServerKeys
|
8
|
+
USER_PEM_NAME = 'user.pem'
|
9
|
+
ORGANIZATION_PEM_NAME = 'organization.pem'
|
10
|
+
|
11
|
+
# rubocop:disable Metrics/MethodLength
|
12
|
+
# rubocop:disable Metrics/ParameterLists
|
13
|
+
def self.get(
|
14
|
+
aws:,
|
15
|
+
bucket:,
|
16
|
+
name:,
|
17
|
+
target:,
|
18
|
+
guid:,
|
19
|
+
directory:
|
20
|
+
)
|
21
|
+
user_pem_key = self.user_pem_key name: name, target: target, guid: guid
|
22
|
+
Formatron::LOG.info do
|
23
|
+
'Download Chef Server user key from ' \
|
24
|
+
"#{bucket}/#{user_pem_key}"
|
25
|
+
end
|
26
|
+
aws.download_file(
|
27
|
+
bucket: bucket,
|
28
|
+
key: user_pem_key,
|
29
|
+
path: user_pem_path(directory: directory)
|
30
|
+
)
|
31
|
+
organization_pem_key = self.organization_pem_key(
|
32
|
+
name: name, target: target, guid: guid
|
33
|
+
)
|
34
|
+
Formatron::LOG.info do
|
35
|
+
'Download Chef Server organization key ' \
|
36
|
+
"from #{bucket}/#{organization_pem_key}"
|
37
|
+
end
|
38
|
+
aws.download_file(
|
39
|
+
bucket: bucket,
|
40
|
+
key: organization_pem_key,
|
41
|
+
path: organization_pem_path(directory: directory)
|
42
|
+
)
|
43
|
+
end
|
44
|
+
# rubocop:enable Metrics/ParameterLists
|
45
|
+
# rubocop:enable Metrics/MethodLength
|
46
|
+
|
47
|
+
# rubocop:disable Metrics/MethodLength
|
48
|
+
def self.destroy(
|
49
|
+
aws:,
|
50
|
+
bucket:,
|
51
|
+
name:,
|
52
|
+
target:,
|
53
|
+
guid:
|
54
|
+
)
|
55
|
+
user_pem_key = self.user_pem_key name: name, target: target, guid: guid
|
56
|
+
Formatron::LOG.info do
|
57
|
+
'Delete Chef Server user key from ' \
|
58
|
+
"#{bucket}/#{user_pem_key}"
|
59
|
+
end
|
60
|
+
aws.delete_file(
|
61
|
+
bucket: bucket,
|
62
|
+
key: user_pem_key
|
63
|
+
)
|
64
|
+
organization_pem_key = self.organization_pem_key(
|
65
|
+
name: name, target: target, guid: guid
|
66
|
+
)
|
67
|
+
Formatron::LOG.info do
|
68
|
+
'Delete Chef Server organization key ' \
|
69
|
+
"from #{bucket}/#{organization_pem_key}"
|
70
|
+
end
|
71
|
+
aws.delete_file(
|
72
|
+
bucket: bucket,
|
73
|
+
key: organization_pem_key
|
74
|
+
)
|
75
|
+
end
|
76
|
+
# rubocop:enable Metrics/MethodLength
|
77
|
+
|
78
|
+
def self.user_pem_key(name:, target:, guid:)
|
79
|
+
Path.key(
|
80
|
+
name: name,
|
81
|
+
target: target,
|
82
|
+
sub_key: "#{guid}/#{USER_PEM_NAME}"
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.user_pem_path(directory:)
|
87
|
+
File.join directory, USER_PEM_NAME
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.organization_pem_key(name:, target:, guid:)
|
91
|
+
Path.key(
|
92
|
+
name: name,
|
93
|
+
target: target,
|
94
|
+
sub_key: "#{guid}/#{ORGANIZATION_PEM_NAME}"
|
95
|
+
)
|
96
|
+
end
|
97
|
+
|
98
|
+
def self.organization_pem_path(directory:)
|
99
|
+
File.join directory, ORGANIZATION_PEM_NAME
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'path'
|
2
|
+
require 'formatron/logger'
|
3
|
+
|
4
|
+
class Formatron
|
5
|
+
module S3
|
6
|
+
# manage the CloudFormation template stored on S3
|
7
|
+
module CloudFormationTemplate
|
8
|
+
FILE_NAME = 'cloud_formation_template.json'
|
9
|
+
|
10
|
+
# rubocop:disable Metrics/ParameterLists
|
11
|
+
# rubocop:disable Metrics/MethodLength
|
12
|
+
def self.deploy(
|
13
|
+
aws:, kms_key:, bucket:, name:, target:, cloud_formation_template:
|
14
|
+
)
|
15
|
+
key = Path.key(
|
16
|
+
name: name,
|
17
|
+
target: target,
|
18
|
+
sub_key: FILE_NAME
|
19
|
+
)
|
20
|
+
Formatron::LOG.info do
|
21
|
+
"Upload CloudFormation template to #{bucket}/#{key}"
|
22
|
+
end
|
23
|
+
aws.upload_file(
|
24
|
+
kms_key: kms_key,
|
25
|
+
bucket: bucket,
|
26
|
+
key: key,
|
27
|
+
content: cloud_formation_template
|
28
|
+
)
|
29
|
+
end
|
30
|
+
# rubocop:enable Metrics/MethodLength
|
31
|
+
# rubocop:enable Metrics/ParameterLists
|
32
|
+
|
33
|
+
# rubocop:disable Metrics/MethodLength
|
34
|
+
def self.destroy(aws:, bucket:, name:, target:)
|
35
|
+
key = Path.key(
|
36
|
+
name: name,
|
37
|
+
target: target,
|
38
|
+
sub_key: FILE_NAME
|
39
|
+
)
|
40
|
+
Formatron::LOG.info do
|
41
|
+
"Delete CloudFormation template from #{bucket}/#{key}"
|
42
|
+
end
|
43
|
+
aws.delete_file(
|
44
|
+
bucket: bucket,
|
45
|
+
key: key
|
46
|
+
)
|
47
|
+
end
|
48
|
+
# rubocop:enable Metrics/MethodLength
|
49
|
+
|
50
|
+
def self.url(region:, bucket:, name:, target:)
|
51
|
+
Path.url(
|
52
|
+
region: region,
|
53
|
+
bucket: bucket,
|
54
|
+
name: name,
|
55
|
+
target: target,
|
56
|
+
sub_key: FILE_NAME
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative 'path'
|
2
|
+
require 'formatron/logger'
|
3
|
+
|
4
|
+
class Formatron
|
5
|
+
module S3
|
6
|
+
# manage the configuration stored on S3
|
7
|
+
module Configuration
|
8
|
+
FILE_NAME = 'configuration.json'
|
9
|
+
|
10
|
+
# rubocop:disable Metrics/ParameterLists
|
11
|
+
def self.deploy(aws:, kms_key:, bucket:, name:, target:, configuration:)
|
12
|
+
key = self.key name: name, target: target
|
13
|
+
Formatron::LOG.info do
|
14
|
+
"Upload configuration to #{bucket}/#{key}"
|
15
|
+
end
|
16
|
+
aws.upload_file(
|
17
|
+
kms_key: kms_key,
|
18
|
+
bucket: bucket,
|
19
|
+
key: key,
|
20
|
+
content: "#{JSON.pretty_generate(configuration)}\n"
|
21
|
+
)
|
22
|
+
end
|
23
|
+
# rubocop:enable Metrics/ParameterLists
|
24
|
+
|
25
|
+
def self.get(aws:, bucket:, name:, target:)
|
26
|
+
key = self.key name: name, target: target
|
27
|
+
Formatron::LOG.info do
|
28
|
+
"Get configuration from #{bucket}/#{key}"
|
29
|
+
end
|
30
|
+
JSON.parse(
|
31
|
+
aws.get_file(
|
32
|
+
bucket: bucket,
|
33
|
+
key: key
|
34
|
+
)
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.destroy(aws:, bucket:, name:, target:)
|
39
|
+
key = self.key name: name, target: target
|
40
|
+
Formatron::LOG.info do
|
41
|
+
"Delete configuration from #{bucket}/#{key}"
|
42
|
+
end
|
43
|
+
aws.delete_file(
|
44
|
+
bucket: bucket,
|
45
|
+
key: key
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.key(name:, target:)
|
50
|
+
Path.key(
|
51
|
+
name: name,
|
52
|
+
target: target,
|
53
|
+
sub_key: FILE_NAME
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Formatron
|
2
|
+
module S3
|
3
|
+
# defines the S3 bucket keys for consistency
|
4
|
+
module Path
|
5
|
+
def self.key(name:, target:, sub_key:)
|
6
|
+
File.join _base_path(
|
7
|
+
name: name,
|
8
|
+
target: target
|
9
|
+
), sub_key
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.url(region:, bucket:, name:, target:, sub_key:)
|
13
|
+
key = key(
|
14
|
+
name: name,
|
15
|
+
target: target,
|
16
|
+
sub_key: sub_key
|
17
|
+
)
|
18
|
+
"https://s3-#{region}.amazonaws.com/#{bucket}/#{key}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def self._base_path(name:, target:)
|
22
|
+
File.join target, name
|
23
|
+
end
|
24
|
+
|
25
|
+
private_class_method(
|
26
|
+
:_base_path
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
class Formatron
|
2
|
+
module Util
|
3
|
+
# utilities for generating DSL classes
|
4
|
+
module DSL
|
5
|
+
def dsl_initialize_block(&block)
|
6
|
+
define_method :initialize do |**params|
|
7
|
+
instance_exec(**params, &block) unless block.nil?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def dsl_initialize_hash(&block)
|
12
|
+
define_method :initialize do |dsl_key, **params|
|
13
|
+
instance_exec(
|
14
|
+
dsl_key,
|
15
|
+
**params,
|
16
|
+
&block
|
17
|
+
) unless block.nil?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def dsl_property(symbol)
|
22
|
+
iv = "@#{symbol}"
|
23
|
+
define_method symbol do |value = nil|
|
24
|
+
instance_variable_set iv, value unless value.nil?
|
25
|
+
instance_variable_get iv
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# rubocop:disable Metrics/MethodLength
|
30
|
+
def dsl_block(symbol, cls, ¶ms_block)
|
31
|
+
iv = "@#{symbol}"
|
32
|
+
define_method symbol do |&block|
|
33
|
+
value = instance_variable_get(iv)
|
34
|
+
if value.nil?
|
35
|
+
params = {}
|
36
|
+
params = instance_eval(
|
37
|
+
¶ms_block
|
38
|
+
) unless params_block.nil?
|
39
|
+
value = self.class.const_get(cls).new(**params)
|
40
|
+
instance_variable_set iv, value
|
41
|
+
end
|
42
|
+
block.call value unless block.nil?
|
43
|
+
instance_variable_get iv
|
44
|
+
end
|
45
|
+
end
|
46
|
+
# rubocop:enable Metrics/MethodLength
|
47
|
+
|
48
|
+
# rubocop:disable Metrics/MethodLength
|
49
|
+
def dsl_hash(symbol, cls, ¶ms_block)
|
50
|
+
iv = "@#{symbol}"
|
51
|
+
define_method symbol do |dsl_key = nil, &block|
|
52
|
+
hash = instance_variable_get(iv)
|
53
|
+
if hash.nil?
|
54
|
+
hash = {}
|
55
|
+
instance_variable_set iv, hash
|
56
|
+
end
|
57
|
+
unless dsl_key.nil?
|
58
|
+
params = {}
|
59
|
+
params = instance_exec(
|
60
|
+
dsl_key, ¶ms_block
|
61
|
+
) unless params_block.nil?
|
62
|
+
value = self.class.const_get(cls).new(
|
63
|
+
dsl_key,
|
64
|
+
**params
|
65
|
+
)
|
66
|
+
hash[dsl_key] = value
|
67
|
+
block.call value unless block.nil?
|
68
|
+
end
|
69
|
+
hash
|
70
|
+
end
|
71
|
+
end
|
72
|
+
# rubocop:enable Metrics/MethodLength
|
73
|
+
|
74
|
+
def dsl_array(symbol)
|
75
|
+
iv = "@#{symbol}"
|
76
|
+
define_method symbol do |value = nil|
|
77
|
+
array = instance_variable_get(iv)
|
78
|
+
if array.nil?
|
79
|
+
array = []
|
80
|
+
instance_variable_set iv, array
|
81
|
+
end
|
82
|
+
array.push value unless value.nil?
|
83
|
+
array
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# rubocop:disable Metrics/MethodLength
|
88
|
+
def dsl_block_array(symbol, cls)
|
89
|
+
iv = "@#{symbol}"
|
90
|
+
define_method symbol do |&block|
|
91
|
+
array = instance_variable_get(iv)
|
92
|
+
if array.nil?
|
93
|
+
array = []
|
94
|
+
instance_variable_set iv, array
|
95
|
+
end
|
96
|
+
unless block.nil?
|
97
|
+
value = self.class.const_get(cls).new
|
98
|
+
array.push value
|
99
|
+
block.call value
|
100
|
+
end
|
101
|
+
array
|
102
|
+
end
|
103
|
+
end
|
104
|
+
# rubocop:enable Metrics/MethodLength
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|