HEX
Server: Apache/2.4.65 (Ubuntu)
System: Linux ielts-store-v2 6.8.0-1036-gcp #38~22.04.1-Ubuntu SMP Thu Aug 14 01:19:18 UTC 2025 x86_64
User: root (0)
PHP: 7.2.34-54+ubuntu20.04.1+deb.sury.org+1
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,
Upload Files
File: //snap/google-cloud-cli/394/lib/googlecloudsdk/command_lib/developer_connect/flags.py
# -*- coding: utf-8 -*- #
# Copyright 2025 Google LLC. All Rights Reserved.
#
# 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.
"""Flags and helpers for the Developer Connect CLI."""
from googlecloudsdk.calliope import arg_parsers


# Flags
def AddDiscoveryArgument(parser):
  """Creates state argument."""
  parser.add_argument(
      '--run-discovery',
      action='store_true',
      help=(
          'Sets the state of the insight config to PENDING and kicks off the'
          ' discovery flow.'
      ),
  )


def AddArtifactArgument(parser):
  """Creates artifact argument."""
  parser.add_argument(
      '--artifact-uri',
      metavar='ARTIFACT_URI',
      dest='artifact_uri',
      required=True,
      help=(
          'Identifier for the specific artifact you want to update'
      ),
  )


def AddBuildProjectArgument(parser):
  """Creates build project argument."""
  parser.add_argument(
      '--build-project',
      metavar='BUILD_PROJECT',
      dest='build_project',
      required=True,
      help=(
          'The project ID of the project to where the artifact is built.'
      ),
  )


def AddAppHubApplicationArgument(parser):
  """Creates app hub application argument."""
  parser.add_argument(
      '--app-hub-application',
      metavar='APP_HUB_APPLICATION',
      dest='app_hub_application',
      required=True,
      help='The App Hub application to which the insight config is associated.',
  )


# Helper function for ArtifactConfigType
def RemoveOuterBrackets(input_string):
  """Removes outer brackets from a string."""
  if input_string.startswith('[') and input_string.endswith(']'):
    stripped_string = input_string[1:-1]
  elif input_string.startswith('[') or input_string.endswith(']'):
    raise arg_parsers.ArgumentTypeError(
        f"Invalid artifact config string: '{input_string}'. Inconsistent"
        ' brackets.'
    )
  else:
    stripped_string = input_string
  # Split the string by the delimiter "]["
  parts = stripped_string.split('][')
  return parts


def ArtifactConfigType(item_string):
  """Parses a single artifact configuration string.

  Args:
    item_string: The string to parse. The string can be in a custom key-value
      format (e.g. 'key1=val1.)

  Returns:
    A dictionary of artifact configuration key-value pairs.
  """

  if not item_string:
    return {}

  final_dict = {}
  artifact_configs = RemoveOuterBrackets(item_string)
  if not artifact_configs:
    raise arg_parsers.ArgumentTypeError(
        f"Invalid artifact config string: '{item_string}'. "
        'Expected format like: '
        "'uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image,buildProject=my-project' "
        "or '[uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image,buildProject=my-project]'."
    )

  for artifact_config in artifact_configs:
    aritfact_config_props = artifact_config.strip().split(',')
    result_dict = {}
    for prop in aritfact_config_props:
      # Split by key-value pairs: key=val
      parts = prop.split('=', 1)
      if len(parts) != 2:
        raise arg_parsers.ArgumentTypeError(
            f"Invalid key-value pair format: '{prop}' within"
            f" '{item_string}'. Expected"
            " 'uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image or"
            " buildProject=my-project'."
        )
      key = parts[0].strip()
      value_str = parts[1].strip()
      result_dict[key] = value_str
    if 'uri' not in result_dict or 'buildProject' not in result_dict:
      raise arg_parsers.ArgumentTypeError(
          f"Invalid artifact config string: '{item_string}'. Expected format like: "
          '--artifact-config=uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image,buildProject=my-project'
      )
    final_dict[result_dict['uri']] = result_dict['buildProject']

  return final_dict


def AddArtifactConfigsArgument(parser):
  """Creates artifact config argument."""
  parser.add_argument(
      '--artifact-config',
      metavar='ARTIFACT_CONFIG_ITEM',
      dest='artifact_configs',
      type=ArtifactConfigType,
      action='append',
      help="""\
Specifies a single artifact configuration. This flag can be repeated for
multiple configurations.

Each configuration can be provided in a key-value format.

Format examples:
`--artifact-config=uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image,buildProject=my-project`
`--artifact-config=[uri={REGION}-docker.pkg.dev/my-project/my-repo/my-image,buildProject=my-project]`

Supported keys within a configuration:
- `buildProject`: String, e.g., `my-project`
- `uri`: String, e.g., `{REGION}-docker.pkg.dev/my-project/my-repo/my-image`
""",
  )