// Copyright 2017 The LUCI Authors. All rights reserved.
// Use of this source code is governed under the Apache License, Version 2.0
// that can be found in the LICENSE file.

syntax = "proto3";

package vpython;

import "go.chromium.org/luci/vpython/api/vpython/pep425.proto";


// Spec is a "vpython" environment specification.
message Spec {
  // The Python version to use. This should be of the form:
  // "Major[.Minor[.Patch]]"
  //
  // If specified,
  // - The Major version will be enforced absolutely. Python 3 will not be
  //   preferred over Python 2 because '3' is greater than '2'.
  // - The remaining versions, if specified, will be regarded as *minimum*
  //   versions. In other words, if "2.7.4" is specified and the system has
  //   "2.7.12", that will suffice. Similarly, "2.6" would accept a "2.7"
  //   interpreter.
  //
  // If empty, the default Python interpreter ("python") will be used.
  string python_version = 1;

  // A definition for a remote package. The type of package depends on the
  // configured package resolver.
  message Package {
    // The name of the package.
    //
    // - For CIPD, this is the package name.
    string name = 1;

    // The package version.
    //
    // - For CIPD, this will be any recognized CIPD version (i.e., ID, tag, or
    //   ref).
    string version = 2;

    // Optional PEP425 tags to determine whether this package is included on the
    // target system. If no match tags are specified, this package will always
    // be included. If match tags are specified, the package will be included if
    // any system PEP425 tags match at least one of the match tags.
    //
    // A match will succeed if any system PEP425 tag field matches the
    // corresponding field in the PEP425 tag. If the match tag omits a field
    // (partial), that field will not be considered. For example, if a match
    // tag specifies just an ABI field, any system PEP425 tag with that ABI will
    // be considered a successful match, regardless of other field values.
    repeated vpython.PEP425Tag match_tag = 3;

    // Optional PEP425 tags to determine whether this package is NOT included on
    // the target system. This has the opposite behavior as "match_tag": if any
    // host tags match any tags in this list, the package will not be installed
    // on this host.
    //
    // A "not_match_tag" overrides a "match_tag", so if a host has tags that
    // match entries in both, the package will be not considered a match.
    repeated vpython.PEP425Tag not_match_tag = 4;
  }
  repeated Package wheel = 2;

  // The VirtualEnv package.
  //
  // This should be left empty to use the `vpython` default package
  // (recommended).
  Package virtualenv = 3;

  // Specification-provided PEP425 verification tags.
  //
  // By default, verification will be performed against a default set of
  // environment parameters. However, a given specification may offer its own
  // set of PEP425 tags representing the systems that it wants to be verified
  // against.
  repeated vpython.PEP425Tag verify_pep425_tag = 4;
}
