Skip to content

Commit

Permalink
Add buf alpha sdk python-version (#2634)
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanvanburen authored Dec 1, 2023
1 parent d3dc2fa commit a89d727
Show file tree
Hide file tree
Showing 6 changed files with 485 additions and 132 deletions.
2 changes: 2 additions & 0 deletions private/buf/cmd/buf/buf.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/package/goversion"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/package/mavenversion"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/package/npmversion"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/package/pythonversion"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/package/swiftversion"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/protoc"
"github.com/bufbuild/buf/private/buf/cmd/buf/command/alpha/registry/token/tokendelete"
Expand Down Expand Up @@ -239,6 +240,7 @@ func NewRootCommand(name string) *appcmd.Command {
mavenversion.NewCommand("maven-version", builder),
npmversion.NewCommand("npm-version", builder),
swiftversion.NewCommand("swift-version", builder),
pythonversion.NewCommand("python-version", builder),
},
},
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Copyright 2020-2023 Buf Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package pythonversion

import (
"context"
"fmt"

"connectrpc.com/connect"
"github.com/bufbuild/buf/private/buf/bufcli"
"github.com/bufbuild/buf/private/bufpkg/bufmodule/bufmoduleref"
"github.com/bufbuild/buf/private/bufpkg/bufplugin/bufpluginref"
"github.com/bufbuild/buf/private/gen/proto/connect/buf/alpha/registry/v1alpha1/registryv1alpha1connect"
registryv1alpha1 "github.com/bufbuild/buf/private/gen/proto/go/buf/alpha/registry/v1alpha1"
"github.com/bufbuild/buf/private/pkg/app/appcmd"
"github.com/bufbuild/buf/private/pkg/app/appflag"
"github.com/bufbuild/buf/private/pkg/connectclient"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)

const (
pluginFlagName = "plugin"
moduleFlagName = "module"
registryName = "python"
)

// NewCommand returns a new Command
func NewCommand(
name string,
builder appflag.Builder,
) *appcmd.Command {
flags := newFlags()
return &appcmd.Command{
Use: name + " --module=<buf.build/owner/repository[:ref]> --plugin=<buf.build/owner/plugin[:version]>",
Short: bufcli.PackageVersionShortDescription(registryName),
Long: bufcli.PackageVersionLongDescription(registryName, name, "buf.build/protocolbuffers/python"),
Args: cobra.NoArgs,
Run: builder.NewRunFunc(
func(ctx context.Context, container appflag.Container) error {
return run(ctx, container, flags)
},
bufcli.NewErrorInterceptor(),
),
BindFlags: flags.Bind,
}
}

type flags struct {
Plugin string
Module string
}

func newFlags() *flags {
return &flags{}
}

func (f *flags) Bind(flagSet *pflag.FlagSet) {
flagSet.StringVar(&f.Module, moduleFlagName, "", "The module reference to resolve")
flagSet.StringVar(&f.Plugin, pluginFlagName, "", fmt.Sprintf("The %s plugin reference to resolve", registryName))
_ = cobra.MarkFlagRequired(flagSet, moduleFlagName)
_ = cobra.MarkFlagRequired(flagSet, pluginFlagName)
}

func run(
ctx context.Context,
container appflag.Container,
flags *flags,
) error {
bufcli.WarnAlphaCommand(ctx, container)
clientConfig, err := bufcli.NewConnectClientConfig(container)
if err != nil {
return err
}
moduleReference, err := bufmoduleref.ModuleReferenceForString(flags.Module)
if err != nil {
return appcmd.NewInvalidArgumentErrorf("failed parsing module reference: %s", err.Error())
}
pluginIdentity, pluginVersion, err := bufpluginref.ParsePluginIdentityOptionalVersion(flags.Plugin)
if err != nil {
return appcmd.NewInvalidArgumentErrorf("failed parsing plugin reference: %s", err.Error())
}
if pluginIdentity.Remote() != moduleReference.Remote() {
return appcmd.NewInvalidArgumentError("module and plugin must be from the same remote")
}
resolver := connectclient.Make(
clientConfig,
moduleReference.Remote(),
registryv1alpha1connect.NewResolveServiceClient,
)
packageVersion, err := resolver.GetPythonVersion(ctx, connect.NewRequest(
&registryv1alpha1.GetPythonVersionRequest{
ModuleReference: &registryv1alpha1.LocalModuleReference{
Owner: moduleReference.Owner(),
Repository: moduleReference.Repository(),
Reference: moduleReference.Reference(),
},
PluginReference: &registryv1alpha1.GetRemotePackageVersionPlugin{
Owner: pluginIdentity.Owner(),
Name: pluginIdentity.Plugin(),
Version: pluginVersion,
},
},
))
if err != nil {
return err
}
if _, err := container.Stdout().Write([]byte(packageVersion.Msg.Version)); err != nil {
return err
}
return nil
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
// Copyright 2020-2023 Buf Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Generated. DO NOT EDIT.

package pythonversion

import _ "github.com/bufbuild/buf/private/usage"

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit a89d727

Please sign in to comment.