mirror of
https://github.com/mikefarah/yq.git
synced 2026-07-07 22:35:37 +00:00
Updating golanglint
This commit is contained in:
parent
89518a09b8
commit
20b5129120
38
.golangci.bck.yml
Normal file
38
.golangci.bck.yml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
run:
|
||||||
|
timeout: 5m
|
||||||
|
linters:
|
||||||
|
enable:
|
||||||
|
- asciicheck
|
||||||
|
- depguard
|
||||||
|
- errorlint
|
||||||
|
- gci
|
||||||
|
- gochecknoinits
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
- gosec
|
||||||
|
- gosimple
|
||||||
|
- staticcheck
|
||||||
|
- unused
|
||||||
|
- misspell
|
||||||
|
- nakedret
|
||||||
|
- nolintlint
|
||||||
|
- predeclared
|
||||||
|
- revive
|
||||||
|
- unconvert
|
||||||
|
- unparam
|
||||||
|
linters-settings:
|
||||||
|
depguard:
|
||||||
|
rules:
|
||||||
|
prevent_unmaintained_packages:
|
||||||
|
list-mode: lax
|
||||||
|
files:
|
||||||
|
- $all
|
||||||
|
- "!$test"
|
||||||
|
deny:
|
||||||
|
- pkg: io/ioutil
|
||||||
|
desc: "replaced by io and os packages since Go 1.16: https://tip.golang.org/doc/go1.16#ioutil"
|
||||||
|
issues:
|
||||||
|
exclude-rules:
|
||||||
|
- linters:
|
||||||
|
- revive
|
||||||
|
text: "var-naming"
|
||||||
@ -1,18 +1,11 @@
|
|||||||
run:
|
version: "2"
|
||||||
timeout: 5m
|
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
- asciicheck
|
- asciicheck
|
||||||
- depguard
|
- depguard
|
||||||
- errorlint
|
- errorlint
|
||||||
- gci
|
|
||||||
- gochecknoinits
|
- gochecknoinits
|
||||||
- gofmt
|
|
||||||
- goimports
|
|
||||||
- gosec
|
- gosec
|
||||||
- gosimple
|
|
||||||
- staticcheck
|
|
||||||
- unused
|
|
||||||
- misspell
|
- misspell
|
||||||
- nakedret
|
- nakedret
|
||||||
- nolintlint
|
- nolintlint
|
||||||
@ -20,19 +13,40 @@ linters:
|
|||||||
- revive
|
- revive
|
||||||
- unconvert
|
- unconvert
|
||||||
- unparam
|
- unparam
|
||||||
linters-settings:
|
settings:
|
||||||
depguard:
|
depguard:
|
||||||
rules:
|
rules:
|
||||||
prevent_unmaintained_packages:
|
prevent_unmaintained_packages:
|
||||||
list-mode: lax
|
list-mode: lax
|
||||||
files:
|
files:
|
||||||
- $all
|
- $all
|
||||||
- "!$test"
|
- '!$test'
|
||||||
deny:
|
deny:
|
||||||
- pkg: io/ioutil
|
- pkg: io/ioutil
|
||||||
desc: "replaced by io and os packages since Go 1.16: https://tip.golang.org/doc/go1.16#ioutil"
|
desc: 'replaced by io and os packages since Go 1.16: https://tip.golang.org/doc/go1.16#ioutil'
|
||||||
issues:
|
exclusions:
|
||||||
exclude-rules:
|
generated: lax
|
||||||
|
presets:
|
||||||
|
- comments
|
||||||
|
- common-false-positives
|
||||||
|
- legacy
|
||||||
|
- std-error-handling
|
||||||
|
rules:
|
||||||
- linters:
|
- linters:
|
||||||
- revive
|
- revive
|
||||||
text: "var-naming"
|
text: var-naming
|
||||||
|
paths:
|
||||||
|
- third_party$
|
||||||
|
- builtin$
|
||||||
|
- examples$
|
||||||
|
formatters:
|
||||||
|
enable:
|
||||||
|
- gci
|
||||||
|
- gofmt
|
||||||
|
- goimports
|
||||||
|
exclusions:
|
||||||
|
generated: lax
|
||||||
|
paths:
|
||||||
|
- third_party$
|
||||||
|
- builtin$
|
||||||
|
- examples$
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
testLoadFileNotExist() {
|
testLoadFileNotExist() {
|
||||||
result=$(./yq e -n 'load("cat.yml")' 2>&1)
|
result=$(./yq e -n 'load("cat.yml")' 2>&1)
|
||||||
assertEquals 1 $?
|
assertEquals 1 $?
|
||||||
assertEquals "Error: Failed to load cat.yml: open cat.yml: no such file or directory" "$result"
|
assertEquals "Error: failed to load cat.yml: open cat.yml: no such file or directory" "$result"
|
||||||
}
|
}
|
||||||
|
|
||||||
testLoadFileExpNotExist() {
|
testLoadFileExpNotExist() {
|
||||||
@ -15,7 +15,7 @@ testLoadFileExpNotExist() {
|
|||||||
testStrLoadFileNotExist() {
|
testStrLoadFileNotExist() {
|
||||||
result=$(./yq e -n 'strload("cat.yml")' 2>&1)
|
result=$(./yq e -n 'strload("cat.yml")' 2>&1)
|
||||||
assertEquals 1 $?
|
assertEquals 1 $?
|
||||||
assertEquals "Error: Failed to load cat.yml: open cat.yml: no such file or directory" "$result"
|
assertEquals "Error: failed to load cat.yml: open cat.yml: no such file or directory" "$result"
|
||||||
}
|
}
|
||||||
|
|
||||||
testStrLoadFileExpNotExist() {
|
testStrLoadFileExpNotExist() {
|
||||||
|
|||||||
@ -45,5 +45,5 @@ func getHumanVersion() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Strip off any single quotes added by the git information.
|
// Strip off any single quotes added by the git information.
|
||||||
return strings.Replace(version, "'", "", -1)
|
return strings.ReplaceAll(version, "'", "")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -201,13 +201,14 @@ func (n *CandidateNode) SetParent(parent *CandidateNode) {
|
|||||||
type ValueVisitor func(*CandidateNode) error
|
type ValueVisitor func(*CandidateNode) error
|
||||||
|
|
||||||
func (n *CandidateNode) VisitValues(visitor ValueVisitor) error {
|
func (n *CandidateNode) VisitValues(visitor ValueVisitor) error {
|
||||||
if n.Kind == MappingNode {
|
switch n.Kind {
|
||||||
|
case MappingNode:
|
||||||
for i := 1; i < len(n.Content); i = i + 2 {
|
for i := 1; i < len(n.Content); i = i + 2 {
|
||||||
if err := visitor(n.Content[i]); err != nil {
|
if err := visitor(n.Content[i]); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if n.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
for i := 0; i < len(n.Content); i = i + 1 {
|
for i := 0; i < len(n.Content); i = i + 1 {
|
||||||
if err := visitor(n.Content[i]); err != nil {
|
if err := visitor(n.Content[i]); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@ -64,6 +64,6 @@ func (d *dataTreeNavigator) GetMatchingNodes(context Context, expressionNode *Ex
|
|||||||
if handler != nil {
|
if handler != nil {
|
||||||
return handler(d, context, expressionNode)
|
return handler(d, context, expressionNode)
|
||||||
}
|
}
|
||||||
return Context{}, fmt.Errorf("Unknown operator %v", expressionNode.Operation.OperationType)
|
return Context{}, fmt.Errorf("unknown operator %v", expressionNode.Operation.OperationType)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -249,11 +249,12 @@ func (dec *tomlDecoder) processTopLevelNode(currentNode *toml.Node) (bool, error
|
|||||||
var runAgainstCurrentExp bool
|
var runAgainstCurrentExp bool
|
||||||
var err error
|
var err error
|
||||||
log.Debug("processTopLevelNode: Going to process %v state is current %v", currentNode.Kind, NodeToString(dec.rootMap))
|
log.Debug("processTopLevelNode: Going to process %v state is current %v", currentNode.Kind, NodeToString(dec.rootMap))
|
||||||
if currentNode.Kind == toml.Table {
|
switch currentNode.Kind {
|
||||||
|
case toml.Table:
|
||||||
runAgainstCurrentExp, err = dec.processTable(currentNode)
|
runAgainstCurrentExp, err = dec.processTable(currentNode)
|
||||||
} else if currentNode.Kind == toml.ArrayTable {
|
case toml.ArrayTable:
|
||||||
runAgainstCurrentExp, err = dec.processArrayTable(currentNode)
|
runAgainstCurrentExp, err = dec.processArrayTable(currentNode)
|
||||||
} else {
|
default:
|
||||||
runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(dec.rootMap, currentNode)
|
runAgainstCurrentExp, err = dec.decodeKeyValuesIntoMap(dec.rootMap, currentNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -315,13 +315,14 @@ func (dec *xmlDecoder) decodeXML(root *xmlNode) error {
|
|||||||
case xml.Comment:
|
case xml.Comment:
|
||||||
|
|
||||||
commentStr := string(xml.CharData(se))
|
commentStr := string(xml.CharData(se))
|
||||||
if elem.state == "started" {
|
switch elem.state {
|
||||||
|
case "started":
|
||||||
applyFootComment(elem, commentStr)
|
applyFootComment(elem, commentStr)
|
||||||
|
|
||||||
} else if elem.state == "chardata" {
|
case "chardata":
|
||||||
log.Debug("got a line comment for (%v) %v: [%v]", elem.state, elem.label, commentStr)
|
log.Debug("got a line comment for (%v) %v: [%v]", elem.state, elem.label, commentStr)
|
||||||
elem.n.LineComment = joinComments([]string{elem.n.LineComment, commentStr}, " ")
|
elem.n.LineComment = joinComments([]string{elem.n.LineComment, commentStr}, " ")
|
||||||
} else {
|
default:
|
||||||
log.Debug("got a head comment for (%v) %v: [%v]", elem.state, elem.label, commentStr)
|
log.Debug("got a head comment for (%v) %v: [%v]", elem.state, elem.label, commentStr)
|
||||||
elem.n.HeadComment = joinComments([]string{elem.n.HeadComment, commentStr}, " ")
|
elem.n.HeadComment = joinComments([]string{elem.n.HeadComment, commentStr}, " ")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -167,10 +167,14 @@ func needsQuoting(s string) bool {
|
|||||||
// [%a_][%w_]*
|
// [%a_][%w_]*
|
||||||
for i, c := range s {
|
for i, c := range s {
|
||||||
if i == 0 {
|
if i == 0 {
|
||||||
|
// keeping for legacy reasons, upgraded linter
|
||||||
|
//nolint:staticcheck
|
||||||
if !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_') {
|
if !((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_') {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// keeping for legacy reasons, upgraded linter
|
||||||
|
//nolint:staticcheck
|
||||||
if !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_') {
|
if !((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || c == '_') {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -299,10 +303,10 @@ func (le *luaEncoder) encodeAny(writer io.Writer, node *CandidateNode) error {
|
|||||||
return writeString(writer, node.Value)
|
return writeString(writer, node.Value)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Lua encoder NYI -- %s", node.Tag)
|
return fmt.Errorf("lua encoder NYI -- %s", node.Tag)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Lua encoder NYI -- %s", node.Tag)
|
return fmt.Errorf("lua encoder NYI -- %s", node.Tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -107,7 +107,7 @@ func (pe *propertiesEncoder) doEncode(p *properties.Properties, node *CandidateN
|
|||||||
case AliasNode:
|
case AliasNode:
|
||||||
return pe.doEncode(p, node.Alias, path, nil)
|
return pe.doEncode(p, node.Alias, path, nil)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Unsupported node %v", node.Tag)
|
return fmt.Errorf("unsupported node %v", node.Tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -75,7 +75,7 @@ func (pe *shellVariablesEncoder) doEncode(w *io.Writer, node *CandidateNode, pat
|
|||||||
case AliasNode:
|
case AliasNode:
|
||||||
return pe.doEncode(w, node.Alias, path)
|
return pe.doEncode(w, node.Alias, path)
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Unsupported node %v", node.Tag)
|
return fmt.Errorf("unsupported node %v", node.Tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,14 +50,15 @@ func (p *expressionParserImpl) createExpressionTree(postFixPath []*Operation) (*
|
|||||||
log.Debugf("pathTree %v ", Operation.toString())
|
log.Debugf("pathTree %v ", Operation.toString())
|
||||||
if Operation.OperationType.NumArgs > 0 {
|
if Operation.OperationType.NumArgs > 0 {
|
||||||
numArgs := Operation.OperationType.NumArgs
|
numArgs := Operation.OperationType.NumArgs
|
||||||
if numArgs == 1 {
|
switch numArgs {
|
||||||
|
case 1:
|
||||||
if len(stack) < 1 {
|
if len(stack) < 1 {
|
||||||
return nil, fmt.Errorf("'%v' expects 1 arg but received none", strings.TrimSpace(Operation.StringValue))
|
return nil, fmt.Errorf("'%v' expects 1 arg but received none", strings.TrimSpace(Operation.StringValue))
|
||||||
}
|
}
|
||||||
remaining, rhs := stack[:len(stack)-1], stack[len(stack)-1]
|
remaining, rhs := stack[:len(stack)-1], stack[len(stack)-1]
|
||||||
newNode.RHS = rhs
|
newNode.RHS = rhs
|
||||||
stack = remaining
|
stack = remaining
|
||||||
} else if numArgs == 2 {
|
case 2:
|
||||||
if len(stack) < 2 {
|
if len(stack) < 2 {
|
||||||
return nil, fmt.Errorf("'%v' expects 2 args but there is %v", strings.TrimSpace(Operation.StringValue), len(stack))
|
return nil, fmt.Errorf("'%v' expects 2 args but there is %v", strings.TrimSpace(Operation.StringValue), len(stack))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,11 +26,12 @@ func popOpToResult(opStack []*token, result []*Operation) ([]*token, []*Operatio
|
|||||||
}
|
}
|
||||||
|
|
||||||
func validateNoOpenTokens(token *token) error {
|
func validateNoOpenTokens(token *token) error {
|
||||||
if token.TokenType == openCollect {
|
switch token.TokenType {
|
||||||
|
case openCollect:
|
||||||
return fmt.Errorf(("bad expression, could not find matching `]`"))
|
return fmt.Errorf(("bad expression, could not find matching `]`"))
|
||||||
} else if token.TokenType == openCollectObject {
|
case openCollectObject:
|
||||||
return fmt.Errorf(("bad expression, could not find matching `}`"))
|
return fmt.Errorf(("bad expression, could not find matching `}`"))
|
||||||
} else if token.TokenType == openBracket {
|
case openBracket:
|
||||||
return fmt.Errorf(("bad expression, could not find matching `)`"))
|
return fmt.Errorf(("bad expression, could not find matching `)`"))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -64,7 +65,7 @@ func (p *expressionPostFixerImpl) ConvertToPostfix(infixTokens []*token) ([]*Ope
|
|||||||
opStack, result = popOpToResult(opStack, result)
|
opStack, result = popOpToResult(opStack, result)
|
||||||
}
|
}
|
||||||
if len(opStack) == 0 {
|
if len(opStack) == 0 {
|
||||||
return nil, errors.New("Bad path expression, got close collect brackets without matching opening bracket")
|
return nil, errors.New("bad path expression, got close collect brackets without matching opening bracket")
|
||||||
}
|
}
|
||||||
// now we should have [ as the last element on the opStack, get rid of it
|
// now we should have [ as the last element on the opStack, get rid of it
|
||||||
opStack = opStack[0 : len(opStack)-1]
|
opStack = opStack[0 : len(opStack)-1]
|
||||||
|
|||||||
@ -31,24 +31,25 @@ type token struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t *token) toString(detail bool) string {
|
func (t *token) toString(detail bool) string {
|
||||||
if t.TokenType == operationToken {
|
switch t.TokenType {
|
||||||
|
case operationToken:
|
||||||
if detail {
|
if detail {
|
||||||
return fmt.Sprintf("%v (%v)", t.Operation.toString(), t.Operation.OperationType.Precedence)
|
return fmt.Sprintf("%v (%v)", t.Operation.toString(), t.Operation.OperationType.Precedence)
|
||||||
}
|
}
|
||||||
return t.Operation.toString()
|
return t.Operation.toString()
|
||||||
} else if t.TokenType == openBracket {
|
case openBracket:
|
||||||
return "("
|
return "("
|
||||||
} else if t.TokenType == closeBracket {
|
case closeBracket:
|
||||||
return ")"
|
return ")"
|
||||||
} else if t.TokenType == openCollect {
|
case openCollect:
|
||||||
return "["
|
return "["
|
||||||
} else if t.TokenType == closeCollect {
|
case closeCollect:
|
||||||
return "]"
|
return "]"
|
||||||
} else if t.TokenType == openCollectObject {
|
case openCollectObject:
|
||||||
return "{"
|
return "{"
|
||||||
} else if t.TokenType == closeCollectObject {
|
case closeCollectObject:
|
||||||
return "}"
|
return "}"
|
||||||
} else if t.TokenType == traverseArrayCollect {
|
case traverseArrayCollect:
|
||||||
return ".["
|
return ".["
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,11 +26,12 @@ func deleteChildOperator(d *dataTreeNavigator, context Context, expressionNode *
|
|||||||
candidatePath := candidate.GetPath()
|
candidatePath := candidate.GetPath()
|
||||||
childPath := candidatePath[len(candidatePath)-1]
|
childPath := candidatePath[len(candidatePath)-1]
|
||||||
|
|
||||||
if parentNode.Kind == MappingNode {
|
switch parentNode.Kind {
|
||||||
|
case MappingNode:
|
||||||
deleteFromMap(candidate.Parent, childPath)
|
deleteFromMap(candidate.Parent, childPath)
|
||||||
} else if parentNode.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
deleteFromArray(candidate.Parent, childPath)
|
deleteFromArray(candidate.Parent, childPath)
|
||||||
} else {
|
default:
|
||||||
return Context{}, fmt.Errorf("cannot delete nodes from parent of tag %v", parentNode.Tag)
|
return Context{}, fmt.Errorf("cannot delete nodes from parent of tag %v", parentNode.Tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -45,12 +45,13 @@ func keysOperator(_ *dataTreeNavigator, context Context, _ *ExpressionNode) (Con
|
|||||||
candidate := el.Value.(*CandidateNode)
|
candidate := el.Value.(*CandidateNode)
|
||||||
|
|
||||||
var targetNode *CandidateNode
|
var targetNode *CandidateNode
|
||||||
if candidate.Kind == MappingNode {
|
switch candidate.Kind {
|
||||||
|
case MappingNode:
|
||||||
targetNode = getMapKeys(candidate)
|
targetNode = getMapKeys(candidate)
|
||||||
} else if candidate.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
targetNode = getIndices(candidate)
|
targetNode = getIndices(candidate)
|
||||||
} else {
|
default:
|
||||||
return Context{}, fmt.Errorf("Cannot get keys of %v, keys only works for maps and arrays", candidate.Tag)
|
return Context{}, fmt.Errorf("cannot get keys of %v, keys only works for maps and arrays", candidate.Tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
results.PushBack(targetNode)
|
results.PushBack(targetNode)
|
||||||
|
|||||||
@ -82,7 +82,7 @@ func loadStringOperator(d *dataTreeNavigator, context Context, expressionNode *E
|
|||||||
|
|
||||||
contentsCandidate, err := loadString(filename)
|
contentsCandidate, err := loadString(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Context{}, fmt.Errorf("Failed to load %v: %w", filename, err)
|
return Context{}, fmt.Errorf("failed to load %v: %w", filename, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
results.PushBack(contentsCandidate)
|
results.PushBack(contentsCandidate)
|
||||||
@ -118,7 +118,7 @@ func loadOperator(d *dataTreeNavigator, context Context, expressionNode *Express
|
|||||||
|
|
||||||
contentsCandidate, err := loadWithDecoder(filename, loadPrefs.decoder)
|
contentsCandidate, err := loadWithDecoder(filename, loadPrefs.decoder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Context{}, fmt.Errorf("Failed to load %v: %w", filename, err)
|
return Context{}, fmt.Errorf("failed to load %v: %w", filename, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
results.PushBack(contentsCandidate)
|
results.PushBack(contentsCandidate)
|
||||||
|
|||||||
@ -154,9 +154,9 @@ func repeatString(lhs *CandidateNode, rhs *CandidateNode) (*CandidateNode, error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if count < 0 {
|
} else if count < 0 {
|
||||||
return nil, fmt.Errorf("Cannot repeat string by a negative number (%v)", count)
|
return nil, fmt.Errorf("cannot repeat string by a negative number (%v)", count)
|
||||||
} else if count > 10000000 {
|
} else if count > 10000000 {
|
||||||
return nil, fmt.Errorf("Cannot repeat string by more than 100 million (%v)", count)
|
return nil, fmt.Errorf("cannot repeat string by more than 100 million (%v)", count)
|
||||||
}
|
}
|
||||||
target.Value = strings.Repeat(stringNode.Value, count)
|
target.Value = strings.Repeat(stringNode.Value, count)
|
||||||
|
|
||||||
|
|||||||
@ -206,7 +206,7 @@ var multiplyOperatorScenarios = []expressionScenario{
|
|||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
document: `n: -4`,
|
document: `n: -4`,
|
||||||
expression: `"banana" * .n`,
|
expression: `"banana" * .n`,
|
||||||
expectedError: "Cannot repeat string by a negative number (-4)",
|
expectedError: "cannot repeat string by a negative number (-4)",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Multiply string X by more than 100 million",
|
description: "Multiply string X by more than 100 million",
|
||||||
@ -214,7 +214,7 @@ var multiplyOperatorScenarios = []expressionScenario{
|
|||||||
skipDoc: true,
|
skipDoc: true,
|
||||||
document: `n: 100000001`,
|
document: `n: 100000001`,
|
||||||
expression: `"banana" * .n`,
|
expression: `"banana" * .n`,
|
||||||
expectedError: "Cannot repeat string by more than 100 million (100000001)",
|
expectedError: "cannot repeat string by more than 100 million (100000001)",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "Multiply int node X string",
|
description: "Multiply int node X string",
|
||||||
|
|||||||
@ -58,11 +58,12 @@ func omitOperator(d *dataTreeNavigator, context Context, expressionNode *Express
|
|||||||
|
|
||||||
var replacement *CandidateNode
|
var replacement *CandidateNode
|
||||||
|
|
||||||
if node.Kind == MappingNode {
|
switch node.Kind {
|
||||||
|
case MappingNode:
|
||||||
replacement = omitMap(node, indicesToOmit)
|
replacement = omitMap(node, indicesToOmit)
|
||||||
} else if node.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
replacement = omitSequence(node, indicesToOmit)
|
replacement = omitSequence(node, indicesToOmit)
|
||||||
} else {
|
default:
|
||||||
log.Debugf("Omit from type %v (%v) is noop", node.Tag, node.GetNicePath())
|
log.Debugf("Omit from type %v (%v) is noop", node.Tag, node.GetNicePath())
|
||||||
return context, nil
|
return context, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,15 +22,16 @@ func getPathArrayFromNode(funcName string, node *CandidateNode) ([]interface{},
|
|||||||
path := make([]interface{}, len(node.Content))
|
path := make([]interface{}, len(node.Content))
|
||||||
|
|
||||||
for i, childNode := range node.Content {
|
for i, childNode := range node.Content {
|
||||||
if childNode.Tag == "!!str" {
|
switch childNode.Tag {
|
||||||
|
case "!!str":
|
||||||
path[i] = childNode.Value
|
path[i] = childNode.Value
|
||||||
} else if childNode.Tag == "!!int" {
|
case "!!int":
|
||||||
number, err := parseInt(childNode.Value)
|
number, err := parseInt(childNode.Value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("%v: could not parse %v as an int: %w", funcName, childNode.Value, err)
|
return nil, fmt.Errorf("%v: could not parse %v as an int: %w", funcName, childNode.Value, err)
|
||||||
}
|
}
|
||||||
path[i] = number
|
path[i] = number
|
||||||
} else {
|
default:
|
||||||
return nil, fmt.Errorf("%v: expected either a !!str or !!int in the path, found %v instead", funcName, childNode.Tag)
|
return nil, fmt.Errorf("%v: expected either a !!str or !!int in the path, found %v instead", funcName, childNode.Tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -64,15 +64,16 @@ func pickOperator(d *dataTreeNavigator, context Context, expressionNode *Express
|
|||||||
node := el.Value.(*CandidateNode)
|
node := el.Value.(*CandidateNode)
|
||||||
|
|
||||||
var replacement *CandidateNode
|
var replacement *CandidateNode
|
||||||
if node.Kind == MappingNode {
|
switch node.Kind {
|
||||||
|
case MappingNode:
|
||||||
replacement = pickMap(node, indicesToPick)
|
replacement = pickMap(node, indicesToPick)
|
||||||
} else if node.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
replacement, err = pickSequence(node, indicesToPick)
|
replacement, err = pickSequence(node, indicesToPick)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Context{}, err
|
return Context{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
default:
|
||||||
return Context{}, fmt.Errorf("cannot pick indices from type %v (%v)", node.Tag, node.GetNicePath())
|
return Context{}, fmt.Errorf("cannot pick indices from type %v (%v)", node.Tag, node.GetNicePath())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -47,11 +47,12 @@ func sortByOperator(d *dataTreeNavigator, context Context, expressionNode *Expre
|
|||||||
sort.Stable(sortableArray)
|
sort.Stable(sortableArray)
|
||||||
|
|
||||||
sortedList := candidate.CopyWithoutContent()
|
sortedList := candidate.CopyWithoutContent()
|
||||||
if candidate.Kind == MappingNode {
|
switch candidate.Kind {
|
||||||
|
case MappingNode:
|
||||||
for _, sortedNode := range sortableArray {
|
for _, sortedNode := range sortableArray {
|
||||||
sortedList.AddKeyValueChild(sortedNode.Node.Key, sortedNode.Node)
|
sortedList.AddKeyValueChild(sortedNode.Node.Key, sortedNode.Node)
|
||||||
}
|
}
|
||||||
} else if candidate.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
for _, sortedNode := range sortableArray {
|
for _, sortedNode := range sortableArray {
|
||||||
sortedList.AddChild(sortedNode.Node)
|
sortedList.AddChild(sortedNode.Node)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -410,7 +410,7 @@ func extractMatchArguments(d *dataTreeNavigator, context Context, expressionNode
|
|||||||
return nil, matchPrefs, fmt.Errorf(`'i' is not a valid option for match. To ignore case, use an expression like match("(?i)cat")`)
|
return nil, matchPrefs, fmt.Errorf(`'i' is not a valid option for match. To ignore case, use an expression like match("(?i)cat")`)
|
||||||
}
|
}
|
||||||
if len(paramText) > 0 {
|
if len(paramText) > 0 {
|
||||||
return nil, matchPrefs, fmt.Errorf(`Unrecognised match params '%v', please see docs at https://mikefarah.gitbook.io/yq/operators/string-operators`, paramText)
|
return nil, matchPrefs, fmt.Errorf(`unrecognised match params '%v', please see docs at https://mikefarah.gitbook.io/yq/operators/string-operators`, paramText)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,7 +19,7 @@ func parseStyle(customStyle string) (Style, error) {
|
|||||||
} else if customStyle == "flow" {
|
} else if customStyle == "flow" {
|
||||||
return FlowStyle, nil
|
return FlowStyle, nil
|
||||||
} else if customStyle != "" {
|
} else if customStyle != "" {
|
||||||
return 0, fmt.Errorf("Unknown style %v", customStyle)
|
return 0, fmt.Errorf("unknown style %v", customStyle)
|
||||||
}
|
}
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -135,12 +135,13 @@ func traverseArrayIndices(context Context, matchingNode *CandidateNode, indicesT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if matchingNode.Kind == AliasNode {
|
switch matchingNode.Kind {
|
||||||
|
case AliasNode:
|
||||||
matchingNode = matchingNode.Alias
|
matchingNode = matchingNode.Alias
|
||||||
return traverseArrayIndices(context, matchingNode, indicesToTraverse, prefs)
|
return traverseArrayIndices(context, matchingNode, indicesToTraverse, prefs)
|
||||||
} else if matchingNode.Kind == SequenceNode {
|
case SequenceNode:
|
||||||
return traverseArrayWithIndices(matchingNode, indicesToTraverse, prefs)
|
return traverseArrayWithIndices(matchingNode, indicesToTraverse, prefs)
|
||||||
} else if matchingNode.Kind == MappingNode {
|
case MappingNode:
|
||||||
return traverseMapWithIndices(context, matchingNode, indicesToTraverse, prefs)
|
return traverseMapWithIndices(context, matchingNode, indicesToTraverse, prefs)
|
||||||
}
|
}
|
||||||
log.Debugf("OperatorArrayTraverse skipping %v as its a %v", matchingNode, matchingNode.Tag)
|
log.Debugf("OperatorArrayTraverse skipping %v as its a %v", matchingNode, matchingNode.Tag)
|
||||||
|
|||||||
@ -132,7 +132,7 @@ func (p *resultsPrinter) PrintResults(matchingNodes *list.List) error {
|
|||||||
tempBufferBytes := tempBuffer.Bytes()
|
tempBufferBytes := tempBuffer.Bytes()
|
||||||
if bytes.IndexByte(tempBufferBytes, 0) != -1 {
|
if bytes.IndexByte(tempBufferBytes, 0) != -1 {
|
||||||
return fmt.Errorf(
|
return fmt.Errorf(
|
||||||
"Can't serialize value because it contains NUL char and you are using NUL separated output",
|
"can't serialize value because it contains NUL char and you are using NUL separated output",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if _, err := writer.Write(tempBufferBytes); err != nil {
|
if _, err := writer.Write(tempBufferBytes); err != nil {
|
||||||
|
|||||||
@ -319,10 +319,11 @@ func documentUnwrappedEncodePropertyScenario(w *bufio.Writer, s formatScenario)
|
|||||||
prefs := NewDefaultPropertiesPreferences()
|
prefs := NewDefaultPropertiesPreferences()
|
||||||
useArrayBracketsFlag := ""
|
useArrayBracketsFlag := ""
|
||||||
useCustomSeparatorFlag := ""
|
useCustomSeparatorFlag := ""
|
||||||
if s.scenarioType == "encode-array-brackets" {
|
switch s.scenarioType {
|
||||||
|
case "encode-array-brackets":
|
||||||
useArrayBracketsFlag = " --properties-array-brackets"
|
useArrayBracketsFlag = " --properties-array-brackets"
|
||||||
prefs.UseArrayBrackets = true
|
prefs.UseArrayBrackets = true
|
||||||
} else if s.scenarioType == "encode-custom-separator" {
|
case "encode-custom-separator":
|
||||||
prefs.KeyValueSeparator = " :@ "
|
prefs.KeyValueSeparator = " :@ "
|
||||||
useCustomSeparatorFlag = ` --properties-separator=" :@ "`
|
useCustomSeparatorFlag = ` --properties-separator=" :@ "`
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -ex
|
set -ex
|
||||||
go mod download golang.org/x/tools@latest
|
go mod download golang.org/x/tools@latest
|
||||||
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.64.8
|
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.1.5
|
||||||
curl -sSfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s
|
curl -sSfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user