makemespiffy 0.1.0

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
+ ---
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