Skip to content

Commit 7a69237

Browse files
ibuildthecloudjoshwget
authored andcommitted
Expose Interpolate for external tools
It is quite useful to parse a text file in the same exact way that compose does. One can imagine this being useful for GUI applications or custom parsers. Signed-off-by: Darren Shepherd <darren@rancher.com> Conflicts: project/merge.go
1 parent c70c528 commit 7a69237

File tree

3 files changed

+24
-20
lines changed

3 files changed

+24
-20
lines changed

project/interpolation.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ func parseConfig(option, service string, data *interface{}, mapping func(string)
137137
return nil
138138
}
139139

140-
func interpolate(environmentLookup EnvironmentLookup, config *rawServiceMap) error {
140+
// Interpolate replaces variables in the raw map representation of the project file
141+
func Interpolate(environmentLookup EnvironmentLookup, config *RawServiceMap) error {
141142
for k, v := range *config {
142143
for k2, v2 := range v {
143144
err := parseConfig(k2, k, &v2, func(s string) string {

project/interpolation_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ func testInterpolatedConfig(t *testing.T, expectedConfig, interpolatedConfig str
9393
expectedConfigBytes := []byte(expectedConfig)
9494
interpolatedConfigBytes := []byte(interpolatedConfig)
9595

96-
expectedData := make(rawServiceMap)
97-
interpolatedData := make(rawServiceMap)
96+
expectedData := make(RawServiceMap)
97+
interpolatedData := make(RawServiceMap)
9898

9999
yaml.Unmarshal(expectedConfigBytes, &expectedData)
100100
yaml.Unmarshal(interpolatedConfigBytes, &interpolatedData)
101101

102-
_ = interpolate(MockEnvironmentLookup{envVariables}, &interpolatedData)
102+
_ = Interpolate(MockEnvironmentLookup{envVariables}, &interpolatedData)
103103

104104
for k := range envVariables {
105105
os.Unsetenv(k)
@@ -110,10 +110,10 @@ func testInterpolatedConfig(t *testing.T, expectedConfig, interpolatedConfig str
110110

111111
func testInvalidInterpolatedConfig(t *testing.T, interpolatedConfig string) {
112112
interpolatedConfigBytes := []byte(interpolatedConfig)
113-
interpolatedData := make(rawServiceMap)
113+
interpolatedData := make(RawServiceMap)
114114
yaml.Unmarshal(interpolatedConfigBytes, &interpolatedData)
115115

116-
err := interpolate(new(MockEnvironmentLookup), &interpolatedData)
116+
err := Interpolate(new(MockEnvironmentLookup), &interpolatedData)
117117

118118
assert.NotNil(t, err)
119119
}

project/merge.go

+17-14
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,21 @@ var (
2828
}
2929
)
3030

31-
type rawService map[string]interface{}
32-
type rawServiceMap map[string]rawService
31+
// RawService is represent a Service in map form unparsed
32+
type RawService map[string]interface{}
33+
34+
// RawServiceMap is a collection of RawServices
35+
type RawServiceMap map[string]RawService
3336

3437
func mergeProject(p *Project, file string, bytes []byte) (map[string]*ServiceConfig, error) {
3538
configs := make(map[string]*ServiceConfig)
3639

37-
datas := make(rawServiceMap)
40+
datas := make(RawServiceMap)
3841
if err := yaml.Unmarshal(bytes, &datas); err != nil {
3942
return nil, err
4043
}
4144

42-
if err := interpolate(p.context.EnvironmentLookup, &datas); err != nil {
45+
if err := Interpolate(p.context.EnvironmentLookup, &datas); err != nil {
4346
return nil, err
4447
}
4548

@@ -51,7 +54,7 @@ func mergeProject(p *Project, file string, bytes []byte) (map[string]*ServiceCon
5154
}
5255

5356
if _, ok := p.Configs[name]; ok {
54-
var rawExistingService rawService
57+
var rawExistingService RawService
5558
if err := utils.Convert(p.Configs[name], &rawExistingService); err != nil {
5659
return nil, err
5760
}
@@ -80,7 +83,7 @@ func adjustValues(configs map[string]*ServiceConfig) {
8083
}
8184
}
8285

83-
func readEnvFile(resourceLookup ResourceLookup, inFile string, serviceData rawService) (rawService, error) {
86+
func readEnvFile(resourceLookup ResourceLookup, inFile string, serviceData RawService) (RawService, error) {
8487
var config ServiceConfig
8588

8689
if err := utils.Convert(serviceData, &config); err != nil {
@@ -138,7 +141,7 @@ func readEnvFile(resourceLookup ResourceLookup, inFile string, serviceData rawSe
138141
return serviceData, nil
139142
}
140143

141-
func resolveBuild(inFile string, serviceData rawService) (rawService, error) {
144+
func resolveBuild(inFile string, serviceData RawService) (RawService, error) {
142145

143146
build := asString(serviceData["build"])
144147
if build == "" {
@@ -164,7 +167,7 @@ func resolveBuild(inFile string, serviceData rawService) (rawService, error) {
164167
return serviceData, nil
165168
}
166169

167-
func parse(resourceLookup ResourceLookup, environmentLookup EnvironmentLookup, inFile string, serviceData rawService, datas rawServiceMap) (rawService, error) {
170+
func parse(resourceLookup ResourceLookup, environmentLookup EnvironmentLookup, inFile string, serviceData RawService, datas RawServiceMap) (RawService, error) {
168171
serviceData, err := readEnvFile(resourceLookup, inFile, serviceData)
169172
if err != nil {
170173
return nil, err
@@ -196,7 +199,7 @@ func parse(resourceLookup ResourceLookup, environmentLookup EnvironmentLookup, i
196199
return serviceData, nil
197200
}
198201

199-
var baseService rawService
202+
var baseService RawService
200203

201204
if file == "" {
202205
if serviceData, ok := datas[service]; ok {
@@ -211,12 +214,12 @@ func parse(resourceLookup ResourceLookup, environmentLookup EnvironmentLookup, i
211214
return nil, err
212215
}
213216

214-
var baseRawServices rawServiceMap
217+
var baseRawServices RawServiceMap
215218
if err := yaml.Unmarshal(bytes, &baseRawServices); err != nil {
216219
return nil, err
217220
}
218221

219-
err = interpolate(environmentLookup, &baseRawServices)
222+
err = Interpolate(environmentLookup, &baseRawServices)
220223
if err != nil {
221224
return nil, err
222225
}
@@ -254,7 +257,7 @@ func parse(resourceLookup ResourceLookup, environmentLookup EnvironmentLookup, i
254257
return baseService, nil
255258
}
256259

257-
func mergeConfig(baseService, serviceData rawService) rawService {
260+
func mergeConfig(baseService, serviceData RawService) RawService {
258261
for k, v := range serviceData {
259262
// Image and build are mutually exclusive in merge
260263
if k == "image" {
@@ -298,8 +301,8 @@ func merge(existing, value interface{}) interface{} {
298301
return value
299302
}
300303

301-
func clone(in rawService) rawService {
302-
result := rawService{}
304+
func clone(in RawService) RawService {
305+
result := RawService{}
303306
for k, v := range in {
304307
result[k] = v
305308
}

0 commit comments

Comments
 (0)