From 98fe38b9061363544b2148d59078c31500a43644 Mon Sep 17 00:00:00 2001 From: Bruce Flynn Date: Thu, 2 Jan 2025 12:00:32 -0600 Subject: [PATCH] lint fix --- cmd/collections/writers.go | 2 +- cmd/granules/cmd.go | 9 ++-- cmd/granules/download.go | 4 +- cmd/granules/order.go | 59 +++++++++++++------------- cmd/granules/writers.go | 14 +++--- cmd/root.go | 6 --- internal/cmrsearch_collections_test.go | 11 +++-- internal/cmrsearch_granules.go | 3 -- internal/cmrsearch_granules_test.go | 11 +++-- internal/cmrsearch_keywords_test.go | 6 +-- internal/cmrsearch_test.go | 5 ++- internal/fetch_http_test.go | 7 +-- internal/fetch_test.go | 4 +- internal/holdingsapi.go | 11 +++-- internal/holdingsapi_test.go | 11 +++-- 15 files changed, 80 insertions(+), 83 deletions(-) diff --git a/cmd/collections/writers.go b/cmd/collections/writers.go index 2e1e331..e3b276c 100644 --- a/cmd/collections/writers.go +++ b/cmd/collections/writers.go @@ -57,7 +57,7 @@ func writeCollection(zult internal.CollectionResult, w io.Writer, long bool) err t.SetCaption(col["abstract"]) } t.Render() - w.Write([]byte{'\n'}) + _, _ = w.Write([]byte{'\n'}) } return zult.Err() } diff --git a/cmd/granules/cmd.go b/cmd/granules/cmd.go index 22a421a..509aeac 100644 --- a/cmd/granules/cmd.go +++ b/cmd/granules/cmd.go @@ -125,7 +125,7 @@ NASA Earthdata Authentication if destdir != "" { err = doDownload(context.TODO(), api, params, destdir, token, netrc, clobber, yes, concurrency) } else { - err = do(api, params, output, fields, yes) + err = do(api, params, output, fields) } if err != nil { log.Fatalf("failed! %s", err) @@ -181,11 +181,12 @@ func init() { "results and must load all results in memory before rendering. Make sure to provide enough "+ "filters to limit the result set to a reasonable size or use json or csv output.") - flags.MarkHidden("shortname") - flags.MarkDeprecated("shortname", "Provide the collection concept id instead") + cobra.CheckErr(flags.MarkHidden("shortname")) + cobra.CheckErr(flags.MarkDeprecated("yes", "Not used and will be ignored")) + cobra.CheckErr(flags.MarkDeprecated("shortname", "Provide the collection concept id instead")) } -func do(api *internal.CMRSearchAPI, params *internal.SearchGranuleParams, writerName string, fields []string, yes bool) error { +func do(api *internal.CMRSearchAPI, params *internal.SearchGranuleParams, writerName string, fields []string) error { var writer outputWriter switch writerName { case "short": diff --git a/cmd/granules/download.go b/cmd/granules/download.go index d005557..7952486 100644 --- a/cmd/granules/download.go +++ b/cmd/granules/download.go @@ -58,7 +58,9 @@ func doDownload( if !yes && zult.Hits() > maxResultsWithoutPrompt { fmt.Printf("There are more than %v, CTRL-C to cancel or ENTER to continue\n", maxResultsWithoutPrompt) - bufio.NewReader(os.Stdin).ReadBytes('\n') + if _, err := bufio.NewReader(os.Stdin).ReadBytes('\n'); err != nil { + return err + } } if internal.Exists(destdir) { diff --git a/cmd/granules/order.go b/cmd/granules/order.go index 03b0fbf..a83762c 100644 --- a/cmd/granules/order.go +++ b/cmd/granules/order.go @@ -1,32 +1,31 @@ package granules -import "strings" - -var sortByFields = []string{ - "entry_title", - "data_size", - "granule_ur", - "producer_granule_id", - "project", - "provider", - "short_name", - "start_date", - "end_date", - "version", - "platform", - "instrument", - "sensor", - "day_night_flag", - "cloud_cover", - "revision_date", -} - -func validSortField(val string) bool { - val = strings.ReplaceAll(val, "-", "") - for _, s := range sortByFields { - if val == s { - return true - } - } - return false -} +// TODO: impl sortBy +// var sortByFields = []string{ +// "entry_title", +// "data_size", +// "granule_ur", +// "producer_granule_id", +// "project", +// "provider", +// "short_name", +// "start_date", +// "end_date", +// "version", +// "platform", +// "instrument", +// "sensor", +// "day_night_flag", +// "cloud_cover", +// "revision_date", +// } +// +// func validSortField(val string) bool { +// val = strings.ReplaceAll(val, "-", "") +// for _, s := range sortByFields { +// if val == s { +// return true +// } +// } +// return false +// } diff --git a/cmd/granules/writers.go b/cmd/granules/writers.go index f45c67e..f1a8b40 100644 --- a/cmd/granules/writers.go +++ b/cmd/granules/writers.go @@ -12,10 +12,6 @@ import ( type outputWriter func(internal.GranuleResult, io.Writer, []string) error -func longWriter(zult internal.GranuleResult, w io.Writer, fields []string) error { - return nil -} - func shortWriter(zult internal.GranuleResult, w io.Writer, _ []string) error { fields := []string{"name", "size", "native_id", "concept_id", "revision_id"} t := table.NewWriter() @@ -82,7 +78,10 @@ func jsonWriter(zult internal.GranuleResult, w io.Writer, fields []string) error } func csvWriter(zult internal.GranuleResult, w io.Writer, fields []string) error { - w.Write([]byte(strings.Join(fields, ",") + "\n")) + _, err := w.Write([]byte(strings.Join(fields, ",") + "\n")) + if err != nil { + return err + } for granule := range zult.Ch { vals := []string{} @@ -90,7 +89,10 @@ func csvWriter(zult internal.GranuleResult, w io.Writer, fields []string) error for _, name := range fields { vals = append(vals, fmt.Sprintf("%v", m[name])) } - w.Write([]byte(strings.Join(vals, ",") + "\n")) + _, err := w.Write([]byte(strings.Join(vals, ",") + "\n")) + if err != nil { + return err + } } return zult.Err() } diff --git a/cmd/root.go b/cmd/root.go index fe0c7a8..6d22ba8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -9,12 +9,6 @@ import ( "github.com/spf13/cobra" ) -func failOnError(err error) { - if err != nil { - panic(err) - } -} - var rootCmd = &cobra.Command{ Use: "cmrfetch", Short: "Search for and download NASA Earthdata collections and granules", diff --git a/internal/cmrsearch_collections_test.go b/internal/cmrsearch_collections_test.go index c9b004c..b023154 100644 --- a/internal/cmrsearch_collections_test.go +++ b/internal/cmrsearch_collections_test.go @@ -3,10 +3,9 @@ package internal import ( "context" "fmt" - "io/ioutil" - "log" "net/http" "net/http/httptest" + "os" "testing" "time" @@ -57,7 +56,7 @@ func TestSearchCollectionParams(t *testing.T) { } func Test_newCollectionFromUMM(t *testing.T) { - dat, err := ioutil.ReadFile("testdata/aerdt_collection.umm_json") + dat, err := os.ReadFile("testdata/aerdt_collection.umm_json") require.NoError(t, err) col := newCollectionFromUMM(gjson.Parse(string(dat)).Get("items.0")) @@ -85,7 +84,7 @@ func TestSearchCollections(t *testing.T) { w.Header().Set("cmr-hits", hits) } w.WriteHeader(status) - w.Write([]byte(body)) + _, _ = w.Write([]byte(body)) })) url := fmt.Sprintf("http://%s", ts.Listener.Addr()) origURL := defaultCMRURL @@ -99,7 +98,7 @@ func TestSearchCollections(t *testing.T) { doGet := func(t *testing.T, params *SearchCollectionParams) ScrollResult[Collection] { t.Helper() - api := NewCMRSearchAPI(log.Default()) + api := NewCMRSearchAPI() // make sure we're not waiting long zult, err := api.SearchCollections(context.Background(), params) require.NoError(t, err) @@ -108,7 +107,7 @@ func TestSearchCollections(t *testing.T) { } t.Run("get", func(t *testing.T) { - dat, err := ioutil.ReadFile("testdata/aerdt_collection.umm_json") + dat, err := os.ReadFile("testdata/aerdt_collection.umm_json") require.NoError(t, err) require.True(t, gjson.Valid(string(dat))) diff --git a/internal/cmrsearch_granules.go b/internal/cmrsearch_granules.go index b312a42..09aa92e 100644 --- a/internal/cmrsearch_granules.go +++ b/internal/cmrsearch_granules.go @@ -13,8 +13,6 @@ import ( "github.com/tidwall/gjson" ) -const notProvided = "Not provided" - func joinFloats(vals []float64) string { s := []string{} for _, v := range vals { @@ -192,7 +190,6 @@ func findDownloadURLs(zult *gjson.Result, directAccess bool) map[string]string { } func newGranulesFromUMM(zult gjson.Result) []Granule { - granules := []Granule{} for _, gran := range findGranules(zult) { diff --git a/internal/cmrsearch_granules_test.go b/internal/cmrsearch_granules_test.go index 65c9126..321ba51 100644 --- a/internal/cmrsearch_granules_test.go +++ b/internal/cmrsearch_granules_test.go @@ -3,7 +3,6 @@ package internal import ( "context" "fmt" - "log" "net/http" "net/http/httptest" "os" @@ -144,7 +143,6 @@ func Test_newGranuleFromUMM(t *testing.T) { "-131.310653687,66.963340759,-92.430793762,55.710681915,-37.703670502,63.907997131,-4.32655859,82.950004578,-131.310653687,66.963340759", }, gran.BoundingBox) }) - } func TestSearchGranules(t *testing.T) { @@ -155,7 +153,8 @@ func TestSearchGranules(t *testing.T) { w.Header().Set("cmr-hits", hits) } w.WriteHeader(status) - w.Write([]byte(body)) + _, err := w.Write([]byte(body)) + require.NoError(t, err) })) url := fmt.Sprintf("http://%s", ts.Listener.Addr()) origURL := defaultCMRURL @@ -169,7 +168,7 @@ func TestSearchGranules(t *testing.T) { doGet := func(t *testing.T, params *SearchGranuleParams) ScrollResult[Granule] { t.Helper() - api := NewCMRSearchAPI(log.Default()) + api := NewCMRSearchAPI() // make sure we're not waiting long zult, err := api.SearchGranules(context.Background(), params) require.NoError(t, err) @@ -199,7 +198,7 @@ func TestSearchGranules(t *testing.T) { }) } -func testDecodeArchiveInfo(t *testing.T) { +func TestDecodeArchiveInfo(t *testing.T) { ar := gjson.Parse(` [ { @@ -235,7 +234,7 @@ func testDecodeArchiveInfo(t *testing.T) { require.Equal(t, "ffffffffffffffffffffffffffffffff", info.Checksum) info = infos["CAL_LID_L1-Standard-V4-51.2016-08-31T23-21-32ZD.hdf.met"] - require.Equal(t, "8.0 KB", info.Size) + require.Equal(t, "8 KB", info.Size) require.Equal(t, "MD5", info.ChecksumAlg) require.Equal(t, "3e84cf5f8ffb0e97627ff9462cec8534", info.Checksum) } diff --git a/internal/cmrsearch_keywords_test.go b/internal/cmrsearch_keywords_test.go index c99d102..73a785b 100644 --- a/internal/cmrsearch_keywords_test.go +++ b/internal/cmrsearch_keywords_test.go @@ -3,7 +3,6 @@ package internal import ( "context" "fmt" - "log" "net/http" "net/http/httptest" "testing" @@ -19,7 +18,8 @@ func TestSearchFacets(t *testing.T) { w.Header().Set("cmr-hits", hits) } w.WriteHeader(status) - w.Write([]byte(body)) + _, err := w.Write([]byte(body)) + require.NoError(t, err) })) url := fmt.Sprintf("http://%s", ts.Listener.Addr()) origURL := defaultCMRURL @@ -33,7 +33,7 @@ func TestSearchFacets(t *testing.T) { doGet := func(t *testing.T, val string, types []string) ScrollResult[Facet] { t.Helper() - api := NewCMRSearchAPI(log.Default()) + api := NewCMRSearchAPI() // make sure we're not waiting long zult, err := api.SearchFacets(context.Background(), val, types) require.NoError(t, err) diff --git a/internal/cmrsearch_test.go b/internal/cmrsearch_test.go index cfd5970..00d0b98 100644 --- a/internal/cmrsearch_test.go +++ b/internal/cmrsearch_test.go @@ -20,7 +20,8 @@ func TestCMRSearchAPI(t *testing.T) { w.Header().Set("cmr-hits", hits) } w.WriteHeader(status) - w.Write([]byte(body)) + _, err := w.Write([]byte(body)) + require.NoError(t, err) })) url := fmt.Sprintf("http://%s", ts.Listener.Addr()) return ts, url @@ -29,7 +30,7 @@ func TestCMRSearchAPI(t *testing.T) { doGet := func(t *testing.T, url string) ScrollResult[gjson.Result] { t.Helper() - api := NewCMRSearchAPI(nil) + api := NewCMRSearchAPI() // make sure we're not waiting long ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() diff --git a/internal/fetch_http_test.go b/internal/fetch_http_test.go index 4d8ad7b..e6ec446 100644 --- a/internal/fetch_http_test.go +++ b/internal/fetch_http_test.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "net/http" "net/http/httptest" "os" @@ -60,7 +59,8 @@ func mockNetrc(t *testing.T) func() { netrc, err := os.CreateTemp("", "") require.NoError(t, err) - ioutil.WriteFile(netrc.Name(), []byte("machine testhost.com login LOGIN password PASSWORD"), 0o644) + err = os.WriteFile(netrc.Name(), []byte("machine testhost.com login LOGIN password PASSWORD"), 0o644) + require.NoError(t, err) orig := defaultNetrcFinder defaultNetrcFinder = func() (string, error) { @@ -94,7 +94,8 @@ func TestHTTPFetcher(t *testing.T) { t.Run("ok", func(t *testing.T) { body := []byte("xxx") svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - w.Write(body) + _, err := w.Write(body) + require.NoError(t, err) })) defer svr.Close() diff --git a/internal/fetch_test.go b/internal/fetch_test.go index 7f00fae..0ec8596 100644 --- a/internal/fetch_test.go +++ b/internal/fetch_test.go @@ -3,7 +3,6 @@ package internal import ( "bytes" "crypto/md5" - "io/ioutil" "os" "path/filepath" "testing" @@ -85,7 +84,8 @@ func Test_findNetrc(t *testing.T) { defer os.RemoveAll(dir) path := filepath.Join(dir, ".netrc") - ioutil.WriteFile(path, []byte("xxx"), 0o644) + err = os.WriteFile(path, []byte("xxx"), 0o644) + require.NoError(t, err) t.Setenv("HOME", dir) gotpath, err := findNetrc() diff --git a/internal/holdingsapi.go b/internal/holdingsapi.go index e7428f6..fe80420 100644 --- a/internal/holdingsapi.go +++ b/internal/holdingsapi.go @@ -12,8 +12,7 @@ import ( var defaultHoldingsURL = "https://cmr.earthdata.nasa.gov/search/provider_holdings.json" -type ProviderCollection struct { -} +type ProviderCollection struct{} /* { @@ -105,7 +104,9 @@ func writeCachedProviderHoldings(providers []Provider) error { return err } dir = filepath.Join(dir, "cmrfetch") - os.MkdirAll(dir, 0o755) + if err := os.MkdirAll(dir, 0o755); err != nil { + return fmt.Errorf("making dir: %w", err) + } f, err := os.Create(filepath.Join(dir, "provider_holdings.json")) if err != nil { return err @@ -132,6 +133,8 @@ func GetProviderHoldings() ([]Provider, error) { return nil, err } // intentionally ignoring error - writeCachedProviderHoldings(providers) + if err := writeCachedProviderHoldings(providers); err != nil { + return nil, fmt.Errorf("writing to cache dir: %w", err) + } return providers, err } diff --git a/internal/holdingsapi_test.go b/internal/holdingsapi_test.go index bb88fb5..7c74ffe 100644 --- a/internal/holdingsapi_test.go +++ b/internal/holdingsapi_test.go @@ -3,7 +3,6 @@ package internal import ( "bytes" "fmt" - "io/ioutil" "net/http" "net/http/httptest" "os" @@ -70,7 +69,6 @@ func testCacheDir(t *testing.T) (string, func()) { } func Test_getCachedProviderHoldngs(t *testing.T) { - t.Run("cache dir missing is ok", func(t *testing.T) { _, cleanup := testCacheDir(t) defer cleanup() @@ -85,7 +83,7 @@ func Test_getCachedProviderHoldngs(t *testing.T) { t.Run("not a dir is err", func(t *testing.T) { dir, cleanup := testCacheDir(t) defer cleanup() - err := ioutil.WriteFile(filepath.Join(dir, "cmrfetch"), nil, 0o644) + err := os.WriteFile(filepath.Join(dir, "cmrfetch"), nil, 0o644) require.NoError(t, err) zult, mtime, err := getCachedProviderHoldings() @@ -112,7 +110,7 @@ func Test_getCachedProviderHoldngs(t *testing.T) { err := os.MkdirAll(filepath.Join(dir, "cmrfetch"), 0o755) require.NoError(t, err) fpath := filepath.Join(dir, "cmrfetch", "provider_holdings.json") - require.NoError(t, ioutil.WriteFile(fpath, nil, 0o000)) + require.NoError(t, os.WriteFile(fpath, nil, 0o000)) zult, mtime, err := getCachedProviderHoldings() require.Nil(t, zult) @@ -126,7 +124,7 @@ func Test_getCachedProviderHoldngs(t *testing.T) { err := os.MkdirAll(filepath.Join(dir, "cmrfetch"), 0o755) require.NoError(t, err) fpath := filepath.Join(dir, "cmrfetch", "provider_holdings.json") - require.NoError(t, ioutil.WriteFile(fpath, []byte(`[]`), 0o644)) + require.NoError(t, os.WriteFile(fpath, []byte(`[]`), 0o644)) zult, mtime, err := getCachedProviderHoldings() require.Len(t, zult, 0) @@ -166,7 +164,7 @@ func TestGetProviderHoldings(t *testing.T) { defer cleanup() svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Write([]byte(` + _, err := w.Write([]byte(` [ { "concept-id": "C1", @@ -187,6 +185,7 @@ func TestGetProviderHoldings(t *testing.T) { "granule-count": 1 } ]`)) + require.NoError(t, err) })) defer svr.Close() origURL := defaultHoldingsURL