makemespiffy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9ca618f5b75c3126fe81406bc1730fad8669d9d5
4
+ data.tar.gz: c4c7144a3327bed3ea0482bd1f310946a9d6e219
5
+ SHA512:
6
+ metadata.gz: 410bf36d64d0abe4c23febe497eb4e3a4a2b377ec9b69684c7e7b7266d6e444a1779bf7f970d8c2d32e6931ea3e685eabbad829e06eaf3ad3cc05146c8ce9695
7
+ data.tar.gz: 2c765d06fc74cdbf31718611e818c79718946dcbd3d7fc45eaae41f30fc408a6f7743fc8b5c41e9aa8e1a75a98ee4a29715f01372d78725cab84b3d7964c0fed
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format progress
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ language: ruby
2
+ script: bundle exec rspec
3
+ notifications:
4
+ email:
5
+ recipients:
6
+ - drnicwilliams@gmail.com
7
+
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in makemespiffy.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Dr Nic Williams
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,51 @@
1
+ Make Me Spiffy
2
+ ==============
3
+
4
+ Convert a flat BOSH manifest for something into a set of Spiff templates.
5
+
6
+ This is being developed to help migrate flat BOSH manifests into a standardised Concourse pipeline that could deploy anything.
7
+
8
+ The plan
9
+ --------
10
+
11
+ Given a BOSH manifest `manifest.yml`, run the command multiple times to extract data into spiff templates:
12
+
13
+ ```
14
+ makemespiffy manifest.yml name environment/name.yml meta.name
15
+ ```
16
+
17
+ This will take the root level key `name` from `manifest.yml` and replace it with `(( meta.name ))`.
18
+
19
+ ```
20
+ name: manifest-name
21
+ ```
22
+
23
+ Becomes:
24
+
25
+ ```yaml
26
+ meta:
27
+ name: (( merge ))
28
+
29
+ name: (( meta.name ))
30
+ ```
31
+
32
+ It will also create `environment/name.yml` (if not yet created) and add the extracted value:
33
+
34
+ ```yaml
35
+ meta:
36
+ name: manifest-name
37
+ ```
38
+
39
+ Multiple fields can be extracted into the same target file.
40
+
41
+ Reference items from lists by their `name:` field (like `spiff` itself does):
42
+
43
+ ```
44
+ makemespiffy manifest.yml "jobs.runner_z1.instances" environment/scaling.yml meta.instances.runner_z1
45
+ ```
46
+
47
+ Complex objects can be extracted too:
48
+
49
+ ```
50
+ makemespiffy manifest.yml "networks.cf1.subnets" environment/networking.yml meta.subnets.cf1
51
+ ```
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'makemespiffy'
4
+
5
+ input_manifest_path=ARGV[0]
6
+ input_scope=ARGV[1]
7
+ output_spiff_template_path=ARGV[2]
8
+ output_meta_scope=ARGV[3]
9
+
10
+ if ARGV[3].nil? || ARGV[3].length == 0
11
+ $stderr.puts "USAGE: makemespiffy manifest.yml properties.something templates/properties.yml meta.something"
12
+ exit 1
13
+ end
14
+
15
+ input_manifest = MakeMeSpiffy::InputManifest.from_file(input_manifest_path)
16
+ value = input_manifest.spiffy(input_scope, output_meta_scope)
17
+ input_manifest.insert_scope_value(output_meta_scope, "(( merge ))")
18
+
19
+ output_manifest = MakeMeSpiffy::OutputTemplateManifest.from_file(output_spiff_template_path)
20
+ output_manifest.insert_scope_value(output_meta_scope, value)
21
+
22
+ #
23
+ # (( x.y.z )) is rendered as "(( x.y.z ))" in to_yaml; so explicitly
24
+ # construct the YAMLTree
25
+ #
26
+ # Thanks @tenderlove for https://gist.github.com/tenderlove/8c3988b8f797dfee0a3a
27
+ #
28
+ def tree o, options = {}
29
+ visitor = Psych::Visitors::YAMLTree.create options
30
+ visitor << o
31
+ visitor.tree
32
+ end
33
+
34
+ t = tree(input_manifest.manifest)
35
+ # find scalar nodes and modify them
36
+ t.grep(Psych::Nodes::Scalar).each do |node|
37
+ node.plain = true
38
+ node.quoted = false
39
+ node.style = Psych::Nodes::Scalar::PLAIN
40
+ end
41
+
42
+ File.open(input_manifest_path, "w") do |file|
43
+ file << t.yaml
44
+ end
45
+ File.open(output_spiff_template_path, "w") do |file|
46
+ file << output_manifest.manifest.to_yaml
47
+ end
@@ -0,0 +1,7 @@
1
+ module MakeMeSpiffy
2
+ # Your code goes here...
3
+ end
4
+
5
+ require "makemespiffy/version"
6
+ require "makemespiffy/input_manifest"
7
+ require "makemespiffy/output_template_manifest"
@@ -0,0 +1,58 @@
1
+ require "yaml"
2
+
3
+ module MakeMeSpiffy
4
+ class InputManifest
5
+ attr_reader :manifest
6
+
7
+ class UnknownScopeError < Exception; end
8
+
9
+ def self.from_file(manifest_path)
10
+ file = YAML.load_file(manifest_path)
11
+ self.new(file)
12
+ end
13
+
14
+ def initialize(bosh_manifest_yaml)
15
+ @manifest = bosh_manifest_yaml
16
+ end
17
+
18
+ # Primary method to replace a chunk of manifest with a (( meta.scope ))
19
+ def spiffy(extraction_scope, meta_scope)
20
+ part, *other_parts = extraction_scope.split('.')
21
+
22
+ if manifest.is_a?(Array)
23
+ part_value = manifest.find { |item| item["name"] == part }
24
+ else
25
+ part_value = manifest[part]
26
+ end
27
+
28
+ if other_parts.size == 0
29
+ if part_value
30
+ manifest[extraction_scope] = "(( #{meta_scope} ))"
31
+ end
32
+ return part_value
33
+ else
34
+ unless part_value
35
+ raise UnknownScopeError, extraction_scope
36
+ end
37
+ inner_manifest = InputManifest.new(part_value)
38
+ return inner_manifest.spiffy(other_parts.join("."), meta_scope)
39
+ end
40
+ end
41
+
42
+ # Usage: insert_scope_value("meta.foo.bar", 1234)
43
+ # Will add the following into manifest YAML
44
+ # meta:
45
+ # foo:
46
+ # bar: 1234
47
+ def insert_scope_value(meta_scope, value)
48
+ parts = meta_scope.split('.')
49
+ submanifest = manifest
50
+ scoping_parts, key = parts[0..-2], parts[-1]
51
+ for part in scoping_parts
52
+ submanifest[part] ||= {}
53
+ submanifest = submanifest[part]
54
+ end
55
+ submanifest[key] = value
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,36 @@
1
+ require "yaml"
2
+
3
+ module MakeMeSpiffy
4
+ class OutputTemplateManifest
5
+ attr_reader :manifest
6
+
7
+ def self.from_file(manifest_path)
8
+ if File.exist?(manifest_path)
9
+ file = YAML.load_file(manifest_path)
10
+ else
11
+ file = {}
12
+ end
13
+ self.new(file)
14
+ end
15
+
16
+ def initialize(bosh_manifest_yaml)
17
+ @manifest = bosh_manifest_yaml
18
+ end
19
+
20
+ # Usage: insert_scope_value("meta.foo.bar", 1234)
21
+ # Will add the following into manifest YAML
22
+ # meta:
23
+ # foo:
24
+ # bar: 1234
25
+ def insert_scope_value(meta_scope, value)
26
+ parts = meta_scope.split('.')
27
+ submanifest = manifest
28
+ scoping_parts, key = parts[0..-2], parts[-1]
29
+ for part in scoping_parts
30
+ submanifest[part] ||= {}
31
+ submanifest = submanifest[part]
32
+ end
33
+ submanifest[key] = value
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module MakeMeSpiffy
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'makemespiffy/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "makemespiffy"
8
+ spec.version = MakeMeSpiffy::VERSION
9
+ spec.authors = ["Dr Nic Williams"]
10
+ spec.email = ["drnicwilliams@gmail.com"]
11
+ spec.summary = %q{Convert a flat BOSH manifest for something into a set of Spiff templates.}
12
+ spec.description = %q{Convert a flat BOSH manifest for something into a set of Spiff templates.}
13
+ spec.homepage = "https://github.com/cloudfoundry-community/makemespiffy"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.7"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "rspec"
24
+ end
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: concourse
3
+
4
+ director_uuid: 3b9806e6-f540-11e4-a153-6c4008a663f0
5
+
6
+ releases:
7
+ - name: concourse
8
+ version: latest
9
+ - name: garden-linux
10
+ version: latest
11
+
12
+ jobs:
13
+ - name: web
14
+ instances: 1
15
+ resource_pool: concourse
16
+ networks:
17
+ - name: concourse
18
+ static_ips: &web-ips [10.244.8.2]
19
+ persistent_disk: 1024 # for consul
20
+ templates:
21
+ - {release: concourse, name: consul-agent}
22
+ - {release: concourse, name: atc}
23
+ - {release: concourse, name: tsa}
24
+ properties:
25
+ atc:
26
+ development_mode: true
27
+ publicly_viewable: true
28
+ postgresql:
29
+ database: &atc-db atc
30
+ role: &atc-role
31
+ name: atc
32
+ password: dummy-postgres-password
33
+
34
+ consul:
35
+ agent:
36
+ mode: server
37
+
38
+ - name: db
39
+ instances: 1
40
+ resource_pool: concourse
41
+ networks: [{name: concourse}]
42
+ persistent_disk: 10240
43
+ templates:
44
+ - {release: concourse, name: consul-agent}
45
+ - {release: concourse, name: postgresql}
46
+ properties:
47
+ postgresql:
48
+ databases: [{name: *atc-db}]
49
+ roles: [*atc-role]
50
+
51
+ consul:
52
+ agent:
53
+ servers: {lan: *web-ips}
54
+
55
+ - name: worker
56
+ instances: 1
57
+ resource_pool: concourse
58
+ networks: [{name: concourse}]
59
+ templates:
60
+ - {release: concourse, name: consul-agent}
61
+ - {release: garden-linux, name: garden}
62
+ - {release: concourse, name: groundcrew}
63
+ properties:
64
+ garden:
65
+ # cannot enforce quotas in bosh-lite
66
+ disk_quota_enabled: false
67
+
68
+ listen_network: tcp
69
+ listen_address: 0.0.0.0:7777
70
+
71
+ allow_host_access: true
72
+
73
+ consul:
74
+ agent:
75
+ servers: {lan: *web-ips}
76
+
77
+ networks:
78
+ - name: concourse
79
+ subnets:
80
+ # network with static ip used for web
81
+ - range: 10.244.8.0/30
82
+ reserved: [10.244.8.1]
83
+ static: [10.244.8.2]
84
+ cloud_properties: {}
85
+
86
+ # networks for dynamic ips (db, workers, compilation vms)
87
+ - range: 10.244.8.4/30
88
+ reserved: [10.244.8.5]
89
+ cloud_properties: {}
90
+ - range: 10.244.8.8/30
91
+ reserved: [10.244.8.9]
92
+ cloud_properties: {}
93
+ - range: 10.244.8.12/30
94
+ reserved: [10.244.8.13]
95
+ cloud_properties: {}
96
+ - range: 10.244.8.16/30
97
+ reserved: [10.244.8.17]
98
+ cloud_properties: {}
99
+ - range: 10.244.8.20/30
100
+ reserved: [10.244.8.21]
101
+ cloud_properties: {}
102
+
103
+ resource_pools:
104
+ - name: concourse
105
+ network: concourse
106
+ cloud_properties: {}
107
+ stemcell:
108
+ name: bosh-warden-boshlite-ubuntu-trusty-go_agent
109
+ version: latest
110
+
111
+ compilation:
112
+ workers: 3
113
+ network: concourse
114
+ cloud_properties: {}
115
+
116
+ update:
117
+ canaries: 1
118
+ max_in_flight: 3
119
+ serial: false
120
+ canary_watch_time: 1000-60000
121
+ update_watch_time: 1000-60000
@@ -0,0 +1,2 @@
1
+ ---
2
+ name: concourse
@@ -0,0 +1,62 @@
1
+ describe MakeMeSpiffy::InputManifest do
2
+ describe 'concourse.yml' do
3
+ let(:fixture) { fixture_path("concourse.yml") }
4
+ subject { MakeMeSpiffy::InputManifest.from_file(fixture) }
5
+
6
+ describe "simple scope" do
7
+ it { expect(subject.manifest["name"]).to eq "concourse" }
8
+ describe "spiffy" do
9
+ before do
10
+ @value = subject.spiffy("name", "meta.name")
11
+ end
12
+ it {expect(subject.manifest["name"]).to eq "(( meta.name ))"}
13
+ it {expect(@value).to eq "concourse"}
14
+ end
15
+
16
+ describe "insert_scope_value" do
17
+ before do
18
+ subject.insert_scope_value("meta.name", "(( merge ))")
19
+ end
20
+ it {expect(subject.manifest["meta"]).to_not be_nil }
21
+ it {expect(subject.manifest["meta"]["name"]).to eq("(( merge ))") }
22
+ end
23
+ end
24
+
25
+ describe "nested scope" do
26
+ it { expect(subject.manifest["compilation"]["workers"]).to eq 3 }
27
+ describe "spiffy" do
28
+ before do
29
+ @value = subject.spiffy("compilation.workers", "meta.instances.workers")
30
+ end
31
+ it {expect(subject.manifest["compilation"]["workers"]).to eq "(( meta.instances.workers ))"}
32
+ it {expect(@value).to eq 3}
33
+ end
34
+
35
+ describe "insert_scope_value" do
36
+ before do
37
+ subject.insert_scope_value("meta.instances.workers", "(( merge ))")
38
+ end
39
+ it {expect(subject.manifest["meta"]).to_not be_nil }
40
+ it {expect(subject.manifest["meta"]["instances"]).to_not be_nil }
41
+ it {expect(subject.manifest["meta"]["instances"]["workers"]).to eq("(( merge ))") }
42
+ end
43
+
44
+ describe "bad input scope" do
45
+ xit { expect(subject.manifest["compilation"]["foobar"]).to be_nil }
46
+ xit { expect(subject.manifest["foobar"]["workers"]).to be_nil }
47
+ end
48
+ end
49
+
50
+ describe "complex scope through named array" do
51
+ it { expect(subject.manifest["jobs"][0]["name"]).to eq "web" }
52
+ describe "spiffy" do
53
+ before do
54
+ @value = subject.spiffy("jobs.web.instances", "meta.instances.web")
55
+ end
56
+ it {expect(subject.manifest["jobs"][0]["name"]).to eq "web"}
57
+ it {expect(subject.manifest["jobs"][0]["instances"]).to eq "(( meta.instances.web ))"}
58
+ it {expect(@value).to eq 1}
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,27 @@
1
+ #!/bin/bash
2
+
3
+ DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
4
+ cd $DIR/..
5
+
6
+ set -e
7
+
8
+ source_manifest=${source_manifest:-spec/fixtures/concourse.yml}
9
+ manifest=tmp/manifest.yml
10
+ makemespiffy() {
11
+ bundle exec bin/makemespiffy $@
12
+ }
13
+
14
+ rm -rf tmp
15
+ mkdir -p tmp
16
+ cp ${source_manifest} tmp/manifest.yml
17
+
18
+ makemespiffy ${manifest} name tmp/name.yml meta.name
19
+ makemespiffy ${manifest} director_uuid tmp/director.yml meta.director_uuid
20
+ makemespiffy ${manifest} releases tmp/stub.yml meta.releases
21
+ makemespiffy ${manifest} resource_pools.concourse.stemcell tmp/stub.yml meta.stemcell
22
+ makemespiffy ${manifest} networks.concourse.subnets tmp/networks.yml meta.subnets
23
+ makemespiffy ${manifest} jobs.web.instances tmp/scaling.yml meta.instances.web
24
+ makemespiffy ${manifest} jobs.worker.instances tmp/scaling.yml meta.instances.worker
25
+
26
+ spiff merge tmp/manifest.yml tmp/networks.yml tmp/scaling.yml tmp/name.yml tmp/director.yml tmp/stub.yml > tmp/spiffy.yml
27
+ spiff diff ${source_manifest} tmp/spiffy.yml
@@ -0,0 +1,13 @@
1
+ describe MakeMeSpiffy::OutputTemplateManifest do
2
+ describe 'concourse.yml' do
3
+ subject { MakeMeSpiffy::OutputTemplateManifest.from_file("tmp/new.yml") }
4
+
5
+ it { expect(subject.manifest).to eq({}) }
6
+ it {
7
+ subject.insert_scope_value("meta.top.bottom", 123)
8
+ expect(subject.manifest["meta"]).not_to be_nil
9
+ expect(subject.manifest["meta"]["top"]).not_to be_nil
10
+ expect(subject.manifest["meta"]["top"]["bottom"]).to eq(123)
11
+ }
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright (c) 2015 Stark & Wayne, LLC
2
+
3
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
4
+
5
+ require "rubygems"
6
+ require "bundler"
7
+ Bundler.setup(:default, :test)
8
+
9
+ $:.unshift(File.expand_path("../../lib", __FILE__))
10
+
11
+ require "rspec/core"
12
+
13
+ require "makemespiffy"
14
+
15
+ # load all files in spec/support/* (but not lower down)
16
+ Dir[File.dirname(__FILE__) + '/support/*'].each do |path|
17
+ require path unless File.directory?(path)
18
+ end
19
+
20
+ def fixture_path(path)
21
+ File.join(File.expand_path("../fixtures", __FILE__), path)
22
+ end
23
+
24
+ RSpec.configure do |c|
25
+ c.color = true
26
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: makemespiffy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dr Nic Williams
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-05-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Convert a flat BOSH manifest for something into a set of Spiff templates.
56
+ email:
57
+ - drnicwilliams@gmail.com
58
+ executables:
59
+ - makemespiffy
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - ".gitignore"
64
+ - ".rspec"
65
+ - ".travis.yml"
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - bin/makemespiffy
71
+ - lib/makemespiffy.rb
72
+ - lib/makemespiffy/input_manifest.rb
73
+ - lib/makemespiffy/output_template_manifest.rb
74
+ - lib/makemespiffy/version.rb
75
+ - makemespiffy.gemspec
76
+ - spec/fixtures/concourse.yml
77
+ - spec/fixtures/just_name.yml
78
+ - spec/input_manifest_spec.rb
79
+ - spec/integration_test.sh
80
+ - spec/output_template_manifest_spec.rb
81
+ - spec/spec_helper.rb
82
+ homepage: https://github.com/cloudfoundry-community/makemespiffy
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubyforge_project:
102
+ rubygems_version: 2.4.3
103
+ signing_key:
104
+ specification_version: 4
105
+ summary: Convert a flat BOSH manifest for something into a set of Spiff templates.
106
+ test_files:
107
+ - spec/fixtures/concourse.yml
108
+ - spec/fixtures/just_name.yml
109
+ - spec/input_manifest_spec.rb
110
+ - spec/integration_test.sh
111
+ - spec/output_template_manifest_spec.rb
112
+ - spec/spec_helper.rb