🆙

Goa v3.11.0 更新情報

2023/01/28に公開

概要

Goa の更新情報メモです。

Goa v3.11.0

主な変更内容

  • Enable Foresight on Windows by @raphael in #3185
  • Fix OpenAPI tags by @raphael in #3190
  • Fix up CI output paths on Windows by @raphael in #3186
  • Create dependency-review.yml by @raphael in #3192
  • Create codeql.yml by @raphael in #3193
  • Add dsl.Randomiser that lets you pass your own example randomiser by @isaacseymour in #3191
  • Added detail about Service dsl function to godoc comment by @c-reeder in #3194
  • Fixed UUID generation in openapi examples by @c-reeder in #3199
  • Fix potential bug with result types by @raphael in #3204
  • OpenAPI v3 type names refer to openapi:typename in meta by @najeira in #3203
  • Remove duplicate err declaration by @raphael in #3218
  • Properly check for nil in validation by @raphael in #3222
  • Fix potential panic when method name is empty by @ikawaha in #3231
  • Use proper scope to compute enum value by @raphael in #3234

結構色々入っていますが、この中から2つピックアックします。

Add dsl.Randomiser that lets you pass your own example randomiser

乱数発生器を自分で定義できるようになりました。乱数発生器は、OpenAPI などの example を生成してくれている機能です。

var _ = API("divider", func() {
    Randomizer(expr.NewFakerRandomizer("different seed"))
})

このように、Randomizer を API に対して設定できます。Randomizer は interface になっていますので、これを満たすように自分で乱数発生器を用意することができます。

自分で定義することが出来る、というとめんどくさい感じしかしませんが、ランダムじゃない乱数発生器が今回用意された、というのが大きなニュースです。OpenAPI ドキュメントは生成される度に example が再生成されて、適当に置き換えられてしまうので、差分が沢山出来てしまうのが問題でした。これを避けるには、デザインに自分で example を指定しておくという回避方法があるのですが、いちいち自分で書かなくてもこれで差分が出なくなります。

var _ = API("divider", func() {
    Randomizer(expr.NewDeterministicRandomizer())
})

ちなみに DeterministicRandomizer はこんな感じで定義されています。

// DeterministicRandomizer returns hard-coded values, removing all randomness
// from example generation
type DeterministicRandomizer struct{}

func (DeterministicRandomizer) ArrayLength() int        { return 1 }
func (DeterministicRandomizer) Int() int                { return 1 }
func (DeterministicRandomizer) Int32() int32            { return 1 }
func (DeterministicRandomizer) Int64() int64            { return 1 }
func (DeterministicRandomizer) String() string          { return "abc123" }
func (DeterministicRandomizer) Bool() bool              { return false }
func (DeterministicRandomizer) Float32() float32        { return 1 }
func (DeterministicRandomizer) Float64() float64        { return 1 }
func (DeterministicRandomizer) UInt() uint              { return 1 }
func (DeterministicRandomizer) UInt32() uint32          { return 1 }
func (DeterministicRandomizer) UInt64() uint64          { return 1 }
func (DeterministicRandomizer) Name() string            { return "Alice" }
func (DeterministicRandomizer) Email() string           { return "alice@example.com" }
func (DeterministicRandomizer) Hostname() string        { return "example.com" }
func (DeterministicRandomizer) IPv4Address() net.IP     { return net.IPv4zero }
func (DeterministicRandomizer) IPv6Address() net.IP     { return net.IPv6zero }
func (DeterministicRandomizer) URL() string             { return "https://example.com/foo" }
func (DeterministicRandomizer) Characters(n int) string { return strings.Repeat("a", n) }

OpenAPI v3 type names refer to openapi:typename in meta

これは、OpenAPI ドキュメントで生成された型の名前を上書きできる機能です。Goa によって生成された OpenAPI ドキュメントをさらにクライアントの生成などに利用している場合などには、ぜひ覚えておくとよさそうな機能。

var Foo = Type("Foo", func() {
    Attribute("name", String)
    Meta("openapi:typename", "Bar")
})

今回はこまごました修正も、新しい機能も盛りだくさんでした。僕も issue 書いたり pr 書いたりしてちょっとだけ貢献できました ╭( ・ㅂ・)و ̑̑ グッ !

Happy hacking!

Discussion