Skip to content

Commit dc87465

Browse files
committed
Relinting (2)
* addressed linting issues, especially those related to non-wrapping errors: refactored all calls to fmt.Errorf() * fixes #114: unfortunate copy paste typo in mixin.go * test: worked around go issue on windows: golang/go#71544 Signed-off-by: Frederic BIDON <[email protected]>
1 parent 20848b4 commit dc87465

File tree

12 files changed

+198
-75
lines changed

12 files changed

+198
-75
lines changed

analyzer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para
681681

682682
obj, _, err := pr.Ref.GetPointer().Get(s.spec)
683683
if err != nil {
684-
if callmeOnError(param, fmt.Errorf("invalid reference: %q", pr.Ref.String())) {
684+
if callmeOnError(param, ErrInvalidRef(pr.Ref.String())) {
685685
continue
686686
}
687687

@@ -690,7 +690,7 @@ func (s *Spec) paramsAsMap(parameters []spec.Parameter, res map[string]spec.Para
690690

691691
objAsParam, ok := obj.(spec.Parameter)
692692
if !ok {
693-
if callmeOnError(param, fmt.Errorf("resolved reference is not a parameter: %q", pr.Ref.String())) {
693+
if callmeOnError(param, ErrInvalidParameterRef(pr.Ref.String())) {
694694
continue
695695
}
696696

analyzer_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"path/filepath"
2020
"sort"
2121
"strconv"
22+
"strings"
2223
"testing"
2324

2425
"github.com/go-openapi/analysis/internal/antest"
@@ -426,8 +427,8 @@ func TestAnalyzer_ParamsAsMapWithCallback(t *testing.T) {
426427
return true // Continue
427428
})
428429

429-
assert.Contains(t, e, `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
430-
assert.Contains(t, e, `invalid reference: "#/definitions/sample_info/properties/sids"`)
430+
assert.Contains(t, strings.Join(e, ","), `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
431+
assert.Contains(t, strings.Join(e, ","), `invalid reference: "#/definitions/sample_info/properties/sids"`)
431432

432433
// bail out callback
433434
m = make(map[string]spec.Parameter)
@@ -533,8 +534,8 @@ func TestAnalyzer_SafeParamsFor(t *testing.T) {
533534
require.Fail(t, "There should be no safe parameter in this testcase")
534535
}
535536

536-
assert.Contains(t, e, `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
537-
assert.Contains(t, e, `invalid reference: "#/definitions/sample_info/properties/sids"`)
537+
assert.Contains(t, strings.Join(e, ","), `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
538+
assert.Contains(t, strings.Join(e, ","), `invalid reference: "#/definitions/sample_info/properties/sids"`)
538539
}
539540

540541
func TestAnalyzer_ParamsFor(t *testing.T) {
@@ -581,8 +582,8 @@ func TestAnalyzer_SafeParametersFor(t *testing.T) {
581582
require.Fail(t, "There should be no safe parameter in this testcase")
582583
}
583584

584-
assert.Contains(t, e, `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
585-
assert.Contains(t, e, `invalid reference: "#/definitions/sample_info/properties/sids"`)
585+
assert.Contains(t, strings.Join(e, ","), `resolved reference is not a parameter: "#/definitions/sample_info/properties/sid"`)
586+
assert.Contains(t, strings.Join(e, ","), `invalid reference: "#/definitions/sample_info/properties/sids"`)
586587
}
587588

588589
func TestAnalyzer_ParametersFor(t *testing.T) {

errors.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package analysis
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
)
7+
8+
type analysisError string
9+
10+
const (
11+
ErrAnalysis analysisError = "analysis error"
12+
ErrNoSchema analysisError = "no schema to analyze"
13+
)
14+
15+
func (e analysisError) Error() string {
16+
return string(e)
17+
}
18+
19+
func ErrAtKey(key string, err error) error {
20+
return errors.Join(
21+
fmt.Errorf("key %s: %w", key, err),
22+
ErrAnalysis,
23+
)
24+
}
25+
26+
func ErrInvalidRef(key string) error {
27+
return fmt.Errorf("invalid reference: %q: %w", key, ErrAnalysis)
28+
}
29+
30+
func ErrInvalidParameterRef(key string) error {
31+
return fmt.Errorf("resolved reference is not a parameter: %q: %w", key, ErrAnalysis)
32+
}
33+
34+
func ErrResolveSchema(err error) error {
35+
return errors.Join(
36+
fmt.Errorf("could not resolve schema: %w", err),
37+
ErrAnalysis,
38+
)
39+
}
40+
41+
func ErrRewriteRef(key string, target any, err error) error {
42+
return errors.Join(
43+
fmt.Errorf("failed to rewrite ref for key %q at %v: %w", key, target, err),
44+
ErrAnalysis,
45+
)
46+
}
47+
48+
func ErrInlineDefinition(key string, err error) error {
49+
return errors.Join(
50+
fmt.Errorf("error while creating definition %q from inline schema: %w", key, err),
51+
ErrAnalysis,
52+
)
53+
}

flatten.go

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package analysis
1616

1717
import (
18-
"fmt"
1918
"log"
2019
"path"
2120
"sort"
@@ -251,7 +250,7 @@ func nameInlinedSchemas(opts *FlattenOpts) error {
251250

252251
asch, err := Schema(SchemaOpts{Schema: sch.Schema, Root: opts.Swagger(), BasePath: opts.BasePath})
253252
if err != nil {
254-
return fmt.Errorf("schema analysis [%s]: %w", key, err)
253+
return ErrAtKey(key, err)
255254
}
256255

257256
if asch.isAnalyzedAsComplex() { // move complex schemas to definitions
@@ -320,7 +319,7 @@ func importNewRef(entry sortref.RefRevIdx, refStr string, opts *FlattenOpts) err
320319

321320
sch, err := spec.ResolveRefWithBase(opts.Swagger(), &entry.Ref, opts.ExpandOpts(false))
322321
if err != nil {
323-
return fmt.Errorf("could not resolve schema: %w", err)
322+
return ErrResolveSchema(err)
324323
}
325324

326325
// at this stage only $ref analysis matters
@@ -335,7 +334,7 @@ func importNewRef(entry sortref.RefRevIdx, refStr string, opts *FlattenOpts) err
335334
// now rewrite those refs with rebase
336335
for key, ref := range partialAnalyzer.references.allRefs {
337336
if err := replace.UpdateRef(sch, key, spec.MustCreateRef(normalize.RebaseRef(entry.Ref.String(), ref.String()))); err != nil {
338-
return fmt.Errorf("failed to rewrite ref for key %q at %s: %w", key, entry.Ref.String(), err)
337+
return ErrRewriteRef(key, entry.Ref.String(), err)
339338
}
340339
}
341340

@@ -429,7 +428,7 @@ func importExternalReferences(opts *FlattenOpts) (bool, error) {
429428
ref := spec.MustCreateRef(r.path)
430429
sch, err := spec.ResolveRefWithBase(opts.Swagger(), &ref, opts.ExpandOpts(false))
431430
if err != nil {
432-
return false, fmt.Errorf("could not resolve schema: %w", err)
431+
return false, ErrResolveSchema(err)
433432
}
434433

435434
r.schema = sch
@@ -666,7 +665,7 @@ func namePointers(opts *FlattenOpts) error {
666665

667666
result, err := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), ref)
668667
if err != nil {
669-
return fmt.Errorf("at %s, %w", k, err)
668+
return ErrAtKey(k, err)
670669
}
671670

672671
replacingRef := result.Ref
@@ -697,7 +696,7 @@ func namePointers(opts *FlattenOpts) error {
697696
// update current replacement, which may have been updated by previous changes of deeper elements
698697
result, erd := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), v.Ref)
699698
if erd != nil {
700-
return fmt.Errorf("at %s, %w", key, erd)
699+
return ErrAtKey(key, erd)
701700
}
702701

703702
if opts.flattenContext != nil {
@@ -743,7 +742,7 @@ func flattenAnonPointer(key string, v SchemaRef, refsToReplace map[string]Schema
743742
// qualify the expanded schema
744743
asch, ers := Schema(SchemaOpts{Schema: v.Schema, Root: opts.Swagger(), BasePath: opts.BasePath})
745744
if ers != nil {
746-
return fmt.Errorf("schema analysis [%s]: %w", key, ers)
745+
return ErrAtKey(key, ers)
747746
}
748747
callers := make([]string, 0, allocMediumMap)
749748

@@ -753,7 +752,7 @@ func flattenAnonPointer(key string, v SchemaRef, refsToReplace map[string]Schema
753752
for k, w := range an.references.allRefs {
754753
r, err := replace.DeepestRef(opts.Swagger(), opts.ExpandOpts(false), w)
755754
if err != nil {
756-
return fmt.Errorf("at %s, %w", key, err)
755+
return ErrAtKey(key, err)
757756
}
758757

759758
if opts.flattenContext != nil {

flatten_name.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *Ana
4343
debugLog("rewriting schema to ref: key=%s with new name: %s", key, newName)
4444
if err := replace.RewriteSchemaToRef(isn.Spec, key,
4545
spec.MustCreateRef(path.Join(definitionsPath, newName))); err != nil {
46-
return fmt.Errorf("error while creating definition %q from inline schema: %w", newName, err)
46+
return ErrInlineDefinition(newName, err)
4747
}
4848

4949
// rewrite any dependent $ref pointing to this place,
@@ -54,7 +54,7 @@ func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *Ana
5454
for k, v := range an.references.allRefs {
5555
r, erd := replace.DeepestRef(isn.opts.Swagger(), isn.opts.ExpandOpts(false), v)
5656
if erd != nil {
57-
return fmt.Errorf("at %s, %w", k, erd)
57+
return ErrAtKey(k, erd)
5858
}
5959

6060
if isn.opts.flattenContext != nil {

internal/antest/helpers_test.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package antest
22

33
import (
44
"os"
5+
"runtime"
56
"testing"
67

78
"github.com/stretchr/testify/require"
@@ -54,7 +55,7 @@ func prepareBadDoc(t testing.TB, kind string, invalidFormat bool) (string, func(
5455

5556
switch kind {
5657
case "yaml", "yml":
57-
f, err := os.CreateTemp("", "*.yaml")
58+
f, err := os.CreateTemp(workaroundTempDir(t)(), "*.yaml")
5859
require.NoError(t, err)
5960
file = f.Name()
6061

@@ -72,7 +73,7 @@ info:
7273
}
7374

7475
case "json":
75-
f, err := os.CreateTemp("", "*.json")
76+
f, err := os.CreateTemp(workaroundTempDir(t)(), "*.json")
7677
require.NoError(t, err)
7778
file = f.Name()
7879

@@ -98,7 +99,18 @@ info:
9899
os.WriteFile(file, data, 0600),
99100
)
100101

101-
return file, func() {
102-
_ = os.RemoveAll(file)
102+
return file, func() {}
103+
}
104+
105+
func workaroundTempDir(t testing.TB) func() string {
106+
// Workaround for go testing bug on Windows: https://github.com/golang/go/issues/71544
107+
// On windows, t.TempDir() doesn't properly release file handles yet,
108+
// se we just leave it unchecked (no cleanup would take place).
109+
if runtime.GOOS == "windows" {
110+
return func() string {
111+
return ""
112+
}
103113
}
114+
115+
return t.TempDir
104116
}

internal/debug/debug_test.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,19 @@ package debug
1616

1717
import (
1818
"os"
19+
"runtime"
1920
"testing"
2021

2122
"github.com/stretchr/testify/assert"
2223
"github.com/stretchr/testify/require"
2324
)
2425

2526
func TestDebug(t *testing.T) {
26-
tmpFile, err := os.CreateTemp("", "debug-test")
27+
tmpFile, err := os.CreateTemp(workaroundTempDir(t)(), "debug-test")
2728
require.NoError(t, err)
2829

2930
output = tmpFile
30-
3131
tmpName := tmpFile.Name()
32-
defer func() {
33-
_ = os.Remove(tmpName)
34-
}()
35-
3632
testLogger := GetLogger("test", true)
3733

3834
testLogger("A debug: %s", "a string")
@@ -43,14 +39,11 @@ func TestDebug(t *testing.T) {
4339

4440
assert.Contains(t, string(flushed), "A debug: a string")
4541

46-
tmpEmptyFile, err := os.CreateTemp("", "debug-test")
42+
tmpEmptyFile, err := os.CreateTemp(workaroundTempDir(t)(), "debug-test")
4743
require.NoError(t, err)
4844
tmpEmpty := tmpEmptyFile.Name()
49-
defer func() {
50-
_ = os.Remove(tmpEmpty)
51-
}()
52-
5345
testLogger = GetLogger("test", false)
46+
5447
testLogger("A debug: %s", "a string")
5548
tmpFile.Close()
5649

@@ -59,3 +52,16 @@ func TestDebug(t *testing.T) {
5952

6053
assert.Empty(t, flushed)
6154
}
55+
56+
func workaroundTempDir(t testing.TB) func() string {
57+
// Workaround for go testing bug on Windows: https://github.com/golang/go/issues/71544
58+
// On windows, t.TempDir() doesn't properly release file handles yet,
59+
// se we just leave it unchecked (no cleanup would take place).
60+
if runtime.GOOS == "windows" {
61+
return func() string {
62+
return ""
63+
}
64+
}
65+
66+
return t.TempDir
67+
}

internal/flatten/replace/errors.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package replace
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
)
7+
8+
type replaceError string
9+
10+
const (
11+
ErrReplace replaceError = "flatten replace error"
12+
ErrUnexpectedType replaceError = "unexpected type used in getPointerFromKey"
13+
)
14+
15+
func (e replaceError) Error() string {
16+
return string(e)
17+
}
18+
19+
func ErrNoSchemaWithRef(key string, value any) error {
20+
return fmt.Errorf("no schema with ref found at %s for %T: %w", key, value, ErrReplace)
21+
}
22+
23+
func ErrNoSchema(key string) error {
24+
return fmt.Errorf("no schema found at %s: %w", key, ErrReplace)
25+
}
26+
27+
func ErrNotANumber(key string, err error) error {
28+
return errors.Join(
29+
ErrReplace,
30+
fmt.Errorf("%s not a number: %w", key, err),
31+
)
32+
}
33+
34+
func ErrUnhandledParentRewrite(key string, value any) error {
35+
return fmt.Errorf("unhandled parent schema rewrite %s: %T: %w", key, value, ErrReplace)
36+
}
37+
38+
func ErrUnhandledParentType(key string, value any) error {
39+
return fmt.Errorf("unhandled type for parent of %s: %T: %w", key, value, ErrReplace)
40+
}
41+
42+
func ErrNoParent(key string, err error) error {
43+
return errors.Join(
44+
fmt.Errorf("can't get parent for %s: %w", key, err),
45+
ErrReplace,
46+
)
47+
}
48+
49+
func ErrUnhandledContainerType(key string, value any) error {
50+
return fmt.Errorf("unhandled container type at %s: %T: %w", key, value, ErrReplace)
51+
}
52+
53+
func ErrCyclicChain(key string) error {
54+
return fmt.Errorf("cannot resolve cyclic chain of pointers under %s: %w", key, ErrReplace)
55+
}
56+
57+
func ErrInvalidPointerType(key string, value any, err error) error {
58+
return fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%v): %w",
59+
key, value, err, ErrReplace,
60+
)
61+
}

0 commit comments

Comments
 (0)