如何让ConfigSlurper在环境中使用计算属性

时间:2013-05-30 04:58:58

标签: groovy config

我希望有一个groovy配置,允许我设置一些默认值(即计算值),可以选择性地覆盖环境。以下脚本显示了一个简单示例。

import static junit.framework.Assert.*

def config = 
"""
base { value = "X" }
calc { value = base.value }

environments {
    overridebase {
        base { value = "1" }
    }
}
"""

// these asserts work
assertEquals("X", new ConfigSlurper().parse(config).base.value)
assertEquals("X", new ConfigSlurper().parse(config).calc.value)
assertEquals("1", new ConfigSlurper("overridebase").parse(config).base.value)

// this assert fails as calc.value remains "X"
assertEquals("1", new ConfigSlurper("overridebase").parse(config).calc.value)

前三个断言有效,因此原始计算值有效,但即使基数发生变化,它仍然会很快解决,因为它保持原始计算值。

2 个答案:

答案 0 :(得分:0)

证明自己错了:

def myConfig = new ConfigSlurper("overridebase").parse(config)
assert "1" == Eval.me("${myConfig.calc.value}", myConfig.base.value, myConfig.calc.value.toString())

你鼓励我不要辜负目的。谢谢。 :)

答案 1 :(得分:0)

看起来最简单的事情就是手动检查缺失值

import static junit.framework.Assert.*

def configs = 
"""
base { value = "X" }
calc {  }

environments {
    overridebase {
        base { value = "1" }
    }
    overridecalc {
        calc { value = "2" }
    }
}
"""

def config

config = new ConfigSlurper().parse(configs)

assertEquals("X", config.base.value)
assertEquals("X", config.calc.value ?: config.base.value)

config = new ConfigSlurper("overridebase").parse(configs)

assertEquals("1", config.base.value)
assertEquals("1", config.calc.value ?: config.base.value)

config = new ConfigSlurper("overridecalc").parse(configs)

assertEquals("X", config.base.value)
assertEquals("2", config.calc.value ?: config.base.value)