Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions gazelle/python/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
load("@bazel_gazelle//:def.bzl", "gazelle_binary")
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
load("@bazel_skylib//rules:diff_test.bzl", "diff_test")
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
load(":gazelle_test.bzl", "gazelle_test")

Expand All @@ -17,15 +18,10 @@ go_library(
"std_modules.go",
"target.go",
],
# NOTE @aignas 2023-12-03: currently gazelle does not support embedding
# generated files, but 3.11.txt is generated by a build rule.
#
# You will get a benign error like when running gazelle locally:
# > 8 gazelle: .../rules_python/gazelle/python/std_modules.go:24:3: pattern 3.11.txt: matched no files
#
# See following for more info:
# https://github.com/bazelbuild/bazel-gazelle/issues/1513
embedsrcs = ["stdlib_list.txt"], # keep # TODO: use user-defined version?
embedsrcs = [
"stdlib_list/default.txt",
"stdlib_list/selected.txt", # keep # TODO: use user-defined version?
],
importpath = "github.com/bazel-contrib/rules_python/gazelle/python",
visibility = ["//visibility:public"],
deps = [
Expand Down Expand Up @@ -62,10 +58,16 @@ copy_file(
"//conditions:default": "@python_stdlib_list//:stdlib_list/lists/3.14.txt",
},
),
out = "stdlib_list.txt",
out = "stdlib_list/selected.txt",
allow_symlink = True,
)

diff_test(
name = "stdlib_list_default_test",
file1 = "stdlib_list/default.txt",
file2 = "@python_stdlib_list//:stdlib_list/lists/3.14.txt",
)

# gazelle:exclude testdata/
# gazelle:exclude extensions.bzl
# Exclude test-only Starlark helper from Gazelle to avoid generating an unnecessary bzl_library
Expand Down
31 changes: 24 additions & 7 deletions gazelle/python/std_modules.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,39 @@ package python

import (
"bufio"
_ "embed"
"strings"
"bytes"
"embed"
"io/fs"
)

var (
//go:embed stdlib_list.txt
stdlibList string
//go:embed stdlib_list/*.txt
stdlibFS embed.FS
stdModules map[string]struct{}
)

func init() {
stdModules = make(map[string]struct{})
scanner := bufio.NewScanner(strings.NewReader(stdlibList))
var err error
stdModules, err = loadStdModules(stdlibFS)
if err != nil {
panic(err)
}
}

func loadStdModules(fsys fs.ReadFileFS) (map[string]struct{}, error) {
data, err := fsys.ReadFile("stdlib_list/selected.txt")
if err != nil {
data, err = fsys.ReadFile("stdlib_list/default.txt")
if err != nil {
return nil, err
}
}
modules := make(map[string]struct{})
scanner := bufio.NewScanner(bytes.NewReader(data))
for scanner.Scan() {
stdModules[scanner.Text()] = struct{}{}
modules[scanner.Text()] = struct{}{}
}
return modules, scanner.Err()
}

func isStdModule(m Module) bool {
Expand Down
25 changes: 25 additions & 0 deletions gazelle/python/std_modules_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package python

import (
"testing"
"testing/fstest"

"github.com/stretchr/testify/assert"
)
Expand All @@ -25,3 +26,27 @@ func TestIsStdModule(t *testing.T) {
assert.True(t, isStdModule(Module{Name: "os.path"}))
assert.False(t, isStdModule(Module{Name: "foo"}))
}

func TestLoadStdModules(t *testing.T) {
t.Run("prefers selected.txt when present", func(t *testing.T) {
fsys := fstest.MapFS{
"stdlib_list/default.txt": &fstest.MapFile{Data: []byte("default_only\n")},
"stdlib_list/selected.txt": &fstest.MapFile{Data: []byte("selected_only\n")},
}
modules, err := loadStdModules(fsys)
if assert.NoError(t, err) {
assert.Contains(t, modules, "selected_only")
assert.NotContains(t, modules, "default_only")
}
})

t.Run("falls back to default.txt when selected.txt is absent", func(t *testing.T) {
fsys := fstest.MapFS{
"stdlib_list/default.txt": &fstest.MapFile{Data: []byte("default_only\n")},
}
modules, err := loadStdModules(fsys)
if assert.NoError(t, err) {
assert.Contains(t, modules, "default_only")
}
})
}
Loading
Loading