Skip to content

Commit

Permalink
Merge pull request #447 from thriftrw/syrie/release
Browse files Browse the repository at this point in the history
Release v1.24.0 (#447)
  • Loading branch information
SyrieBianco authored Jun 24, 2020
2 parents 4a3f3be + 053a955 commit 84592e4
Show file tree
Hide file tree
Showing 27 changed files with 289 additions and 95 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## [1.24.0] - 2020-06-18
### Added
- Generate `Default_*` methods that construct Thrift structs with defined
default values pre-populated.

### Changed
- gen: Redefine Options.Plugin as a struct usable outside go.uber.org/thriftrw.

### Fixed
- Serializing generated Thrift objects no longer mutates them with default
values for unspecified fields.

## [1.23.0] - 2020-03-31
### Added
- Support opting out of the `omitempty` JSON option by adding `!omitempty` to the
Expand Down Expand Up @@ -330,6 +342,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
### Added
- Initial release.

[1.24.0]: https://github.com/thriftrw/thriftrw-go/compare/v1.23.0...v1.24.0
[1.23.0]: https://github.com/thriftrw/thriftrw-go/compare/v1.22.0...v1.23.0
[1.22.0]: https://github.com/thriftrw/thriftrw-go/compare/v1.21.0...v1.22.0
[1.21.0]: https://github.com/thriftrw/thriftrw-go/compare/v1.20.2...v1.21.0
Expand Down
23 changes: 12 additions & 11 deletions gen/collision_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ func TestStruct(t *testing.T) {
},
}
for _, tt := range tests {
roundTrip(t, tt.x, tt.desc)
roundTrip(t, tt.x, tt.x, tt.desc)
}
}

Expand Down Expand Up @@ -433,15 +433,16 @@ func TestConstant(t *testing.T) {
}

func TestWithDefault(t *testing.T) {
a := &tc.WithDefault{
withDefault := &tc.WithDefault{
Pouet: &tc.StructCollision2{
CollisionField2: "false indeed",
},
}
b := &tc.WithDefault{}
noDefault := &tc.WithDefault{}

a = roundTrip(t, a, "WithDefault{filled in}").(*tc.WithDefault)
b = roundTrip(t, b, "WithDefault{}").(*tc.WithDefault)
// expect FromWire values to have defaults and be equivalent
a := roundTrip(t, withDefault, withDefault, "WithDefault{filled in}").(*tc.WithDefault)
b := roundTrip(t, noDefault, withDefault, "WithDefault{}").(*tc.WithDefault)
if a != nil && b != nil {
require.Equal(t, a, b)
}
Expand Down Expand Up @@ -531,9 +532,9 @@ func TestMyEnum2Equals(t *testing.T) {
}
}

func roundTrip(t *testing.T, x thriftType, msg string) thriftType {
v, err := x.ToWire()
if !assert.NoError(t, err, "failed to serialize: %v", x) {
func roundTrip(t *testing.T, give thriftType, want thriftType, msg string) thriftType {
v, err := give.ToWire()
if !assert.NoError(t, err, "failed to serialize: %v", give) {
return nil
}

Expand All @@ -548,11 +549,11 @@ func roundTrip(t *testing.T, x thriftType, msg string) thriftType {
}

if !assert.True(
t, wire.ValuesAreEqual(newV, v), "%v: deserialize(serialize(%v.ToWire())) != %v", msg, x, v) {
t, wire.ValuesAreEqual(newV, v), "%v: deserialize(serialize(%v.ToWire())) != %v", msg, give, v) {
return nil
}

xType := reflect.TypeOf(x)
xType := reflect.TypeOf(give)
if xType.Kind() == reflect.Ptr {
xType = xType.Elem()
}
Expand All @@ -562,7 +563,7 @@ func roundTrip(t *testing.T, x thriftType, msg string) thriftType {
return nil
}

assert.Equal(t, x, gotX, "FromWire: %v", msg)
assert.Equal(t, want, gotX, "FromWire: %v", msg)
return gotX
}

Expand Down
42 changes: 39 additions & 3 deletions gen/field.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ func (f fieldGroupGenerator) Generate(g Generator) error {
return err
}

if err := f.DefineDefaultConstructor(g); err != nil {
return err
}

if err := f.ToWire(g); err != nil {
return err
}
Expand Down Expand Up @@ -244,6 +248,35 @@ func (f *fieldGroupGenerator) declFieldName(fs *compile.FieldSpec) (string, erro
return name, nil
}

func (f fieldGroupGenerator) DefineDefaultConstructor(g Generator) error {
var hasDefaults bool
for _, f := range f.Fields {
if f.Default != nil {
hasDefaults = true
break
}
}
if !hasDefaults {
return nil
}
return g.DeclareFromTemplate(
`
// Default_<.Name> constructs a new <.Name> struct,
// pre-populating any fields with defined default values.
func Default_<.Name>() *<.Name> {
<- $v := newVar "v" ->
var v <.Name>
<- range .Fields ->
<- $fname := goName . ->
<- if .Default>
<$v>.<$fname> = <constantValuePtr .Default .Type>
<- end ->
<end>
return &v
}
`, f, TemplateFunc("constantValuePtr", ConstantValuePtr))
}

func (f fieldGroupGenerator) ToWire(g Generator) error {
return g.DeclareFromTemplate(
`
Expand Down Expand Up @@ -297,14 +330,17 @@ func (f fieldGroupGenerator) ToWire(g Generator) error {
<$i>++
<- else ->
<- if .Default ->
if <$f> == nil {
<$f> = <constantValuePtr .Default .Type>
<- $fval := printf "%s%s" $v $fname ->
<$fval> := <$f>
if <$fval> == nil {
<$fval> = <constantValuePtr .Default .Type>
}
{
<$wVal>, err = <toWirePtr .Type $fval>
<- else ->
if <$f> != nil {
<- end>
<$wVal>, err = <toWirePtr .Type $f>
<- end>
if err != nil {
return <$wVal>, err
}
Expand Down
26 changes: 15 additions & 11 deletions gen/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,16 @@ import (

"go.uber.org/thriftrw/compile"
"go.uber.org/thriftrw/internal/plugin"
"go.uber.org/thriftrw/plugin/api"

"go.uber.org/multierr"
)

// CodeGenerator lists possible code generators for a plugin.
type CodeGenerator struct {
ServiceGenerator api.ServiceGenerator
}

// Options controls how code gets generated.
type Options struct {
// OutputDir is the directory into which all generated code is written.
Expand All @@ -60,7 +66,7 @@ type Options struct {
NoVersionCheck bool

// Code generation plugin
Plugin plugin.Handle
Plugin CodeGenerator

// Do not generate types.go
NoTypes bool
Expand Down Expand Up @@ -133,20 +139,18 @@ func Generate(m *compile.Module, o *Options) error {
}
}

plug := o.Plugin
plug := o.Plugin.ServiceGenerator
if plug == nil {
plug = plugin.EmptyHandle
plug = plugin.EmptyServiceGenerator
}

if sgen := plug.ServiceGenerator(); sgen != nil {
res, err := sgen.Generate(genBuilder.Build())
if err != nil {
return err
}
res, err := plug.Generate(genBuilder.Build())
if err != nil {
return err
}

if err := mergeFiles(files, res.Files); err != nil {
return err
}
if err := mergeFiles(files, res.Files); err != nil {
return err
}

for relPath, contents := range files {
Expand Down
7 changes: 5 additions & 2 deletions gen/generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -290,9 +290,12 @@ func TestGenerate(t *testing.T) {
require.NoError(t, err)
defer os.RemoveAll(outputDir)

var p plugin.Handle
var p CodeGenerator
if tt.getPlugin != nil {
p = tt.getPlugin(mockCtrl)
handle := tt.getPlugin(mockCtrl)
p = CodeGenerator{
ServiceGenerator: handle.ServiceGenerator(),
}
}

err = Generate(module, &Options{
Expand Down
20 changes: 16 additions & 4 deletions gen/internal/tests/collision/collision.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/constants/constants.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/containers/containers.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 18 additions & 7 deletions gen/internal/tests/enum_conflict/enum_conflict.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/enums/enums.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/exceptions/exceptions.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/hyphenated-file/hyphenated-file.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/hyphenated_file/hyphenated_file.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/non_hyphenated/non_hyphenated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/nozap/nozap.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/other_constants/other_constants.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/services/services.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion gen/internal/tests/set_to_slice/set_to_slice.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 84592e4

Please sign in to comment.