Skip to content

Commit ec4f1cc

Browse files
committed
Address issue #611
http URLs can now be used as a ruleset location and it will be fetched automatically.
1 parent 3d73e7d commit ec4f1cc

File tree

6 files changed

+61
-33
lines changed

6 files changed

+61
-33
lines changed

cmd/build_results.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package cmd
22

33
import (
4+
"context"
5+
"fmt"
46
"github.com/daveshanley/vacuum/model"
57
"github.com/daveshanley/vacuum/motor"
68
"github.com/daveshanley/vacuum/rulesets"
79
"github.com/pterm/pterm"
810
"os"
11+
"strings"
912
"time"
1013
)
1114

@@ -60,13 +63,26 @@ func BuildResultsWithDocCheckSkip(
6063
// and see if it's valid. If so - let's go!
6164
if rulesetFlag != "" {
6265

63-
rsBytes, rsErr := os.ReadFile(rulesetFlag)
64-
if rsErr != nil {
65-
return nil, nil, rsErr
66-
}
67-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
68-
if rsErr != nil {
69-
return nil, nil, rsErr
66+
if strings.HasPrefix(rulesetFlag, "http") {
67+
// Handle remote ruleset URL
68+
if !remote {
69+
return nil, nil, fmt.Errorf("remote ruleset specified but remote flag is disabled (use --remote=true or -u=true)")
70+
}
71+
downloadedRS, rsErr := rulesets.DownloadRemoteRuleSet(context.Background(), rulesetFlag)
72+
if rsErr != nil {
73+
return nil, nil, rsErr
74+
}
75+
selectedRS = defaultRuleSets.GenerateRuleSetFromSuppliedRuleSet(downloadedRS)
76+
} else {
77+
// Handle local ruleset file
78+
rsBytes, rsErr := os.ReadFile(rulesetFlag)
79+
if rsErr != nil {
80+
return nil, nil, rsErr
81+
}
82+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
83+
if rsErr != nil {
84+
return nil, nil, rsErr
85+
}
7086
}
7187
}
7288

cmd/language_server.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"github.com/spf13/cobra"
1313
"io"
1414
"log/slog"
15-
"os"
1615
)
1716

1817
func GetLanguageServerCommand() *cobra.Command {
@@ -60,12 +59,9 @@ IDE and start linting your OpenAPI documents in real-time.`,
6059
}
6160

6261
if rulesetFlag != "" {
63-
rsBytes, rsErr := os.ReadFile(rulesetFlag)
64-
if rsErr != nil {
65-
return rsErr
66-
}
67-
68-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
62+
remoteFlag, _ := cmd.Flags().GetBool("remote")
63+
var rsErr error
64+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag)
6965
if rsErr != nil {
7066
return rsErr
7167
}

cmd/lint.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -180,17 +180,13 @@ func GetLintCommand() *cobra.Command {
180180
// and see if it's valid. If so - let's go!
181181
if rulesetFlag != "" {
182182

183-
rsBytes, rsErr := os.ReadFile(rulesetFlag)
183+
var rsErr error
184+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag)
184185
if rsErr != nil {
185-
pterm.Error.Printf("Unable to read ruleset file '%s': %s\n", rulesetFlag, rsErr.Error())
186+
pterm.Error.Printf("Unable to load ruleset '%s': %s\n", rulesetFlag, rsErr.Error())
186187
pterm.Println()
187188
return rsErr
188189
}
189-
190-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
191-
if rsErr != nil {
192-
return rsErr
193-
}
194190
}
195191

196192
var printLock sync.Mutex

cmd/shared_functions.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@
44
package cmd
55

66
import (
7+
"context"
78
"fmt"
89
"github.com/daveshanley/vacuum/model"
910
"github.com/daveshanley/vacuum/plugin"
1011
"github.com/daveshanley/vacuum/rulesets"
1112
"github.com/dustin/go-humanize"
1213
"github.com/pb33f/libopenapi/index"
1314
"github.com/pterm/pterm"
15+
"os"
16+
"strings"
1417
"time"
1518
)
1619

20+
1721
// BuildRuleSetFromUserSuppliedSet creates a ready to run ruleset, augmented or provided by a user
1822
// configured ruleset. This ruleset could be lifted directly from a Spectral configuration.
1923
func BuildRuleSetFromUserSuppliedSet(rsBytes []byte, rs rulesets.RuleSets) (*rulesets.RuleSet, error) {
@@ -29,6 +33,28 @@ func BuildRuleSetFromUserSuppliedSet(rsBytes []byte, rs rulesets.RuleSets) (*rul
2933
return rs.GenerateRuleSetFromSuppliedRuleSet(userRS), nil
3034
}
3135

36+
// BuildRuleSetFromUserSuppliedLocation creates a ready to run ruleset from a location (file path or URL)
37+
func BuildRuleSetFromUserSuppliedLocation(rulesetFlag string, rs rulesets.RuleSets, remote bool) (*rulesets.RuleSet, error) {
38+
if strings.HasPrefix(rulesetFlag, "http") {
39+
// Handle remote ruleset URL directly
40+
if !remote {
41+
return nil, fmt.Errorf("remote ruleset specified but remote flag is disabled (use --remote=true or -u=true)")
42+
}
43+
downloadedRS, rsErr := rulesets.DownloadRemoteRuleSet(context.Background(), rulesetFlag)
44+
if rsErr != nil {
45+
return nil, rsErr
46+
}
47+
return rs.GenerateRuleSetFromSuppliedRuleSet(downloadedRS), nil
48+
} else {
49+
// Handle local ruleset file
50+
rsBytes, rsErr := os.ReadFile(rulesetFlag)
51+
if rsErr != nil {
52+
return nil, rsErr
53+
}
54+
return BuildRuleSetFromUserSuppliedSet(rsBytes, rs)
55+
}
56+
}
57+
3258
// RenderTimeAndFiles will render out the time taken to process a specification, and the size of the file in kb.
3359
// it will also render out how many files were processed.
3460
func RenderTimeAndFiles(timeFlag bool, duration time.Duration, fileSize int64, totalFiles int) {

cmd/spectral_report.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,16 +136,13 @@ func GetSpectralReportCommand() *cobra.Command {
136136
if rulesetFlag != "" {
137137

138138
customFunctions, _ = LoadCustomFunctions(functionsFlag, true)
139-
rsBytes, rsErr := os.ReadFile(rulesetFlag)
139+
var rsErr error
140+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag)
140141
if rsErr != nil {
141-
pterm.Error.Printf("Unable to read ruleset file '%s': %s\n", rulesetFlag, rsErr.Error())
142+
pterm.Error.Printf("Unable to load ruleset '%s': %s\n", rulesetFlag, rsErr.Error())
142143
pterm.Println()
143144
return rsErr
144145
}
145-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
146-
if rsErr != nil {
147-
return rsErr
148-
}
149146
}
150147

151148
if !stdIn && !stdOut {

cmd/vacuum_report.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -153,16 +153,13 @@ func GetVacuumReportCommand() *cobra.Command {
153153

154154
customFunctions, _ = LoadCustomFunctions(functionsFlag, true)
155155

156-
rsBytes, rsErr := os.ReadFile(rulesetFlag)
156+
var rsErr error
157+
selectedRS, rsErr = BuildRuleSetFromUserSuppliedLocation(rulesetFlag, defaultRuleSets, remoteFlag)
157158
if rsErr != nil {
158-
pterm.Error.Printf("Unable to read ruleset file '%s': %s\n", rulesetFlag, rsErr.Error())
159+
pterm.Error.Printf("Unable to load ruleset '%s': %s\n", rulesetFlag, rsErr.Error())
159160
pterm.Println()
160161
return rsErr
161162
}
162-
selectedRS, rsErr = BuildRuleSetFromUserSuppliedSet(rsBytes, defaultRuleSets)
163-
if rsErr != nil {
164-
return rsErr
165-
}
166163
}
167164

168165
if !stdIn && !stdOut {

0 commit comments

Comments
 (0)