diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml new file mode 100644 index 000000000000..24ff3259b7f4 --- /dev/null +++ b/.github/workflows/docs.yaml @@ -0,0 +1,42 @@ +name: DoxFX Test Suite +on: + push: + branches: [ main ] + pull_request: + workflow_dispatch: + +jobs: + docfx: + name: "Run DocFX tests" + runs-on: ubuntu-latest + env: + PHPDOC_ENV: prod + steps: + - uses: actions/checkout@v3 + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.9' + - run: pip install --require-hashes -r .kokoro/docs/docker/requirements.txt + - name: Setup PHP + uses: shivammathur/setup-php@verbose + with: + php-version: "8.0" + - name: Extract phpDocumentor + id: extract + uses: shrink/actions-docker-extract@v2 + with: + image: "phpdoc/phpdoc:202301112131087e6028" + path: "/opt/phpdoc/." + - name: Symlink phpDocumentor + run: ln -s $(pwd)/${{ steps.extract.outputs.destination }}/bin/phpdoc /usr/local/bin/phpdoc + - name: Install Dependencies + uses: nick-invision/retry@v2 + with: + timeout_minutes: 10 + max_attempts: 3 + command: composer --no-interaction --no-ansi --no-progress update -d dev + - name: Run DocFX Unit Test Suite + run: dev/vendor/bin/phpunit -c dev/phpunit-docfx.xml.dist + - name: Run Docs Generator (Dry Run) + run: .kokoro/docs/publish.sh diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml new file mode 100644 index 000000000000..1dcdbadc8e13 --- /dev/null +++ b/.github/workflows/lint.yaml @@ -0,0 +1,21 @@ +name: CS Test Suite +on: + push: + branches: [ main ] + pull_request: + workflow_dispatch: + +jobs: + style: + runs-on: ubuntu-latest + name: PHP Style Check + steps: + - uses: actions/checkout@v3 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.0' + - name: "Install dependencies" + run: composer global require "squizlabs/php_codesniffer:3.*" + - name: Run PHPCS Code Style Checker + run: ~/.composer/vendor/bin/phpcs --standard=phpcs-ruleset.xml -p diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index fce4fae52246..7fd464c7853b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -66,55 +66,16 @@ jobs: - name: Run Package Test Suites run: bash .github/run-package-tests.sh - style: + test_dev_commands: + name: Dev Commands Unit Tests runs-on: ubuntu-latest - name: PHP Style Check steps: - uses: actions/checkout@v3 - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.0' - - name: Install Dependencies - uses: nick-invision/retry@v2 - with: - timeout_minutes: 10 - max_attempts: 3 - command: composer --no-interaction --no-ansi --no-progress update - - name: Run PHPCS Code Style Checker - run: dev/sh/style - - docfx: - name: "Run DocFX tests" - runs-on: ubuntu-latest - env: - PHPDOC_ENV: prod - steps: - - uses: actions/checkout@v3 - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.9' - - run: pip install --require-hashes -r .kokoro/docs/docker/requirements.txt - name: Setup PHP uses: shivammathur/setup-php@verbose with: php-version: "8.0" - - name: Extract phpDocumentor - id: extract - uses: shrink/actions-docker-extract@v2 - with: - image: "phpdoc/phpdoc:202301112131087e6028" - path: "/opt/phpdoc/." - - name: Symlink phpDocumentor - run: ln -s $(pwd)/${{ steps.extract.outputs.destination }}/bin/phpdoc /usr/local/bin/phpdoc - - name: Install Dependencies - uses: nick-invision/retry@v2 - with: - timeout_minutes: 10 - max_attempts: 3 - command: composer --no-interaction --no-ansi --no-progress update - - name: Run DocFX Unit Test Suite - run: vendor/bin/phpunit -c dev/phpunit-docfx.xml.dist - - name: Run Docs Generator (Dry Run) - run: .kokoro/docs/publish.sh + - name: "Install dependencies" + run: composer --no-interaction --no-ansi --no-progress update -d dev + - name: Run Dev Unit Test Suite + run: dev/vendor/bin/phpunit -c dev/phpunit.xml.dist diff --git a/.kokoro/continuous/run-tests.sh b/.kokoro/continuous/run-tests.sh index 7c95f0cc712b..354254ce987e 100755 --- a/.kokoro/continuous/run-tests.sh +++ b/.kokoro/continuous/run-tests.sh @@ -30,9 +30,6 @@ fi # non-secret env vars export ASSET_TEST_BUCKET="php_asset_test_bucket" -echo "Running PHPCS Code Style Checker" -dev/sh/style - PHP_VERSION=$(php -r 'echo PHP_MAJOR_VERSION;') if [ "5" == $PHP_VERSION ]; then # Exclude compute if the PHP version is below 7.0 @@ -50,8 +47,4 @@ echo "Running System Test Suite" vendor/bin/phpunit -d memory_limit=512M -c phpunit${PHPUNIT_SUFFIX}-system.xml.dist \ --verbose --log-junit ${SYSTEM_LOG_FILENAME} -echo "Running package integration Test" - -dev/google-cloud integration -u - popd diff --git a/.kokoro/docs/publish.sh b/.kokoro/docs/publish.sh index 61a0249058b3..96cd068b7634 100755 --- a/.kokoro/docs/publish.sh +++ b/.kokoro/docs/publish.sh @@ -12,15 +12,15 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) PROJECT_DIR=$(dirname $(dirname $SCRIPT_DIR)) # Run "composer install" if it hasn't been run yet -if [ ! -d 'vendor/' ]; then - composer install -d $PROJECT_DIR +if [ ! -d 'dev/vendor/' ]; then + composer install -d $PROJECT_DIR/dev fi if [ "$STAGING_BUCKET" != "" ]; then echo "Using staging bucket ${STAGING_BUCKET}..." fi -find $PROJECT_DIR/* -mindepth 1 -maxdepth 1 -name 'composer.json' -not -path '*vendor/*' -exec dirname {} \; | while read DIR +find $PROJECT_DIR/* -mindepth 1 -maxdepth 1 -name 'composer.json' -not -path '*vendor/*' -regex '[A-Z].*' -exec dirname {} \; | while read DIR do COMPONENT=$(basename $DIR) VERSION=$(cat $DIR/VERSION) diff --git a/AdvisoryNotifications/composer.json b/AdvisoryNotifications/composer.json index 72c0ac44f590..d9890d4f4f2c 100644 --- a/AdvisoryNotifications/composer.json +++ b/AdvisoryNotifications/composer.json @@ -13,7 +13,7 @@ "component": { "id": "cloud-advisorynotifications", "path": "AdvisoryNotifications", - "target": "https://github.com/googleapis/google-cloud-php-advisorynotifications" + "target": "googleapis/google-cloud-php-advisorynotifications" } }, "require": { diff --git a/CommonProtos/dev/regenerate.sh b/CommonProtos/dev/regenerate.sh deleted file mode 100644 index 6302b6dba547..000000000000 --- a/CommonProtos/dev/regenerate.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/bin/bash -# Copyright 2018 Google LLC -# -# 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. - -# Protos to generate -PROTOS_TO_GENERATE=( - google/cloud/audit/audit_log.proto - google/devtools/source/v1/source_context.proto - google/cloud/common/operation_metadata.proto - google/rpc/context/attribute_context.proto -) - -# Constants -REQUIRED_PROTOC_VERSION="libprotoc 3.15.8" -GOOGLEAPIS_REPO="https://github.com/googleapis/googleapis.git" - -# Directories -: "${ROOT_DIR:=$(pwd)}" -echo "root dir: ${ROOT_DIR}" -TEMP_COMMON_PROTOS_DIR="${ROOT_DIR}/tmp_common_protos" -PROTOC_OUT_DIR="${ROOT_DIR}/out" -SRC_DIR="${ROOT_DIR}/src" -METADATA_DIR="${ROOT_DIR}/metadata" - -# Protoc bin -: "${PROTOC_BIN:=$(which protoc)}" -echo "protoc bin: ${PROTOC_BIN}" - -# Check protoc version -PROTOC_VERSION=$($PROTOC_BIN --version) -echo "protoc version: ${PROTOC_VERSION}" - -if [ "${PROTOC_VERSION}" != "${REQUIRED_PROTOC_VERSION}" ] -then - echo "Invalid protoc version, expected '${REQUIRED_PROTOC_VERSION}', got '${PROTOC_VERSION}'" - exit 1 -fi - -rm -rf ${TEMP_COMMON_PROTOS_DIR} -git clone ${GOOGLEAPIS_REPO} ${TEMP_COMMON_PROTOS_DIR} - -rm -rf ${PROTOC_OUT_DIR} -mkdir ${PROTOC_OUT_DIR} - -PROTOC_ARGS="--php_out ${PROTOC_OUT_DIR} -I${TEMP_COMMON_PROTOS_DIR} ${PROTOS_TO_GENERATE[@]}" -echo "Calling protoc with args: ${PROTOC_ARGS}" -${PROTOC_BIN} ${PROTOC_ARGS} - -rm -rf ${SRC_DIR} -mkdir ${SRC_DIR} - -rm -rf ${METADATA_DIR} -mkdir ${METADATA_DIR} - -echo "Copy protos to src and metadata locations" -cp -r ${PROTOC_OUT_DIR}/Google/Cloud/* ${SRC_DIR}/ -cp -r ${PROTOC_OUT_DIR}/GPBMetadata/Google/* ${METADATA_DIR}/ diff --git a/composer.json b/composer.json index 7fc8fb976dad..cac31368f279 100644 --- a/composer.json +++ b/composer.json @@ -59,17 +59,12 @@ "phpunit/phpunit": "^4.8|^5.0|^8.0", "yoast/phpunit-polyfills": "^1.0", "phpspec/prophecy": "^1.10.3", - "squizlabs/php_codesniffer": "3.*", "phpdocumentor/reflection": "^3.0||^4.0||^5.0", - "symfony/console": "^3.0", "erusev/parsedown": "^1.6", - "vierbergenlars/php-semver": "^3.0", "phpseclib/phpseclib": "^2.0||^3.0", "google/cloud-tools": "^0.13.0", "opis/closure": "^3.0", - "swaggest/json-schema": "^0.12.0", - "rg/avro-php": "^1.8.0||^2.0.1||^3.0.0", - "symfony/yaml": "^3.3||^6.0" + "rg/avro-php": "^1.8.0||^2.0.1||^3.0.0" }, "conflict": { "psr/log": ">=3" @@ -565,7 +560,6 @@ "Google\\Cloud\\DataCatalog\\Lineage\\Tests\\": "DataCatalogLineage/tests", "Google\\Cloud\\Datastore\\Tests\\": "Datastore/tests", "Google\\Cloud\\Debugger\\Tests\\": "Debugger/tests", - "Google\\Cloud\\Dev\\": "dev/src", "Google\\Cloud\\ErrorReporting\\Tests\\": "ErrorReporting/tests", "Google\\Cloud\\Firestore\\Tests\\": "Firestore/tests", "Google\\Cloud\\Language\\Tests\\": "Language/tests", @@ -593,12 +587,6 @@ "PubSub/tests/System/testdata/generated/StateProto.php" ] }, - "scripts": { - "google-cloud": "dev/google-cloud", - "style": "dev/sh/style", - "style-fix": "dev/sh/style-fix", - "tests": "dev/sh/tests" - }, "bin": [ "Core/bin/google-cloud-batch", "Debugger/bin/google-cloud-debugger" diff --git a/dev/composer.json b/dev/composer.json new file mode 100644 index 000000000000..01cf0fa5892a --- /dev/null +++ b/dev/composer.json @@ -0,0 +1,35 @@ +{ + "type": "library", + "description": "Development commands for the google/cloud library", + "require": { + "vierbergenlars/php-semver": "^3.0", + "symfony/console": " ^3.0", + "symfony/yaml": " ^3.3||^6.0", + "symfony/process": "^6.0", + "google/cloud": "dev-parent", + "symfony/filesystem": "^6.0", + "twig/twig": "^3.5" + }, + "autoload": { + "psr-4": { + "Google\\Cloud\\Dev\\": "src" + } + }, + "require-dev": { + "phpspec/prophecy": "^1.17", + "phpunit/phpunit": "4.8|^5.0|^8.0", + "swaggest/json-schema": "^0.12.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "repositories": { + "google-cloud": { + "type": "path", + "url": "../", + "options": { + "versions": { + "google/cloud": "dev-parent" + } + } + } + } +} diff --git a/dev/google-cloud b/dev/google-cloud index 38b73832f208..2e6aec609ccc 100755 --- a/dev/google-cloud +++ b/dev/google-cloud @@ -16,16 +16,13 @@ * limitations under the License. */ -require __DIR__ . '/../vendor/autoload.php'; +require __DIR__ . '/vendor/autoload.php'; -use Google\Cloud\Dev\AddComponent\Command\AddComponent; -use Google\Cloud\Dev\ComponentIntegration\Command\ComponentIntegration; -use Google\Cloud\Dev\ComponentManager; -use Google\Cloud\Dev\Credentials\Command as Credentials; -use Google\Cloud\Dev\DocFx\Command\DocFx; -use Google\Cloud\Dev\Release\Release; -use Google\Cloud\Dev\ReleaseBuilder\ReleaseBuilder; -use Google\Cloud\Dev\Split\Command as Split; +use Google\Cloud\Dev\Command\AddComponentCommand; +use Google\Cloud\Dev\Command\DocFxCommand; +use Google\Cloud\Dev\Command\ComponentInfoCommand; +use Google\Cloud\Dev\Command\ReleaseCommand; +use Google\Cloud\Dev\Command\SplitCommand; use Symfony\Component\Console\Application; if (!class_exists(Application::class)) { @@ -38,14 +35,10 @@ if (!class_exists(Application::class)) { $rootDirectory = realpath(__DIR__ . '/../') . '/'; -$componentManager = new ComponentManager($rootDirectory); - $app = new Application; -$app->add(new AddComponent($rootDirectory)); -$app->add(new ComponentIntegration($rootDirectory)); -$app->add(new Credentials($rootDirectory)); -$app->add(new DocFX($rootDirectory)); -$app->add(new Release($rootDirectory)); -$app->add(new ReleaseBuilder($rootDirectory)); -$app->add(new Split($rootDirectory, $componentManager)); +$app->add(new AddComponentCommand($rootDirectory)); +$app->add(new DocFxCommand()); +$app->add(new ComponentInfoCommand()); +$app->add(new ReleaseCommand($rootDirectory)); +$app->add(new SplitCommand($rootDirectory)); $app->run(); diff --git a/dev/phpunit-docfx.xml.dist b/dev/phpunit-docfx.xml.dist index 2db25dbb6e9b..a149aa26f26d 100644 --- a/dev/phpunit-docfx.xml.dist +++ b/dev/phpunit-docfx.xml.dist @@ -3,6 +3,8 @@ ./tests/Unit/DocFx + ./tests/Unit/Command/DocFxCommandTest.php + diff --git a/dev/phpunit.xml.dist b/dev/phpunit.xml.dist new file mode 100644 index 000000000000..d7c4261bf182 --- /dev/null +++ b/dev/phpunit.xml.dist @@ -0,0 +1,18 @@ + + + + + tests/Unit + tests/Unit/DocFx/ + tests/Unit/Command/DocFxCommandTest.php + + + + + src + + src/V[!a-zA-Z]* + + + + diff --git a/dev/sh/style b/dev/sh/style deleted file mode 100755 index 3ebb514f22db..000000000000 --- a/dev/sh/style +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash - -set -e - -$(dirname $0)/../../vendor/bin/phpcs --standard=$(dirname $0)/../../phpcs-ruleset.xml -p diff --git a/dev/sh/tests b/dev/sh/tests deleted file mode 100755 index 745e2d85b751..000000000000 --- a/dev/sh/tests +++ /dev/null @@ -1,49 +0,0 @@ -#!/bin/bash - -set -e - -function unit () { - echo "Running Unit Test Suite" - - if [ "${TRAVIS}" == "true" ]; then - # TODO: re-enable code coverage once issues with xdebug and empty - # coverage reports are resolved. - # $(dirname $0)/../../vendor/bin/phpunit --coverage-clover=build/clover.xml - $(dirname $0)/../../vendor/bin/phpunit - else - $(dirname $0)/../../vendor/bin/phpunit - fi -} - -function style() { - echo "Running PHPCS Code Style Checker" - - $(dirname $0)/style -} - -function snippets() { - echo "Running Snippet Test Suite" - - $(dirname $0)/../../vendor/bin/phpunit -c phpunit-snippets.xml.dist --verbose -} - -function composer() { - echo "Running Composer Integration Test" - - $(dirname $0)/../../dev/sh/test-composer -} - -function system () { - echo "Running System Test Suite" - - $(dirname $0)/../../vendor/bin/phpunit -c phpunit-system.xml.dist -} - -style -unit -snippets - -if [ "${TRAVIS_EVENT_TYPE}" == "cron" ]; then - composer - system -fi diff --git a/dev/src/AddComponent/Command/AddComponent.php b/dev/src/AddComponent/Command/AddComponent.php deleted file mode 100644 index 4048ff330458..000000000000 --- a/dev/src/AddComponent/Command/AddComponent.php +++ /dev/null @@ -1,192 +0,0 @@ -setName('component') - ->setDescription('Add a Component'); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - // this is gross. - $this->input = $input; - $this->output = $output; - - $formatter = $this->getHelper('formatter'); - - $info = (new Info( - $this->getHelper('question'), - $input, - $output, - $this->rootPath - ))->run(); - - $output->writeln($formatter->formatSection( - 'License', - 'Creating LICENSE file by copying from repository base.' - )); - - (new License($this->rootPath, $info['path']))->run(); - - $output->writeln($formatter->formatSection( - 'Pull Request Template', - 'Creating .github/pull_request_template.md file by copying from template.' - )); - - (new PullRequestTemplate($this->rootPath, $info['path']))->run(); - - $output->writeln($formatter->formatSection( - 'Contributing Guide', - 'Creating CONTRIBUTING.md file by copying from template.' - )); - - (new Contributing($this->rootPath, $info['path']))->run(); - - $output->writeln($formatter->formatSection( - 'Git Attributes', - 'Creating .gitattributes file by copying from template.' - )); - - (new GitAttributes($this->rootPath, $info['path']))->run(); - - $output->writeln($formatter->formatSection( - 'Test Config', - 'Creating PHPUnit configs by copying from templates.' - )); - - (new TestConfig($this->rootPath, $info['path']))->run(); - - $output->writeln($formatter->formatSection( - 'Readme', - 'README files will be created in the root, and in any "V*" folders. ' . - 'README files are populated using information you already supplied. ' . - 'When a directory does not contain a single entry point, or a main client class, ' . - 'README functions as a main service. ' . - PHP_EOL - )); - - $readme = new Readmes( - $this->getHelper('question'), - $input, - $output, - $this->rootPath, - $info - ); - $readme->run(); - - $output->writeln($formatter->formatSection( - 'Table of Contents', - 'The main service for a directory is what users will see when they first ' . - 'encounter an endpoint in the documentation hierarchy. If a main service ' . - 'is present (as in handwritten clients), that service should be used. ' . - 'If not, choose README.md' . - PHP_EOL - )); - - (new TableOfContents( - $this->getHelper('formatter'), - $this->getHelper('question'), - $input, - $output, - $this->rootPath, - $info['path'] - ))->run($info['name']); - - $output->writeln($formatter->formatSection( - 'Table of Contents', - 'Wrote table of contents data.' . PHP_EOL - )); - - $output->writeln($formatter->formatSection( - 'Composer', - 'The following questions allow us to properly configure the new component ' . - 'for use with PHP\'s package manager, Composer.' - )); - - (new Composer( - $this->getHelper('question'), - $input, - $output, - $this->rootPath, - $info - ))->run(); - - $output->writeln($formatter->formatSection( - 'Docs Manifest', - 'Finally, we need to configure the manifest for the documentation site.' - )); - - (new Manifest( - $this->getHelper('question'), - $input, - $output, - $this->rootPath, - $info - ))->run(); - - $output->writeln(''); - $output->writeln(''); - $output->writeln('Success!'); - $output->writeln( - "All done! Before committing, be sure to complete the following manual steps:\n" - . "1. Add a code sample to /path/to/Folder/README.md" - ); - } - - protected function questionHelper() - { - return $this->getHelper('question'); - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/ComponentTypeTrait.php b/dev/src/AddComponent/ComponentTypeTrait.php deleted file mode 100644 index f6d134423ab2..000000000000 --- a/dev/src/AddComponent/ComponentTypeTrait.php +++ /dev/null @@ -1,46 +0,0 @@ - 'Generated Client only', - 'veneer' => 'Handwritten veneer only', - 'gapic-grpc' => 'Both generated and handwritten, but only generated supports gRPC', - 'both-grpc' => 'Both generated and handwritten, and both clients support gRPC' - ]; - - private function getComponentTypesListValues() - { - return array_values($this->types); - } - - private function getComponentTypeKey($value) - { - return array_search($value, $this->types); - } - - private function getComponentTypeValue($key) - { - return $this->types[$key]; - } -} diff --git a/dev/src/AddComponent/Composer.php b/dev/src/AddComponent/Composer.php deleted file mode 100644 index 58bac8582252..000000000000 --- a/dev/src/AddComponent/Composer.php +++ /dev/null @@ -1,305 +0,0 @@ - "^4.8|^5.0", - "google/cloud-core" => "^1.31", - "phpdocumentor/reflection" => "^3.0" - ]; - - /** - * @var array - */ - private $defaultSuggests = [ - 'ext-grpc' => 'Enables use of gRPC, a universal high-performance RPC framework created by Google.', - 'ext-protobuf' => 'Provides a significant increase in throughput over the pure PHP ' . - 'protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions.' - ]; - - public function __construct( - QuestionHelper $questionHelper, - InputInterface $input, - OutputInterface $output, - $rootPath, - array $info - ) { - $this->questionHelper = $questionHelper; - $this->input = $input; - $this->output = $output; - $this->rootPath = $rootPath; - $this->path = $info['path']; - $this->info = $info; - } - - public function run() - { - $parts = explode('/', $this->path); - $relativePath = array_pop($parts); - - $namespace = $this->ask( - 'Enter the component base namespace, relative to `Google\\Cloud\\`.', - $relativePath - ); - - $gpbMetadataNamespace = $this->ask( - 'Enter the component metadata namespace, relative to `GPBMetadata\\`. ' . - '(e.g. GPBMetadata\\Google\\Cloud\\FooBar). ' . - 'NOTE: This value is often subtly different from the component namespace. ' . - 'Be sure you correctly enter the value, taking care to correctly case characters.', - 'Google\\Cloud\\' . $relativePath - ); - - $this->updateMainComposer($namespace, $gpbMetadataNamespace, $relativePath); - $this->createComponentComposer($namespace, $gpbMetadataNamespace, $relativePath); - } - - private function updateMainComposer($namespace, $gpbMetadataNamespace, $relativePath) - { - $path = $this->rootPath .'/composer.json'; - $composer = json_decode(file_get_contents($path), true); - - // Add `replace` to main composer file. - $composer['replace']['google/'. $this->info['name']] = 'main'; - ksort($composer['replace']); - - // Add namespaces to main composer file. - $composer['autoload']['psr-4']['Google\\Cloud\\' . $namespace .'\\'] = $relativePath . '/src'; - $composer['autoload']['psr-4']['GPBMetadata\\' . $gpbMetadataNamespace .'\\'] = $relativePath . '/metadata'; - $composer['autoload-dev']['psr-4']['Google\\Cloud\\' . $namespace .'\\Tests\\'] = $relativePath . '/tests'; - - ksort($composer['autoload']['psr-4']); - ksort($composer['autoload-dev']['psr-4']); - - file_put_contents($path, json_encode($composer, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)); - } - - private function createComponentComposer($namespace, $gpbMetadataNamespace, $relativePath) - { - $composer = []; - $composer['name'] = 'google/'. $this->info['name']; - $composer['description'] = $this->ask( - 'Enter a description for this component.', - $this->info['display'] .' Client for PHP' - ); - $composer['license'] = 'Apache-2.0'; - $composer['minimum-stability'] = 'stable'; - - $composer['autoload']['psr-4'] = [ - 'Google\\Cloud\\' . $namespace .'\\' => 'src', - 'GPBMetadata\\' . $gpbMetadataNamespace .'\\' => 'metadata' - ]; - $composer['autoload-dev']['psr-4'] = [ - 'Google\\Cloud\\' . $namespace .'\\Tests\\' => 'tests' - ]; - - $target = $this->ask( - 'Enter the remote repository target, relative to the hostname. ' . - 'For `git@github.com:foo/bar.git`, enter `foo/bar.git`.', - 'googleapis/google-cloud-php-'. str_replace('cloud-', '', $this->info['name']) .'.git' - ); - - $entry = $this->ask( - 'Enter the entry service for the component, relative to the folder. ' . - 'For instance, for path `Foo/src/FooClient.php`, enter `src/FooClient.php`. ' . - 'Gapic-only clients should leave this blank.' - ); - - $composer['extra']['component'] = [ - 'id' => $this->info['name'], - 'path' => $relativePath, - 'entry' => $entry ?: null, - 'target' => $target - ]; - - foreach ($this->defaultDeps as $dep) { - $confirm = $this->confirm(sprintf('Should `%s` be required?', $dep)); - if (!$this->askQuestion($confirm)) { - continue; - } - - $version = $this->askForVersion($dep); - - $composer['require'][$dep] = $version; - } - - $hasMoreDependencies = true; - do { - $dep = $this->ask('Enter the next dependency name, or leave blank if done.'); - if (!$dep) { - $hasMoreDependencies = false; - } else { - $version = $this->askForVersion($dep); - - $composer['require'][$dep] = $version; - } - } while ($hasMoreDependencies); - - foreach ($this->defaultDevDeps as $dep => $ver) { - if (array_key_exists('require', $composer) && array_key_exists($dep, $composer['require'])) { - continue; - } - - $confirm = $this->confirm(sprintf('Should `%s` be included in require-dev?', $dep)); - if (!$this->askQuestion($confirm)) { - continue; - } - - if (!isset($composer['require-dev'])) { - $composer['require-dev'] = []; - } - - $composer['require-dev'][$dep] = $ver; - } - - foreach ($this->defaultSuggests as $dep => $val) { - if (array_key_exists('require', $composer) && array_key_exists($dep, $composer['require'])) { - continue; - } - - $confirm = $this->confirm(sprintf('Should `%s` be suggested?', $dep)); - if (!$this->askQuestion($confirm)) { - continue; - } - - if (!isset($composer['suggest'])) { - $composer['suggest'] = []; - } - - $composer['suggest'][$dep] = $val; - } - - file_put_contents( - $this->path .'/composer.json', - json_encode($composer, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL - ); - } - - private function askForVersion($dep) - { - if (strpos($dep, 'ext-') !== false) { - $defaultVersion = '*'; - } else { - $defaultVersion = $this->getLatestVersion($dep); - } - - return $this->ask('Enter the version to require', $defaultVersion); - } - - private function getLatestVersion($dep) - { - $client = new Client; - $uri = 'https://packagist.org/packages/'. $dep .'.json'; - $pkg = $client->request('GET', $uri); - - $versions = json_decode($pkg->getBody(), true)['package']['versions']; - $def = null; - foreach (array_keys($versions) as $v) { - if (strpos($v, 'dev-') !== false) { - continue; - } - - try { - $version = new version($v); - } catch (SemVerException $e) { - continue; - } - - $def = sprintf( - '^%d.%d.0', - $version->getMajor(), - $version->getMinor() - ); - - break; - } - - return $def; - } - - protected function questionHelper() - { - return $this->questionHelper; - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/Contributing.php b/dev/src/AddComponent/Contributing.php deleted file mode 100644 index 9c2123b903a0..000000000000 --- a/dev/src/AddComponent/Contributing.php +++ /dev/null @@ -1,51 +0,0 @@ -rootPath = $rootPath; - $this->path = $path; - } - - public function run() - { - $source = $this->rootPath . '/dev/src/AddComponent/templates/' . self::CONTRIBUTING_TPL; - $dest = $this->path .'/CONTRIBUTING.md'; - - copy($source, $dest); - } -} diff --git a/dev/src/AddComponent/GitAttributes.php b/dev/src/AddComponent/GitAttributes.php deleted file mode 100644 index 3deb4f4b64d2..000000000000 --- a/dev/src/AddComponent/GitAttributes.php +++ /dev/null @@ -1,51 +0,0 @@ -rootPath = $rootPath; - $this->path = $path; - } - - public function run() - { - $source = $this->rootPath . '/dev/src/AddComponent/templates/' . self::ATTRIBUTES_TPL; - $dest = $this->path .'/.gitattributes'; - - copy($source, $dest); - } -} diff --git a/dev/src/AddComponent/Info.php b/dev/src/AddComponent/Info.php deleted file mode 100644 index 637e757d3ec1..000000000000 --- a/dev/src/AddComponent/Info.php +++ /dev/null @@ -1,271 +0,0 @@ -questionHelper = $questionHelper; - $this->input = $input; - $this->output = $output; - $this->rootPath = $rootPath; - } - - public function run() - { - $info = []; - - $info['shortName'] = $this->askShortName(); - - $info['name'] = $this->askComponentName($info); - - $info['display'] = $this->askDisplayName($info); - - $info['cloudPage'] = $this->askCloudPage( - 'Please enter the URI of the service homepage', - sprintf('https://cloud.google.com/%s', $info['shortName']), - $info - ); - - $default = $info['cloudPage'] . '/docs'; - $default = explode('://', $default); - $default[1] = str_replace('//', '/', $default[1]); - - $info['docsPage'] = $this->askCloudPage( - 'Please enter the URI of the documentation homepage', - $default[0] . '://' . $default[1], - $info - ); - - $default = str_replace(' ', '', ucwords(str_replace('-', ' ', $info['shortName']))); - $base = $this->rootPath; - $q = $this->question( - 'Please enter the directory name, relative to the google-cloud-php root, where the component is found. Be sure to verify correct casing.', - $default - )->setValidator(function ($answer) use ($base) { - $path = realpath($base . '/' . $answer); - - if (!is_dir($path)) { - throw new \RuntimeException( - $path .' does not exist or is not a folder.' - ); - } - - return $path; - }); - - $info['path'] = $this->askQuestion($q); - - $defaultType = $this->getComponentTypeValue('gapic'); - $q = $this->choice( - 'What type of component is this?', - $this->getComponentTypesListValues(), - $defaultType - )->setValidator($this->validators([ - $this->defaultChoice($defaultType), - $this->preventEmpty(), - $this->removeDefaultNotice($defaultType), - function ($answer) { - return $this->getComponentTypeKey($answer); - } - ])); - $info['type'] = $this->askQuestion($q); - - $this->output->writeln('Confirm entered data'); - foreach ($info as $key => $val) { - $this->output->writeln(sprintf('%s: %s', $key, $val)); - } - - if (!$this->askQuestion($this->confirm('Does everything look correct? Choosing no will restart the wizard.'))) { - return $this->run(); - } - - return $info; - } - - private function askCloudPage($description, $default, array $info) - { - $default = $this->validUri($default) - ? $default - : null; - - if (!$default) { - $description = $description . ' (could not determine a valid default)'; - } - $q = $this->question( - $description, - $default - )->setValidator($this->validators([ - $this->preventEmpty(), - function ($answer) use ($default) { - if ($answer === $default) { - return $answer; - } - - return $this->uriValidate($answer); - } - ])); - - return $this->askQuestion($q); - } - - private function uriValidate($answer) - { - if (strpos($answer, '://') === false) { - $answer = 'https://'. $answer; - } - - if (strpos($answer, 'http://') !== false) { - $confirm = $this->confirm('You entered http as the protocol. Should we change this to https?'); - - if ($this->askQuestion($confirm)) { - $answer = str_replace('http://', 'https://', $answer); - } - } - - $confirm = $this->confirm('The URI you entered returned a non-200 status code. Would you like to re-enter a different URI?'); - if (!$this->validUri($answer) && $this->askQuestion($confirm)) { - throw new \RuntimeException('Re-enter a new URI'); - } - - return $answer; - } - - private function validUri($uri) - { - $client = new Client; - try { - $res = $client->get($uri); - } catch (RequestException $e) { - return false; - } catch (\Exception $e) { - return true; - } - - return true; - } - - private function askShortName() - { - $q = $this->question( - 'Please enter the component short name. Examples include bigquery, datastore, spanner.' - )->setValidator($this->validators([ - $this->preventEmpty() - ])); - - return $this->askQuestion($q); - } - - private function askComponentName(array $info) - { - $validator = function ($answer) { - $answer = trim($answer); - - if (strpos($answer, 'google/') === 0) { - $answer = str_replace('google/', '', $answer); - } - - if (strpos($answer, 'cloud-') !== 0) { - $confirm = $this->confirm( - 'You entered a non-standard name. Standard name convention is `cloud-`. Accept non-standard name?', - false - ); - - if (!$this->askQuestion($confirm)) { - throw new \RuntimeException('Re-enter a valid name'); - } - } - - return $answer; - }; - - $q = $this->question( - 'Please enter the component name, omitting the vendor', - 'cloud-'. $info['shortName'] - )->setValidator($this->validators([ - $this->preventEmpty(), - $validator - ])); - - return $this->askQuestion($q); - } - - private function askDisplayName(array $info) - { - $name = 'Google '. ucwords(str_replace('-', ' ', $info['name'])); - - - return $this->ask( - 'Please enter the component display name', - $name - ); - } - - protected function questionHelper() - { - return $this->questionHelper; - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/License.php b/dev/src/AddComponent/License.php deleted file mode 100644 index 5363fcba38e1..000000000000 --- a/dev/src/AddComponent/License.php +++ /dev/null @@ -1,49 +0,0 @@ -rootPath = $rootPath; - $this->path = $path; - } - - public function run() - { - $source = $this->rootPath .'/LICENSE'; - $dest = $this->path .'/LICENSE'; - - copy($source, $dest); - } -} diff --git a/dev/src/AddComponent/Manifest.php b/dev/src/AddComponent/Manifest.php deleted file mode 100644 index 38eb64f13cd6..000000000000 --- a/dev/src/AddComponent/Manifest.php +++ /dev/null @@ -1,166 +0,0 @@ -questionHelper = $questionHelper; - $this->input = $input; - $this->output = $output; - $this->rootPath = $rootPath; - $this->path = $info['path']; - $this->info = $info; - } - - public function run() - { - $path = $this->rootPath .'/docs/manifest.json'; - $manifest = json_decode(file_get_contents($path), true); - - $modules = $manifest['modules']; - $matches = array_filter($modules, function ($module) { - return $module['id'] === $this->info['name']; - }); - - if ($matches) { - $continue = $this->ask(sprintf( - 'The component %s alreay exists in the manifest. Continuing will overwrite. Enter "continue" to continue.', - $this->info['name'] - )); - - if (strtolower($continue) !== 'continue') { - $this->output->writeln('skipping further work in docs manifest.'); - return; - } else { - unset($modules[array_keys($matches)[0]]); - } - } - $q = $this->question( - 'Enter the default service. For handwritten clients, this will be the client entry point. ' . - 'For instance, if the service is `Foo/FooClient.php`, enter `FooClient.php`. ' . - 'For Gapic-only clients, the default service is generally the README file.', - 'README.md' - )->setValidator(function ($answer) { - if (!file_exists($this->path .'/'. $answer)) { - throw new \RuntimeException('file does not exist'); - } - - $pathParts = explode('/', $this->path); - $last = array_pop($pathParts); - - $answerParts = explode('.', $answer); - array_pop($answerParts); - return strtolower($last .'/'. implode('.', $answerParts)); - }); - - $defaultService = $this->askQuestion($q); - - $manifestEntry = [ - 'id' => $this->info['name'], - 'name' => 'google/'. $this->info['name'], - 'defaultService' => $defaultService, - 'versions' => ['main'] - ]; - - $modules[] = $manifestEntry; - - $main = $modules[0]; - unset($modules[0]); - - usort($modules, function ($item1, $item2) { - return strcmp($item1['id'], $item2['id']); - }); - - array_unshift($modules, $main); - - $manifest['modules'] = $modules; - - file_put_contents($path, json_encode($manifest, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL); - } - - protected function questionHelper() - { - return $this->questionHelper; - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/PathTrait.php b/dev/src/AddComponent/PathTrait.php deleted file mode 100644 index 18d5f02d3f8d..000000000000 --- a/dev/src/AddComponent/PathTrait.php +++ /dev/null @@ -1,61 +0,0 @@ -GAPIC_PATH_REGEX, $last) === 1; - } - - private function getVersionFromPath($path) - { - $parts = explode('/', $path); - $last = array_pop($parts); - return (preg_match($this->GAPIC_PATH_REGEX, $last) === 1) - ? $last - : null; - } - - private function scanDirectory($path, array $excludes = []) - { - $excludes = ['..', '.', '.DS_Store', 'VERSION', 'LICENSE', 'CONTRIBUTING.md', '.github'] + $excludes; - return array_diff(scandir($path), $excludes); - } - - private function directoryHasPhpFile(array $choices) - { - $res = false; - foreach ($choices as $choice) { - $res = strpos($choice, '.php') !== false; - if ($res) { - return $res; - } - } - - return $res; - } -} diff --git a/dev/src/AddComponent/PullRequestTemplate.php b/dev/src/AddComponent/PullRequestTemplate.php deleted file mode 100644 index 0bbd50575cf5..000000000000 --- a/dev/src/AddComponent/PullRequestTemplate.php +++ /dev/null @@ -1,55 +0,0 @@ -rootPath = $rootPath; - $this->path = $path; - } - - public function run() - { - $source = $this->rootPath . '/dev/src/AddComponent/templates/template-pull_request_template.md.txt'; - $dir = $this->path .'/.github'; - $dest = $dir . '/pull_request_template.md'; - @mkdir($dir); - - $pathParts = explode('/', $this->path); - $template = file_get_contents($source); - $template = str_replace('{clientBase}', array_pop($pathParts), $template); - - file_put_contents($dest, $template); - } -} diff --git a/dev/src/AddComponent/Readmes.php b/dev/src/AddComponent/Readmes.php deleted file mode 100644 index 09fe830b3937..000000000000 --- a/dev/src/AddComponent/Readmes.php +++ /dev/null @@ -1,172 +0,0 @@ -questionHelper = $questionHelper; - $this->input = $input; - $this->output = $output; - $this->rootPath = $rootPath; - $this->info = $info; - - $this->templatesPath = $this->rootPath .'/dev/src/AddComponent/templates'; - } - - public function run() - { - $this->createReadmes($this->info['path']); - } - - /** - * Recursively search for paths that contain /V*, and create a minimal generated client readme. - * @param $path - */ - private function createReadmesInGeneratedClientRoot($path) - { - if ($this->pathIsGapic($path)) { - $questionText = sprintf('%s ' . PHP_EOL . 'Create README.md?', $path); - $q = $this->confirm($questionText); - $create = $this->askQuestion($q); - if ($create) { - $file = $path .'/README.md'; - $content = file_get_contents($this->templatesPath .'/'. self::README_GEN_CLIENT_TPL); - - $content = str_replace('{notice}', file_get_contents( - $this->templatesPath .'/'. sprintf(self::GRPC_NOTICE_TPL, $this->info['type']) - ), $content); - $content = str_replace('{display}', $this->info['display'], $content); - $content = str_replace('{version}', $this->getVersionFromPath($path), $content); - - file_put_contents($file, $content); - } - return; - } - - $files = $this->scanDirectory($path); - foreach ($files as $file) { - $file = $path .'/'. $file; - if (is_dir($file)) { - $this->createReadmesInGeneratedClientRoot($file); - } - } - } - - private function createReadmes($path) - { - $files = $this->scanDirectory($path); - if (!in_array('README.md', $files)) { - $questionText = sprintf('%s '. PHP_EOL .'Create README.md?', $path); - $q = $this->confirm($questionText); - $create = $this->askQuestion($q); - - if ($create) { - $file = $path .'/README.md'; - $content = file_get_contents($this->templatesPath .'/'. self::README_TPL); - - $content = str_replace('{notice}', file_get_contents( - $this->templatesPath .'/'. sprintf(self::GRPC_NOTICE_TPL, $this->info['type']) - ), $content); - $content = str_replace('{display}', $this->info['display'], $content); - $content = str_replace('{homepage}', $this->info['cloudPage'], $content); - $content = str_replace('{docspage}', $this->info['docsPage'], $content); - $content = str_replace('{name}', $this->info['name'], $content); - $content = str_replace('{client}', 'readme', $content); - $content = str_replace('{directory}', strtolower(basename($this->info['path'])), $content); - - file_put_contents($file, $content); - } - } - - foreach ($files as $file) { - $file = $path .'/'. $file; - if (is_dir($file)) { - $this->createReadmesInGeneratedClientRoot($file); - } - } - } - - protected function questionHelper() - { - return $this->questionHelper; - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/TableOfContents.php b/dev/src/AddComponent/TableOfContents.php deleted file mode 100644 index 0d1f1d06ec63..000000000000 --- a/dev/src/AddComponent/TableOfContents.php +++ /dev/null @@ -1,344 +0,0 @@ -formatter = $formatter; - $this->questionHelper = $questionHelper; - $this->input = $input; - $this->output = $output; - $this->rootPath = $rootPath; - $this->path = $path; - } - - public function run($name) - { - $toc = $this->buildTopLevelToc($this->path); - $this->writeToc($name, $toc); - - $this->addToIncludes($name); - } - - private function stripDirectories($path, array $files) - { - foreach ($files as $i => $file) { - if (is_dir($path .'/'. $file)) { - unset($files[$i]); - } - } - - return array_values($files); - } - - private function buildToc($path) - { - $this->output->writeln($this->formatter->formatSection( - 'Table of Contents', - sprintf('Working in directory `%s`', realpath($path)) . PHP_EOL - )); - - $files = $this->scanDirectory($path); - - if (strpos($path, 'Gapic') !== false || strpos($path, 'resources') !== false) { - return []; - } - - $choices = $this->stripDirectories($path, array_values($files)); - - if (count($choices) === 0) { - // No choices, so instead skip to iterating over subdirs - $this->output->writeln($this->formatter->formatSection( - 'Table of Contents', - sprintf('Eliding directory with no files:`%s`', realpath($path)) . PHP_EOL - )); - $tocs = []; - foreach ($files as $file) { - if (is_dir($path .'/'. $file)) { - $tocs = array_merge($tocs, $this->buildToc($path .'/'. $file)); - } - } - return $tocs; - } - - $q = $this->buildMainServiceQuestion($choices); - - $mainSelection = $this->askQuestion($q); - if ($mainSelection === self::SKIP_TEXT) { - return []; - } - - $entries = $this->buildSingleTocEntry(new \SplFileInfo($mainSelection), $path, true); - if (count($entries) !== 1) { - throw new \RuntimeException("Unexpected number of entries for main: $mainSelection"); - } - $main = $entries[0]; - - $services = $this->buildServices($path, $files, [$mainSelection, 'README.md']); - - $parent = $this->calculateParent($main['type']); - $pattern = $parent .'/\w{1,}'; - - $main['nav'] = $services; - $main['patterns'] = [$pattern]; - return [$main]; - } - - private function buildTopLevelToc($path) - { - $this->output->writeln($this->formatter->formatSection( - 'Table of Contents', - sprintf('Working in directory `%s`', realpath($path)) . PHP_EOL - )); - - $files = $this->scanDirectory($path); - $choices = $this->stripDirectories($path, array_values($files)); - $q = $this->buildMainServiceQuestion($choices); - $mainSelection = $this->askQuestion($q); - if ($mainSelection === self::SKIP_TEXT) { - return []; - } - - $entries = $this->buildSingleTocEntry(new \SplFileInfo($mainSelection), $path, true); - if (count($entries) !== 1) { - throw new \RuntimeException("Unexpected number of entries for main: $mainSelection"); - } - $main = $entries[0]; - - $services = []; - $services[] = [ - 'title' => 'Overview', - 'type' => $main['type'] - ]; - - $services = array_merge($services, $this->buildServices($path, $files, [$mainSelection, 'README.md'])); - - $parent = $this->calculateParent($services[0]['type']); - $pattern = $parent .'/\w{1,}'; - - $main['defaultService'] = $main['type']; - $main['services'] = $services; - $main['pattern'] = $pattern; - unset($main['type']); - - return $main; - } - - private function buildServices($path, $files, $exclude = []) - { - foreach ($exclude as $ex) { - $i = array_search($ex, $files); - unset($files[$i]); - } - - $services = []; - foreach ($files as $file) { - $services = array_merge($services, $this->buildSingleTocEntry(new \SplFileInfo($file), $path)); - } - return $services; - } - - private function calculateParent($child) - { - $parts = explode('/', $child); - array_pop($parts); - return implode('/', $parts); - } - - private function buildMainServiceQuestion($choices) - { - $choices[] = self::SKIP_TEXT; - - $default = null; - foreach ($choices as $index => &$choice) { - if ($choice === 'README.md') { - $default = $index; - $choice = 'README.md' . self::SUGGESTION_TEXT; - } - } - - $setDefault = function ($answer) use ($default) { - if (empty($answer) && $answer !== 0 && $answer !== '0' && $default !== null) { - return (string) $default; - } - - return $answer; - }; - - $validator = function ($answer) use ($choices) { - if (!array_key_exists((int)$answer, $choices)) { - throw new \RuntimeException('Invalid selection.'); - } - - $answer = $choices[$answer]; - if ($answer === 'README.md' . self::SUGGESTION_TEXT) { - $answer = 'README.md'; - } - - return $answer; - }; - - return $this->choice('Please select the main service.', $choices) - ->setValidator($this->validators([ - $setDefault, - $this->preventEmpty(), - $validator, - ])); - } - - private function buildSingleTocEntry(\SplFileInfo $file, $path, $isMain = false) - { - if (is_dir($path .'/'. $file)) { - return $this->buildToc($path .'/'. $file); - } - - $file = new \SplFileInfo($file); - if (!in_array($file->getExtension(), ['php', 'md'])) { - return []; - } - - $file = trim($file, '/'); - - if (!$isMain) { - $q = $this->confirm(sprintf('Should %s be included in the table of contents?', $file)); - $include = $this->askQuestion($q); - if (!$include) { - return []; - } - } - - $withoutExt = explode('.', $file)[0]; - $base = trim(substr($path, strlen($this->rootPath)), '/'); - - if (strpos($file, 'README.md') !== false) { - $parts = explode('/', $path); - $last = array_pop($parts); - - if ($this->pathIsGapic($path)) { - $last = strtolower($last); - } - $suggestedTitle = $last; - } else { - $suggestedTitle = basename($withoutExt); - } - - $title = $this->ask('Enter the service title', $suggestedTitle); - $type = $this->removeSrcDir(strtolower($base .'/'. $withoutExt)); - - return [[ - 'title' => $title, - 'type' => $type, - ]]; - } - - private function removeSrcDir($type) - { - $parts = explode('/', $type); - $i = array_search('src', $parts); - if ($i !== false) { - unset($parts[$i]); - } - return implode('/', $parts); - } - - private function writeToc($name, array $toc) - { - $path = $this->rootPath .'/'. self::TOC_PATH .'/'. $name .'.json'; - file_put_contents($path, json_encode($toc, JSON_PRETTY_PRINT) . PHP_EOL); - } - - private function addToIncludes($name) - { - $path = $this->rootPath .'/'. self::TOC_PATH .'/google-cloud.json'; - $toc = json_decode(file_get_contents($path), true); - $toc['includes'][] = $name; - sort($toc['includes']); - $toc['includes'] = array_unique($toc['includes']); - - $this->writeToc('google-cloud', $toc); - } - - protected function questionHelper() - { - return $this->questionHelper; - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } -} diff --git a/dev/src/AddComponent/TestConfig.php b/dev/src/AddComponent/TestConfig.php deleted file mode 100644 index 981eb38ca52a..000000000000 --- a/dev/src/AddComponent/TestConfig.php +++ /dev/null @@ -1,57 +0,0 @@ -rootPath = $rootPath; - $this->path = $path; - } - - public function run() - { - $files = [ - 'phpunit.xml.dist', - 'phpunit-snippets.xml.dist', - 'phpunit-system.xml.dist' - ]; - - foreach ($files as $file) { - $source = $this->rootPath . '/dev/src/AddComponent/templates/template-' . $file . '.txt'; - $dest = $this->path . '/' . $file; - - copy($source, $dest); - } - } -} diff --git a/dev/src/AddComponent/templates/template-README.md-both-grpc.txt b/dev/src/AddComponent/templates/template-README.md-both-grpc.txt deleted file mode 100644 index 7cf87801595c..000000000000 --- a/dev/src/AddComponent/templates/template-README.md-both-grpc.txt +++ /dev/null @@ -1,3 +0,0 @@ - -This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits offered by gRPC (such as streaming methods) -please see our [gRPC installation guide](https://cloud.google.com/php/grpc). diff --git a/dev/src/AddComponent/templates/template-README.md-gapic-grpc.txt b/dev/src/AddComponent/templates/template-README.md-gapic-grpc.txt deleted file mode 100644 index 7cf87801595c..000000000000 --- a/dev/src/AddComponent/templates/template-README.md-gapic-grpc.txt +++ /dev/null @@ -1,3 +0,0 @@ - -This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits offered by gRPC (such as streaming methods) -please see our [gRPC installation guide](https://cloud.google.com/php/grpc). diff --git a/dev/src/AddComponent/templates/template-README.md-gapic.txt b/dev/src/AddComponent/templates/template-README.md-gapic.txt deleted file mode 100644 index 7cf87801595c..000000000000 --- a/dev/src/AddComponent/templates/template-README.md-gapic.txt +++ /dev/null @@ -1,3 +0,0 @@ - -This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits offered by gRPC (such as streaming methods) -please see our [gRPC installation guide](https://cloud.google.com/php/grpc). diff --git a/dev/src/AddComponent/templates/template-README.md-generated-client.txt b/dev/src/AddComponent/templates/template-README.md-generated-client.txt deleted file mode 100644 index ffd1fff1be5d..000000000000 --- a/dev/src/AddComponent/templates/template-README.md-generated-client.txt +++ /dev/null @@ -1,6 +0,0 @@ -# {display} {version} generated client for PHP - -### Sample - -```php -``` diff --git a/dev/src/AddComponent/templates/template-README.md-veneer.txt b/dev/src/AddComponent/templates/template-README.md-veneer.txt deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/dev/src/AddComponent/templates/template-README.md.txt b/dev/src/AddComponent/templates/template-README.md.txt deleted file mode 100644 index 843e51264f71..000000000000 --- a/dev/src/AddComponent/templates/template-README.md.txt +++ /dev/null @@ -1,45 +0,0 @@ -# {display} for PHP - -> Idiomatic PHP client for [{display}]({homepage}). - -[![Latest Stable Version](https://poser.pugx.org/google/{name}/v/stable)](https://packagist.org/packages/google/{name}) [![Packagist](https://img.shields.io/packagist/dm/google/{name}.svg)](https://packagist.org/packages/google/{name}) - -* [API documentation](https://cloud.google.com/php/docs/reference/{name}/latest) - -**NOTE:** This repository is part of [Google Cloud PHP](https://github.com/googleapis/google-cloud-php). Any -support requests, bug reports, or development contributions should be directed to -that project. - -### Installation - -To begin, install the preferred dependency manager for PHP, [Composer](https://getcomposer.org/). - -Now to install just this component: - -```sh -$ composer require google/{name} -``` - -Or to install the entire suite of components at once: - -```sh -$ composer require google/cloud -``` -{notice} -### Authentication - -Please see our [Authentication guide](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md) for more information -on authenticating your client. Once authenticated, you'll be ready to start making requests. - -### Sample - -```php -``` - -### Version - -This component is considered alpha. As such, it is still a work-in-progress and is more likely to get backwards-incompatible updates. - -### Next Steps - -1. Understand the [official documentation]({docspage}). diff --git a/dev/src/AddComponent/templates/template-gitattributes.txt b/dev/src/AddComponent/templates/template-gitattributes.txt deleted file mode 100644 index d43b60862bcf..000000000000 --- a/dev/src/AddComponent/templates/template-gitattributes.txt +++ /dev/null @@ -1,3 +0,0 @@ -/*.xml.dist export-ignore -/tests export-ignore -/.github export-ignore diff --git a/dev/src/Command/AddComponentCommand.php b/dev/src/Command/AddComponentCommand.php new file mode 100644 index 000000000000..4bf0690ec75f --- /dev/null +++ b/dev/src/Command/AddComponentCommand.php @@ -0,0 +1,195 @@ +rootPath = realpath($rootPath); + parent::__construct(); + } + + protected function configure() + { + $this->setName('add-component') + ->setDescription('Add a Component') + ->addArgument('proto', InputArgument::REQUIRED, 'Path to service proto.'); + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $proto = $input->getArgument('proto'); + $new = NewComponent::fromProto($this->loadProtoContent($proto), $proto); + $new->componentPath = $this->rootPath . '/' . $new->componentName; + + $output->writeln(''); // blank line + $output->writeln(sprintf('Your package (%s) will have the following info:', $proto)); + + $f = fn($f, $v) => ["$f", $v]; + $newArray = (array) $new; + + (new Table($output)) + ->setRows(array_map($f, array_keys($newArray), $newArray)) + ->render(); + + while ( + !$this->getHelper('question')->ask( + $input, + $output, + new ConfirmationQuestion('Does this information look correct? ("n" to customize) [Y/n] ', 'Y') + ) + ) { + foreach ($new as $field => $val) { + $new->$field = $this->getHelper('question')->ask( + $input, + $output, + new Question(sprintf('What is the %s? (ENTER for "%s") ', $field, $val), $val) + ); + } + $newArray = (array) $new; + (new Table($output)) + ->setRows(array_map($f, array_keys($newArray), $newArray)) + ->render(); + } + + $productHomepage = $this->getHelper('question')->ask( + $input, + $output, + new Question('What is the product homepage? ') + ); + + $productDocumentation = $this->getHelper('question')->ask( + $input, + $output, + new Question('What is the product documentation URL? ') + ); + + $documentationUrl = $new->getDocumentationUrl(); + + // Make the component dir if it doesn't exist + if (!is_dir($new->componentPath)) { + if (!mkdir($new->componentPath, 0777, true)) { + throw new \Exception('Unable to make Component dir: ' . $new->componentPath); + } + } + + // Copy over static files + $filesystem = new Filesystem(); + foreach (self::COPY_FILES as $file) { + $output->writeln(sprintf('%s Creating %s by copying from template dir.', $file, $file)); + $filesystem->copy(self::TEMPLATE_DIR . '/' . $file, $new->componentPath . '/' . $file); + } + + // Render twig templates + $loader = new FilesystemLoader(self::TEMPLATE_DIR); + $twig = new Environment($loader); + foreach (self::TEMPLATE_FILES as $template) { + $file = str_replace('.twig', '', $template); + $output->writeln(sprintf('%s Creating %s from twig template.', $file, $file)); + $filesystem->dumpFile($new->componentPath . '/' . $file, $twig->render($template, [ + 'name' => $new->displayName, + 'component' => $new->componentName, + 'package' => $new->composerPackage, + 'repo' => $new->githubRepo, + 'proto_path' => $new->protoPath, + 'version' => $new->version, + 'documentation' => $documentationUrl, + 'product_homepage' => $productHomepage, + 'product_documentation' => $productDocumentation, + ])); + } + + // Write repo metadata JSON + $output->writeln(' Writing .repo-metadata.json'); + $repoMetadata = [ + 'distribution_name' => $new->composerPackage, + 'release_level' => 'preview', + 'client_documentation' => $documentationUrl, + 'library_type' => 'GAPIC_AUTO', + 'api_shortname' => $new->shortName + ]; + $contents = json_encode($repoMetadata, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + $filesystem->dumpFile($new->componentPath . '/.repo-metadata.json', $contents . PHP_EOL); + + // Write composer file + $output->writeln('Composer Updating root composer.json and creating component composer.json'); + $composer = new Composer( + $new->componentPath, + $new->composerPackage, + $new->phpNamespace, + $new->gpbMetadataNamespace + ); + $composer->updateMainComposer(); + $composer->createComponentComposer($new->displayName, $new->githubRepo); + + $output->writeln(''); + $output->writeln(''); + $output->writeln('Success!'); + } + + private function loadProtoContent(string $proto): string + { + $protoUrl = 'https://raw.githubusercontent.com/googleapis/googleapis/master/' . $proto; + $client = new Client(); + $response = $client->get($protoUrl); + return (string) $response->getBody(); + } +} diff --git a/dev/src/Command/ComponentInfoCommand.php b/dev/src/Command/ComponentInfoCommand.php new file mode 100644 index 000000000000..da24df420fc4 --- /dev/null +++ b/dev/src/Command/ComponentInfoCommand.php @@ -0,0 +1,135 @@ +setName('component-info') + ->setDescription('list info of a component or the whole library') + ->addArgument('name', InputArgument::OPTIONAL, 'Component to check compliance for.') + ->addOption('csv', '', InputOption::VALUE_REQUIRED, 'export findings to csv.') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $components = []; + $components[] = [ + 'Component', + 'Composer package', + 'GitHub repo', + 'PHP namespace', + 'Protobuf package', + ]; + $verbose = $input->getOption('verbose'); + if ($verbose) { + $components[0][] = 'Validation errors'; + } + if ($componentName = rtrim($input->getArgument('name'), '/')) { + $components[] = $this->checkComponent(new Component($componentName), $verbose); + } else { + foreach (Component::getComponents() as $component) { + $components[] = $this->checkComponent($component, $verbose); + } + } + + if ($csv = $input->getOption('csv')) { + $fp = fopen($csv, 'wa+'); + foreach ($components as $component) { + fputcsv($fp, $component); + } + fclose($fp); + $output->writeln('Output written to ' . $csv); + } else { + $table = new Table($output); + $table + ->setHeaders(array_shift($components)) + ->setRows($components) + ; + $table->render(); + } + } + + private function checkComponent(Component $component, bool $verbose): array + { + $protobufPackage = ''; + $githubRepo = $component->getRepoName(); + $composerPackage = $component->getPackageName(); + $phpNamespace = $component->getNamespaces()[0]; + $componentName = $component->getName(); + $validationErrors = []; + $expectedNamespace = ''; + try { + $protobufPackage = $component->getProtoPackage($this->googleapisDir); + } catch (\Exception $e) { + $validationErrors[] = $e->getMessage(); + } + + if ($verbose && $protobufPackage) { + $namer = new ComponentNamer($protobufPackage); + // Output validation errors + $expectedComposerPackage = $namer->getComposerPackage(); + $expectedGithubRepo = $namer->getGithubRepo(); + $expectedNamespace = $namer->getPhpNamespace(); + if ($expectedGithubRepo !== $githubRepo) { + $validationErrors[] = "Github repo name $githubRepo doesn't match expected $expectedGithubRepo"; + } + if ($expectedComposerPackage !== $composerPackage) { + $validationErrors[] = "Composer package name $composerPackage doesn't match expected $expectedComposerPackage"; + } + + $expectedComponentName = $namer->getComponentName(); + if (strtolower($componentName) !== strtolower($expectedComponentName)) { + $validationErrors[] = "Component $componentName doesn't match expected $expectedComponentName"; + } + + $expectedNamespace = $namer->getPhpNamespace(); + if (strtolower($expectedNamespace) !== strtolower($phpNamespace)) { + $validationErrors[] = "PHP namespace $phpNamespace doesn't match expected $expectedNamespace"; + } + } + + $info = [ + $componentName, + $composerPackage, + $githubRepo, + $phpNamespace, + $protobufPackage, + ]; + if ($verbose) { + $info[] = implode("\n", $validationErrors); + } + return $info; + } +} \ No newline at end of file diff --git a/dev/src/DocFx/Command/DocFx.php b/dev/src/Command/DocFxCommand.php similarity index 55% rename from dev/src/DocFx/Command/DocFx.php rename to dev/src/Command/DocFxCommand.php index 1c88e731cd5d..0728aaa69358 100644 --- a/dev/src/DocFx/Command/DocFx.php +++ b/dev/src/Command/DocFxCommand.php @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\DocFx\Command; +namespace Google\Cloud\Dev\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; @@ -27,8 +27,12 @@ use RuntimeException; use Google\Cloud\Dev\DocFx\Page\PageTree; use Google\Cloud\Dev\DocFx\Page\OverviewPage; +use Google\Cloud\Dev\Component; -class DocFx extends Command +/** + * @internal + */ +class DocFxCommand extends Command { private array $composerJson; private array $repoMetadataJson; @@ -57,16 +61,15 @@ protected function execute(InputInterface $input, OutputInterface $output) throw new RuntimeException('This command must be run on PHP 8.0 or above'); } - $component = $input->getOption('component') ?: basename(getcwd()); - $componentPath = $input->getOption('component-path') ?: $this->getComponentPath($component); - $this->validateComponentFiles($componentPath, $component); - $output->writeln(sprintf('Generating documentation for %s', $component)); + $componentName = $input->getOption('component') ?: basename(getcwd()); + $component = new Component($componentName, $input->getOption('component-path')); + $output->writeln(sprintf('Generating documentation for %s', $componentName)); $xml = $input->getOption('xml'); $outDir = $input->getOption('out'); if (empty($xml)) { $output->write('Running phpdoc to generate structure.xml... '); // Run "phpdoc" - $process = self::getPhpDocCommand($componentPath, $outDir); + $process = self::getPhpDocCommand($component->getPath(), $outDir); $process->mustRun(); $output->writeln('Done.'); $xml = $outDir . '/structure.xml'; @@ -90,13 +93,13 @@ protected function execute(InputInterface $input, OutputInterface $output) $flags = Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK; $tocItems = []; - $packageDescription = $this->getPackageDescription(); - foreach ($this->getNamespaces() as $namespace) { + $packageDescription = $component->getDescription(); + foreach ($component->getNamespaces() as $namespace) { $pageTree = new PageTree( $xml, $namespace, $packageDescription, - $componentPath + $component->getPath() ); foreach ($pageTree->getPages() as $page) { @@ -114,8 +117,8 @@ protected function execute(InputInterface $input, OutputInterface $output) $tocItems = array_merge($tocItems, $pageTree->getTocItems()); } - $releaseLevel = $this->getReleaseLevel(); - if (file_exists($overviewFile = sprintf('%s/README.md', $componentPath))) { + $releaseLevel = $component->getReleaseLevel(); + if (file_exists($overviewFile = sprintf('%s/README.md', $component->getPath()))) { $overview = new OverviewPage( file_get_contents($overviewFile), $releaseLevel !== 'stable' @@ -128,8 +131,8 @@ protected function execute(InputInterface $input, OutputInterface $output) // Write the TOC to a file $componentToc = array_filter([ - 'uid' => $this->getComponentUid(), - 'name' => $this->getDistributionName(), + 'uid' => $component->getReferenceDocumentationUid(), + 'name' => $component->getPackageName(), 'status' => $releaseLevel !== 'stable' ? 'beta' : '', 'items' => $tocItems, ]); @@ -143,13 +146,13 @@ protected function execute(InputInterface $input, OutputInterface $output) $output->write(sprintf('Writing docs.metadata with version %s... ', $metadataVersion)); $process = new Process([ 'docuploader', 'create-metadata', - '--name', str_replace('google/', '', $this->getDistributionName()), + '--name', str_replace('google/', '', $component->getPackageName()), '--version', $metadataVersion, '--language', 'php', - '--distribution-name', $this->getDistributionName(), - '--product-page', $this->getProductDocumentation(), - '--github-repository', $this->getRepo(), - '--issue-tracker', $this->getIssueTracker(), + '--distribution-name', $component->getPackageName(), + '--product-page', $component->getProductDocumentation(), + '--github-repository', $component->getRepoName(), + '--issue-tracker', $component->getIssueTracker(), $outDir . '/docs.metadata' ]); $process->mustRun(); @@ -187,128 +190,4 @@ public static function getPhpDocCommand(string $componentPath, string $outDir): $outDir ]); } - - private function getComponentPath(string $component): string - { - $rootDir = __DIR__ . '/../../../../'; - - $components = scandir($rootDir); - foreach ($components as $i => $c) { - if (!is_dir($rootDir . $c) || !preg_match('/^[A-Z]/', $c)) { - unset($components[$i]); - } - } - if (!in_array($component, $components)) { - throw new \Exception($component ? 'Invalid component provided: ' . $component - : 'You are not in a component directory. Run this command from a valid component' - . ' directory or provide a valid component using the "component" option.'); - } - - $componentPath = realpath(sprintf(__DIR__ . '/../../../../%s', $component)); - - if (!is_dir($componentPath)) { - throw new RuntimeException(sprintf('component "%s" not found', $component)); - } - - return $componentPath; - } - - private function validateComponentFiles(string $componentPath, string $component) - { - $composerPath = $componentPath . '/composer.json'; - if (!file_exists($composerPath)) { - throw new RuntimeException(sprintf('composer.json not found for component "%s"', $component)); - } - if (!$this->composerJson = json_decode(file_get_contents($composerPath), true)) { - throw new RuntimeException(sprintf('Invalid composer.json for component "%s"', $component)); - } - - $repoMetadataPath = $componentPath . '/.repo-metadata.json'; - if (!file_exists($repoMetadataPath)) { - throw new RuntimeException(sprintf('repo metadata not found for component "%s"', $component)); - } - if (!$this->repoMetadataJson = json_decode(file_get_contents($repoMetadataPath), true)) { - throw new RuntimeException(sprintf('Invalid .repo-metadata.json for component "%s"', $component)); - } - } - - private function getReleaseLevel(): string - { - if (empty($this->repoMetadataJson['release_level'])) { - throw new RuntimeException(sprintf( - 'repo metadata does not contain "release_level" for component "%s"', - $component - )); - } - - return $this->repoMetadataJson['release_level']; - } - - private function getProductDocumentation(): string - { - return $this->repoMetadataJson['product_documentation'] ?? ''; - } - - private function getDistributionName(): string - { - if (empty($this->composerJson['name'])) { - throw new RuntimeException('composer.json does not contain "name"'); - } - return $this->composerJson['name']; - } - - /** - * Formats distribution name like - * - google-cloud-policy-troubleshooter - * - google-cloud-vision - * - google-grafeas - * - google-analytics-data - */ - private function getComponentUid(): string - { - return str_replace('/', '-', $this->getDistributionName()); - } - - private function getPackageDescription(): string - { - if (empty($this->composerJson['description'])) { - throw new RuntimeException('composer.json does not contain "description"'); - } - return $this->composerJson['description']; - } - - private function getNamespaces(): array - { - if (empty($this->composerJson['autoload']['psr-4'])) { - throw new RuntimeException('composer does not contain autoload.psr-4'); - } - - $namespaces = []; - foreach ($this->composerJson['autoload']['psr-4'] as $namespace => $dir) { - if (0 === strpos($dir, 'src')) { - $namespaces[] = rtrim($namespace, '\\'); - } - } - - if (empty($namespaces)) { - throw new RuntimeException('composer autoload.psr-4 does not contain a namespace'); - } - - return $namespaces; - } - - private function getRepo(): string - { - if (empty($this->composerJson['extra']['component']['target'])) { - throw new RuntimeException('composer does not contain extra.component.target'); - } - - // Strip trailing ".git" - return preg_replace('/\.git$/', '', $this->composerJson['extra']['component']['target']); - } - - private function getIssueTracker(): string - { - return sprintf('https://github.com/%s/issues', $this->getRepo()); - } } diff --git a/dev/src/Command/GoogleCloudCommand.php b/dev/src/Command/GoogleCloudCommand.php deleted file mode 100644 index 15fd1f9d63ed..000000000000 --- a/dev/src/Command/GoogleCloudCommand.php +++ /dev/null @@ -1,34 +0,0 @@ -rootPath = $rootPath; - - parent::__construct(); - } -} diff --git a/dev/src/Release/Release.php b/dev/src/Command/ReleaseCommand.php similarity index 95% rename from dev/src/Release/Release.php rename to dev/src/Command/ReleaseCommand.php index 345918c212bd..27e3f4e3f6c9 100644 --- a/dev/src/Release/Release.php +++ b/dev/src/Command/ReleaseCommand.php @@ -15,17 +15,20 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Release; +namespace Google\Cloud\Dev\Command; -use Google\Cloud\Dev\Command\GoogleCloudCommand; use Google\Cloud\Dev\ComponentVersionTrait; use RuntimeException; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use vierbergenlars\SemVer\version; -class Release extends GoogleCloudCommand +/** + * @internal + */ +class ReleaseCommand extends Command { use ComponentVersionTrait; @@ -44,13 +47,15 @@ class Release extends GoogleCloudCommand 'major', 'minor', 'patch' ]; + private $rootPath; + public function __construct($rootPath) { $this->manifest = sprintf(self::PATH_MANIFEST, $rootPath); $this->defaultComponentComposer = sprintf(self::DEFAULT_COMPONENT_COMPOSER, $rootPath); $this->components = sprintf(self::COMPONENT_BASE, $rootPath); - - parent::__construct($rootPath); + $this->rootPath = $rootPath; + parent::__construct(); } protected function configure() diff --git a/dev/src/Split/Command.php b/dev/src/Command/SplitCommand.php similarity index 79% rename from dev/src/Split/Command.php rename to dev/src/Command/SplitCommand.php index 946d1434d255..a379dbea6d8e 100644 --- a/dev/src/Split/Command.php +++ b/dev/src/Command/SplitCommand.php @@ -15,11 +15,16 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; - -use Google\Cloud\Dev\Command\GoogleCloudCommand; -use Google\Cloud\Dev\ComponentManager; +namespace Google\Cloud\Dev\Command; + +use Google\Cloud\Dev\Component; +use Google\Cloud\Dev\GitHub; +use Google\Cloud\Dev\ReleaseNotes; +use Google\Cloud\Dev\RunShell; +use Google\Cloud\Dev\Split; +use Google\Cloud\Dev\SplitInstall; use GuzzleHttp\Client; +use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -30,27 +35,19 @@ * * @internal */ -class Command extends GoogleCloudCommand +class SplitCommand extends Command { const PARENT_TAG_NAME = 'https://github.com/%s/releases/tag/%s'; const EXEC_DIR = '.split'; - - /** - * @var ComponentManager - */ - private $componentManager; + const TOKEN_ENV = 'GH_OAUTH_TOKEN'; /** * @param string $rootPath The path to the repository root directory. - * @param ComponentManager $componentManaher An instance of the Component - * Manager. */ - public function __construct($rootPath, ComponentManager $componentManager) + public function __construct($rootPath) { - parent::__construct($rootPath); - $this->rootPath = realpath($rootPath); - $this->componentManager = $componentManager; + parent::__construct(); } /** @@ -92,6 +89,12 @@ protected function configure() 'c', InputOption::VALUE_OPTIONAL, 'Split and release only a single component.' + ) + ->addOption( + 'update-release-notes', + '', + InputOption::VALUE_NONE, + 'Update the release notes if the release already exists.' ); } @@ -104,17 +107,13 @@ protected function configure() */ protected function execute(InputInterface $input, OutputInterface $output) { - if (PHP_VERSION_ID < 50600) { - throw new \RuntimeException('This command is only available in PHP 5.6 and later.'); - } - $output->writeln("[INFO]: Parent repository: " . $input->getArgument('repo')); $output->writeln("[INFO]: Parent tag: " . $input->getArgument('parent')); $execDir = $this->rootPath . '/' . self::EXEC_DIR; $token = $this->githubToken($input->getOption('token')); - $shell = new RunShell; + $shell = new RunShell(); $guzzle = $this->guzzleClient(); $github = $this->githubClient($output, $shell, $guzzle, $token); $split = $this->splitWrapper($output, $shell); @@ -123,15 +122,24 @@ protected function execute(InputInterface $input, OutputInterface $output) $splitBinaryPath = $this->splitshInstall($output, $shell, $execDir, $input->getOption('splitsh')); - $componentId = $input->getOption('component'); - $components = $this->componentManager->componentsExtra($componentId); + $changelog = $github->getChangelog( + $input->getArgument('repo'), + $input->getArgument('parent') + ); - // remove umbrella component. - $components = array_filter($components, function ($component, $key) { - return $key !== 'google-cloud'; - }, ARRAY_FILTER_USE_BOTH); + $releaseNotes = new ReleaseNotes($changelog); - $manifestPath = $this->rootPath . '/docs/manifest.json'; + if ($componentId = $input->getOption('component')) { + $components = [new Component($componentId)]; + } else { + // Build a list of components to update based on the release notes + $components = []; + foreach (Component::getComponents() as $component) { + if ($releaseNotes->get($component->getId())) { + $components[] = $component; + } + } + } $parentTagSource = sprintf( self::PARENT_TAG_NAME, @@ -139,12 +147,6 @@ protected function execute(InputInterface $input, OutputInterface $output) $input->getArgument('parent') ); - $changelog = $github->getChangelog( - $input->getArgument('repo'), - $input->getArgument('parent') - ); - - $releaseNotes = new ReleaseNotes($changelog); $errors = []; foreach ($components as $component) { @@ -155,10 +157,11 @@ protected function execute(InputInterface $input, OutputInterface $output) $releaseNotes, $component, $splitBinaryPath, - $parentTagSource + $parentTagSource, + $input->getOption('update-release-notes') ); if (!$res) { - $errors[] = $component['id']; + $errors[] = $componentId; } $output->writeln(''); @@ -196,22 +199,25 @@ private function processComponent( GitHub $github, Split $split, ReleaseNotes $releaseNotes, - array $component, + Component $component, $splitBinaryPath, - $parentTagSource + $parentTagSource, + $updateReleaseNotes ) { $output->writeln(''); - $localVersion = current($this->componentManager->componentsVersion($component['id'])); - $isAlreadyTagged = $github->doesTagExist($component['target'], $localVersion); - $defaultBranch = $github->getDefaultBranch($component['target']) ?: 'main'; + $tagName = 'v' . $component->getLocalVersion(); + $repoName = $component->getRepoName(); + $componentId = $component->getId(); + $isAlreadyTagged = $github->doesTagExist($repoName, $tagName); + $defaultBranch = $github->getDefaultBranch($repoName) ?: 'main'; // If the repo is empty, it's new and we don't want to force-push. - $isTargetEmpty = $github->isTargetEmpty($component['target']); + $isTargetEmpty = $github->isTargetEmpty($repoName); $output->writeln(sprintf( '%s: Starting on component. Target version %s', - $component['id'], - $localVersion + $componentId, + $tagName )); $this->writeDiv($output); @@ -219,20 +225,26 @@ private function processComponent( if ($isAlreadyTagged) { $output->writeln(sprintf( 'Version %s already exists on target %s', - $localVersion, - $component['target'] + $tagName, + $repoName )); - $output->writeln('[info] Skipping.'); + if ($updateReleaseNotes && ($notes = $releaseNotes->get($componentId)) && ($version = $releaseNotes->getVersion($componentId))) { + $github->updateReleaseNotes($repoName, 'v' . $version, $notes); + $output->writeln(sprintf('[info] Release notes updated for version %s.', $version)); + } else { + $output->writeln('[info] Skipping.'); + } + return true; } $output->writeln(sprintf( '%s: Running splitsh', - $component['id'] + $componentId )); - $splitBranch = $split->execute($splitBinaryPath, $this->rootPath, $component['path']); + $splitBranch = $split->execute($splitBinaryPath, $this->rootPath, $component->getName()); if ($splitBranch) { $output->writeln(sprintf('Split succeeded, branch %s created.', $splitBranch)); } else { @@ -245,15 +257,15 @@ private function processComponent( $output->writeln(sprintf( '%s: Push to github target %s', - $component['id'], - $component['target'] + $componentId, + $repoName )); - $res = $github->push($component['target'], $splitBranch, $defaultBranch, $isTargetEmpty); + $res = $github->push($repoName, $splitBranch, $defaultBranch, $isTargetEmpty); if ($res[0]) { - $output->writeln(sprintf('%s: Push succeeded.', $component['id'])); + $output->writeln(sprintf('%s: Push succeeded.', $componentId)); } else { - $output->writeln(sprintf('%s: Push failed.', $component['id'])); + $output->writeln(sprintf('%s: Push failed.', $componentId)); return false; } @@ -261,7 +273,7 @@ private function processComponent( $output->writeln(''); $output->writeln('[info] Creating GitHub tag.'); - $notes = $releaseNotes->get($component['id']); + $notes = $releaseNotes->get($componentId); if (!$notes) { $notes = sprintf( 'For release notes, please see the [associated Google Cloud PHP release](%s).', @@ -270,16 +282,16 @@ private function processComponent( } $res = $github->createRelease( - $component['target'], - $localVersion, - $component['displayName'] . ' ' . $localVersion, + $repoName, + $tagName, + $component->getPackageName() . ' ' . $tagName, $notes ); if ($res) { - $output->writeln(sprintf('%s: Tag succeeded.', $component['id'])); + $output->writeln(sprintf('%s: Tag succeeded.', $componentId)); } else { - $output->writeln(sprintf('%s: Tag failed.', $component['id'])); + $output->writeln(sprintf('%s: Tag failed.', $componentId)); return false; } diff --git a/dev/src/Component.php b/dev/src/Component.php new file mode 100644 index 000000000000..c6b0675ebacb --- /dev/null +++ b/dev/src/Component.php @@ -0,0 +1,316 @@ +path = $path ?: $this->getComponentPath($name); + $this->validateComponentFiles(); + } + } + + private static function getComponentNames(): array + { + $components = scandir(self::ROOT_DIR); + foreach ($components as $i => $name) { + if (!is_dir(self::ROOT_DIR . $name) || !preg_match('/^[A-Z]/', $name)) { + unset($components[$i]); + } + } + + return $components; + } + + public static function getComponents(): array + { + $components = []; + foreach (self::getComponentNames() as $name) { + $components[] = new Component($name); + } + + return $components; + } + + public function getId(): string + { + return str_replace('google/', '', $this->getPackageName()); + } + + public function getName(): string + { + return $this->name; + } + + public function getPath(): string + { + return $this->path; + } + + public function getProtoPackage(string $googleapisDir): string + { + $gapicClients = $this->getGapicClients(); + $regex = '#\* GENERATED CODE WARNING + \* Generated by gapic-generator-php from the file + \* https:\/\/github.com\/googleapis\/googleapis\/blob\/master\/(.*.proto) + \* Updates to the above are reflected here through a refresh process#'; + $exception = null; + foreach ($gapicClients as $gapicClient) { + $gapicClientContent = file_get_contents($gapicClient); + if (preg_match($regex, $gapicClientContent, $matches)) { + $proto = realpath($googleapisDir . '/' . $matches[1]); + if (!file_exists($proto)) { + $exception = new \Exception('Could not find protobuf file '. $matches[1]); + continue; + } + if (!preg_match('/^package ([\.\w]+);$/m', file_get_contents($proto), $matches)) { + $exception = new \Exception('Could not find proto package in file ' . $proto); + continue; + } + $packageParts = explode('.', $matches[1]); + $packageVersion = array_pop($packageParts); + return implode('.', $packageParts); + } + } + + throw $exception ? $exception : new \Exception('No GAPIC Clients found in ' . $this->name); + } + + public function getRepoName(): string + { + return $this->repoName; + } + + public function getServiceAddress(): string + { + $gapicClients = $this->getGapicClients(); + foreach ($gapicClients as $gapicClient) { + $gapicClientClass = str_replace([$this->path, '/src/', '.php'], '', $gapicClient); + $gapicClientClass = str_replace('/', '\\', $gapicClientClass); + foreach ($this->getNamespaces() as $namespace) { + if ($serviceAddress = constant($namespace . '\\' . $gapicClientClass . '::SERVICE_ADDRESS')) { + return $serviceAddress; + } + } + } + return ''; + } + + public function getApiShortname(): string + { + $serviceAddress = $this->getServiceAddress(); + return substr($serviceAddress, 0, strpos($serviceAddress, '.')); + } + + public function getIssueTracker(): string + { + return sprintf('https://github.com/%s/issues', $this->getRepoName()); + } + + public function getPackageName(): string + { + return $this->packageName; + } + + public function getReleaseLevel(): string + { + return $this->releaseLevel; + } + + public function getClientDocumentation(): string + { + return $this->clientDocumentation; + } + + public function getProductDocumentation(): string + { + return $this->productDocumentation; + } + + public function getDescription(): string + { + return $this->description; + } + + public function getNamespaces(): array + { + return $this->namespaces; + } + + /** + * Formats distribution name like + * - google-cloud-policy-troubleshooter + * - google-cloud-vision + * - google-grafeas + * - google-analytics-data + * This is for the reference documentation URLs + */ + public function getReferenceDocumentationUid(): string + { + return str_replace('/', '-', $this->getPackageName()); + } + + private function getComponentPath(string $component): string + { + $components = $this->getComponentNames(); + + if (!in_array($component, $components)) { + throw new \Exception($component ? 'Invalid component provided' + : 'You are not in a component directory. Run this command from a valid component' + . ' directory or provide a valid component using the "component" option.'); + } + + $componentPath = realpath(self::ROOT_DIR . '/' . $component); + + if (!is_dir($componentPath)) { + throw new RuntimeException(sprintf('component "%s" not found', $component)); + } + + return $componentPath; + } + + private function validateComponentFiles(): void + { + $composerPath = $this->path . '/composer.json'; + if (!file_exists($composerPath)) { + throw new RuntimeException( + sprintf('composer.json not found for component "%s"', $this->name) + ); + } + $composerJson = json_decode(file_get_contents($composerPath), true); + if (!$composerJson) { + throw new RuntimeException( + sprintf('Invalid composer.json for component "%s"', $this->name) + ); + } + if (empty($composerJson['name'])) { + throw new RuntimeException('composer.json does not contain "name"'); + } + if (empty($composerJson['extra']['component']['target'])) { + throw new RuntimeException('composer does not contain extra.component.target'); + } + if (empty($composerJson['description'])) { + throw new RuntimeException('composer.json does not contain "description"'); + } + if (empty($composerJson['autoload']['psr-4'])) { + throw new RuntimeException('composer does not contain autoload.psr-4'); + } + + $this->packageName = $composerJson['name']; + $repoName = $composerJson['extra']['component']['target']; + $this->repoName = preg_replace('/\.git$/', '', $repoName); // Strip trailing ".git" + $this->description = $composerJson['description']; + + $repoMetadataPath = $this->path . '/.repo-metadata.json'; + if (!file_exists($repoMetadataPath)) { + throw new RuntimeException( + sprintf('repo metadata not found for component "%s"', $this->name) + ); + } + $repoMetadataJson = json_decode(file_get_contents($repoMetadataPath), true); + if (!$repoMetadataJson) { + throw new RuntimeException( + sprintf('Invalid .repo-metadata.json for component "%s"', $this->name) + ); + } + if (empty($repoMetadataJson['release_level'])) { + throw new RuntimeException(sprintf( + 'repo metadata does not contain "release_level" for component "%s"', + $component + )); + } + if (empty($repoMetadataJson['release_level'])) { + throw new RuntimeException(sprintf( + 'repo metadata does not contain "client_documentation" for component "%s"', + $component + )); + } + $this->releaseLevel = $repoMetadataJson['release_level']; + $this->clientDocumentation = $repoMetadataJson['client_documentation']; + $this->productDocumentation = $repoMetadataJson['product_documentation'] ?? ''; + + $namespaces = []; + foreach ($composerJson['autoload']['psr-4'] as $namespace => $dir) { + if (0 === strpos($dir, 'src')) { + $namespaces[] = rtrim($namespace, '\\'); + } + } + if (empty($namespaces)) { + throw new RuntimeException('composer autoload.psr-4 does not contain a namespace'); + } + $this->namespaces = $namespaces; + } + + /** + * Get the API versions supported by this component + */ + public function getVersions(): array + { + $versionDirs = array_diff(scandir($this->path . '/src'), ['.', '..']); + $versions = []; + foreach ($versionDirs as $version) { + if (preg_match(self::VERSION_REGEX, $version, $matches)) { + $versions[] = $matches[0]; + } + } + + return $versions; + } + + /** + * Get the contents of VERSION in the component directory + */ + public function getLocalVersion(): string + { + return trim(file_get_contents(sprintf('%s/VERSION', $this->path))); + } + + private function getGapicClients(): array + { + $gapicClients = []; + foreach ($this->getVersions() as $version) { + $gapicPath = sprintf('%s/src/%s%sGapic', $this->path, $version, $version ? '/' : ''); + if (!file_exists($gapicPath)) { + continue; + } + + foreach (array_diff(scandir($gapicPath), ['.', '..']) as $gapicClient) { + $gapicClients[] = $gapicPath . '/' . $gapicClient; + } + } + return $gapicClients; + } +} diff --git a/dev/src/ComponentIntegration/Command/ComponentIntegration.php b/dev/src/ComponentIntegration/Command/ComponentIntegration.php deleted file mode 100644 index 960701bb1ca0..000000000000 --- a/dev/src/ComponentIntegration/Command/ComponentIntegration.php +++ /dev/null @@ -1,352 +0,0 @@ -setName('integration') - ->setDescription('Test each component individually.') - ->addOption('umbrella', 'u', InputOption::VALUE_NONE, 'If set, umbrella version update check will be skipped.') - ->addOption('preserve', 'p', InputOption::VALUE_NONE, 'If set, testing directory will not be deleted if an error occurs. ' . - 'This may be a useful tool when debugging problems.' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $this->execute = true; - $this->output = $output; - - $rootPath = $this->rootPath; - $manifestPath = $rootPath . DIRECTORY_SEPARATOR . self::MANIFEST_PATH; - - $components = $this->getComponents($rootPath, $rootPath); - - $dest = $rootPath . DIRECTORY_SEPARATOR . self::TESTING_DIR; - $this->tmpDir = $dest; - @mkdir($dest); - - // If `--preserve|-p` is not provided, .testing will be deleted if an error occurs. - if (!$input->getOption('preserve')) { - register_shutdown_function(function () use ($dest) { - $this->deleteTmp($dest); - }); - } - - $guzzle = new Client; - - // Check that the umbrella version is updated. - $skipUmbrellaCheck = $input->getOption('umbrella'); - $isUmbrellaUpdated = $this->checkUmbrellaUpdate($guzzle, $rootPath, $manifestPath); - - if (!$skipUmbrellaCheck && !$isUmbrellaUpdated) { - throw new \RuntimeException('Umbrella package version has not been updated!'); - } - - // do setup on components -- copy to tmp directory and check version info - foreach ($components as &$component) { - $tmpDir = $this->copyComponent($rootPath, $dest, $component); - - $localLatestVersion = $this->getComponentVersion($manifestPath, $component['id']); - $remoteLatestVersion = $this->getRemoteLatestVersion($guzzle, $component); - - // If the latest version in the manifest is greater than the latest remote, - // then the component is being updated. - // use semver to normalize both versions. - try { - $isUpdated = version::gt($localLatestVersion, $remoteLatestVersion); - } catch (\RuntimeException $e) { - // `main` is not a valid semver version and will raise an - // exception. Handle and set the value to false to continue on. - $isUpdated = false; - } - - $component['useLocalPath'] = $isUpdated; - $component['tmpDir'] = realpath($tmpDir); - } - - $components = $this->updateComposerFiles($dest, $components); - - // run tests on each component. - foreach ($components as $component) { - if (isset($component['missingDependency']) && $component['missingDependency']) { - $this->output->writeln('Skipping '. $component['id'] .' because a required PHP extension is missing.'); - $this->output->writeln(''); - continue; - } - - $this->testComponent($component); - } - - $this->deleteTmp($dest); - } - - private function checkUmbrellaUpdate(Client $guzzle, $rootPath, $manifestPath) - { - $component = $this->getComponentComposer($rootPath, 'google-cloud', $rootPath .'/composer.json'); - $localLatestVersion = $this->getComponentVersion($manifestPath, $component['id']); - $remoteLatestVersion = $this->getRemoteLatestVersion($guzzle, $component); - - return version::gt($localLatestVersion, $remoteLatestVersion); - } - - private function copyComponent($rootPath, $dest, array $component) - { - $src = $rootPath . DIRECTORY_SEPARATOR . $component['path']; - $dest = $dest . DIRECTORY_SEPARATOR . $component['id']; - - if (file_exists($dest)) { - $this->deleteTmp($dest); - } - - $this->output->writeln('Creating temp directory for '. $component['id']); - $this->output->writeln('path: '. $dest); - $this->output->writeln(''); - - @mkdir($dest); - $filteredIterator = new \RecursiveCallbackFilterIterator( - new \RecursiveDirectoryIterator( - $src, - \RecursiveDirectoryIterator::SKIP_DOTS - ), - function ($current, $key, $iterator) { - // Exclude the vendor dir and the composer.lock file - if ($current->isDir()) { - return $current->getFilename() !== 'vendor'; - } - return $current->getFilename() !== 'composer.lock'; - } - ); - $iterator = new \RecursiveIteratorIterator( - $filteredIterator, - \RecursiveIteratorIterator::SELF_FIRST - ); - - foreach ($iterator as $item) { - if ($item->isDir()) { - mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); - } else { - copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName()); - } - } - - return $dest; - } - - private function deleteTmp($path) - { - $this->output->writeln('Deleting '. $path); - $this->output->writeln(''); - - if (!strpos($this->tmpDir, $path) === false) { - throw new \RuntimeException('cannot delete files outside test root path.'); - } - - passthru('rm -rf '. $path); - } - - private function getRemoteLatestVersion(Client $guzzle, array $component) - { - $target = str_replace('.git', '', trim($component['target'], '/')); - - $uri = 'https://api.github.com/repos/'. $target .'/releases/latest'; - if (getenv('GH_OAUTH_TOKEN')) { - $uri .= '?access_token='. getenv('GH_OAUTH_TOKEN'); - } - - try { - $res = $guzzle->get($uri); - } catch (RequestException $e) { - return '0.0.0'; - } - - $release = json_decode((string) $res->getBody(), true); - - if (!isset($release['tag_name'])) { - throw new \RuntimeException('Unexpected response from '. $uri); - } - - return $release['tag_name']; - } - - private function updateComposerFiles($tmpDir, array $components) - { - $repositories = []; - $aliases = []; - - foreach ($components as $component) { - if (!$component['useLocalPath']) { - continue; - } - - $repositories[] = [ - 'type' => 'path', - 'url' => '../'. $component['id'] - ]; - - $aliases[] = $component['id']; - } - - foreach ($components as &$component) { - $composerFile = $component['tmpDir'] . DIRECTORY_SEPARATOR .'composer.json'; - $composer = json_decode(file_get_contents($composerFile), true); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new \RuntimeException(sprintf( - 'Could not decode composer file %s. Got error %s', - $composerFile, - json_last_error_msg() - )); - } - - foreach ($aliases as $alias) { - $id = $component['id']; - if ( - !in_array($id, $aliases) && ( - array_key_exists('google/'. $alias, $composer['require']) || - array_key_exists('google/'. $alias, $composer['require-dev']) - )) { - $aliases[] = $id; - - $repositories[] = [ - 'type' => 'path', - 'url' => '../'. $component['id'] - ]; - } - } - - $component['missingDependency'] = false; - foreach ($composer['require'] as $require => $version) { - if (strpos($require, 'ext-') === 0) { - $ext = str_replace('ext-', '', $require); - if (!extension_loaded($ext)) { - $component['missingDependency'] = true; - continue; - } - } - } - } - - foreach ($components as $component) { - $composerFile = $component['tmpDir'] . DIRECTORY_SEPARATOR .'composer.json'; - $this->modifyComposerFile($composerFile, $repositories, $aliases); - } - - return $components; - } - - private function testComponent(array $component) - { - $this->output->writeln('Testing component '. $component['id'] .''); - $this->output->writeln(''); - $commands = [ - "cd {$component['tmpDir']}", - "composer update --no-suggest", - ]; - - if ($this->hasTests($component, 'Unit', 'phpunit.xml.dist')) { - $commands = array_merge($commands, [ - "echo \"\\nRUNNING UNIT TESTS\\n\"", - "vendor/bin/phpunit", - ]); - } - - if ($this->hasTests($component, 'Snippet', 'phpunit-snippets.xml.dist')) { - $commands = array_merge($commands, [ - "echo \"\\nRUNNING SNIPPET TESTS\\n\"", - "vendor/bin/phpunit -c phpunit-snippets.xml.dist" - ]); - } - - passthru(implode(" && ", $commands), $exitCode); - - if ($exitCode !== 0) { - throw new \RuntimeException('Testing '. $component['id'] .' exited with a non-zero code'); - } - - $this->output->writeln(''); - } - - private function modifyComposerFile($composerFile, array $repositories, array $aliases) - { - $composer = json_decode(file_get_contents($composerFile), true); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new \RuntimeException('Could not decode composer file '. $composerFile); - } - - foreach ($aliases as $alias) { - if (isset($composer['require']['google/'. $alias])) { - $composer['require']['google/'. $alias] = "@dev"; - } - - if (isset($composer['require-dev']['google/'. $alias])) { - $composer['require-dev']['google/'. $alias] = "@dev"; - } - } - - $oldRepositories = isset($composer['repositories']) - ? $composer['repositories'] - : []; - - $composer['repositories'] = array_merge($oldRepositories, $repositories); - - file_put_contents($composerFile, json_encode($composer, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)); - } - - private function hasTests(array $component, $folderName, $configFile) - { - $folderPath = $component['tmpDir'] . '/tests/' . $folderName; - $configFilePath = $component['tmpDir'] . '/' . $configFile; - - if (file_exists($folderPath)) { - if (!file_exists($configFilePath)) { - throw new \RuntimeException(sprintf( - 'Test folder %s exists, but no relevant PHPUnit configuration was found at %s.', - $folderPath, - $configFilePath - )); - } - - return true; - } - - return false; - } -} diff --git a/dev/src/ComponentManager.php b/dev/src/ComponentManager.php deleted file mode 100644 index 13e459c5357e..000000000000 --- a/dev/src/ComponentManager.php +++ /dev/null @@ -1,193 +0,0 @@ -rootPath = $rootPath; - $this->manifestPath = $manifestPath - ?: $this->rootPath . self::DEFAULT_MANIFEST_PATH; - } - - /** - * Return a list of component IDs. - * - * @return string[] - */ - public function components() - { - $components = $this->components ?: $this->loadComponents(); - - return array_keys($components); - } - - /** - * Get all component's composer.json extra data. - * - * @param string $componentId [optional] If set, only this component's data - * will be returned. - * @return array[] - */ - public function componentsExtra($componentId = null) - { - $components = $this->components ?: $this->loadComponents(); - - array_walk($components, function (&$component) { - $name = $component['composer']['name']; - $component = $component['composer']['extra']['component']; - $component['displayName'] = $name; - }); - - return $componentId - ? [$componentId => $components[$componentId]] - : $components; - } - - /** - * Get all component's manifest.json data. - * - * @param string $componentId [optional] If set, only this component's data - * will be returned. - * @return array[] - */ - public function componentsManifest($componentId = null) - { - $manifest = $this->manifest ?: $this->loadManifest; - $modules = $manifest['modules']; - - if ($componentId) { - $modules = array_filter($modules, function ($module) use ($componentId) { - return $module['id'] === $componentId; - }); - } - - return $modules; - } - - /** - * Get the latest version of each component. - * - * @param string $componentId [optional] If set, only this component's data - * will be returned. - * @return string[] - */ - public function componentsVersion($componentId = null) - { - $components = $this->components ?: $this->loadComponents(); - - array_walk($components, function (&$component) { - $component = $component['version']; - }); - - return $componentId - ? [$componentId => $components[$componentId]] - : $components; - } - - private function loadComponents() - { - $manifest = $this->manifest ?: $this->loadManifest(); - - $modules = $manifest['modules']; - $components = []; - foreach ($modules as $module) { - $components[$module['id']] = [ - 'version' => array_shift($module['versions']), - 'name' => $module['name'], - 'defaultService' => $module['defaultService'] - ]; - } - - // List all composer.json files in subdirectories directly below repository root, - // add root composer.json. - $composerFiles = array_merge(glob($this->rootPath . '/*/composer.json'), [$this->rootPath .'/composer.json']); - foreach ($composerFiles as $composerPath) { - $composer = $this->loadJsonFromFile($composerPath); - - if (!isset($composer['extra']['component'])) { - continue; - } - - $component = $composer['extra']['component']; - $id = $component['id']; - - if (isset($components[$id])) { - $components[$id]['displayName'] = $composer['name']; - $components[$id]['composer'] = $composer; - } - } - - $this->components = $components; - return $components; - } - - private function loadManifest() - { - $manifest = $this->loadJsonFromFile($this->manifestPath); - - $this->manifest = $manifest; - return $manifest; - } - - protected function loadJsonFromFile($path) - { - $json = json_decode(@file_get_contents($path), true); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new \RuntimeException(sprintf( - 'Could not load manifest from %s. Check that the file exists and is valid JSON.', - $path - )); - } - - return $json; - } -} diff --git a/dev/src/Composer.php b/dev/src/Composer.php new file mode 100644 index 000000000000..8130cf972563 --- /dev/null +++ b/dev/src/Composer.php @@ -0,0 +1,162 @@ + "^4.8|^5.0|^8.0" + ]; + + /** + * @var array + */ + private $defaultSuggests = [ + 'ext-grpc' => 'Enables use of gRPC, a universal high-performance RPC framework created by Google.', + 'ext-protobuf' => 'Provides a significant increase in throughput over the pure PHP ' . + 'protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions.' + ]; + + private string $relativePath; + private string $rootPath; + + public function __construct( + private string $componentPath, + private string $composerPackage, + private string $phpNamespace, + private string $gpbMetadataNamespace, + ) { + $parts = explode('/', $this->componentPath); + $this->relativePath = array_pop($parts); + $this->rootPath = implode('/', $parts); + } + + public function updateMainComposer() + { + $rootComposer = $this->rootPath . '/composer.json'; + $composer = json_decode(file_get_contents($rootComposer), true); + + // Add `replace` to main composer file. + $composer['replace'][$this->composerPackage] = '0.0.0'; + ksort($composer['replace']); + + // Add namespaces to main composer file. + $composer['autoload']['psr-4'][$this->phpNamespace . '\\'] = $this->relativePath . '/src'; + $composer['autoload']['psr-4'][$this->gpbMetadataNamespace . '\\'] = $this->relativePath . '/metadata'; + ksort($composer['autoload']['psr-4']); + + file_put_contents( + $rootComposer, + json_encode($composer, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL + ); + } + + public function createComponentComposer( + string $displayName, + string $githubRepo + ) { + $composer = [ + 'name' => $this->composerPackage, + 'description' => $displayName .' Client for PHP', + 'license' => 'Apache-2.0', + 'minimum-stability' => 'stable', + 'autoload' => [ + 'psr-4' => [ + $this->phpNamespace .'\\' => 'src', + $this->gpbMetadataNamespace .'\\' => 'metadata', + ], + ], + 'extra' => [ + 'component' => [ + 'id' => str_replace('google/', '', $this->composerPackage), + 'path' => $this->relativePath, + 'target' => $githubRepo, + ], + ], + 'require' => [], + 'require-dev' => [], + 'suggest' => [], + ]; + + foreach ($this->defaultDeps as $dep) { + $composer['require'][$dep] = $this->getLatestVersion($dep); + } + + foreach ($this->defaultDevDeps as $dep => $ver) { + $composer['require-dev'][$dep] = $ver; + } + + foreach ($this->defaultSuggests as $dep => $val) { + $composer['suggest'][$dep] = $val; + } + + file_put_contents( + $this->componentPath .'/composer.json', + json_encode($composer, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES) . PHP_EOL + ); + } + + private function getLatestVersion($dep) + { + $client = new Client(); + $uri = 'https://packagist.org/packages/'. $dep .'.json'; + $pkg = $client->request('GET', $uri); + + $versions = json_decode($pkg->getBody(), true)['package']['versions']; + $def = null; + foreach (array_keys($versions) as $v) { + if (strpos($v, 'dev-') !== false) { + continue; + } + + try { + $version = new version($v); + } catch (SemVerException $e) { + continue; + } + + $def = sprintf( + '^%d.%d.0', + $version->getMajor(), + $version->getMinor() + ); + + break; + } + + return $def; + } +} diff --git a/dev/src/Credentials/Command.php b/dev/src/Credentials/Command.php deleted file mode 100644 index 8744b61d337c..000000000000 --- a/dev/src/Credentials/Command.php +++ /dev/null @@ -1,75 +0,0 @@ -setName('credentials') - ->setDescription('Configure credentials for system tests') - ->setHelp(file_get_contents(__DIR__ .'/help.txt')); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $base = $this->rootPath; - - $keyfiles = getenv('GOOGLE_CLOUD_PHP_KEYFILES'); - $decoded = json_decode(base64_decode($keyfiles), true); - if (!$keyfiles || json_last_error() !== JSON_ERROR_NONE) { - $output->writeln('You must specify `GOOGLE_CLOUD_PHP_KEYFILES` as a base64-encoded json array of keyfile names.'); - return; - } - - foreach ($decoded as $kf) { - $err = false; - - $data = base64_decode(getenv($kf . '_ENCODED'), true); - if (json_last_error() !== JSON_ERROR_NONE) { - $output->writeln('Required environment variable `' . $kf . '_ENCODED` not set or invalid!'); - return; - } else { - $output->writeln('Found valid json at environment variable `' . $kf .'`'); - } - - $dir = $base . '/keys/'; - $path = $dir . $kf .'.json'; - - if (!file_exists($dir)) { - mkdir($dir); - } - - if (file_put_contents($path, $data) !== false) { - $output->writeln('Wrote keyfile contents to file `' . realpath($path) . '`'); - } else { - $output->writeln('Could not write to file'); - return; - } - } - - $output->writeln('Credentials configured!'); - } -} diff --git a/dev/src/Credentials/help.txt b/dev/src/Credentials/help.txt deleted file mode 100644 index f5339dbdbc9d..000000000000 --- a/dev/src/Credentials/help.txt +++ /dev/null @@ -1,7 +0,0 @@ -This command reads keyfile data from the environment and generates on-disk keyfiles. - -This command relies on environment variables which must be set prior to running this command. - -1. `GOOGLE_CLOUD_PHP_KEYFILES` is a base64-encoded, json-encoded list of keyfiles to load. For instance, if you only need a single keyfile to run system tests, this environment variable should be the value of `base64_encode(json_encode(['KEYFILE_NAME']))`. -2. `_ENCODED` is a base64-encoded, json-encoded keyfile. There must be one environment variable corresponding to each member of `GOOGLE_CLOUD_PHP_KEYFILES` and it must contain the keyfile in its expected format. - diff --git a/dev/src/DocFx/Node/ClassNode.php b/dev/src/DocFx/Node/ClassNode.php index 55eb08c0e900..f31c290bc756 100644 --- a/dev/src/DocFx/Node/ClassNode.php +++ b/dev/src/DocFx/Node/ClassNode.php @@ -19,6 +19,9 @@ use SimpleXMLElement; +/** + * @internal + */ class ClassNode { use DocblockTrait; diff --git a/dev/src/DocFx/Node/ConstantNode.php b/dev/src/DocFx/Node/ConstantNode.php index c6a7c1dba1f1..f522167ce61d 100644 --- a/dev/src/DocFx/Node/ConstantNode.php +++ b/dev/src/DocFx/Node/ConstantNode.php @@ -19,6 +19,9 @@ use SimpleXMLElement; +/** + * @internal + */ class ConstantNode { use DocblockTrait; diff --git a/dev/src/DocFx/Node/DocblockTrait.php b/dev/src/DocFx/Node/DocblockTrait.php index 9ee2d2c4eed6..93fceab54872 100644 --- a/dev/src/DocFx/Node/DocblockTrait.php +++ b/dev/src/DocFx/Node/DocblockTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait DocblockTrait { use XrefTrait; diff --git a/dev/src/DocFx/Node/FencedCodeBlockTrait.php b/dev/src/DocFx/Node/FencedCodeBlockTrait.php index bbc6b35ca29c..4a13349a5b1d 100644 --- a/dev/src/DocFx/Node/FencedCodeBlockTrait.php +++ b/dev/src/DocFx/Node/FencedCodeBlockTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait FencedCodeBlockTrait { /** diff --git a/dev/src/DocFx/Node/MethodNode.php b/dev/src/DocFx/Node/MethodNode.php index 91885269850f..d5326f42f507 100644 --- a/dev/src/DocFx/Node/MethodNode.php +++ b/dev/src/DocFx/Node/MethodNode.php @@ -19,6 +19,9 @@ use SimpleXMLElement; +/** + * @internal + */ class MethodNode { use DocblockTrait; diff --git a/dev/src/DocFx/Node/NameTrait.php b/dev/src/DocFx/Node/NameTrait.php index eb346cf285eb..339c01ca6ea7 100644 --- a/dev/src/DocFx/Node/NameTrait.php +++ b/dev/src/DocFx/Node/NameTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait NameTrait { public function getName(): string diff --git a/dev/src/DocFx/Node/ParameterNode.php b/dev/src/DocFx/Node/ParameterNode.php index ab7539e235ab..a93f594bbe43 100644 --- a/dev/src/DocFx/Node/ParameterNode.php +++ b/dev/src/DocFx/Node/ParameterNode.php @@ -19,6 +19,9 @@ use SimpleXMLElement; +/** + * @internal + */ class ParameterNode { use XrefTrait; diff --git a/dev/src/DocFx/Node/ParentNodeTrait.php b/dev/src/DocFx/Node/ParentNodeTrait.php index 50e36808e7c6..53576d82748c 100644 --- a/dev/src/DocFx/Node/ParentNodeTrait.php +++ b/dev/src/DocFx/Node/ParentNodeTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait ParentNodeTrait { use NameTrait; diff --git a/dev/src/DocFx/Node/VisibilityTrait.php b/dev/src/DocFx/Node/VisibilityTrait.php index 76b6afc90b01..10b4155c5170 100644 --- a/dev/src/DocFx/Node/VisibilityTrait.php +++ b/dev/src/DocFx/Node/VisibilityTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait VisibilityTrait { public function isPublic(): bool diff --git a/dev/src/DocFx/Node/XrefTrait.php b/dev/src/DocFx/Node/XrefTrait.php index fcfb3efd13f6..85d898c5543c 100644 --- a/dev/src/DocFx/Node/XrefTrait.php +++ b/dev/src/DocFx/Node/XrefTrait.php @@ -17,6 +17,9 @@ namespace Google\Cloud\Dev\DocFx\Node; +/** + * @internal + */ trait XrefTrait { /** diff --git a/dev/src/DocFx/Page/OverviewPage.php b/dev/src/DocFx/Page/OverviewPage.php index 5e811f72d12a..1300b534b2bc 100644 --- a/dev/src/DocFx/Page/OverviewPage.php +++ b/dev/src/DocFx/Page/OverviewPage.php @@ -19,6 +19,7 @@ /** * Class to output the Overview Page + * @internal */ class OverviewPage { diff --git a/dev/src/DocFx/Page/Page.php b/dev/src/DocFx/Page/Page.php index c2d3f4942881..3cd435fd90d5 100644 --- a/dev/src/DocFx/Page/Page.php +++ b/dev/src/DocFx/Page/Page.php @@ -21,6 +21,7 @@ /** * Class to output the DocFX array before exporting to YAML. + * @internal */ class Page { diff --git a/dev/src/DocFx/Page/PageTree.php b/dev/src/DocFx/Page/PageTree.php index 5592101a42c8..7bffa0a7367b 100644 --- a/dev/src/DocFx/Page/PageTree.php +++ b/dev/src/DocFx/Page/PageTree.php @@ -23,6 +23,7 @@ /** * Class to determine the tree for DocFX rendering + * @internal */ class PageTree { diff --git a/dev/src/DocFx/Toc/ClassToc.php b/dev/src/DocFx/Toc/ClassToc.php index 9b1203c49ea3..92fc858b16ad 100644 --- a/dev/src/DocFx/Toc/ClassToc.php +++ b/dev/src/DocFx/Toc/ClassToc.php @@ -21,6 +21,7 @@ /** * Class to output the DocFX Table of Contents + * @internal */ class ClassToc { diff --git a/dev/src/DocFx/Toc/NamespaceToc.php b/dev/src/DocFx/Toc/NamespaceToc.php index 9add106c08f0..274e8a00711f 100644 --- a/dev/src/DocFx/Toc/NamespaceToc.php +++ b/dev/src/DocFx/Toc/NamespaceToc.php @@ -21,6 +21,7 @@ /** * Class to output the DocFX Table of Contents + * @internal */ class NamespaceToc { diff --git a/dev/src/Split/GitHub.php b/dev/src/GitHub.php similarity index 81% rename from dev/src/Split/GitHub.php rename to dev/src/GitHub.php index 1c337b51aa4a..ea66f7a45f3f 100644 --- a/dev/src/Split/GitHub.php +++ b/dev/src/GitHub.php @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; +namespace Google\Cloud\Dev; use GuzzleHttp\Client; use GuzzleHttp\Exception\GuzzleException; @@ -31,6 +31,8 @@ class GitHub const GITHUB_REPO_ENDPOINT = 'https://api.github.com/repos/%s'; const GITHUB_RELEASE_ENDPOINT = self::GITHUB_REPO_ENDPOINT . '/releases/tags/%s'; const GITHUB_RELEASE_CREATE_ENDPOINT = self::GITHUB_REPO_ENDPOINT . '/releases'; + const GITHUB_RELEASE_UPDATE_ENDPOINT = self::GITHUB_REPO_ENDPOINT . '/releases/%s'; + const GITHUB_RELEASE_GET_ENDPOINT = self::GITHUB_REPO_ENDPOINT . '/releases/tags/%s'; /** * @var RunShell @@ -150,6 +152,51 @@ public function createRelease($target, $tagName, $display, $notes) } } + /** + * Create a tag on the given GitHub repository and sends a request to verify. + * + * @param string $target The GitHub organization and repository ID separated + * by a forward slash, i.e. `organization/repository'. + * @param string $tagName The name of the tag to create. + * @param string $notes The tag release notes. + * @return bool True if successful, false if failed. + */ + public function updateReleaseNotes($target, $tagName, $notes) + { + $requestBody = [ + 'body' => $notes + ]; + + $res = $this->client->get(sprintf( + self::GITHUB_RELEASE_GET_ENDPOINT, + $this->cleanTarget($target), + $tagName + ), [ + 'auth' => [null, $this->token] + ]); + + if ($release = json_decode((string) $res->getBody(), true)) { + $tagId = $release['id']; + } else { + throw new \LogicException('Tag ID not found!'); + } + + try { + $res = $this->client->post(sprintf( + self::GITHUB_RELEASE_UPDATE_ENDPOINT, + $this->cleanTarget($target), + $tagId + ), [ + 'json' => $requestBody, + 'auth' => [null, $this->token] + ]); + + return $res->getStatusCode() === 201; + } catch (\Exception $e) { + return false; + } + } + /** * Get the changelog from a release. * diff --git a/dev/src/NewComponent.php b/dev/src/NewComponent.php new file mode 100644 index 000000000000..e8b1b01774b3 --- /dev/null +++ b/dev/src/NewComponent.php @@ -0,0 +1,172 @@ +protoPackage = self::extractPackageNameFromProtoContents($protoContents); + $new->phpNamespace = self::extractPhpNamespaceFromProtoContents($protoContents) + ?: self::derivePhpNamespaceFromProtoPackage($new->protoPackage); + $new->displayName = self::getDisplayName($new->phpNamespace); + $new->componentName = self::getComponentName($new->displayName); + $new->composerPackage = self::getComposerPackageFromProtoPackage($new->protoPackage); + $new->githubRepo = self::getGithubRepo($new->composerPackage); + $new->gpbMetadataNamespace = self::getGpbMetadataNamespace($new->protoPackage); + $new->shortName = self::extractShortNameFromProtoContents($protoContents); + $new->version = self::extractVersionFromProtoFilename($protoFilename); + $new->protoPath = self::getProtoPath($protoFilename, $new->version); + + return $new; + } + + public function getDocumentationUrl(): string + { + return sprintf( + 'https://cloud.google.com/php/docs/reference/%s/latest', + str_replace('google/', '', $this->composerPackage) + ); + } + + private static function getGithubRepo(string $composerPackage): string + { + return 0 === strpos($composerPackage, 'google/cloud-') + ? 'googleapis/google-cloud-php-' . substr($composerPackage, 13) + : 'googleapis/php-' . substr($composerPackage, 7); + } + + private static function getComponentName(string $displayName): string + { + return trim(str_replace(['Google', 'Cloud', ' '], '', $displayName)); + } + + private static function getDisplayName(string $phpNamespace): string + { + $nameParts = explode('\\', $phpNamespace); + foreach ($nameParts as $i => $part) { + $nameParts[$i] = ltrim(strtolower(preg_replace('/[A-Z]([A-Z](?![a-z]))*/', ' $0', $part))); + } + return ucwords(implode(' ', $nameParts)); + } + + private static function getGpbMetadataNamespace(string $protoPackage): string + { + return 'GPBMetadata\\' . implode('\\', array_map('ucfirst', explode('.', $protoPackage))); + } + + private static function derivePhpNamespaceFromProtoPackage(string $protoPackage): string + { + return implode('\\', array_map('ucfirst', explode('.', $protoPackage))); + } + + private static function getComposerPackageFromProtoPackage(string $protoPackage): string + { + return 'google/' . str_replace( + ['google.', 'devtools.cloud', '.'], + ['', 'cloud-', '-'], + $protoPackage + ); + } + + private static function getProtoPath(string $protoFilename, ?string $version): string + { + $protoPath = dirname($protoFilename); + if (is_null($version)) { + return $protoPath; + } + $parts = explode('/', $protoPath); + if ($i = array_search($version, $parts)) { + $parts[$i] = "(.*)"; + } + + return implode('/', $parts); + } + + private static function extractPackageNameFromProtoContents(string $protoContents): string + { + if (!preg_match('/package (.*);/', $protoContents, $matches)) { + throw new RuntimeException('package name not found in proto file '); + } + $parts = explode('.', $matches[1]); + $version = array_pop($parts); + if ('v' !== $version[0]) { + $parts[] = $version; + } + return implode('.', $parts); + } + + private static function extractShortNameFromProtoContents(string $protoContents): string + { + if (!preg_match( + '/option \(google.api.default_host\) = "(.*).googleapis.com";/', + $protoContents, + $matches) + ) { + throw new RuntimeException('short name not found in proto file'); + } + return $matches[1]; + } + + private static function extractPhpNamespaceFromProtoContents(string $protoContents): ?string + { + if (!preg_match('/option php_namespace = "(.*)";/', $protoContents, $matches)) { + return null; + } + // Remove version from namespace + $parts = explode('\\\\', $matches[1]); + $version = array_pop($parts); + if ('v' !== strtolower($version[0])) { + $parts[] = $version; + } + + return implode('\\', $parts); + } + + private static function extractVersionFromProtoFilename(string $protoFilename): ?string + { + // Remove version from namespace + $parts = explode('/', $protoFilename); + while (count($parts)) { + $version = array_pop($parts); + if (preg_match(Component::VERSION_REGEX . 'i', $version)) { + return $version; + } + } + + return null; + } +} diff --git a/dev/src/QuestionTrait.php b/dev/src/QuestionTrait.php deleted file mode 100644 index ebaedd8ad4d4..000000000000 --- a/dev/src/QuestionTrait.php +++ /dev/null @@ -1,139 +0,0 @@ -question($question, $default); - return $this->askQuestion($question); - } - - private function askQuestion(Question $question) - { - return $this->questionHelper()->ask( - $this->input(), - $this->output(), - $question - ); - } - - private function question($question, $default = null) - { - if ($default) { - $question = $question . ' (leave blank for "'. $default .'")'; - } - - return new Question( - $question . PHP_EOL, - $default - ); - } - - private function choice($question, array $options, $default = null) - { - if ($default !== null) { - if (!in_array($default, $options)) { - throw new \RuntimeException( - 'default choice `'. $default .'` is not an allowed choice. (This is a developer problem)' - ); - } - - $key = array_search($default, $options); - $options[$key] = $options[$key] . $this->choiceDefaultText; - $default = $options[$key]; - } - - return new ChoiceQuestion($question, $options, $default); - } - - private function removeDefaultFromChoice($answer) - { - return explode($this->choiceDefaultText, $answer)[0]; - } - - private function confirm($question, $defaultToYes = true) - { - $choices = implode('/', [ - ($defaultToYes) ? 'y [default]' : 'y', - (!$defaultToYes) ? 'n [default]' : 'n', - ]); - - return new ConfirmationQuestion($question . ' (' . $choices .')' . PHP_EOL, $defaultToYes); - } - - private function validators(array $callables) - { - return function ($answer) use ($callables) { - foreach ($callables as $callable) { - $answer = call_user_func($callable, $answer); - } - - return $answer; - }; - } - - private function preventEmpty() - { - return function ($answer) { - if (empty($answer) && $answer !== 0 && $answer !== '0') { - throw new \RuntimeException('Answer cannot be blank.'); - } - - return $answer; - }; - } - - private function defaultChoice($default) - { - return function ($answer) use ($default) { - if (empty($answer) && $answer !== 0 && $answer !== '0' && $default !== null) { - return (string) $default; - } - - return $answer; - }; - } - - private function removeDefaultNotice($default, $notice = '(default)') - { - return function ($answer) use ($default, $notice) { - if (strpos($answer, $notice) !== false) { - $answer = trim(str_replace($notice, '', $answer)); - } - - return $answer; - }; - } -} diff --git a/dev/src/ReleaseBuilder/ReleaseBuilder.php b/dev/src/ReleaseBuilder/ReleaseBuilder.php deleted file mode 100644 index 576e6434df8e..000000000000 --- a/dev/src/ReleaseBuilder/ReleaseBuilder.php +++ /dev/null @@ -1,799 +0,0 @@ - 'patch', - self::LEVEL_MINOR => 'minor', - self::LEVEL_MAJOR => 'major', - ]; - - public function __construct($rootPath) - { - $this->manifest = sprintf(self::PATH_MANIFEST, $rootPath); - $this->components = sprintf(self::COMPONENT_BASE, $rootPath); - $this->defaultComponentComposer = $rootPath .'/composer.json'; - - $this->http = new Client; - $this->token = getenv(self::TOKEN_ENV); - - parent::__construct($rootPath); - } - - protected function configure() - { - $this->setName('rb') - ->setDescription('An interactive tool for creating releases.'); - } - - protected function execute(InputInterface $input, OutputInterface $output) - { - $this->input = $input; - $this->output = $output; - - $version = $this->getComponentVersion($this->manifest, 'google-cloud'); - $composer = $this->getComponentComposer($this->manifest, 'google-cloud'); - list ($org, $repo) = $this->getOrgAndRepo($composer); - - if (!$this->hasExpectedBase($org, $repo, $version)) { - throw new \RuntimeException(sprintf( - 'Expected tag %s not found in %s/%s', - $version, - $org, - $repo - )); - } - - $commits = $this->getCommits($org, $repo, $version); - $output->writeln(sprintf('%s commits found.', count($commits))); - - $release = []; - foreach ($commits as $commit) { - $components = $this->getCommitComponentModifiedList($commit['url']); - if (!$components) { - continue; - } - - $commitRelease = $this->interactiveCommitRelease($output, $commit, $components); - $release = $commitRelease ? $this->mergeCommitIntoRelease($release, $commitRelease) : $release; - } - - $release = $this->determineUmbrellaLevel($release); - $release = $this->determineReleaseVersions($release); - - $this->updateComponentVersions($release); - $notesLocation = $this->createReleaseNotes($release); - - $output->writeln(sprintf( - 'Release created!'. PHP_EOL .'Release notes generated at %s', - realpath($notesLocation) - )); - } - - /** - * Iterate through a release and do the work of preparing a release. - * - * @param array $release An associative array, where the key is the - * component ID and the value is structured data describing the - * release. - * @return void - */ - private function updateComponentVersions(array $release) - { - foreach ($release as $key => $releaseComponent) - { - $component = $this->getComponentComposer($this->rootPath(), $key); - - $this->addToComponentManifest($releaseComponent['version'], $component); - foreach ((array) $component['entry'] as $entry) { - $entryUpdated = $this->updateComponentVersionConstant( - $releaseComponent['version'], - $component['path'], - $entry - ); - } - - if ($component['id'] !== 'google-cloud') { - $this->updateComponentVersionFile($releaseComponent['version'], $component); - $this->updateComposerReplacesVersion($releaseComponent['version'], $component); - } - } - } - - /** - * Iterate through a release and determine the new version numbers based on - * the release type of each component (patch, minor, major) and the latest - * previous release number. - * - * @param array $release An associative array, where the key is the - * component ID and the value is structured data describing the - * release. - * @return array $release - */ - private function determineReleaseVersions(array $release) - { - foreach ($release as $key => &$component) { - $latestVersion = $this->getComponentVersion($this->manifest, $key); - $latestVersion = $latestVersion !== 'main' - ? $latestVersion - : '0.0.0'; - - $oldVersion = new version($latestVersion); - - $component['version'] = (string) $oldVersion->inc($this->levels[$component['level']]); - } - - return $release; - } - - /** - * Determine the release level of the umbrella package by examining the - * levels of all affected components and incrementing the umbrella by the - * highest level of a component release. - * - * In other words, if three components are released as patches, the umbrella - * will be a patch release. If there are any minor releases, the umbrella is - * released as a minor. The umbrella package will never be incrememted as a - * major release. - * - * @param array $release An associative array, where the key is the - * component ID and the value is structured data describing the - * release. - * @return array $release - */ - private function determineUmbrellaLevel(array $release) - { - $levels = []; - array_walk($release, function ($component) use (&$levels) { - $levels[] = $component['level']; - }); - - $levels = array_unique($levels); - rsort($levels); - - // Since we don't use major versions of the umbrella, major versions of - // components only bump the umbrella by a minor increment. - if ($levels[0] === self::LEVEL_MAJOR) { - $levels[0] = self::LEVEL_MINOR; - } - - $release[self::DEFAULT_COMPONENT] = [ - 'level' => $levels[0] - ]; - - return $release; - } - - /** - * Build a release notes markdown file. - * - * @param array $release An associative array, where the key is the - * component ID and the value is structured data describing the - * release. - * @return void - */ - private function createReleaseNotes(array $release) - { - $buildDir = $this->rootPath .'/build'; - $locationTemplate = $buildDir . '/release-%s.md'; - - if (!is_dir($buildDir)) { - mkdir($buildDir); - } - - $umbrella = $release[self::DEFAULT_COMPONENT]; - $location = sprintf($locationTemplate, $umbrella['version']); - - unset($release[self::DEFAULT_COMPONENT]); - - ksort($release); - - $notes = []; - foreach ($release as $key => $component) { - $messages = []; - foreach ($component['messages'] as $message) { - $messages[] = sprintf('* %s', $message); - } - - $notes[] = sprintf('### google/%s v%s', $key, $component['version']) - . PHP_EOL . PHP_EOL . implode(PHP_EOL, $messages); - } - - $template = file_get_contents(__DIR__ .'/templates/release-notes.md.txt'); - $template = str_replace('{version}', $umbrella['version'], $template); - $template = str_replace('{notes}', implode(PHP_EOL . PHP_EOL, $notes), $template); - - file_put_contents($location, $template); - - return $location; - } - - /** - * Interlace new commit release data into an existing release structure. - * - * @param array $release An associative array, where the key is the - * component ID and the value is structured data describing the - * release. - * @param array $commitRelease The release data generated for a single commit. - * @return array $release - */ - private function mergeCommitIntoRelease(array $release, array $commitRelease) - { - foreach ($commitRelease as $key => $commit) { - if (!isset($release[$key])) { - $release[$key] = [ - 'level' => $commit['level'], - 'messages' => [$commit['message']] - ]; - } else { - $release[$key]['messages'][] = $commit['message']; - $release[$key]['level'] = ($release[$key]['level'] >= $commit['level']) - ? $release[$key]['level'] - : $commit['level']; - } - } - - return $release; - } - - /** - * Determine defaults for components affected by the commit, display an - * overview and provide an interface for modifications. - * - * @param OutputInterface $output The Symfony Output for writing to stdout - * @param array $commit The commit data. - * @param array $components Components modified by the commit. - * @return array Structured data about components modified in this commit. - */ - private function interactiveCommitRelease(OutputInterface $output, array $commit, array $components) - { - $commitRelease = $this->processCommit($output, $commit, $components); - - $proceed = false; - do { - $this->displayCommitSummary($output, $commitRelease); - - $output->writeln(''); - - $choices = [ - 'Proceed without changes', - 'Change Release Message', - 'Change Release Type to Patch', - 'Change Release Type to Minor', - 'Change Release Type to Major', - 'Start over', - 'Skip Commit' - ]; - $q = $this->choice('Choose an action', $choices, $choices[0]); - - $action = $this->askQuestion($q); - $action = $this->removeDefaultFromChoice($action); - - switch ($action) { - case $choices[0]: - $proceed = true; - break; - - case $choices[1]: - $commitRelease = $this->handleChange($output, $commitRelease); - break; - - case $choices[2]: // patch - $commitRelease = $this->handleChange($output, $commitRelease, self::LEVEL_PATCH); - break; - - case $choices[3]: // minor - $commitRelease = $this->handleChange($output, $commitRelease, self::LEVEL_MINOR); - break; - - case $choices[4]: // major - $commitRelease = $this->handleChange($output, $commitRelease, self::LEVEL_MAJOR); - break; - - case $choices[5]: - $commitRelease = $this->processCommit($output, $commit, $components); - break; - - case $choices[6]: - return; - } - } while (!$proceed); - - $output->writeln(''); - - return $commitRelease; - } - - /** - * An interactive flow for modifying release data. - * - * @param OutputInterface $output - * @param array $commitRelease Structured data about components modified by - * the current commit. - * @param int|null $level The level to change to. If null, assume change release message. - */ - public function handleChange(OutputInterface $output, array $commitRelease, $level = null) - { - $choices = array_keys($commitRelease); - - if (count($choices) > 1) { - $options = array_merge([ - 'All Components' - ], $choices, [ - 'Go Back' - ]); - - // By default, all components are batch modified in this method. - $q = $this->choice('Choose a component to modify.', $options, $options[0]); - $component = $this->removeDefaultFromChoice($this->askQuestion($q)); - - if ($component === 'Go Back') { - return $commitRelease; - } - - if ($component === 'All Components') { - $component = null; - } - } else { - $component = $choices[0]; - } - - if ($level === null) { - if ($component) { - $componentOverview = sprintf( - 'google/%s [%s]:', - $component, - $this->levels[$commitRelease[$component]['level']] - ); - - $currentMessage = $commitRelease[$component]['message']; - } else { - $componentOverview = sprintf( - 'Modifying %s components.', - count($commitRelease) - ); - - $currentMessage = current($commitRelease)['message']; - } - - $key = 'message'; - $value = $this->ask(sprintf( - '%s Enter a release note message. Do not enter the Pull Request reference number.'. - PHP_EOL .' - Message: %s', - $componentOverview, - $currentMessage - ), $currentMessage); - - $value .= ' (#'. current($commitRelease)['ref'] .')'; - } elseif (array_key_exists($level, $this->levels)) { - $key = 'level'; - $value = $level; - } else { - throw new \Exception('Something went really wrong.'); - } - - if ($component) { - $commitRelease[$component][$key] = $value; - } else { - foreach ($commitRelease as &$commitComponent) { - $commitComponent[$key] = $value; - } - - } - - return $commitRelease; - } - - /** - * Top-level CLI to process a single commit and display information to the user. - * - * @param OutputInterface $output - * @param array $commit Data about the commit. - * @param array $components Data about all components modified in the commit. - * @return array - */ - private function processCommit(OutputInterface $output, array $commit, array $components) - { - $output->writeln(sprintf( - 'Processing Commit: %s', - $commit['message'] - )); - $output->writeln(sprintf('View on GitHub: %s', $commit['htmlUrl'])); - $output->writeln('----------'); - $output->writeln(''); - - $message = trim($this->ask('Enter a release summary for this commit. You can change this later.', $commit['message'])); - - $commitRelease = []; - foreach ($components as $key => $component) { - $componentRelease = isset($commitRelease[$key]) - ? $commitRelease[$key] - : ['level' => self::LEVEL_PATCH, 'message' => '', 'reasons' => []]; - - $lowestAllowedLevel = $componentRelease['level']; - $suggestedLevel = $lowestAllowedLevel; - $allowedLevels = array_filter($this->levels, function ($name, $key) use ($lowestAllowedLevel) { - return $key >= $lowestAllowedLevel; - }, ARRAY_FILTER_USE_BOTH); - - $output->writeln(sprintf('Component %s modified by commit.', $key)); - - list ($suggestedLevel, $reasons) = - $this->determineSuggestedLevel($allowedLevels, $suggestedLevel, $component['files']); - - $output->writeln(sprintf( - 'We suggest a %s release because of the following reasons. Please do not use this as an ' . - 'absolute guide, as this tool is unable to determine the correct outcome in every scenario.', - $this->levels[$suggestedLevel] - )); - $output->writeln(''); - - foreach ($reasons as $reason) { - $output->writeln('* '. $reason); - } - - $output->writeln(''); - - $componentRelease['level'] = $suggestedLevel; - $componentRelease['message'] = $message .' (#'. $commit['reference'] .')'; - $componentRelease['reasons'] = array_merge($componentRelease['reasons'], $reasons); - $componentRelease['ref'] = $commit['reference']; - - $commitRelease[$key] = $componentRelease; - } - - return $commitRelease; - } - - /** - * Formatted summary of the release state of components in the commit. - * - * @param OutputInterface $output - * @param array $commitRelease Release data scoped to a single commit. - * @return void - */ - private function displayCommitSummary(OutputInterface $output, array $commitRelease) - { - $output->writeln('Commit Summary'); - $output->writeln('-----'); - - foreach ($commitRelease as $key => $releaseInfo) { - $output->writeln(sprintf('google/%s [%s]', $key, $this->levels[$releaseInfo['level']])); - $output->writeln(sprintf(' - Message: %s', $releaseInfo['message'])); - } - } - - /** - * Logic to determine the best release level for a component. - * - * @param array $levelChoices Allowed levels for the component. - * @param string $suggestedLevel The current suggested level for the release. - * @param array $files A list of files in the component folder modified in - * the commit. - * @return array [$suggestedLevel, $reasons] - */ - private function determineSuggestedLevel(array $levelChoices, $suggestedLevel, array $files) - { - $reasons = []; - - if ($levelChoices !== $this->levels) { - $suggestedLevel = array_keys($levelChoices)[0]; - $reasons[] = 'Another change specified a higher minimum release level.'; - } - - if (isset($levelChoices[self::LEVEL_MINOR]) && (bool) array_filter($files, function ($file) { - $parts = explode('/', $file); - return isset($parts[1]) && $parts[1] === 'src' && count($parts) > 2; - })) { - $suggestedLevel = self::LEVEL_MINOR; - $reasons[] = 'There are changes in the component `src` folder.'; - } - - if (isset($levelChoices[self::LEVEL_MINOR]) && in_array('composer.json', $files)) { - $suggestedLevel = self::LEVEL_MINOR; - $reasons[] = 'The component `composer.json` file was modified.'; - } - - if ($suggestedLevel === self::LEVEL_PATCH) { - $reasons[] = 'None of the indicators show the commit includes a client-facing code change.'; - } - - return [$suggestedLevel, $reasons]; - } - - /** - * Parse the organization and repo from a composer file. - * - * @param array $composer - * @return array [$org, $repo] - */ - private function getOrgAndRepo(array $composer) - { - $target = $composer['target']; - - $matches = []; - preg_match(self::TARGET_REGEX, $target, $matches); - - $org = $matches[1]; - $repo = $matches[2]; - - return [$org, $repo]; - } - - /** - * Check that a Github Repository has the expected release. - * - * Used to verify existence of the previous release to compare against. - * - * @param string $org The github organization - * @param string $repo The github repository name. - * @param string $version The version to search for. - * @return bool - */ - private function hasExpectedBase($org, $repo, $version) - { - $url = sprintf( - self::GITHUB_RELEASES_ENDPOINT, - $org, - $repo, - $version - ); - - try { - $res = $this->http->get($url, [ - 'auth' => [null, $this->token] - ]); - return true; - } catch (RequestException $e) { - return false; - } - } - - /** - * Get a list of commits between a version and the current repository state. - * - * @param string $org The github organization - * @param string $repo The github repository name. - * @param string $version The version to search for. - * @return array - */ - private function getCommits($org, $repo, $version) - { - $url = sprintf( - self::GITHUB_COMPARE_ENDPOINT, - $org, - $repo, - $version - ); - - $res = json_decode($this->http->get($url, [ - 'auth' => [null, $this->token] - ])->getBody(), true); - $commits = []; - foreach ($res['commits'] as $commit) { - $message = $commit['commit']['message']; - - $description = explode("\n", $message)[0]; - $matches = []; - if (preg_match('/(.{0,})\(\#(\d{1,})\)/', $description, $matches) === 1) { - $message = trim($matches[1]); - $prNumber = isset($matches[2]) ? $matches[2] : null; - } else { - $prNumber = $this->askForPrNumber($message); - } - - if (strpos($message, '[CHANGE ME]') === 0 && $prNumber) { - $message = $this->getMessageFromPullRequest($org, $repo, $prNumber); - } - - $commits[] = [ - 'url' => $commit['url'], - 'htmlUrl' => $commit['html_url'], - 'message' => $message, - 'reference' => $prNumber, - 'hash' => $commit['sha'] - ]; - } - - return $commits; - } - - private function askForPrNumber($message) - { - return trim($this->ask(sprintf( - 'The commit message did not contain a Pull Request reference. ' . - 'Please enter the pull request reference now. ' . - 'A pull request reference is the ID number of the PR, i.e. 1337. ' . - 'The commit message is "%s"', - $message - ))); - } - - private function getMessageFromPullRequest($org, $repo, $prNumber) - { - $url = sprintf( - self::GITHUB_PULL_ENDPOINT, - $org, - $repo, - $prNumber - ); - - $res = json_decode($this->http->get($url, [ - 'auth' => [null, $this->token] - ])->getBody(), true); - - return $res['title']; - } - - /** - * Query the github API for a list of files modified by a commit. - * - * @param string $url The URL to the commit. - * @return array A list of files. - */ - private function getCommitComponentModifiedList($url) - { - $commit = json_decode($this->http->get($url, [ - 'auth' => [null, $this->token] - ])->getBody(), true); - - $changedComponents = []; - $fileDirectoryComponent = []; - foreach ($commit['files'] as $file) { - $filename = $file['filename']; - if (strpos($filename, '/') === false) { - continue; - } - - $fileParts = explode('/', $filename); - $componentDirectory = $fileParts[0]; - - $composerPath = $this->rootPath .'/'. $componentDirectory .'/composer.json'; - if (!array_key_exists($composerPath, $fileDirectoryComponent)) { - if (!file_exists($composerPath)) { - continue; - } - - $composer = json_decode(file_get_contents($composerPath), true)['extra']['component']; - $fileDirectoryComponent[$composerPath] = $composer; - } else { - $composer = $fileDirectoryComponent[$composerPath]; - } - - if (!isset($changedComponents[$composer['id']])) { - $changedComponents[$composer['id']] = [ - 'files' => [], - 'level' => 'minor' - ]; - } - - $changedComponents[$composer['id']]['files'][] = $file['filename']; - } - - return $changedComponents; - } - - protected function questionHelper() - { - return $this->getHelper('question'); - } - - protected function input() - { - return $this->input; - } - - protected function output() - { - return $this->output; - } - - protected function rootPath() - { - return $this->rootPath; - } - - protected function manifest() - { - return $this->manifest; - } -} diff --git a/dev/src/ReleaseBuilder/templates/release-notes.md.txt b/dev/src/ReleaseBuilder/templates/release-notes.md.txt deleted file mode 100644 index 1e3269b248f6..000000000000 --- a/dev/src/ReleaseBuilder/templates/release-notes.md.txt +++ /dev/null @@ -1,3 +0,0 @@ -## Google Cloud PHP v{version} - -{notes} diff --git a/dev/src/Split/ReleaseNotes.php b/dev/src/ReleaseNotes.php similarity index 72% rename from dev/src/Split/ReleaseNotes.php rename to dev/src/ReleaseNotes.php index c9aa673624e2..8ec7f960005b 100644 --- a/dev/src/Split/ReleaseNotes.php +++ b/dev/src/ReleaseNotes.php @@ -15,10 +15,11 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; +namespace Google\Cloud\Dev; /** * Get release notes for a component + * @internal */ class ReleaseNotes { @@ -27,6 +28,11 @@ class ReleaseNotes */ private $changelog; + /** + * @var array + */ + private $versions; + /** * @param string $changelog The full release changelog. */ @@ -48,6 +54,19 @@ public function get($component) : null; } + /** + * Get the version for the component in the release notes + * + * @param string $component The component ID + * @return string|null + */ + public function getVersion($component) + { + return isset($this->versions[$component]) + ? $this->versions[$component] + : null; + } + /** * Parse the release notes generated by release-please into an associative array, * where the key is the component ID and the value is the HTML / markdown @@ -67,12 +86,13 @@ private function parseChangelog($changelog) $v = new \DOMDocument; $v->loadHTML($d->nodeValue); $nodeValue = trim($d->nodeValue); - - $firstLine = explode(PHP_EOL, $nodeValue)[0]; - preg_match('/\S{0,}\/(\S{1,}):/', $firstLine, $matches); + $lines = explode(PHP_EOL, $nodeValue); + $firstLine = array_shift($lines); + preg_match('/\S{0,}\/(\S{1,}): ([0-9\.]+)/', $firstLine, $matches); if (count($matches) > 0) { $component = $matches[1]; - $this->changelog[$component] = '## ' . $nodeValue; + $this->changelog[$component] = implode(PHP_EOL, $lines) ?: '### Miscellaneous Chores'; + $this->versions[$component] = $matches[2]; } } } diff --git a/dev/src/Split/RunShell.php b/dev/src/RunShell.php similarity index 96% rename from dev/src/Split/RunShell.php rename to dev/src/RunShell.php index 94fc9691a6d2..efae5051e24b 100644 --- a/dev/src/Split/RunShell.php +++ b/dev/src/RunShell.php @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; +namespace Google\Cloud\Dev; /** * Execute Shell commands and return the results. diff --git a/dev/src/Split/Split.php b/dev/src/Split.php similarity index 97% rename from dev/src/Split/Split.php rename to dev/src/Split.php index a46cfc2bfe60..ab50d94b012e 100644 --- a/dev/src/Split/Split.php +++ b/dev/src/Split.php @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; +namespace Google\Cloud\Dev; /** * Execute Subtree Split diff --git a/dev/src/Split/SplitInstall.php b/dev/src/SplitInstall.php similarity index 98% rename from dev/src/Split/SplitInstall.php rename to dev/src/SplitInstall.php index 104afb118327..9d6d494e7fc9 100644 --- a/dev/src/Split/SplitInstall.php +++ b/dev/src/SplitInstall.php @@ -15,7 +15,7 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Split; +namespace Google\Cloud\Dev; /** * Install the Splitsh-lite program. diff --git a/dev/templates/.OwlBot.yaml.twig b/dev/templates/.OwlBot.yaml.twig new file mode 100644 index 000000000000..de6bd776da08 --- /dev/null +++ b/dev/templates/.OwlBot.yaml.twig @@ -0,0 +1,4 @@ +deep-copy-regex: + - source: /{{proto_path}}/.*-php/(.*) + dest: /owl-bot-staging/{{component}}/$1{{version ? '/$2' : ''}} +api-name: {{component}} diff --git a/dev/templates/.gitattributes b/dev/templates/.gitattributes new file mode 100644 index 000000000000..9a8480242644 --- /dev/null +++ b/dev/templates/.gitattributes @@ -0,0 +1,8 @@ +/*.xml.dist export-ignore +/tests export-ignore +/.github export-ignore +/samples export-ignore +/.repo-metadata.json export-ignore +/.OwlBot.yaml export-ignore +/owlbot.py export-ignore +/src/**/gapic_metadata.json export-ignore diff --git a/dev/src/AddComponent/templates/template-pull_request_template.md.txt b/dev/templates/.github/pull_request_template.md similarity index 100% rename from dev/src/AddComponent/templates/template-pull_request_template.md.txt rename to dev/templates/.github/pull_request_template.md diff --git a/dev/templates/.repo_metadata.json.twig b/dev/templates/.repo_metadata.json.twig new file mode 100644 index 000000000000..dea6f4d85166 --- /dev/null +++ b/dev/templates/.repo_metadata.json.twig @@ -0,0 +1,7 @@ +{ + "distribution_name": "google/{packageName}", + "release_level": "pre", + "client_documentation": "{docUrl}", + "library_type": "GAPIC_AUTO", + "api_shortname": "{shortname}" +} \ No newline at end of file diff --git a/dev/src/AddComponent/templates/template-CONTRIBUTING.md.txt b/dev/templates/CONTRIBUTING.md similarity index 100% rename from dev/src/AddComponent/templates/template-CONTRIBUTING.md.txt rename to dev/templates/CONTRIBUTING.md diff --git a/dev/templates/LICENSE b/dev/templates/LICENSE new file mode 100644 index 000000000000..8f71f43fee3f --- /dev/null +++ b/dev/templates/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. + diff --git a/dev/templates/README.md.twig b/dev/templates/README.md.twig new file mode 100644 index 000000000000..475c3cf2de77 --- /dev/null +++ b/dev/templates/README.md.twig @@ -0,0 +1,45 @@ +# {{name}} for PHP + +> Idiomatic PHP client for [{{name}}]({{product_homepage}}). + +[![Latest Stable Version](https://poser.pugx.org/{{package}}/v/stable)](https://packagist.org/packages/{{package}}) [![Packagist](https://img.shields.io/packagist/dm/{{package}}.svg)](https://packagist.org/packages/{{package}}) + +* [API documentation]({{documentation}}) + +**NOTE:** This repository is part of [Google Cloud PHP](https://github.com/googleapis/google-cloud-php). Any +support requests, bug reports, or development contributions should be directed to +that project. + +### Installation + +To begin, install the preferred dependency manager for PHP, [Composer](https://getcomposer.org/). + +Now, install this component: + +```sh +$ composer require {{package}} +``` + +> Browse the complete list of [Google Cloud APIs](https://cloud.google.com/php/docs/reference) +> for PHP + +This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits +offered by gRPC (such as streaming methods) please see our +[gRPC installation guide](https://cloud.google.com/php/grpc). + +### Authentication + +Please see our [Authentication guide](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md) for more information +on authenticating your client. Once authenticated, you'll be ready to start making requests. + +### Sample + +See the [samples directory](samples/) for a canonical list of samples. + +### Version + +This component is considered alpha. As such, it is still a work-in-progress and is more likely to get backwards-incompatible updates. + +### Next Steps + +1. Understand the [official documentation]({{product_documentation}}). diff --git a/dev/templates/VERSION b/dev/templates/VERSION new file mode 100644 index 000000000000..77d6f4ca2371 --- /dev/null +++ b/dev/templates/VERSION @@ -0,0 +1 @@ +0.0.0 diff --git a/dev/templates/owlbot.py.twig b/dev/templates/owlbot.py.twig new file mode 100644 index 000000000000..7176a80a7389 --- /dev/null +++ b/dev/templates/owlbot.py.twig @@ -0,0 +1,63 @@ +# Copyright 2023 Google LLC +# +# 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. + +"""This script is used to synthesize generated parts of this library.""" + +import logging +from pathlib import Path +import subprocess + +import synthtool as s +from synthtool.languages import php +from synthtool import _tracked_paths + +logging.basicConfig(level=logging.DEBUG) + +src = Path(f"../{php.STAGING_DIR}/{{component}}").resolve() +dest = Path().resolve() + +# Added so that we can pass copy_excludes in the owlbot_main() call +_tracked_paths.add(src) + +php.owlbot_main( + src=src, + dest=dest, + copy_excludes=[ + src / "**/[A-Z]*_*.php", + src / "**/*GrpcClient.php" + ] +) + +# remove class_alias code +s.replace( + "src/V*/**/*.php", + r"^// Adding a class alias for backwards compatibility with the previous class name.$" + + "\n" + + r"^class_alias\(.*\);$" + + "\n", + '') + +# format generated clients +subprocess.run([ + 'npm', + 'exec', + '--yes', + '--package=@prettier/plugin-php@^0.16', + '--', + 'prettier', + '**/Gapic/*', + '--write', + '--parser=php', + '--single-quote', + '--print-width=80']) diff --git a/dev/src/AddComponent/templates/template-phpunit.xml.dist.txt b/dev/templates/phpunit.xml.dist.twig similarity index 88% rename from dev/src/AddComponent/templates/template-phpunit.xml.dist.txt rename to dev/templates/phpunit.xml.dist.twig index 1c2b8f6b56d2..292c536ce109 100644 --- a/dev/src/AddComponent/templates/template-phpunit.xml.dist.txt +++ b/dev/templates/phpunit.xml.dist.twig @@ -1,7 +1,7 @@ - + tests/Unit diff --git a/tests/Component/TestComposerInstall.php b/dev/tests/Component/TestComposerInstall.php similarity index 100% rename from tests/Component/TestComposerInstall.php rename to dev/tests/Component/TestComposerInstall.php diff --git a/tests/System/ServiceWhitelist/WhitelistTest.php b/dev/tests/System/WhitelistTest.php similarity index 100% rename from tests/System/ServiceWhitelist/WhitelistTest.php rename to dev/tests/System/WhitelistTest.php diff --git a/dev/tests/Unit/Command/AddComponentCommandTest.php b/dev/tests/Unit/Command/AddComponentCommandTest.php new file mode 100644 index 000000000000..d1db967b7642 --- /dev/null +++ b/dev/tests/Unit/Command/AddComponentCommandTest.php @@ -0,0 +1,149 @@ +add(new AddComponentCommand($tmpDir)); + self::$commandTester = new CommandTester($application->get('add-component')); + } + + public function testAddComponent() + { + self::$commandTester->setInputs([ + 'Y', // Does this information look correct? [Y/n] + 'https://cloud.google.com/secret-mananger', // What is the product homepage? + 'https://cloud.google.com/secret-manager/docs/reference/rest/', // What is the product documentation URL? + ]); + + self::$commandTester->execute([ + 'proto' => 'google/cloud/secretmanager/v1/service.proto', + ]); + + // confirm expected output + $display = self::$commandTester->getDisplay(); + $expectedDisplay = sprintf(<<assertStringContainsString($expectedLine, $display); + } + + foreach (self::$expectedFiles as $file) { + $this->assertFileExists(self::$tmpDir . '/SecretManager/' . $file); + $this->assertFileEquals( + __DIR__ . '/../../fixtures/component/SecretManager/' . $file, + self::$tmpDir . '/SecretManager/' . $file + ); + } + } + + public function testAddComponentWithCustomOptions() + { + self::$commandTester->setInputs([ + 'n', // Does this information look correct? [Y/n] + 'google.custom.proto.package', // custom value for "protoPackage" + 'Google\Cloud\CustomNamespace', // custom value for "phpNamespace" + 'Google Cloud Custom Display Name', // custom value for "displayName" + 'CustomInputs', // custom value for "componentName" + self::$tmpDir . '/CustomInput', // custom value for "componentPath" + 'google/custom-composer-package-name', // custom value for "composerPackage" + 'googleapis/google-cloud-php-custom-repo', // custom value for "githubRepo" + 'GPBMetadata\Google\Custommetadatanamespace', // custom value for "gpbMetadataNamespace" + 'customshortname', // custom value for "shortName" + 'google/cloud/custompath/(.*)', // custom value for "protoPath" + 'v2', // custom value for "version" + 'Y', // Does this information look correct? [Y/n] + 'https://cloud.google.com/coustom-product', // What is the product homepage? + 'https://cloud.google.com/coustom-product/docs/reference/rest/', // What is the product documentation URL? + ]); + + self::$commandTester->execute([ + 'proto' => 'google/cloud/secretmanager/v1/service.proto', + ]); + + // confirm expected output + $display = self::$commandTester->getDisplay(); + $expectedDisplay = sprintf(<<assertStringContainsString($expectedLine, $display); + } + + foreach (self::$expectedFiles as $file) { + $this->assertFileExists(self::$tmpDir . '/CustomInput/' . $file); + $this->assertFileEquals( + __DIR__ . '/../../fixtures/component/CustomInput/' . $file, + self::$tmpDir . '/CustomInput/' . $file + ); + } + } +} diff --git a/dev/tests/Unit/DocFx/CommandTest.php b/dev/tests/Unit/Command/DocFxCommandTest.php similarity index 96% rename from dev/tests/Unit/DocFx/CommandTest.php rename to dev/tests/Unit/Command/DocFxCommandTest.php index 15d14971740f..00d9f1196ca1 100644 --- a/dev/tests/Unit/DocFx/CommandTest.php +++ b/dev/tests/Unit/Command/DocFxCommandTest.php @@ -15,16 +15,16 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Tests\Unit\DocFx; +namespace Google\Cloud\Dev\Tests\Unit\Command; -use Google\Cloud\Dev\DocFx\Command\DocFx; +use Google\Cloud\Dev\Command\DocFxCommand; use Google\Cloud\Dev\DocFx\Page\OverviewPage; use PHPUnit\Framework\TestCase; /** * @group dev */ -class CommandTest extends TestCase +class DocFxCommandTest extends TestCase { private static $fixturesDir; private static $tmpDir; @@ -35,7 +35,7 @@ public function testGenerateVisionStructureXml() $this->markTestSkipped('Set TEST_PHPDOC_STRUCTURE_XML=1 to run this test'); } $componentDir = __DIR__ . '/../../../../Vision'; - $process = DocFx::getPhpDocCommand($componentDir, self::$tmpDir); + $process = DocFxCommand::getPhpDocCommand($componentDir, self::$tmpDir); $process->mustRun(); $left = __DIR__ . '/../../fixtures/phpdoc/structure.xml'; $right = self::$tmpDir . '/structure.xml'; diff --git a/dev/tests/Unit/ComponentManagerTest.php b/dev/tests/Unit/ComponentManagerTest.php deleted file mode 100644 index 96e1c21fe6dd..000000000000 --- a/dev/tests/Unit/ComponentManagerTest.php +++ /dev/null @@ -1,182 +0,0 @@ -cm = TestHelpers::stub(ComponentManager::class, [ - self::ROOT_PATH - ], [ - 'components', - 'manifest' - ]); - - $this->cm->___setProperty('components', $this->components); - $this->cm->___setProperty('manifest', $this->manifest); - } - - public function testComponents() - { - $this->assertEquals(array_keys($this->components), $this->cm->components()); - } - - public function testComponentsExtra() - { - $components = $this->components; - foreach ($components as &$component) { - $name = $component['composer']['name']; - $component = $component['composer']['extra']['component']; - $component['displayName'] = $name; - }; - - $this->assertEquals($components, $this->cm->componentsExtra()); - } - - public function testComponentsExtraSingleComponent() - { - $components = $this->components; - array_walk($components, function (&$component) { - $name = $component['composer']['name']; - $component = $component['composer']['extra']['component']; - $component['displayName'] = $name; - }); - - $componentId = array_keys($this->components)[0]; - $component = $components[$componentId]; - - $this->assertEquals([$componentId => $component], $this->cm->componentsExtra($componentId)); - } - - public function testComponentsManifest() - { - $this->assertEquals($this->manifest['modules'], $this->cm->componentsManifest()); - } - - public function testComponentsManifestSingleComponent() - { - $componentId = array_keys($this->components)[0]; - - $modules = array_filter($this->manifest['modules'], function ($module) use ($componentId) { - return $componentId === $module['id']; - }); - - $res = $this->cm->componentsManifest($componentId); - $this->assertEquals($modules, $res); - } - - public function testComponentsVersion() - { - $versions = []; - foreach ($this->manifest['modules'] as $module) { - $versions[$module['id']] = $module['versions'][0]; - } - - $this->assertEquals($versions, $this->cm->componentsVersion()); - } - - public function testComponentsSingleVersion() - { - $componentId = array_keys($this->components)[0]; - - $versions = []; - foreach ($this->manifest['modules'] as $module) { - if ($module['id'] !== $componentId) { - continue; - } - - $versions[$module['id']] = $module['versions'][0]; - } - - $this->assertEquals($versions, $this->cm->componentsVersion($componentId)); - } - - public function testLoadManifestAndComposers() - { - $fixturesDir = __DIR__ . '/../fixtures/component-manager'; - $cm = TestHelpers::stub(ComponentManager::class, [ - $fixturesDir, - $fixturesDir . '/manifest.json', - ], [ - 'manifest', - 'components' - ]); - - $cm->components(); - - $manifest = $cm->___getProperty('manifest'); - $components = $cm->___getProperty('components'); - - $this->assertEquals(count($manifest['modules']), count($components)); - } - - private $components = [ - 'component-a' => [ - 'composer' => [ - 'name' => 'test/component-a', - 'extra' => [ - 'component' => [ - 'id' => 'component-a' - ] - ] - ], - 'version' => 'v0.1.0' - ], - 'component-b' => [ - 'composer' => [ - 'name' => 'test/component-a', - 'extra' => [ - 'component' => [ - 'id' => 'component-b' - ] - ] - ], - 'version' => 'v1.0.0' - ] - ]; - - private $manifest = [ - 'modules' => [ - [ - 'id' => 'component-a', - 'versions' => [ - 'v0.1.0', - 'main' - ] - ], [ - 'id' => 'component-b', - 'versions' => [ - 'v1.0.0', - 'main' - ] - ] - ] - ]; -} diff --git a/dev/tests/Unit/ComponentTest.php b/dev/tests/Unit/ComponentTest.php new file mode 100644 index 000000000000..84221e95a52d --- /dev/null +++ b/dev/tests/Unit/ComponentTest.php @@ -0,0 +1,80 @@ +assertIsArray($components); + $this->assertContainsOnlyInstancesOf(Component::class, $components); + } + + /** + * @dataProvider provideComponentProperties + */ + public function testComponentProperties(string $componentName, array $details) + { + $component = new Component($componentName); + $this->assertEquals($details['id'], $component->getId()); + $this->assertEquals($details['name'], $component->getName()); + $this->assertEquals($details['path'], $component->getPath()); + $this->assertEquals($details['repo_name'], $component->getRepoName()); + $this->assertEquals($details['service_address'], $component->getServiceAddress()); + $this->assertEquals($details['api_shortname'], $component->getApiShortname()); + $this->assertEquals($details['issue_tracker'], $component->getIssueTracker()); + $this->assertEquals($details['package_name'], $component->getPackageName()); + $this->assertEquals($details['release_level'], $component->getReleaseLevel()); + $this->assertEquals($details['client_documentation'], $component->getClientDocumentation()); + $this->assertEquals($details['product_documentation'], $component->getProductDocumentation()); + $this->assertEquals($details['description'], $component->getDescription()); + $this->assertEquals($details['namespaces'], $component->getNamespaces()); + $this->assertEquals($details['reference_documentation_uid'], $component->getReferenceDocumentationUid()); + } + + public function provideComponentProperties() + { + return [ + [ + 'Bigtable', + [ + 'id' => 'cloud-bigtable', + 'name' => 'Bigtable', + 'path' => realpath(__DIR__ . '/../../../Bigtable'), + 'repo_name' => 'googleapis/google-cloud-php-bigtable', + 'service_address' => 'bigtable.googleapis.com', + 'api_shortname' => 'bigtable', + 'issue_tracker' => 'https://github.com/googleapis/google-cloud-php-bigtable/issues', + 'package_name' => 'google/cloud-bigtable', + 'release_level' => 'stable', + 'client_documentation' => 'https://cloud.google.com/php/docs/reference/cloud-bigtable/latest', + 'product_documentation' => '', + 'description' => 'Cloud Bigtable Client for PHP', + 'namespaces' => ['Google\Cloud\Bigtable'], + 'reference_documentation_uid' => 'google-cloud-bigtable', + ] + ], + ]; + } +} \ No newline at end of file diff --git a/dev/tests/Unit/Split/GitHubTest.php b/dev/tests/Unit/GitHubTest.php similarity index 95% rename from dev/tests/Unit/Split/GitHubTest.php rename to dev/tests/Unit/GitHubTest.php index b918119353ab..96cd14062b92 100644 --- a/dev/tests/Unit/Split/GitHubTest.php +++ b/dev/tests/Unit/GitHubTest.php @@ -15,11 +15,11 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Tests\Unit\Split; +namespace Google\Cloud\Dev\Tests\Unit; use Google\Cloud\Core\Testing\TestHelpers; -use Google\Cloud\Dev\Split\GitHub; -use Google\Cloud\Dev\Split\RunShell; +use Google\Cloud\Dev\GitHub; +use Google\Cloud\Dev\RunShell; use GuzzleHttp\Client; use GuzzleHttp\Exception\BadResponseException; use GuzzleHttp\Psr7\Response; @@ -60,7 +60,7 @@ public function set_up() public function testGetDefaultBranch() { - $resp = new Response(200, [], file_get_contents(__DIR__ . '/../../fixtures/split/get-repo.json')); + $resp = new Response(200, [], file_get_contents(__DIR__ . '/../fixtures/split/get-repo.json')); $uri = sprintf(GitHub::GITHUB_REPO_ENDPOINT, self::TARGET_CLEAN); $this->guzzle->get($uri, [ 'auth' => [null, self::TOKEN] @@ -80,7 +80,7 @@ public function testGetDefaultBranchHttpError() public function testIsTargetEmpty() { - $body = file_get_contents(__DIR__ . '/../../fixtures/split/get-repo.json'); + $body = file_get_contents(__DIR__ . '/../fixtures/split/get-repo.json'); $resp = new Response(200, [], $body); $uri = sprintf(GitHub::GITHUB_REPO_ENDPOINT, self::TARGET_CLEAN); $this->guzzle->get($uri, [ @@ -95,7 +95,7 @@ public function testIsTargetEmpty() public function testIsTargetEmptyReturnsTrue() { - $body = file_get_contents(__DIR__ . '/../../fixtures/split/get-repo.json'); + $body = file_get_contents(__DIR__ . '/../fixtures/split/get-repo.json'); $json = json_decode($body, true); $json['size'] = 0; @@ -186,7 +186,7 @@ public function testCreateReleaseHttpError() public function testGetChangelog() { - $resp = file_get_contents(__DIR__ . '/../../fixtures/split/get-release.json'); + $resp = file_get_contents(__DIR__ . '/../fixtures/split/get-release.json'); $this->guzzle->get( sprintf(GitHub::GITHUB_RELEASE_ENDPOINT, self::TARGET, self::TAG), ['auth' => [null, self::TOKEN]] diff --git a/tests/Unit/JsonFileTest.php b/dev/tests/Unit/JsonFileTest.php similarity index 69% rename from tests/Unit/JsonFileTest.php rename to dev/tests/Unit/JsonFileTest.php index b589af1a2971..af35c8d3688e 100644 --- a/tests/Unit/JsonFileTest.php +++ b/dev/tests/Unit/JsonFileTest.php @@ -17,6 +17,7 @@ namespace Google\Cloud\Tests\Unit; +use Google\Cloud\Dev\Component; use Swaggest\JsonSchema\Schema; use PHPUnit\Framework\TestCase; @@ -25,11 +26,11 @@ */ class JsonFileTest extends TestCase { - const SCHEMA_PATH = '%s/fixtures/schema/%s'; + const SCHEMA_PATH = '%s/../fixtures/schema/%s'; public function testComposer() { - $file = file_get_contents(__DIR__ .'/../../composer.json'); + $file = file_get_contents(__DIR__ .'/../../../composer.json'); $json = json_decode($file); $this->assertEquals(JSON_ERROR_NONE, json_last_error()); @@ -50,32 +51,14 @@ public function testComponentComposer($component) public function components() { - $files = glob(__DIR__ .'/../../*/composer.json'); - array_walk($files, function (&$file) { - $file = [realpath($file)]; - }); + $files = []; + foreach (Component::getComponents() as $component) { + $files[] = [$component->getPath() . '/composer.json']; + } return $files; } - public function testManifest() - { - $file = file_get_contents(__DIR__ .'/../../docs/manifest.json'); - $json = json_decode($file); - $this->assertEquals(JSON_ERROR_NONE, json_last_error()); - - $this->validateAndAssert($json, 'manifest.json.schema'); - } - - public function testToc() - { - $file = file_get_contents(__DIR__ .'/../../docs/toc.json'); - $json = json_decode($file); - $this->assertEquals(JSON_ERROR_NONE, json_last_error()); - - $this->validateAndAssert($json, 'toc.json.schema'); - } - private function validateAndAssert($input, $schemaPath) { $schema = file_get_contents(sprintf( diff --git a/dev/tests/Unit/NewComponentTest.php b/dev/tests/Unit/NewComponentTest.php new file mode 100644 index 000000000000..0197c16b563b --- /dev/null +++ b/dev/tests/Unit/NewComponentTest.php @@ -0,0 +1,114 @@ +protoMinimum; + $new = NewComponent::fromProto($protoContents, $protoPath); + $details += [ + 'protoPackage' => 'foo.bar.baz', + 'phpNamespace' => 'Foo\Bar\Baz', + 'displayName' => 'Foo Bar Baz', + 'componentName' => 'FooBarBaz', + 'composerPackage' => 'google/foo-bar-baz', + 'githubRepo' => 'googleapis/php-foo-bar-baz', + 'gpbMetadataNamespace' => 'GPBMetadata\Foo\Bar\Baz', + 'shortName' => 'foobarbaz', + ]; + $this->assertEquals($details['protoPackage'], $new->protoPackage); + $this->assertEquals($details['phpNamespace'], $new->phpNamespace); + $this->assertEquals($details['displayName'], $new->displayName); + $this->assertEquals($details['componentName'], $new->componentName); + $this->assertEquals($details['composerPackage'], $new->composerPackage); + $this->assertEquals($details['githubRepo'], $new->githubRepo); + $this->assertEquals($details['gpbMetadataNamespace'], $new->gpbMetadataNamespace); + $this->assertEquals($details['shortName'], $new->shortName); + $this->assertEquals($details['protoPath'], $new->protoPath); + $this->assertEquals($details['version'], $new->version); + } + + public function provideFromProto() + { + return [ + [ + 'fixtures/proto/example.proto', + [ + 'protoPackage' => 'example', + 'phpNamespace' => 'Example', + 'displayName' => 'Example', + 'componentName' => 'Example', + 'composerPackage' => 'google/example', + 'githubRepo' => 'googleapis/php-example', + 'gpbMetadataNamespace' => 'GPBMetadata\\Example', + 'shortName' => 'example', + 'protoPath' => 'fixtures/proto', + 'version' => null, + ] + ], + [ + 'foo/bar/v1/admin.proto', + ['version' => 'v1', 'protoPath' => 'foo/bar/(.*)'] + ], + [ + 'foo/bar/v2/admin/admin.proto', + ['version' => 'v2', 'protoPath' => 'foo/bar/(.*)/admin'] + ], + [ + 'foo/bar/v2beta1/admin/admin.proto', + ['version' => 'v2beta1', 'protoPath' => 'foo/bar/(.*)/admin'] + ], + [ + 'foo/bar/v1p1beta1/admin/admin.proto', + ['version' => 'v1p1beta1', 'protoPath' => 'foo/bar/(.*)/admin'] + ], + [ + 'foo/v2/admin/v1/admin.proto', + ['version' => 'v1', 'protoPath' => 'foo/v2/admin/(.*)'] + ], + [ + 'foo/bar/admin/admin.proto', + ['version' => null, 'protoPath' => 'foo/bar/admin'] + ], + [ + 'foo/bar/v1prev1/admin.proto', + ['version' => null, 'protoPath' => 'foo/bar/v1prev1'] + ], + [ + 'foo/bar/v1a/admin.proto', + ['version' => null, 'protoPath' => 'foo/bar/v1a'] + ], + ]; + } +} \ No newline at end of file diff --git a/dev/tests/Unit/Split/ReleaseNotesTest.php b/dev/tests/Unit/ReleaseNotesTest.php similarity index 91% rename from dev/tests/Unit/Split/ReleaseNotesTest.php rename to dev/tests/Unit/ReleaseNotesTest.php index def77ddd51bf..b7c9b26ec02e 100644 --- a/dev/tests/Unit/Split/ReleaseNotesTest.php +++ b/dev/tests/Unit/ReleaseNotesTest.php @@ -17,7 +17,7 @@ namespace Google\Cloud\Dev\Tests\Unit; -use Google\Cloud\Dev\Split\ReleaseNotes; +use Google\Cloud\Dev\ReleaseNotes; use Yoast\PHPUnitPolyfills\TestCases\TestCase; use Yoast\PHPUnitPolyfills\Polyfills\AssertStringContains; @@ -34,7 +34,7 @@ class ReleaseNotesTest extends TestCase public function set_up() { $this->releaseNotes = new ReleaseNotes( - file_get_contents(__DIR__ . '/../../fixtures/split/release-notes.md') + file_get_contents(__DIR__ . '/../fixtures/split/release-notes.md') ); } diff --git a/dev/tests/Unit/Split/RunShellTest.php b/dev/tests/Unit/RunShellTest.php similarity index 94% rename from dev/tests/Unit/Split/RunShellTest.php rename to dev/tests/Unit/RunShellTest.php index 1d392d72e31f..05b63ff10a0c 100644 --- a/dev/tests/Unit/Split/RunShellTest.php +++ b/dev/tests/Unit/RunShellTest.php @@ -15,9 +15,9 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Tests\Unit\Split; +namespace Google\Cloud\Dev\Tests\Unit; -use Google\Cloud\Dev\Split\RunShell; +use Google\Cloud\Dev\RunShell; use PHPUnit\Framework\TestCase; /** diff --git a/dev/tests/Unit/Split/SplitInstallTest.php b/dev/tests/Unit/SplitInstallTest.php similarity index 95% rename from dev/tests/Unit/Split/SplitInstallTest.php rename to dev/tests/Unit/SplitInstallTest.php index 09b256beb458..86eead24a933 100644 --- a/dev/tests/Unit/Split/SplitInstallTest.php +++ b/dev/tests/Unit/SplitInstallTest.php @@ -15,11 +15,11 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Tests\Unit\Split; +namespace Google\Cloud\Dev\Tests\Unit; use Google\Cloud\Core\Testing\TestHelpers; -use Google\Cloud\Dev\Split\RunShell; -use Google\Cloud\Dev\Split\SplitInstall; +use Google\Cloud\Dev\RunShell; +use Google\Cloud\Dev\SplitInstall; use Yoast\PHPUnitPolyfills\TestCases\TestCase; use Yoast\PHPUnitPolyfills\Polyfills\ExpectException; diff --git a/dev/tests/Unit/Split/SplitTest.php b/dev/tests/Unit/SplitTest.php similarity index 94% rename from dev/tests/Unit/Split/SplitTest.php rename to dev/tests/Unit/SplitTest.php index a3309672dd3b..d4e0ecc06941 100644 --- a/dev/tests/Unit/Split/SplitTest.php +++ b/dev/tests/Unit/SplitTest.php @@ -15,11 +15,11 @@ * limitations under the License. */ -namespace Google\Cloud\Dev\Tests\Unit\Split; +namespace Google\Cloud\Dev\Tests\Unit; use Google\Cloud\Core\Testing\TestHelpers; -use Google\Cloud\Dev\Split\RunShell; -use Google\Cloud\Dev\Split\Split; +use Google\Cloud\Dev\RunShell; +use Google\Cloud\Dev\Split; use Yoast\PHPUnitPolyfills\TestCases\TestCase; use Prophecy\Argument; diff --git a/dev/tests/fixtures/component/CustomInput/.OwlBot.yaml b/dev/tests/fixtures/component/CustomInput/.OwlBot.yaml new file mode 100644 index 000000000000..a80333248ca7 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/.OwlBot.yaml @@ -0,0 +1,4 @@ +deep-copy-regex: + - source: /google/cloud/custompath/(.*)/.*-php/(.*) + dest: /owl-bot-staging/CustomInputs/$1/$2 +api-name: CustomInputs diff --git a/dev/tests/fixtures/component/CustomInput/.gitattributes b/dev/tests/fixtures/component/CustomInput/.gitattributes new file mode 100644 index 000000000000..9a8480242644 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/.gitattributes @@ -0,0 +1,8 @@ +/*.xml.dist export-ignore +/tests export-ignore +/.github export-ignore +/samples export-ignore +/.repo-metadata.json export-ignore +/.OwlBot.yaml export-ignore +/owlbot.py export-ignore +/src/**/gapic_metadata.json export-ignore diff --git a/dev/tests/fixtures/component/CustomInput/.github/pull_request_template.md b/dev/tests/fixtures/component/CustomInput/.github/pull_request_template.md new file mode 100644 index 000000000000..606149f49082 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/.github/pull_request_template.md @@ -0,0 +1,24 @@ +**PLEASE READ THIS ENTIRE MESSAGE** + +Hello, and thank you for your contribution! Please note that this repository is +a read-only split of `googleapis/google-cloud-php`. As such, we are +unable to accept pull requests to this repository. + +We welcome your pull request and would be happy to consider it for inclusion in +our library if you follow these steps: + +* Clone the parent client library repository: + +```sh +$ git clone git@github.com:googleapis/google-cloud-php.git +``` + +* Move your changes into the correct location in that library. Library code +belongs in `{clientBase}/src`, and tests in `{clientBase}/tests`. + +* Push the changes in a new branch to a fork, and open a new pull request +[here](https://github.com/googleapis/google-cloud-php). + +Thanks again, and we look forward to seeing your proposed change! + +The Google Cloud PHP team diff --git a/dev/tests/fixtures/component/CustomInput/.repo-metadata.json b/dev/tests/fixtures/component/CustomInput/.repo-metadata.json new file mode 100644 index 000000000000..cfd04e4aa3b3 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/.repo-metadata.json @@ -0,0 +1,7 @@ +{ + "distribution_name": "google/custom-composer-package-name", + "release_level": "preview", + "client_documentation": "https://cloud.google.com/php/docs/reference/custom-composer-package-name/latest", + "library_type": "GAPIC_AUTO", + "api_shortname": "customshortname" +} diff --git a/dev/tests/fixtures/component/CustomInput/CONTRIBUTING.md b/dev/tests/fixtures/component/CustomInput/CONTRIBUTING.md new file mode 100644 index 000000000000..76ea811cacdb --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. We accept +and review pull requests against the main +[Google Cloud PHP](https://github.com/googleapis/google-cloud-php) +repository, which contains all of our client libraries. You will also need to +sign a Contributor License Agreement. For more details about how to contribute, +see the +[CONTRIBUTING.md](https://github.com/googleapis/google-cloud-php/blob/main/CONTRIBUTING.md) +file in the main Google Cloud PHP repository. diff --git a/dev/tests/fixtures/component/CustomInput/LICENSE b/dev/tests/fixtures/component/CustomInput/LICENSE new file mode 100644 index 000000000000..8f71f43fee3f --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. + diff --git a/dev/tests/fixtures/component/CustomInput/README.md b/dev/tests/fixtures/component/CustomInput/README.md new file mode 100644 index 000000000000..0f4b4d040397 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/README.md @@ -0,0 +1,45 @@ +# Google Cloud Custom Display Name for PHP + +> Idiomatic PHP client for [Google Cloud Custom Display Name](https://cloud.google.com/coustom-product). + +[![Latest Stable Version](https://poser.pugx.org/google/custom-composer-package-name/v/stable)](https://packagist.org/packages/google/custom-composer-package-name) [![Packagist](https://img.shields.io/packagist/dm/google/custom-composer-package-name.svg)](https://packagist.org/packages/google/custom-composer-package-name) + +* [API documentation](https://cloud.google.com/php/docs/reference/custom-composer-package-name/latest) + +**NOTE:** This repository is part of [Google Cloud PHP](https://github.com/googleapis/google-cloud-php). Any +support requests, bug reports, or development contributions should be directed to +that project. + +### Installation + +To begin, install the preferred dependency manager for PHP, [Composer](https://getcomposer.org/). + +Now, install this component: + +```sh +$ composer require google/custom-composer-package-name +``` + +> Browse the complete list of [Google Cloud APIs](https://cloud.google.com/php/docs/reference) +> for PHP + +This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits +offered by gRPC (such as streaming methods) please see our +[gRPC installation guide](https://cloud.google.com/php/grpc). + +### Authentication + +Please see our [Authentication guide](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md) for more information +on authenticating your client. Once authenticated, you'll be ready to start making requests. + +### Sample + +See the [samples directory](samples/) for a canonical list of samples. + +### Version + +This component is considered alpha. As such, it is still a work-in-progress and is more likely to get backwards-incompatible updates. + +### Next Steps + +1. Understand the [official documentation](https://cloud.google.com/coustom-product/docs/reference/rest/). diff --git a/dev/tests/fixtures/component/CustomInput/VERSION b/dev/tests/fixtures/component/CustomInput/VERSION new file mode 100644 index 000000000000..77d6f4ca2371 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/VERSION @@ -0,0 +1 @@ +0.0.0 diff --git a/dev/tests/fixtures/component/CustomInput/composer.json b/dev/tests/fixtures/component/CustomInput/composer.json new file mode 100644 index 000000000000..acbc5a1d8c06 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/composer.json @@ -0,0 +1,29 @@ +{ + "name": "google/custom-composer-package-name", + "description": "Google Cloud Custom Display Name Client for PHP", + "license": "Apache-2.0", + "minimum-stability": "stable", + "autoload": { + "psr-4": { + "Google\\Cloud\\CustomNamespace\\": "src", + "GPBMetadata\\Google\\Custommetadatanamespace\\": "metadata" + } + }, + "extra": { + "component": { + "id": "custom-composer-package-name", + "path": "CustomInput", + "target": "googleapis/google-cloud-php-custom-repo" + } + }, + "require": { + "google/gax": "^1.19.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0|^8.0" + }, + "suggest": { + "ext-grpc": "Enables use of gRPC, a universal high-performance RPC framework created by Google.", + "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." + } +} diff --git a/dev/tests/fixtures/component/CustomInput/owlbot.py b/dev/tests/fixtures/component/CustomInput/owlbot.py new file mode 100644 index 000000000000..f0ffddf1d7b0 --- /dev/null +++ b/dev/tests/fixtures/component/CustomInput/owlbot.py @@ -0,0 +1,63 @@ +# Copyright 2023 Google LLC +# +# 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. + +"""This script is used to synthesize generated parts of this library.""" + +import logging +from pathlib import Path +import subprocess + +import synthtool as s +from synthtool.languages import php +from synthtool import _tracked_paths + +logging.basicConfig(level=logging.DEBUG) + +src = Path(f"../{php.STAGING_DIR}/CustomInputs").resolve() +dest = Path().resolve() + +# Added so that we can pass copy_excludes in the owlbot_main() call +_tracked_paths.add(src) + +php.owlbot_main( + src=src, + dest=dest, + copy_excludes=[ + src / "**/[A-Z]*_*.php", + src / "**/*GrpcClient.php" + ] +) + +# remove class_alias code +s.replace( + "src/V*/**/*.php", + r"^// Adding a class alias for backwards compatibility with the previous class name.$" + + "\n" + + r"^class_alias\(.*\);$" + + "\n", + '') + +# format generated clients +subprocess.run([ + 'npm', + 'exec', + '--yes', + '--package=@prettier/plugin-php@^0.16', + '--', + 'prettier', + '**/Gapic/*', + '--write', + '--parser=php', + '--single-quote', + '--print-width=80']) diff --git a/dev/src/AddComponent/templates/template-phpunit-system.xml.dist.txt b/dev/tests/fixtures/component/CustomInput/phpunit.xml.dist similarity index 67% rename from dev/src/AddComponent/templates/template-phpunit-system.xml.dist.txt rename to dev/tests/fixtures/component/CustomInput/phpunit.xml.dist index 6ad255f35f5a..cccafd87a9d8 100644 --- a/dev/src/AddComponent/templates/template-phpunit-system.xml.dist.txt +++ b/dev/tests/fixtures/component/CustomInput/phpunit.xml.dist @@ -1,8 +1,8 @@ - + - - tests/System + + tests/Unit diff --git a/dev/tests/fixtures/component/SecretManager/.OwlBot.yaml b/dev/tests/fixtures/component/SecretManager/.OwlBot.yaml new file mode 100644 index 000000000000..29dc76fe8d5d --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/.OwlBot.yaml @@ -0,0 +1,4 @@ +deep-copy-regex: + - source: /google/cloud/secretmanager/(.*)/.*-php/(.*) + dest: /owl-bot-staging/SecretManager/$1/$2 +api-name: SecretManager diff --git a/dev/tests/fixtures/component/SecretManager/.gitattributes b/dev/tests/fixtures/component/SecretManager/.gitattributes new file mode 100644 index 000000000000..9a8480242644 --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/.gitattributes @@ -0,0 +1,8 @@ +/*.xml.dist export-ignore +/tests export-ignore +/.github export-ignore +/samples export-ignore +/.repo-metadata.json export-ignore +/.OwlBot.yaml export-ignore +/owlbot.py export-ignore +/src/**/gapic_metadata.json export-ignore diff --git a/dev/tests/fixtures/component/SecretManager/.github/pull_request_template.md b/dev/tests/fixtures/component/SecretManager/.github/pull_request_template.md new file mode 100644 index 000000000000..606149f49082 --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/.github/pull_request_template.md @@ -0,0 +1,24 @@ +**PLEASE READ THIS ENTIRE MESSAGE** + +Hello, and thank you for your contribution! Please note that this repository is +a read-only split of `googleapis/google-cloud-php`. As such, we are +unable to accept pull requests to this repository. + +We welcome your pull request and would be happy to consider it for inclusion in +our library if you follow these steps: + +* Clone the parent client library repository: + +```sh +$ git clone git@github.com:googleapis/google-cloud-php.git +``` + +* Move your changes into the correct location in that library. Library code +belongs in `{clientBase}/src`, and tests in `{clientBase}/tests`. + +* Push the changes in a new branch to a fork, and open a new pull request +[here](https://github.com/googleapis/google-cloud-php). + +Thanks again, and we look forward to seeing your proposed change! + +The Google Cloud PHP team diff --git a/dev/tests/fixtures/component/SecretManager/.repo-metadata.json b/dev/tests/fixtures/component/SecretManager/.repo-metadata.json new file mode 100644 index 000000000000..232c2d0bbec9 --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/.repo-metadata.json @@ -0,0 +1,7 @@ +{ + "distribution_name": "google/cloud-secretmanager", + "release_level": "preview", + "client_documentation": "https://cloud.google.com/php/docs/reference/cloud-secretmanager/latest", + "library_type": "GAPIC_AUTO", + "api_shortname": "secretmanager" +} diff --git a/dev/tests/fixtures/component/SecretManager/CONTRIBUTING.md b/dev/tests/fixtures/component/SecretManager/CONTRIBUTING.md new file mode 100644 index 000000000000..76ea811cacdb --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/CONTRIBUTING.md @@ -0,0 +1,10 @@ +# How to Contribute + +We'd love to accept your patches and contributions to this project. We accept +and review pull requests against the main +[Google Cloud PHP](https://github.com/googleapis/google-cloud-php) +repository, which contains all of our client libraries. You will also need to +sign a Contributor License Agreement. For more details about how to contribute, +see the +[CONTRIBUTING.md](https://github.com/googleapis/google-cloud-php/blob/main/CONTRIBUTING.md) +file in the main Google Cloud PHP repository. diff --git a/dev/tests/fixtures/component/SecretManager/LICENSE b/dev/tests/fixtures/component/SecretManager/LICENSE new file mode 100644 index 000000000000..8f71f43fee3f --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/LICENSE @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. + diff --git a/dev/tests/fixtures/component/SecretManager/README.md b/dev/tests/fixtures/component/SecretManager/README.md new file mode 100644 index 000000000000..0bad07113b0e --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/README.md @@ -0,0 +1,45 @@ +# Google Cloud Secret Manager for PHP + +> Idiomatic PHP client for [Google Cloud Secret Manager](https://cloud.google.com/secret-mananger). + +[![Latest Stable Version](https://poser.pugx.org/google/cloud-secretmanager/v/stable)](https://packagist.org/packages/google/cloud-secretmanager) [![Packagist](https://img.shields.io/packagist/dm/google/cloud-secretmanager.svg)](https://packagist.org/packages/google/cloud-secretmanager) + +* [API documentation](https://cloud.google.com/php/docs/reference/cloud-secretmanager/latest) + +**NOTE:** This repository is part of [Google Cloud PHP](https://github.com/googleapis/google-cloud-php). Any +support requests, bug reports, or development contributions should be directed to +that project. + +### Installation + +To begin, install the preferred dependency manager for PHP, [Composer](https://getcomposer.org/). + +Now, install this component: + +```sh +$ composer require google/cloud-secretmanager +``` + +> Browse the complete list of [Google Cloud APIs](https://cloud.google.com/php/docs/reference) +> for PHP + +This component supports both REST over HTTP/1.1 and gRPC. In order to take advantage of the benefits +offered by gRPC (such as streaming methods) please see our +[gRPC installation guide](https://cloud.google.com/php/grpc). + +### Authentication + +Please see our [Authentication guide](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md) for more information +on authenticating your client. Once authenticated, you'll be ready to start making requests. + +### Sample + +See the [samples directory](samples/) for a canonical list of samples. + +### Version + +This component is considered alpha. As such, it is still a work-in-progress and is more likely to get backwards-incompatible updates. + +### Next Steps + +1. Understand the [official documentation](https://cloud.google.com/secret-manager/docs/reference/rest/). diff --git a/dev/tests/fixtures/component/SecretManager/VERSION b/dev/tests/fixtures/component/SecretManager/VERSION new file mode 100644 index 000000000000..77d6f4ca2371 --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/VERSION @@ -0,0 +1 @@ +0.0.0 diff --git a/dev/tests/fixtures/component/SecretManager/composer.json b/dev/tests/fixtures/component/SecretManager/composer.json new file mode 100644 index 000000000000..8b6b28fde56c --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/composer.json @@ -0,0 +1,29 @@ +{ + "name": "google/cloud-secretmanager", + "description": "Google Cloud Secret Manager Client for PHP", + "license": "Apache-2.0", + "minimum-stability": "stable", + "autoload": { + "psr-4": { + "Google\\Cloud\\SecretManager\\": "src", + "GPBMetadata\\Google\\Cloud\\Secretmanager\\": "metadata" + } + }, + "extra": { + "component": { + "id": "cloud-secretmanager", + "path": "SecretManager", + "target": "googleapis/google-cloud-php-secretmanager" + } + }, + "require": { + "google/gax": "^1.19.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8|^5.0|^8.0" + }, + "suggest": { + "ext-grpc": "Enables use of gRPC, a universal high-performance RPC framework created by Google.", + "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." + } +} diff --git a/dev/tests/fixtures/component/SecretManager/owlbot.py b/dev/tests/fixtures/component/SecretManager/owlbot.py new file mode 100644 index 000000000000..37f14d4a3e04 --- /dev/null +++ b/dev/tests/fixtures/component/SecretManager/owlbot.py @@ -0,0 +1,63 @@ +# Copyright 2023 Google LLC +# +# 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. + +"""This script is used to synthesize generated parts of this library.""" + +import logging +from pathlib import Path +import subprocess + +import synthtool as s +from synthtool.languages import php +from synthtool import _tracked_paths + +logging.basicConfig(level=logging.DEBUG) + +src = Path(f"../{php.STAGING_DIR}/SecretManager").resolve() +dest = Path().resolve() + +# Added so that we can pass copy_excludes in the owlbot_main() call +_tracked_paths.add(src) + +php.owlbot_main( + src=src, + dest=dest, + copy_excludes=[ + src / "**/[A-Z]*_*.php", + src / "**/*GrpcClient.php" + ] +) + +# remove class_alias code +s.replace( + "src/V*/**/*.php", + r"^// Adding a class alias for backwards compatibility with the previous class name.$" + + "\n" + + r"^class_alias\(.*\);$" + + "\n", + '') + +# format generated clients +subprocess.run([ + 'npm', + 'exec', + '--yes', + '--package=@prettier/plugin-php@^0.16', + '--', + 'prettier', + '**/Gapic/*', + '--write', + '--parser=php', + '--single-quote', + '--print-width=80']) diff --git a/dev/src/AddComponent/templates/template-phpunit-snippets.xml.dist.txt b/dev/tests/fixtures/component/SecretManager/phpunit.xml.dist similarity index 66% rename from dev/src/AddComponent/templates/template-phpunit-snippets.xml.dist.txt rename to dev/tests/fixtures/component/SecretManager/phpunit.xml.dist index 503ea958da40..9d21a5fc64bc 100644 --- a/dev/src/AddComponent/templates/template-phpunit-snippets.xml.dist.txt +++ b/dev/tests/fixtures/component/SecretManager/phpunit.xml.dist @@ -1,11 +1,8 @@ - + - - tests/Snippet + + tests/Unit diff --git a/dev/tests/fixtures/proto/example.proto b/dev/tests/fixtures/proto/example.proto new file mode 100644 index 000000000000..eba986c8f31f --- /dev/null +++ b/dev/tests/fixtures/proto/example.proto @@ -0,0 +1,35 @@ +// Copyright 2021 Google LLC +// +// 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 +// +// https://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. + +syntax = "proto3"; + +package example; + +service Example { + option (google.api.default_host) = "example.googleapis.com"; + + // An example method; retry specified in example-grpc-service-config.json + rpc ExampleMethod(Request) returns(Response); + + // An example method; retry specified in example-service-config.yaml + rpc ExampleMethodRetryServiceYaml(Request) returns(Response); + + // An example Long Running Operation method + rpc LroMethod(Request) returns(google.longrunning.Operation) { + option (google.longrunning.operation_info) = { + response_type: "LroResponse" + metadata_type: "LroMetadata" + }; + } +} diff --git a/tests/Unit/fixtures/schema/composer.json.schema b/dev/tests/fixtures/schema/composer.json.schema similarity index 100% rename from tests/Unit/fixtures/schema/composer.json.schema rename to dev/tests/fixtures/schema/composer.json.schema diff --git a/tests/Unit/fixtures/schema/manifest.json.schema b/dev/tests/fixtures/schema/manifest.json.schema similarity index 100% rename from tests/Unit/fixtures/schema/manifest.json.schema rename to dev/tests/fixtures/schema/manifest.json.schema diff --git a/tests/Unit/fixtures/schema/toc.json.schema b/dev/tests/fixtures/schema/toc.json.schema similarity index 100% rename from tests/Unit/fixtures/schema/toc.json.schema rename to dev/tests/fixtures/schema/toc.json.schema diff --git a/docs/contents/access-context-manager.json b/docs/contents/access-context-manager.json deleted file mode 100644 index 856c6c9633ae..000000000000 --- a/docs/contents/access-context-manager.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "AccessContextManager", - "defaultService": "accesscontextmanager\/readme", - "services": [ - { - "title": "Overview", - "type": "accesscontextmanager\/readme" - }, - { - "title": "AccessContextManagerClient (v1)", - "type": "accesscontextmanager\/v1\/accesscontextmanagerclient" - } - ], - "pattern": "accesscontextmanager\/\\w{1,}" -} diff --git a/docs/contents/analytics-admin.json b/docs/contents/analytics-admin.json deleted file mode 100644 index b5c1fb06a1d5..000000000000 --- a/docs/contents/analytics-admin.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "title": "AnalyticsAdmin", - "defaultService": "analyticsadmin\/readme", - "services": [ - { - "title": "Overview", - "type": "analyticsadmin\/readme" - }, - { - "title": "AnalyticsAdminServiceClient (v1alpha)", - "type": "analyticsadmin\/v1alpha\/analyticsadminserviceclient", - "nav": [], - "patterns": [ - "analyticsadmin\/v1alpha\/\\w{1,}" - ] - }, - { - "title": "AnalyticsAdminServiceClient (v1beta)", - "type": "analyticsadmin\/v1beta\/analyticsadminserviceclient", - "nav": [], - "patterns": [ - "analyticsadmin\/v1beta\/\\w{1,}" - ] - } - ], - "pattern": "analyticsadmin\/\\w{1,}" -} diff --git a/docs/contents/analytics-data.json b/docs/contents/analytics-data.json deleted file mode 100644 index 0161f9bfbf53..000000000000 --- a/docs/contents/analytics-data.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "AnalyticsData", - "defaultService": "analyticsdata\/readme", - "services": [ - { - "title": "Overview", - "type": "analyticsdata\/readme" - }, - { - "title": "v1alpha", - "type": "analyticsdata\/v1alpha\/readme", - "nav": [ - { - "title": "AlphaAnalyticsDataClient", - "type": "analyticsdata\/v1alpha\/alphaanalyticsdataclient" - } - ], - "patterns": [ - "analyticsdata\/v1alpha\/\\w{1,}" - ] - }, - { - "title": "v1beta", - "type": "analyticsdata\/v1beta\/readme", - "nav": [ - { - "title": "BetaAnalyticsDataClient", - "type": "analyticsdata\/v1beta\/betaanalyticsdataclient" - } - ], - "patterns": [ - "analyticsdata\/v1alpha\/\\w{1,}" - ] - } - ], - "pattern": "analyticsdata\/\\w{1,}" -} diff --git a/docs/contents/cloud-access-approval.json b/docs/contents/cloud-access-approval.json deleted file mode 100644 index 7bb68ed46dac..000000000000 --- a/docs/contents/cloud-access-approval.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "accessapproval", - "defaultService": "accessapproval\/readme", - "services": [ - { - "title": "Overview", - "type": "accessapproval\/readme" - }, - { - "title": "AccessApprovalClient (v1)", - "type": "accessapproval\/v1\/accessapprovalclient" - } - ], - "pattern": "accessapproval\/\\w{1,}" -} diff --git a/docs/contents/cloud-ai-platform.json b/docs/contents/cloud-ai-platform.json deleted file mode 100644 index f5ecdb37bb19..000000000000 --- a/docs/contents/cloud-ai-platform.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "title": "AiPlatform", - "defaultService": "aiplatform\/readme", - "services": [ - { - "title": "Overview", - "type": "aiplatform\/readme" - }, - { - "title": "DatasetServiceClient (v1)", - "type": "aiplatform\/v1\/datasetserviceclient" - }, - { - "title": "EndpointServiceClient (v1)", - "type": "aiplatform\/v1\/endpointserviceclient" - }, - { - "title": "FeaturestoreOnlineServingServiceClient (v1)", - "type": "aiplatform\/v1\/featurestoreonlineservingserviceclient" - }, - { - "title": "FeaturestoreServiceClient (v1)", - "type": "aiplatform\/v1\/featurestoreserviceclient" - }, - { - "title": "IndexEndpointServiceClient (v1)", - "type": "aiplatform\/v1\/indexendpointserviceclient" - }, - { - "title": "IndexServiceClient (v1)", - "type": "aiplatform\/v1\/indexserviceclient" - }, - { - "title": "JobServiceClient (v1)", - "type": "aiplatform\/v1\/jobserviceclient" - }, - { - "title": "MetadataServiceClient (v1)", - "type": "aiplatform\/v1\/metadataserviceclient" - }, - { - "title": "MigrationServiceClient (v1)", - "type": "aiplatform\/v1\/migrationserviceclient" - }, - { - "title": "ModelServiceClient (v1)", - "type": "aiplatform\/v1\/modelserviceclient" - }, - { - "title": "PipelineServiceClient (v1)", - "type": "aiplatform\/v1\/pipelineserviceclient" - }, - { - "title": "PredictionServiceClient (v1)", - "type": "aiplatform\/v1\/predictionserviceclient" - }, - { - "title": "SpecialistPoolServiceClient (v1)", - "type": "aiplatform\/v1\/specialistpoolserviceclient" - }, - { - "title": "TensorboardServiceClient (v1)", - "type": "aiplatform\/v1\/tensorboardserviceclient" - }, - { - "title": "VizierServiceClient (v1)", - "type": "aiplatform\/v1\/vizierserviceclient" - } - ], - "pattern": "aiplatform\/\\w{1,}" -} diff --git a/docs/contents/cloud-api-gateway.json b/docs/contents/cloud-api-gateway.json deleted file mode 100644 index ee100334b398..000000000000 --- a/docs/contents/cloud-api-gateway.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ApiGateway", - "defaultService": "apigateway\/readme", - "services": [ - { - "title": "Overview", - "type": "apigateway\/readme" - }, - { - "title": "ApiGatewayServiceClient (v1)", - "type": "apigateway\/v1\/apigatewayserviceclient" - } - ], - "pattern": "apigateway\/\\w{1,}" -} diff --git a/docs/contents/cloud-api-keys.json b/docs/contents/cloud-api-keys.json deleted file mode 100644 index 6a0184aba16f..000000000000 --- a/docs/contents/cloud-api-keys.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ApiKeys", - "defaultService": "apikeys\/readme", - "services": [ - { - "title": "Overview", - "type": "apikeys\/readme" - }, - { - "title": "ApiKeysClient (v2)", - "type": "apikeys\/v2\/apikeysclient" - } - ], - "pattern": "apikeys\/\\w{1,}" -} diff --git a/docs/contents/cloud-apigee-connect.json b/docs/contents/cloud-apigee-connect.json deleted file mode 100644 index 315de1078df2..000000000000 --- a/docs/contents/cloud-apigee-connect.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "ApigeeConnect", - "defaultService": "apigeeconnect\/readme", - "services": [ - { - "title": "Overview", - "type": "apigeeconnect\/readme" - }, - { - "title": "ConnectionServiceClient (v1)", - "type": "apigeeconnect\/v1\/connectionserviceclient" - }, - { - "title": "TetherClient (v1)", - "type": "apigeeconnect\/v1\/tetherclient" - } - ], - "pattern": "apigeeconnect\/\\w{1,}" -} diff --git a/docs/contents/cloud-apigee-registry.json b/docs/contents/cloud-apigee-registry.json deleted file mode 100644 index 83762345e566..000000000000 --- a/docs/contents/cloud-apigee-registry.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "ApigeeRegistry", - "defaultService": "apigeeregistry\/readme", - "services": [ - { - "title": "Overview", - "type": "apigeeregistry\/readme" - }, - { - "title": "ProvisioningClient (v1)", - "type": "apigeeregistry\/v1\/provisioningclient" - }, - { - "title": "RegistryClient (v1)", - "type": "apigeeregistry\/v1\/registryclient" - } - ], - "pattern": "apigeeregistry\/\\w{1,}" -} diff --git a/docs/contents/cloud-appengine-admin.json b/docs/contents/cloud-appengine-admin.json deleted file mode 100644 index 0ee3610c8d95..000000000000 --- a/docs/contents/cloud-appengine-admin.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "AppEngineAdmin", - "defaultService": "appengineadmin\/readme", - "services": [ - { - "title": "Overview", - "type": "appengineadmin\/readme" - }, - { - "title": "ApplicationsClient (v1)", - "type": "appengineadmin\/v1\/applicationsclient" - }, - { - "title": "AuthorizedCertificatesClient (v1)", - "type": "appengineadmin\/v1\/authorizedcertificatesclient" - }, - { - "title": "AuthorizedDomainsClient (v1)", - "type": "appengineadmin\/v1\/authorizeddomainsclient" - }, - { - "title": "DomainMappingsClient (v1)", - "type": "appengineadmin\/v1\/domainmappingsclient" - }, - { - "title": "FirewallClient (v1)", - "type": "appengineadmin\/v1\/firewallclient" - }, - { - "title": "InstancesClient (v1)", - "type": "appengineadmin\/v1\/instancesclient" - }, - { - "title": "ServicesClient (v1)", - "type": "appengineadmin\/v1\/servicesclient" - }, - { - "title": "VersionsClient (v1)", - "type": "appengineadmin\/v1\/versionsclient" - } - ], - "pattern": "appengineadmin\/\\w{1,}" -} diff --git a/docs/contents/cloud-artifact-registry.json b/docs/contents/cloud-artifact-registry.json deleted file mode 100644 index c1829b4c5d2e..000000000000 --- a/docs/contents/cloud-artifact-registry.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ArtifactRegistry", - "defaultService": "artifactregistry\/readme", - "services": [ - { - "title": "Overview", - "type": "artifactregistry\/readme" - }, - { - "title": "ArtifactRegistryClient (v1beta2)", - "type": "artifactregistry\/v1beta2\/artifactregistryclient" - } - ], - "pattern": "artifactregistry\/\\w{1,}" -} diff --git a/docs/contents/cloud-asset.json b/docs/contents/cloud-asset.json deleted file mode 100644 index f403a0684af2..000000000000 --- a/docs/contents/cloud-asset.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Asset", - "defaultService": "asset\/readme", - "services": [ - { - "title": "Overview", - "type": "asset\/readme" - }, - { - "title": "AssetServiceClient(v1)", - "type": "asset\/v1\/assetserviceclient" - }, - { - "title": "AssetServiceClient(v1beta1)", - "type": "asset\/v1beta1\/assetserviceclient" - } - ], - "pattern": "asset\/\\w{1,}" -} diff --git a/docs/contents/cloud-assured-workloads.json b/docs/contents/cloud-assured-workloads.json deleted file mode 100644 index cf45544c2717..000000000000 --- a/docs/contents/cloud-assured-workloads.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "AssuredWorkloads", - "defaultService": "assuredworkloads\/readme", - "services": [ - { - "title": "Overview", - "type": "assuredworkloads\/readme" - }, - { - "title": "v1beta1", - "type": "assuredworkloads\/v1beta1\/readme", - "nav": [], - "patterns": [ - "assuredworkloads\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "assuredworkloads\/\\w{1,}" -} diff --git a/docs/contents/cloud-automl.json b/docs/contents/cloud-automl.json deleted file mode 100644 index f6db18b7afff..000000000000 --- a/docs/contents/cloud-automl.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "AutoMl", - "defaultService": "automl\/readme", - "services": [ - { - "title": "Overview", - "type": "automl\/readme" - }, - { - "title": "v1beta1", - "type": "automl\/v1beta1\/readme", - "nav": [ - { - "title": "AutoMlClient", - "type": "automl\/v1beta1\/automlclient" - }, - { - "title": "PredictionServiceClient", - "type": "automl\/v1beta1\/predictionserviceclient" - } - ], - "patterns": [ - "automl\/v1beta1\/\\w{1,}" - ] - }, - { - "title": "v1", - "type": "automl\/v1\/readme", - "nav": [ - { - "title": "AutoMlClient", - "type": "automl\/v1\/automlclient" - }, - { - "title": "PredictionServiceClient", - "type": "automl\/v1\/predictionserviceclient" - } - ], - "patterns": [ - "automl\/v1\/\\w{1,}" - ] - } - ], - "pattern": "automl\/\\w{1,}" -} diff --git a/docs/contents/cloud-bare-metal-solution.json b/docs/contents/cloud-bare-metal-solution.json deleted file mode 100644 index 87aaabfd7ba3..000000000000 --- a/docs/contents/cloud-bare-metal-solution.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BareMetalSolution", - "defaultService": "baremetalsolution\/readme", - "services": [ - { - "title": "Overview", - "type": "baremetalsolution\/readme" - }, - { - "title": "BareMetalSolutionClient (v2)", - "type": "baremetalsolution\/v2\/baremetalsolutionclient" - } - ], - "pattern": "baremetalsolution\/\\w{1,}" -} diff --git a/docs/contents/cloud-batch.json b/docs/contents/cloud-batch.json deleted file mode 100644 index d3fe407d8544..000000000000 --- a/docs/contents/cloud-batch.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "Batch", - "defaultService": "batch\/readme", - "services": [ - { - "title": "Overview", - "type": "batch\/readme" - } - ], - "pattern": "batch\/\\w{1,}" -} diff --git a/docs/contents/cloud-beyondcorp-appconnections.json b/docs/contents/cloud-beyondcorp-appconnections.json deleted file mode 100644 index 2d92a5b6687b..000000000000 --- a/docs/contents/cloud-beyondcorp-appconnections.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "BeyondCorpAppConnections", - "defaultService": "beyondcorpappconnections\/readme", - "services": [ - { - "title": "Overview", - "type": "beyondcorpappconnections\/readme" - } - ], - "pattern": "beyondcorpappconnections\/\\w{1,}" -} diff --git a/docs/contents/cloud-beyondcorp-appconnectors.json b/docs/contents/cloud-beyondcorp-appconnectors.json deleted file mode 100644 index 6f8fa1e728a8..000000000000 --- a/docs/contents/cloud-beyondcorp-appconnectors.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "BeyondCorpAppConnectors", - "defaultService": "beyondcorpappconnectors\/readme", - "services": [ - { - "title": "Overview", - "type": "beyondcorpappconnectors\/readme" - } - ], - "pattern": "beyondcorpappconnectors\/\\w{1,}" -} diff --git a/docs/contents/cloud-beyondcorp-appgateways.json b/docs/contents/cloud-beyondcorp-appgateways.json deleted file mode 100644 index 3ce09369ec9e..000000000000 --- a/docs/contents/cloud-beyondcorp-appgateways.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "BeyondCorpAppGateways", - "defaultService": "beyondcorpappgateways\/readme", - "services": [ - { - "title": "Overview", - "type": "beyondcorpappgateways\/readme" - } - ], - "pattern": "beyondcorpappgateways\/\\w{1,}" -} diff --git a/docs/contents/cloud-beyondcorp-clientconnectorservices.json b/docs/contents/cloud-beyondcorp-clientconnectorservices.json deleted file mode 100644 index a763fe5837b7..000000000000 --- a/docs/contents/cloud-beyondcorp-clientconnectorservices.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "beyondcorpclientconnectorservices", - "defaultService": "beyondcorpclientconnectorservices\/readme", - "services": [ - { - "title": "Overview", - "type": "beyondcorpclientconnectorservices\/readme" - } - ], - "pattern": "beyondcorpclientconnectorservices\/\\w{1,}" -} diff --git a/docs/contents/cloud-beyondcorp-clientgateways.json b/docs/contents/cloud-beyondcorp-clientgateways.json deleted file mode 100644 index d4872f59a10f..000000000000 --- a/docs/contents/cloud-beyondcorp-clientgateways.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "BeyondCorpClientGateways", - "defaultService": "beyondcorpclientgateways\/readme", - "services": [ - { - "title": "Overview", - "type": "beyondcorpclientgateways\/readme" - } - ], - "pattern": "beyondcorpclientgateways\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-analyticshub.json b/docs/contents/cloud-bigquery-analyticshub.json deleted file mode 100644 index 6a93efe1ae7f..000000000000 --- a/docs/contents/cloud-bigquery-analyticshub.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQueryAnalyticsHub", - "defaultService": "bigqueryanalyticshub\/readme", - "services": [ - { - "title": "Overview", - "type": "bigqueryanalyticshub\/readme" - }, - { - "title": "AnalyticsHubServiceClient (v1)", - "type": "bigqueryanalyticshub\/v1\/analyticshubserviceclient" - } - ], - "pattern": "bigqueryanalyticshub\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-connection.json b/docs/contents/cloud-bigquery-connection.json deleted file mode 100644 index cf24798afcb5..000000000000 --- a/docs/contents/cloud-bigquery-connection.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "BigQueryConnection", - "defaultService": "bigqueryconnection\/readme", - "services": [ - { - "title": "Overview", - "type": "bigqueryconnection\/readme" - }, - { - "title": "ConnectionServiceClient", - "type": "bigqueryconnection\/v1\/connectionserviceclient", - "nav": [], - "patterns": [ - "bigqueryconnection\/v1\/\\w{1,}" - ] - } - ], - "pattern": "bigqueryconnection\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-data-exchange.json b/docs/contents/cloud-bigquery-data-exchange.json deleted file mode 100644 index b4ea0f49064e..000000000000 --- a/docs/contents/cloud-bigquery-data-exchange.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQueryDataExchange", - "defaultService": "bigquerydataexchange\/readme", - "services": [ - { - "title": "Overview", - "type": "bigquerydataexchange\/readme" - }, - { - "title": "AnalyticsHubServiceClient (v1beta1)", - "type": "bigquerydataexchange\/v1beta1\/analyticshubserviceclient" - } - ], - "pattern": "bigquerydataexchange\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-datapolicies.json b/docs/contents/cloud-bigquery-datapolicies.json deleted file mode 100644 index 79e10e1409cc..000000000000 --- a/docs/contents/cloud-bigquery-datapolicies.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQueryDataPolicies", - "defaultService": "bigquerydatapolicies\/readme", - "services": [ - { - "title": "Overview", - "type": "bigquerydatapolicies\/readme" - }, - { - "title": "DataPolicyServiceClient (v1beta1)", - "type": "bigquerydatapolicies\/v1beta1\/datapolicyserviceclient" - } - ], - "pattern": "bigquerydatapolicies\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-migration.json b/docs/contents/cloud-bigquery-migration.json deleted file mode 100644 index dbbe342fbdab..000000000000 --- a/docs/contents/cloud-bigquery-migration.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQueryMigration", - "defaultService": "bigquerymigration\/readme", - "services": [ - { - "title": "Overview", - "type": "bigquerymigration\/readme" - }, - { - "title": "MigrationServiceClient (v2)", - "type": "bigquerymigration\/v2\/migrationserviceclient" - } - ], - "pattern": "bigquerymigration\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-reservation.json b/docs/contents/cloud-bigquery-reservation.json deleted file mode 100644 index 1386bd86a06a..000000000000 --- a/docs/contents/cloud-bigquery-reservation.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "BigQueryReservation", - "defaultService": "bigqueryreservation\/readme", - "services": [ - { - "title": "Overview", - "type": "bigqueryreservation\/readme" - }, - { - "title": "ReservationServiceClient", - "type": "bigqueryreservation\/v1\/reservationserviceclient", - "nav": [], - "patterns": [ - "bigqueryreservation\/v1\/\\w{1,}" - ] - } - ], - "pattern": "bigqueryreservation\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery-storage.json b/docs/contents/cloud-bigquery-storage.json deleted file mode 100644 index 22aa6f287ca4..000000000000 --- a/docs/contents/cloud-bigquery-storage.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQuery Storage", - "defaultService": "bigquerystorage\/readme", - "services": [ - { - "title": "Overview", - "type": "bigquerystorage\/readme" - }, - { - "title": "BigQueryReadClient", - "type": "bigquerystorage\/v1\/bigqueryreadclient" - } - ], - "pattern": "bigquerystorage\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigquery.json b/docs/contents/cloud-bigquery.json deleted file mode 100644 index 60fef8e2cc44..000000000000 --- a/docs/contents/cloud-bigquery.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "title": "BigQuery", - "pattern": "bigquery\/\\w{1,}", - "defaultService": "bigquery/readme", - "services": [{ - "title": "Overview", - "type": "bigquery/readme" - }, { - "title": "BigQueryClient", - "type": "bigquery/bigqueryclient" - }, { - "title": "Bytes", - "type": "bigquery/bytes" - }, { - "title": "Dataset", - "type": "bigquery/dataset" - }, { - "title": "Date", - "type": "bigquery/date" - }, { - "title": "InsertResponse", - "type": "bigquery/insertresponse" - }, { - "title": "Job", - "type": "bigquery/job" - }, { - "title": "QueryResults", - "type": "bigquery/queryresults" - }, { - "title": "Table", - "type": "bigquery/table" - }, { - "title": "Time", - "type": "bigquery/time" - }, { - "title": "Timestamp", - "type": "bigquery/timestamp" - }] -} diff --git a/docs/contents/cloud-bigquerydatatransfer.json b/docs/contents/cloud-bigquerydatatransfer.json deleted file mode 100644 index 4140856c2be9..000000000000 --- a/docs/contents/cloud-bigquerydatatransfer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BigQuery Data Transfer", - "defaultService": "bigquerydatatransfer\/readme", - "services": [ - { - "title": "Overview", - "type": "bigquerydatatransfer\/readme" - }, - { - "title": "DataTransferServiceClient", - "type": "bigquerydatatransfer\/v1\/datatransferserviceclient" - } - ], - "pattern": "bigquerydatatransfer\/\\w{1,}" -} diff --git a/docs/contents/cloud-bigtable.json b/docs/contents/cloud-bigtable.json deleted file mode 100644 index a2778fd4ea90..000000000000 --- a/docs/contents/cloud-bigtable.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "title": "Bigtable", - "pattern": "bigtable\/\\w{1,}", - "defaultService": "bigtable/readme", - "services": [{ - "title": "Overview", - "type": "bigtable/readme" - }, { - "title": "BigtableClient", - "type": "bigtable/bigtableclient" - }, { - "title": "Filter", - "type": "bigtable/filter" - }, { - "title": "Mutations", - "type": "bigtable/mutations" - }, { - "title": "ReadModifyWriteRowRules", - "type": "bigtable/readmodifywriterowrules" - }, { - "title": "Table", - "type": "bigtable/table" - }, { - "title": "v2", - "type": "bigtable/v2/readme", - "patterns": [ - "bigtable/v2/\\w{1,}", - "bigtable/admin/v2/\\w{1,}" - ], - "nav": [{ - "title": "BigtableClient", - "type": "bigtable/v2/bigtableclient" - }, { - "title": "BigtableInstanceAdminClient", - "type": "bigtable/admin/v2/bigtableinstanceadminclient" - }, { - "title": "BigtableTableAdminClient", - "type": "bigtable/admin/v2/bigtabletableadminclient" - }] - }] -} diff --git a/docs/contents/cloud-billing-budgets.json b/docs/contents/cloud-billing-budgets.json deleted file mode 100644 index a4086398567f..000000000000 --- a/docs/contents/cloud-billing-budgets.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "BillingBudgets", - "defaultService": "billingbudgets\/readme", - "services": [ - { - "title": "Overview", - "type": "billingbudgets\/readme" - }, - { - "title": "BudgetServiceClient (v1)", - "type": "billingbudgets\/v1\/budgetserviceclient" - }, - { - "title": "BudgetServiceClient (v1beta1)", - "type": "billingbudgets\/v1beta1\/budgetserviceclient" - } - ], - "pattern": "billingbudgets\/\\w{1,}" -} diff --git a/docs/contents/cloud-billing.json b/docs/contents/cloud-billing.json deleted file mode 100644 index acbfafc25599..000000000000 --- a/docs/contents/cloud-billing.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "title": "Billing", - "defaultService": "billing\/readme", - "services": [ - { - "title": "Overview", - "type": "billing\/readme" - }, - { - "title": "v1", - "type": "billing\/v1\/readme", - "nav": [ - { - "title": "CloudBillingClient", - "type": "billing\/v1\/cloudbillingclient" - }, - { - "title": "CloudCatalogClient", - "type": "billing\/v1\/cloudcatalogclient" - } - ], - "patterns": [ - "billing\/v1\/\\w{1,}" - ] - } - ], - "pattern": "billing\/\\w{1,}" -} diff --git a/docs/contents/cloud-binary-authorization.json b/docs/contents/cloud-binary-authorization.json deleted file mode 100644 index 8e9ce4e8e2b7..000000000000 --- a/docs/contents/cloud-binary-authorization.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "BinaryAuthorization", - "defaultService": "binaryauthorization\/readme", - "services": [ - { - "title": "Overview", - "type": "binaryauthorization\/readme" - }, - { - "title": "BinauthzManagementServiceV1Beta1Client (v1beta1)", - "type": "binaryauthorization\/v1beta1\/binauthzmanagementservicev1beta1client" - } - ], - "pattern": "binaryauthorization\/\\w{1,}" -} diff --git a/docs/contents/cloud-build.json b/docs/contents/cloud-build.json deleted file mode 100644 index 59b168c5688e..000000000000 --- a/docs/contents/cloud-build.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Build", - "defaultService": "build\/readme", - "services": [ - { - "title": "Overview", - "type": "build\/readme" - }, - { - "title": "CloudBuildClient (v1)", - "type": "build\/v1\/cloudbuildclient" - } - ], - "pattern": "build\/\\w{1,}" -} diff --git a/docs/contents/cloud-certificate-manager.json b/docs/contents/cloud-certificate-manager.json deleted file mode 100644 index c23cc6e10eab..000000000000 --- a/docs/contents/cloud-certificate-manager.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "CertificateManager", - "defaultService": "certificatemanager\/readme", - "services": [ - { - "title": "Overview", - "type": "certificatemanager\/readme" - }, - { - "title": "CertificateManagerClient (v1)", - "type": "certificatemanager\/v1\/certificatemanagerclient" - } - ], - "pattern": "certificatemanager\/\\w{1,}" -} diff --git a/docs/contents/cloud-channel.json b/docs/contents/cloud-channel.json deleted file mode 100644 index c94d52c7a2dc..000000000000 --- a/docs/contents/cloud-channel.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Channel", - "defaultService": "channel\/readme", - "services": [ - { - "title": "Overview", - "type": "channel\/readme" - }, - { - "title": "CloudChannelServiceClient", - "type": "channel\/v1\/cloudchannelserviceclient" - } - ], - "pattern": "channel\/\\w{1,}" -} diff --git a/docs/contents/cloud-common-protos.json b/docs/contents/cloud-common-protos.json deleted file mode 100644 index e85fe9897e52..000000000000 --- a/docs/contents/cloud-common-protos.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "title": "Cloud Common Protos", - "pattern": "commonprotos\/\\w{1,}", - "defaultService": "commonprotos/readme", - "services": [{ - "title": "Overview", - "type": "commonprotos/readme" - }] -} diff --git a/docs/contents/cloud-compute.json b/docs/contents/cloud-compute.json deleted file mode 100644 index d4e17554c9f5..000000000000 --- a/docs/contents/cloud-compute.json +++ /dev/null @@ -1,312 +0,0 @@ -{ - "title": "Compute", - "defaultService": "compute\/readme", - "services": [ - { - "title": "Overview", - "type": "compute\/readme" - }, - { - "title": "v1", - "type": "compute\/v1\/readme", - "nav": [ - { - "title": "AcceleratorTypesClient", - "type": "compute\/v1\/acceleratortypesclient" - }, - { - "title": "AddressesClient", - "type": "compute\/v1\/addressesclient" - }, - { - "title": "AutoscalersClient", - "type": "compute\/v1\/autoscalersclient" - }, - { - "title": "BackendBucketsClient", - "type": "compute\/v1\/backendbucketsclient" - }, - { - "title": "BackendServicesClient", - "type": "compute\/v1\/backendservicesclient" - }, - { - "title": "DiskTypesClient", - "type": "compute\/v1\/disktypesclient" - }, - { - "title": "DisksClient", - "type": "compute\/v1\/disksclient" - }, - { - "title": "ExternalVpnGatewaysClient", - "type": "compute\/v1\/externalvpngatewaysclient" - }, - { - "title": "FirewallsClient", - "type": "compute\/v1\/firewallsclient" - }, - { - "title": "ForwardingRulesClient", - "type": "compute\/v1\/forwardingrulesclient" - }, - { - "title": "GlobalAddressesClient", - "type": "compute\/v1\/globaladdressesclient" - }, - { - "title": "GlobalForwardingRulesClient", - "type": "compute\/v1\/globalforwardingrulesclient" - }, - { - "title": "GlobalNetworkEndpointGroupsClient", - "type": "compute\/v1\/globalnetworkendpointgroupsclient" - }, - { - "title": "GlobalOperationsClient", - "type": "compute\/v1\/globaloperationsclient" - }, - { - "title": "GlobalOrganizationOperationsClient", - "type": "compute\/v1\/globalorganizationoperationsclient" - }, - { - "title": "HealthChecksClient", - "type": "compute\/v1\/healthchecksclient" - }, - { - "title": "ImagesClient", - "type": "compute\/v1\/imagesclient" - }, - { - "title": "InstanceGroupManagersClient", - "type": "compute\/v1\/instancegroupmanagersclient" - }, - { - "title": "InstanceGroupsClient", - "type": "compute\/v1\/instancegroupsclient" - }, - { - "title": "InstanceTemplatesClient", - "type": "compute\/v1\/instancetemplatesclient" - }, - { - "title": "InstancesClient", - "type": "compute\/v1\/instancesclient" - }, - { - "title": "InterconnectAttachmentsClient", - "type": "compute\/v1\/interconnectattachmentsclient" - }, - { - "title": "InterconnectLocationsClient", - "type": "compute\/v1\/interconnectlocationsclient" - }, - { - "title": "InterconnectsClient", - "type": "compute\/v1\/interconnectsclient" - }, - { - "title": "LicenseCodesClient", - "type": "compute\/v1\/licensecodesclient" - }, - { - "title": "LicensesClient", - "type": "compute\/v1\/licensesclient" - }, - { - "title": "MachineTypesClient", - "type": "compute\/v1\/machinetypesclient" - }, - { - "title": "NetworkEndpointGroupsClient", - "type": "compute\/v1\/networkendpointgroupsclient" - }, - { - "title": "NetworksClient", - "type": "compute\/v1\/networksclient" - }, - { - "title": "NodeGroupsClient", - "type": "compute\/v1\/nodegroupsclient" - }, - { - "title": "NodeTemplatesClient", - "type": "compute\/v1\/nodetemplatesclient" - }, - { - "title": "NodeTypesClient", - "type": "compute\/v1\/nodetypesclient" - }, - { - "title": "PacketMirroringsClient", - "type": "compute\/v1\/packetmirroringsclient" - }, - { - "title": "ProjectsClient", - "type": "compute\/v1\/projectsclient" - }, - { - "title": "RegionAutoscalersClient", - "type": "compute\/v1\/regionautoscalersclient" - }, - { - "title": "RegionBackendServicesClient", - "type": "compute\/v1\/regionbackendservicesclient" - }, - { - "title": "RegionCommitmentsClient", - "type": "compute\/v1\/regioncommitmentsclient" - }, - { - "title": "RegionDiskTypesClient", - "type": "compute\/v1\/regiondisktypesclient" - }, - { - "title": "RegionDisksClient", - "type": "compute\/v1\/regiondisksclient" - }, - { - "title": "RegionHealthCheckServicesClient", - "type": "compute\/v1\/regionhealthcheckservicesclient" - }, - { - "title": "RegionHealthChecksClient", - "type": "compute\/v1\/regionhealthchecksclient" - }, - { - "title": "RegionInstanceGroupManagersClient", - "type": "compute\/v1\/regioninstancegroupmanagersclient" - }, - { - "title": "RegionInstanceGroupsClient", - "type": "compute\/v1\/regioninstancegroupsclient" - }, - { - "title": "RegionNetworkEndpointGroupsClient", - "type": "compute\/v1\/regionnetworkendpointgroupsclient" - }, - { - "title": "RegionNotificationEndpointsClient", - "type": "compute\/v1\/regionnotificationendpointsclient" - }, - { - "title": "RegionOperationsClient", - "type": "compute\/v1\/regionoperationsclient" - }, - { - "title": "RegionSslCertificatesClient", - "type": "compute\/v1\/regionsslcertificatesclient" - }, - { - "title": "RegionTargetHttpProxiesClient", - "type": "compute\/v1\/regiontargethttpproxiesclient" - }, - { - "title": "RegionTargetHttpsProxiesClient", - "type": "compute\/v1\/regiontargethttpsproxiesclient" - }, - { - "title": "RegionUrlMapsClient", - "type": "compute\/v1\/regionurlmapsclient" - }, - { - "title": "RegionsClient", - "type": "compute\/v1\/regionsclient" - }, - { - "title": "ReservationsClient", - "type": "compute\/v1\/reservationsclient" - }, - { - "title": "ResourcePoliciesClient", - "type": "compute\/v1\/resourcepoliciesclient" - }, - { - "title": "RoutersClient", - "type": "compute\/v1\/routersclient" - }, - { - "title": "RoutesClient", - "type": "compute\/v1\/routesclient" - }, - { - "title": "SecurityPoliciesClient", - "type": "compute\/v1\/securitypoliciesclient" - }, - { - "title": "SnapshotsClient", - "type": "compute\/v1\/snapshotsclient" - }, - { - "title": "SslCertificatesClient", - "type": "compute\/v1\/sslcertificatesclient" - }, - { - "title": "SslPoliciesClient", - "type": "compute\/v1\/sslpoliciesclient" - }, - { - "title": "SubnetworksClient", - "type": "compute\/v1\/subnetworksclient" - }, - { - "title": "TargetGrpcProxiesClient", - "type": "compute\/v1\/targetgrpcproxiesclient" - }, - { - "title": "TargetHttpProxiesClient", - "type": "compute\/v1\/targethttpproxiesclient" - }, - { - "title": "TargetHttpsProxiesClient", - "type": "compute\/v1\/targethttpsproxiesclient" - }, - { - "title": "TargetInstancesClient", - "type": "compute\/v1\/targetinstancesclient" - }, - { - "title": "TargetPoolsClient", - "type": "compute\/v1\/targetpoolsclient" - }, - { - "title": "TargetSslProxiesClient", - "type": "compute\/v1\/targetsslproxiesclient" - }, - { - "title": "TargetTcpProxiesClient", - "type": "compute\/v1\/targettcpproxiesclient" - }, - { - "title": "TargetVpnGatewaysClient", - "type": "compute\/v1\/targetvpngatewaysclient" - }, - { - "title": "UrlMapsClient", - "type": "compute\/v1\/urlmapsclient" - }, - { - "title": "VpnGatewaysClient", - "type": "compute\/v1\/vpngatewaysclient" - }, - { - "title": "VpnTunnelsClient", - "type": "compute\/v1\/vpntunnelsclient" - }, - { - "title": "ZoneOperationsClient", - "type": "compute\/v1\/zoneoperationsclient" - }, - { - "title": "ZonesClient", - "type": "compute\/v1\/zonesclient" - } - ], - "patterns": [ - "compute\/v1\/\\w{1,}" - ] - } - ], - "pattern": "compute\/\\w{1,}" -} diff --git a/docs/contents/cloud-contact-center-insights.json b/docs/contents/cloud-contact-center-insights.json deleted file mode 100644 index 22858fc7ca2a..000000000000 --- a/docs/contents/cloud-contact-center-insights.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ContactCenterInsights", - "defaultService": "contactcenterinsights\/readme", - "services": [ - { - "title": "Overview", - "type": "contactcenterinsights\/readme" - }, - { - "title": "ContactCenterInsightsClient (v1)", - "type": "contactcenterinsights\/v1\/contactcenterinsightsclient" - } - ], - "pattern": "contactcenterinsights\/\\w{1,}" -} diff --git a/docs/contents/cloud-container-analysis.json b/docs/contents/cloud-container-analysis.json deleted file mode 100644 index 22451ad25ff4..000000000000 --- a/docs/contents/cloud-container-analysis.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ContainerAnalysis", - "defaultService": "containeranalysis\/readme", - "services": [ - { - "title": "Overview", - "type": "containeranalysis\/readme" - }, - { - "title": "ContainerAnalysisClient (v1)", - "type": "containeranalysis\/v1\/containeranalysisclient" - } - ], - "pattern": "containeranalysis\/\\w{1,}" -} diff --git a/docs/contents/cloud-container.json b/docs/contents/cloud-container.json deleted file mode 100644 index 2e88daf17811..000000000000 --- a/docs/contents/cloud-container.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Container", - "defaultService": "container\/readme", - "services": [ - { - "title": "Overview", - "type": "container\/readme" - }, - { - "title": "ClusterManagerClient", - "type": "container\/v1\/clustermanagerclient" - } - ], - "pattern": "container\/\\w{1,}" -} diff --git a/docs/contents/cloud-core.json b/docs/contents/cloud-core.json deleted file mode 100644 index 120ede7b4371..000000000000 --- a/docs/contents/cloud-core.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "title": "Core", - "pattern": "core\/\\w{1,}", - "defaultService": "core/readme", - "services": [{ - "title": "Overview", - "type": "core/readme" - }, { - "title": "ServiceBuilder", - "type": "core/servicebuilder" - }, { - "title": "IAM", - "type": "core/iam/iam", - "patterns": [ - "core/iam/\\w{1,}" - ], - "nav": [{ - "title": "PolicyBuilder", - "type": "core/iam/policybuilder" - }] - }, { - "title": "Upload", - "type": "core/upload/abstractuploader", - "patterns": [ - "core/upload/\\w{1,}" - ], - "nav": [{ - "title": "MultipartUploader", - "type": "core/upload/multipartuploader" - }, { - "title": "ResumableUploader", - "type": "core/upload/resumableuploader" - }, { - "title": "StreamableUploader", - "type": "core/upload/streamableuploader" - }] - }, { - "title": "Duration", - "type": "core/duration" - }, { - "title": "Int64", - "type": "core/int64" - }, { - "title": "Timestamp", - "type": "core/timestamp" - }] -} diff --git a/docs/contents/cloud-data-catalog.json b/docs/contents/cloud-data-catalog.json deleted file mode 100644 index eb4eedbdf1a0..000000000000 --- a/docs/contents/cloud-data-catalog.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": "DataCatalog", - "defaultService": "datacatalog\/readme", - "services": [ - { - "title": "Overview", - "type": "datacatalog\/readme" - }, { - "title": "DataCatalogClient", - "type": "datacatalog/v1/datacatalogclient" - } - ], - "pattern": "datacatalog\/\\w{1,}" -} diff --git a/docs/contents/cloud-data-fusion.json b/docs/contents/cloud-data-fusion.json deleted file mode 100644 index c994ede90b55..000000000000 --- a/docs/contents/cloud-data-fusion.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "DataFusion", - "defaultService": "datafusion\/readme", - "services": [ - { - "title": "Overview", - "type": "datafusion\/readme" - } - ], - "pattern": "datafusion\/\\w{1,}" -} diff --git a/docs/contents/cloud-dataflow.json b/docs/contents/cloud-dataflow.json deleted file mode 100644 index 430b76e2518d..000000000000 --- a/docs/contents/cloud-dataflow.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Dataflow", - "defaultService": "dataflow\/readme", - "services": [ - { - "title": "Overview", - "type": "dataflow\/readme" - }, - { - "title": "FlexTemplatesServiceClient (v1beta3)", - "type": "dataflow\/v1beta3\/flextemplatesserviceclient" - }, - { - "title": "JobsV1Beta3Client (v1beta3)", - "type": "dataflow\/v1beta3\/jobsv1beta3client" - }, - { - "title": "MessagesV1Beta3Client (v1beta3)", - "type": "dataflow\/v1beta3\/messagesv1beta3client" - }, - { - "title": "MetricsV1Beta3Client (v1beta3)", - "type": "dataflow\/v1beta3\/metricsv1beta3client" - }, - { - "title": "SnapshotsV1Beta3Client (v1beta3)", - "type": "dataflow\/v1beta3\/snapshotsv1beta3client" - }, - { - "title": "TemplatesServiceClient (v1beta3)", - "type": "dataflow\/v1beta3\/templatesserviceclient" - } - ], - "pattern": "dataflow\/\\w{1,}" -} diff --git a/docs/contents/cloud-dataform.json b/docs/contents/cloud-dataform.json deleted file mode 100644 index 6371546d0c70..000000000000 --- a/docs/contents/cloud-dataform.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Dataform", - "defaultService": "dataform\/readme", - "services": [ - { - "title": "Overview", - "type": "dataform\/readme" - }, - { - "title": "DataformClient (v1beta1)", - "type": "dataform\/v1beta1\/dataformclient" - } - ], - "pattern": "dataform\/\\w{1,}" -} diff --git a/docs/contents/cloud-datalabeling.json b/docs/contents/cloud-datalabeling.json deleted file mode 100644 index 1cef6162d429..000000000000 --- a/docs/contents/cloud-datalabeling.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "DataLabeling", - "defaultService": "datalabeling\/readme", - "services": [ - { - "title": "Overview", - "type": "datalabeling\/readme" - }, - { - "title": "DataLabelingServiceClient (v1beta1)", - "type": "datalabeling\/v1beta1\/datalabelingserviceclient" - } - ], - "pattern": "datalabeling\/\\w{1,}" -} diff --git a/docs/contents/cloud-dataplex.json b/docs/contents/cloud-dataplex.json deleted file mode 100644 index 34e94264c0a2..000000000000 --- a/docs/contents/cloud-dataplex.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "title": "Dataplex", - "defaultService": "dataplex\/readme", - "services": [ - { - "title": "Overview", - "type": "dataplex\/readme" - }, - { - "title": "ContentServiceClient (v1)", - "type": "dataplex\/v1\/contentserviceclient" - }, - { - "title": "DataplexServiceClient (v1)", - "type": "dataplex\/v1\/dataplexserviceclient" - }, - { - "title": "MetadataServiceClient (v1)", - "type": "dataplex\/v1\/metadataserviceclient" - } - ], - "pattern": "dataplex\/\\w{1,}" -} diff --git a/docs/contents/cloud-dataproc-metastore.json b/docs/contents/cloud-dataproc-metastore.json deleted file mode 100644 index 33588086d36a..000000000000 --- a/docs/contents/cloud-dataproc-metastore.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "title": "DataprocMetastore", - "defaultService": "dataprocmetastore\/readme", - "services": [ - { - "title": "Overview", - "type": "dataprocmetastore\/readme" - }, - { - "title": "DataprocMetastoreClient (v1)", - "type": "dataprocmetastore\/v1\/dataprocmetastoreclient" - }, - { - "title": "DataprocMetastoreClient (v1alpha)", - "type": "dataprocmetastore\/v1alpha\/dataprocmetastoreclient" - }, - { - "title": "DataprocMetastoreClient (v1beta)", - "type": "dataprocmetastore\/v1beta\/dataprocmetastoreclient" - } - ], - "pattern": "dataprocmetastore\/\\w{1,}" -} diff --git a/docs/contents/cloud-dataproc.json b/docs/contents/cloud-dataproc.json deleted file mode 100644 index 7f8e8f372e96..000000000000 --- a/docs/contents/cloud-dataproc.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "title": "Dataproc", - "defaultService": "dataproc\/readme", - "services": [ - { - "title": "Overview", - "type": "dataproc\/readme" - }, - { - "title": "v1", - "type": "dataproc\/v1\/readme", - "nav": [ - { - "title": "AutoscalingPolicyServiceClient", - "type": "dataproc\/v1\/autoscalingpolicyserviceclient" - }, - { - "title": "ClusterControllerClient", - "type": "dataproc\/v1\/clustercontrollerclient" - }, - { - "title": "JobControllerClient", - "type": "dataproc\/v1\/jobcontrollerclient" - }, - { - "title": "WorkflowTemplateServiceClient", - "type": "dataproc\/v1\/workflowtemplateserviceclient" - } - ], - "patterns": [ - "dataproc\/v1\/\\w{1,}" - ] - } - ], - "pattern": "dataproc\/\\w{1,}" -} diff --git a/docs/contents/cloud-datastore-admin.json b/docs/contents/cloud-datastore-admin.json deleted file mode 100644 index 09903074533a..000000000000 --- a/docs/contents/cloud-datastore-admin.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": "Datastore Admin", - "defaultService": "datastoreadmin\/readme", - "services": [ - { - "title": "Overview", - "type": "datastoreadmin\/readme" - }, { - "title": "DatastoreAdminClient", - "type": "datastoreadmin\/v1/datastoreadminclient" - } - ], - "pattern": "datastoreadmin\/\\w{1,}" -} diff --git a/docs/contents/cloud-datastore.json b/docs/contents/cloud-datastore.json deleted file mode 100644 index 99593b4ddc5c..000000000000 --- a/docs/contents/cloud-datastore.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "title": "Datastore", - "pattern": "datastore\/\\w{1,}", - "defaultService": "datastore/readme", - "services": [{ - "title": "Overview", - "type": "datastore/readme" - }, { - "title": "DatastoreClient", - "type": "datastore/datastoreclient" - }, { - "title": "Transaction", - "type": "datastore/transaction" - }, { - "title": "Entity", - "type": "datastore/entity" - }, { - "title": "Key", - "type": "datastore/key" - }, { - "title": "GeoPoint", - "type": "datastore/geopoint" - }, { - "title": "Blob", - "type": "datastore/blob" - }, { - "title": "Queries", - "type": "datastore/query/queryinterface", - "patterns": ["datastore\/query\/\\w{1,}"], - "nav": [{ - "title": "GQL Query", - "type": "datastore/query/gqlquery" - }, { - "title": "Query", - "type": "datastore/query/query" - }] - }, { - "title": "V1", - "type": "datastore/v1/readme", - "patterns": ["datastore\/v1\/\\w{1,}"], - "nav": [{ - "title": "DatastoreClient", - "type": "datastore/v1/datastoreclient" - }] - }] -} diff --git a/docs/contents/cloud-datastream.json b/docs/contents/cloud-datastream.json deleted file mode 100644 index 6e7ee453a989..000000000000 --- a/docs/contents/cloud-datastream.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Datastream", - "defaultService": "datastream\/readme", - "services": [ - { - "title": "Overview", - "type": "datastream\/readme" - }, - { - "title": "DatastreamClient (v1)", - "type": "datastream\/v1\/datastreamclient" - } - ], - "pattern": "datastream\/\\w{1,}" -} \ No newline at end of file diff --git a/docs/contents/cloud-debugger.json b/docs/contents/cloud-debugger.json deleted file mode 100644 index 2f130fa9268f..000000000000 --- a/docs/contents/cloud-debugger.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "title": "Debugger", - "pattern": "debugger\/\\w{1,}", - "defaultService": "debugger/readme", - "services": [{ - "title": "Overview", - "type": "debugger/readme" - },{ - "title": "DebuggerClient", - "type": "debugger/debuggerclient" - }, { - "title": "Agent", - "type": "debugger/agent" - }, { - "title": "Daemon", - "type": "debugger/daemon" - }, { - "title": "v2", - "type": "debugger/v2/readme", - "patterns": [ - "debugger/v2/\\w{1,}" - ], - "nav": [{ - "title": "Controller2Client", - "type": "debugger/v2/controller2client" - }, { - "title": "Debugger2Client", - "type": "debugger/v2/debugger2client" - }] - }] -} diff --git a/docs/contents/cloud-deploy.json b/docs/contents/cloud-deploy.json deleted file mode 100644 index 782be852449a..000000000000 --- a/docs/contents/cloud-deploy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Deploy", - "defaultService": "deploy\/readme", - "services": [ - { - "title": "Overview", - "type": "deploy\/readme" - }, - { - "title": "CloudDeployClient (v1)", - "type": "deploy\/v1\/clouddeployclient" - } - ], - "pattern": "deploy\/\\w{1,}" -} diff --git a/docs/contents/cloud-dialogflow.json b/docs/contents/cloud-dialogflow.json deleted file mode 100644 index 794d26d304f6..000000000000 --- a/docs/contents/cloud-dialogflow.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "title": "Dialogflow", - "defaultService": "dialogflow/readme", - "services": [{ - "title": "Overview", - "type": "dialogflow/readme" - }, { - "title": "AgentsClient", - "type": "dialogflow/v2/agentsclient" - }, { - "title": "ContextsClient", - "type": "dialogflow/v2/contextsclient" - }, { - "title": "EntityTypesClient", - "type": "dialogflow/v2/entitytypesclient" - }, { - "title": "IntentsClient", - "type": "dialogflow/v2/intentsclient" - }, { - "title": "SessionEntityTypesClient", - "type": "dialogflow/v2/sessionentitytypesclient" - }, { - "title": "SessionsClient", - "type": "dialogflow/v2/sessionsclient" - }], - "pattern": "dialogflow\/\\w{1,}" -} diff --git a/docs/contents/cloud-dlp.json b/docs/contents/cloud-dlp.json deleted file mode 100644 index 4678a6fd57a4..000000000000 --- a/docs/contents/cloud-dlp.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "title": "DLP", - "pattern": "dlp\/\\w{1,}", - "defaultService": "dlp/readme", - "services": [{ - "title": "Overview", - "type": "dlp/readme" - }, { - "title": "DlpServiceClient", - "type": "dlp/v2/dlpserviceclient" - }] -} diff --git a/docs/contents/cloud-dms.json b/docs/contents/cloud-dms.json deleted file mode 100644 index 2b1746b4ad85..000000000000 --- a/docs/contents/cloud-dms.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Dms", - "defaultService": "dms\/readme", - "services": [ - { - "title": "Overview", - "type": "dms\/readme" - }, - { - "title": "DataMigrationServiceClient (v1)", - "type": "dms\/v1\/datamigrationserviceclient" - } - ], - "pattern": "dms\/\\w{1,}" -} diff --git a/docs/contents/cloud-document-ai.json b/docs/contents/cloud-document-ai.json deleted file mode 100644 index 4a4a27851325..000000000000 --- a/docs/contents/cloud-document-ai.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "DocumentAi", - "defaultService": "documentai\/readme", - "services": [ - { - "title": "Overview", - "type": "documentai\/readme" - }, - { - "title": "DocumentProcessorServiceClient (v1)", - "type": "documentai\/v1\/documentprocessorserviceclient" - } - ], - "pattern": "documentai\/\\w{1,}" -} diff --git a/docs/contents/cloud-domains.json b/docs/contents/cloud-domains.json deleted file mode 100644 index a97f3c12e5a2..000000000000 --- a/docs/contents/cloud-domains.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Domains", - "defaultService": "domains\/readme", - "services": [ - { - "title": "Overview", - "type": "domains\/readme" - }, - { - "title": "DomainsClient (v1alpha2)", - "type": "domains\/v1alpha2\/domainsclient" - }, - { - "title": "DomainsClient (v1beta1)", - "type": "domains\/v1beta1\/domainsclient" - } - ], - "pattern": "domains\/\\w{1,}" -} diff --git a/docs/contents/cloud-error-reporting.json b/docs/contents/cloud-error-reporting.json deleted file mode 100644 index 60fdf39531c7..000000000000 --- a/docs/contents/cloud-error-reporting.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Error Reporting", - "pattern": "errorreporting\/\\w{1,}", - "defaultService": "errorreporting/readme", - "services": [{ - "title": "Overview", - "type": "errorreporting/readme" - }, { - "title": "ErrorGroupServiceClient", - "type": "errorreporting/v1beta1/errorgroupserviceclient" - }, { - "title": "ErrorStatsServiceClient", - "type": "errorreporting/v1beta1/errorstatsserviceclient" - }, { - "title": "ReportErrorsServiceClient", - "type": "errorreporting/v1beta1/reporterrorsserviceclient" - }] -} diff --git a/docs/contents/cloud-essential-contacts.json b/docs/contents/cloud-essential-contacts.json deleted file mode 100644 index 6970636a37b4..000000000000 --- a/docs/contents/cloud-essential-contacts.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "EssentialContacts", - "defaultService": "essentialcontacts\/readme", - "services": [ - { - "title": "Overview", - "type": "essentialcontacts\/readme" - }, - { - "title": "EssentialContactsServiceClient (v1)", - "type": "essentialcontacts\/v1\/essentialcontactsserviceclient" - } - ], - "pattern": "essentialcontacts\/\\w{1,}" -} diff --git a/docs/contents/cloud-eventarc-publishing.json b/docs/contents/cloud-eventarc-publishing.json deleted file mode 100644 index 177d3d6a9017..000000000000 --- a/docs/contents/cloud-eventarc-publishing.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "eventarcpublishing", - "defaultService": "eventarcpublishing\/readme", - "services": [ - { - "title": "Overview", - "type": "eventarcpublishing\/readme" - }, - { - "title": "PublisherClient (v1)", - "type": "eventarcpublishing\/v1\/publisherclient" - } - ], - "pattern": "eventarcpublishing\/\\w{1,}" -} diff --git a/docs/contents/cloud-eventarc.json b/docs/contents/cloud-eventarc.json deleted file mode 100644 index 9e2dc78681cb..000000000000 --- a/docs/contents/cloud-eventarc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "eventarc", - "defaultService": "eventarc\/readme", - "services": [ - { - "title": "Overview", - "type": "eventarc\/readme" - }, - { - "title": "EventarcClient (v1)", - "type": "eventarc\/v1\/eventarcclient" - } - ], - "pattern": "eventarc\/\\w{1,}" -} diff --git a/docs/contents/cloud-filestore.json b/docs/contents/cloud-filestore.json deleted file mode 100644 index a790cb3fb38d..000000000000 --- a/docs/contents/cloud-filestore.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Filestore", - "defaultService": "filestore\/readme", - "services": [ - { - "title": "Overview", - "type": "filestore\/readme" - }, - { - "title": "CloudFilestoreManagerClient (v1)", - "type": "filestore\/v1\/cloudfilestoremanagerclient" - } - ], - "pattern": "filestore\/\\w{1,}" -} diff --git a/docs/contents/cloud-firestore.json b/docs/contents/cloud-firestore.json deleted file mode 100644 index f887000d90ee..000000000000 --- a/docs/contents/cloud-firestore.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "title": "Firestore", - "pattern": "firestore\/\\w{1,}", - "defaultService": "firestore/readme", - "services": [{ - "title": "Overview", - "type": "firestore/readme" - },{ - "title": "FirestoreClient", - "type": "firestore/firestoreclient" - }, { - "title": "CollectionReference", - "type": "firestore/collectionreference" - }, { - "title": "DocumentReference", - "type": "firestore/documentreference" - }, { - "title": "DocumentSnapshot", - "type": "firestore/documentsnapshot" - }, { - "title": "Transaction", - "type": "firestore/transaction" - }, { - "title": "Query", - "type": "firestore/query" - }, { - "title": "QuerySnapshot", - "type": "firestore/querysnapshot" - }, { - "title": "WriteBatch", - "type": "firestore/writebatch" - }, { - "title": "BulkWriter", - "type": "firestore/bulkwriter" - }, { - "title": "FieldPath", - "type": "firestore/fieldpath" - }, { - "title": "FieldValue", - "type": "firestore/fieldvalue" - }, { - "title": "v1", - "type": "firestore/v1/readme", - "patterns": [ - "firestore/v1/\\w{1,}", - "firestore/admin/v1/\\w{1,}" - ], - "nav": [{ - "title": "FirestoreClient", - "type": "firestore/v1/firestoreclient" - }, { - "title": "FirestoreAdminClient", - "type": "firestore/admin/v1/firestoreadminclient" - }] - }] -} diff --git a/docs/contents/cloud-functions.json b/docs/contents/cloud-functions.json deleted file mode 100644 index 9ef51db05e5e..000000000000 --- a/docs/contents/cloud-functions.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Functions", - "defaultService": "functions\/readme", - "services": [ - { - "title": "Overview", - "type": "functions\/readme" - }, - { - "title": "CloudFunctionsServiceClient (v1)", - "type": "functions\/v1\/cloudfunctionsserviceclient" - }, - { - "title": "FunctionServiceClient (v2)", - "type": "functions\/v2\/functionserviceclient" - } - ], - "pattern": "functions\/\\w{1,}" -} diff --git a/docs/contents/cloud-game-servers.json b/docs/contents/cloud-game-servers.json deleted file mode 100644 index 2ac919b79a00..000000000000 --- a/docs/contents/cloud-game-servers.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "title": "Game Servers", - "defaultService": "gaming\/readme", - "services": [ - { - "title": "Overview", - "type": "gaming\/readme" - }, - { - "title": "v1", - "type": "gaming\/v1\/readme", - "nav": [ - { - "title": "GameServerClustersServiceClient", - "type": "gaming\/v1\/gameserverclustersserviceclient" - }, - { - "title": "GameServerConfigsServiceClient", - "type": "gaming\/v1\/gameserverconfigsserviceclient" - }, - { - "title": "GameServerDeploymentsServiceClient", - "type": "gaming\/v1\/gameserverdeploymentsserviceclient" - }, - { - "title": "RealmsServiceClient", - "type": "gaming\/v1\/realmsserviceclient" - } - ], - "patterns": [ - "gaming\/v1\/\\w{1,}" - ] - } - ], - "pattern": "gaming\/\\w{1,}" -} diff --git a/docs/contents/cloud-gke-backup.json b/docs/contents/cloud-gke-backup.json deleted file mode 100644 index f2a24abbf72e..000000000000 --- a/docs/contents/cloud-gke-backup.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "GkeBackup", - "defaultService": "gkebackup\/readme", - "services": [ - { - "title": "Overview", - "type": "gkebackup\/readme" - }, - { - "title": "BackupForGKEClient (v1)", - "type": "gkebackup\/v1\/backupforgkeclient" - } - ], - "pattern": "gkebackup\/\\w{1,}" -} diff --git a/docs/contents/cloud-gke-connect-gateway.json b/docs/contents/cloud-gke-connect-gateway.json deleted file mode 100644 index 796c41d6e7d6..000000000000 --- a/docs/contents/cloud-gke-connect-gateway.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "GkeConnectGateway", - "defaultService": "gkeconnectgateway\/readme", - "services": [ - { - "title": "Overview", - "type": "gkeconnectgateway\/readme" - }, - { - "title": "GatewayServiceClient (v1beta1)", - "type": "gkeconnectgateway\/v1beta1\/gatewayserviceclient" - } - ], - "pattern": "gkeconnectgateway\/\\w{1,}" -} diff --git a/docs/contents/cloud-gke-hub.json b/docs/contents/cloud-gke-hub.json deleted file mode 100644 index ab76084161d1..000000000000 --- a/docs/contents/cloud-gke-hub.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "GkeHub", - "defaultService": "gkehub\/readme", - "services": [ - { - "title": "Overview", - "type": "gkehub\/readme" - }, - { - "title": "GkeHubMembershipServiceClient (v1beta1)", - "type": "gkehub\/v1beta1\/gkehubmembershipserviceclient" - } - ], - "pattern": "gkehub\/\\w{1,}" -} diff --git a/docs/contents/cloud-gke-multi-cloud.json b/docs/contents/cloud-gke-multi-cloud.json deleted file mode 100644 index e68c28c86596..000000000000 --- a/docs/contents/cloud-gke-multi-cloud.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "title": "GkeMultiCloud", - "defaultService": "gkemulticloud\/readme", - "services": [ - { - "title": "Overview", - "type": "gkemulticloud\/readme" - }, - { - "title": "AwsClustersClient (v1)", - "type": "gkemulticloud\/v1\/awsclustersclient" - }, - { - "title": "AzureClient (v1)", - "type": "gkemulticloud\/v1\/azureclient" - }, - { - "title": "AzureClustersClient (v1)", - "type": "gkemulticloud\/v1\/azureclustersclient" - } - ], - "pattern": "gkemulticloud\/\\w{1,}" -} diff --git a/docs/contents/cloud-gsuite-addons.json b/docs/contents/cloud-gsuite-addons.json deleted file mode 100644 index fecefb48c401..000000000000 --- a/docs/contents/cloud-gsuite-addons.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "GSuiteAddOns", - "defaultService": "gsuiteaddons\/readme", - "services": [ - { - "title": "Overview", - "type": "gsuiteaddons\/readme" - }, - { - "title": "GSuiteAddOnsClient (v1)", - "type": "gsuiteaddons\/v1\/gsuiteaddonsclient" - } - ], - "pattern": "gsuiteaddons\/\\w{1,}" -} diff --git a/docs/contents/cloud-iam-credentials.json b/docs/contents/cloud-iam-credentials.json deleted file mode 100644 index 06e45866c58a..000000000000 --- a/docs/contents/cloud-iam-credentials.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "IamCredentials", - "defaultService": "iamcredentials\/readme", - "services": [ - { - "title": "Overview", - "type": "iamcredentials\/readme" - }, - { - "title": "IAMCredentialsClient (v1)", - "type": "iamcredentials\/v1\/iamcredentialsclient" - } - ], - "pattern": "iamcredentials\/\\w{1,}" -} diff --git a/docs/contents/cloud-iam.json b/docs/contents/cloud-iam.json deleted file mode 100644 index b75bf703f2b8..000000000000 --- a/docs/contents/cloud-iam.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Iam", - "defaultService": "iam\/readme", - "services": [ - { - "title": "Overview", - "type": "iam\/readme" - }, - { - "title": "PoliciesClient (v2)", - "type": "iam\/v2\/policiesclient" - } - ], - "pattern": "iam\/\\w{1,}" -} diff --git a/docs/contents/cloud-iap.json b/docs/contents/cloud-iap.json deleted file mode 100644 index 318243ab1528..000000000000 --- a/docs/contents/cloud-iap.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "title": "Iap", - "defaultService": "iap\/readme", - "services": [ - { - "title": "Overview", - "type": "iap\/readme" - }, - { - "title": "IdentityAwareProxyAdminServiceClient (v1)", - "type": "iap\/v1\/identityawareproxyadminserviceclient" - }, - { - "title": "IdentityAwareProxyClient (v1)", - "type": "iap\/v1\/identityawareproxyclient" - }, - { - "title": "IdentityAwareProxyOAuthServiceClient (v1)", - "type": "iap\/v1\/identityawareproxyoauthserviceclient" - } - ], - "pattern": "iap\/\\w{1,}" -} diff --git a/docs/contents/cloud-ids.json b/docs/contents/cloud-ids.json deleted file mode 100644 index f963abb4d1a5..000000000000 --- a/docs/contents/cloud-ids.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Ids", - "defaultService": "ids\/readme", - "services": [ - { - "title": "Overview", - "type": "ids\/readme" - }, - { - "title": "IDSClient (v1)", - "type": "ids\/v1\/idsclient" - } - ], - "pattern": "ids\/\\w{1,}" -} diff --git a/docs/contents/cloud-iot.json b/docs/contents/cloud-iot.json deleted file mode 100644 index 697a4023a896..000000000000 --- a/docs/contents/cloud-iot.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Iot", - "defaultService": "iot\/readme", - "services": [ - { - "title": "Overview", - "type": "iot\/readme" - }, - { - "title": "DeviceManagerClient", - "type": "iot\/v1\/devicemanagerclient" - } - ], - "pattern": "iot\/\\w{1,}" -} diff --git a/docs/contents/cloud-kms.json b/docs/contents/cloud-kms.json deleted file mode 100644 index 94f8632a6bd2..000000000000 --- a/docs/contents/cloud-kms.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Kms", - "defaultService": "kms\/readme", - "services": [ - { - "title": "Overview", - "type": "kms\/readme" - }, - { - "title": "KeyManagementServiceClient", - "type": "kms\/v1\/keymanagementserviceclient", - "nav": [], - "patterns": [ - "kms\/v1\/\\w{1,}" - ] - } - ], - "pattern": "kms\/\\w{1,}" -} diff --git a/docs/contents/cloud-language.json b/docs/contents/cloud-language.json deleted file mode 100644 index d7cf26c186fc..000000000000 --- a/docs/contents/cloud-language.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "Language", - "pattern": "language\/\\w{1,}", - "defaultService": "language/readme", - "services": [{ - "title": "Overview", - "type": "language/readme" - },{ - "title": "LanguageClient", - "type": "language/languageclient" - }, { - "title": "Annotation", - "type": "language/annotation" - }, { - "title": "v1", - "type": "language/v1/readme", - "patterns": [ - "language/v1/\\w{1,}" - ], - "nav": [{ - "title": "LanguageServiceClient", - "type": "language/v1/languageserviceclient" - }] - }, { - "title": "v1beta2", - "type": "language/v1beta2/readme", - "patterns": [ - "language/v1beta2/\\w{1,}" - ], - "nav": [{ - "title": "LanguageServiceClient", - "type": "language/v1beta2/languageserviceclient" - }] - }] -} diff --git a/docs/contents/cloud-life-sciences.json b/docs/contents/cloud-life-sciences.json deleted file mode 100644 index 39b4f84eafb0..000000000000 --- a/docs/contents/cloud-life-sciences.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "LifeSciences", - "defaultService": "lifesciences\/readme", - "services": [ - { - "title": "Overview", - "type": "lifesciences\/readme" - }, - { - "title": "WorkflowsServiceV2BetaClient (v2beta)", - "type": "lifesciences\/v2beta\/workflowsservicev2betaclient" - } - ], - "pattern": "lifesciences\/\\w{1,}" -} diff --git a/docs/contents/cloud-logging.json b/docs/contents/cloud-logging.json deleted file mode 100644 index df3954c41908..000000000000 --- a/docs/contents/cloud-logging.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "Logging", - "pattern": "logging\/\\w{1,}", - "defaultService": "logging/readme", - "services": [{ - "title": "Overview", - "type": "logging/readme" - },{ - "title": "LoggingClient", - "type": "logging/loggingclient" - }, { - "title": "Entry", - "type": "logging/entry" - }, { - "title": "Logger", - "type": "logging/logger" - }, { - "title": "Metric", - "type": "logging/metric" - },{ - "title": "PsrLogger", - "type": "logging/psrlogger" - },{ - "title": "Sink", - "type": "logging/sink" - }, { - "title": "v2", - "type": "logging/v2/readme", - "patterns": [ - "logging/v2/\\w{1,}" - ], - "nav": [{ - "title": "ConfigServiceV2Client", - "type": "logging/v2/configservicev2client" - }, { - "title": "LoggingServiceV2Client", - "type": "logging/v2/loggingservicev2client" - }, { - "title": "MetricsServiceV2Client", - "type": "logging/v2/metricsservicev2client" - }] - }] -} diff --git a/docs/contents/cloud-managed-identities.json b/docs/contents/cloud-managed-identities.json deleted file mode 100644 index ea1646512a19..000000000000 --- a/docs/contents/cloud-managed-identities.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "ManagedIdentities", - "defaultService": "managedidentities\/readme", - "services": [ - { - "title": "Overview", - "type": "managedidentities\/readme" - }, - { - "title": "ManagedIdentitiesServiceClient (v1)", - "type": "managedidentities\/v1\/managedidentitiesserviceclient" - }, - { - "title": "ManagedIdentitiesServiceClient (v1beta1)", - "type": "managedidentities\/v1beta1\/managedidentitiesserviceclient" - } - ], - "pattern": "managedidentities\/\\w{1,}" -} diff --git a/docs/contents/cloud-media-translation.json b/docs/contents/cloud-media-translation.json deleted file mode 100644 index b2a9613c16a9..000000000000 --- a/docs/contents/cloud-media-translation.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "MediaTranslation", - "defaultService": "mediatranslation\/readme", - "services": [ - { - "title": "Overview", - "type": "mediatranslation\/readme" - }, - { - "title": "SpeechTranslationServiceClient (v1beta1)", - "type": "mediatranslation\/v1beta1\/speechtranslationserviceclient" - } - ], - "pattern": "mediatranslation\/\\w{1,}" -} diff --git a/docs/contents/cloud-memcache.json b/docs/contents/cloud-memcache.json deleted file mode 100644 index 2548af1cb09f..000000000000 --- a/docs/contents/cloud-memcache.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Memcache", - "defaultService": "memcache\/readme", - "services": [ - { - "title": "Overview", - "type": "memcache\/readme" - }, - { - "title": "v1", - "type": "memcache\/v1\/readme", - "nav": [ - { - "title": "CloudMemcacheClient", - "type": "memcache\/v1\/cloudmemcacheclient" - } - ], - "patterns": [ - "memcache\/v1\/\\w{1,}" - ] - }, - { - "title": "v1beta2", - "type": "memcache\/v1beta2\/readme", - "nav": [ - { - "title": "CloudMemcacheClient", - "type": "memcache\/v1beta2\/cloudmemcacheclient" - } - ], - "patterns": [ - "memcache\/v1beta2\/\\w{1,}" - ] - } - ], - "pattern": "memcache\/\\w{1,}" -} diff --git a/docs/contents/cloud-monitoring.json b/docs/contents/cloud-monitoring.json deleted file mode 100644 index d42b7f4687da..000000000000 --- a/docs/contents/cloud-monitoring.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "title": "Monitoring", - "pattern": "monitoring\/\\w{1,}", - "defaultService": "monitoring/readme", - "services": [{ - "title": "Overview", - "type": "monitoring/readme" - }, { - "title": "GroupServiceClient", - "type": "monitoring/v3/groupserviceclient" - }, { - "title": "MetricServiceClient", - "type": "monitoring/v3/metricserviceclient" - }, { - "title": "ServiceMonitoringServiceClient", - "type": "monitoring/v3/servicemonitoringserviceclient" - }] -} diff --git a/docs/contents/cloud-network-connectivity.json b/docs/contents/cloud-network-connectivity.json deleted file mode 100644 index ecc1f1d96f66..000000000000 --- a/docs/contents/cloud-network-connectivity.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "networkconnectivity", - "defaultService": "networkconnectivity\/readme", - "services": [ - { - "title": "Overview", - "type": "networkconnectivity\/readme" - }, - { - "title": "HubServiceClient (v1)", - "type": "networkconnectivity\/v1\/hubserviceclient" - } - ], - "pattern": "networkconnectivity\/\\w{1,}" -} diff --git a/docs/contents/cloud-network-management.json b/docs/contents/cloud-network-management.json deleted file mode 100644 index 40f5a975cffb..000000000000 --- a/docs/contents/cloud-network-management.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "NetworkManagement", - "defaultService": "networkmanagement\/readme", - "services": [ - { - "title": "Overview", - "type": "networkmanagement\/readme" - }, - { - "title": "ReachabilityServiceClient (v1)", - "type": "networkmanagement\/v1\/reachabilityserviceclient" - } - ], - "pattern": "networkmanagement\/\\w{1,}" -} diff --git a/docs/contents/cloud-network-security.json b/docs/contents/cloud-network-security.json deleted file mode 100644 index 00fb9f8108e6..000000000000 --- a/docs/contents/cloud-network-security.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "NetworkSecurity", - "defaultService": "networksecurity\/readme", - "services": [ - { - "title": "Overview", - "type": "networksecurity\/readme" - }, - { - "title": "NetworkSecurityClient (v1beta1)", - "type": "networksecurity\/v1beta1\/networksecurityclient" - } - ], - "pattern": "networksecurity\/\\w{1,}" -} diff --git a/docs/contents/cloud-notebooks.json b/docs/contents/cloud-notebooks.json deleted file mode 100644 index a469593b38ba..000000000000 --- a/docs/contents/cloud-notebooks.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Notebooks", - "defaultService": "notebooks\/readme", - "services": [ - { - "title": "Overview", - "type": "notebooks\/readme" - }, - { - "title": "NotebookServiceClient (v1beta1)", - "type": "notebooks\/v1beta1\/notebookserviceclient" - } - ], - "pattern": "notebooks\/\\w{1,}" -} diff --git a/docs/contents/cloud-optimization.json b/docs/contents/cloud-optimization.json deleted file mode 100644 index 8c66eb31b518..000000000000 --- a/docs/contents/cloud-optimization.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Optimization", - "defaultService": "optimization\/readme", - "services": [ - { - "title": "Overview", - "type": "optimization\/readme" - }, - { - "title": "FleetRoutingClient (v1)", - "type": "optimization\/v1\/fleetroutingclient" - } - ], - "pattern": "optimization\/\\w{1,}" -} \ No newline at end of file diff --git a/docs/contents/cloud-orchestration-airflow.json b/docs/contents/cloud-orchestration-airflow.json deleted file mode 100644 index 89bf872c2573..000000000000 --- a/docs/contents/cloud-orchestration-airflow.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "OrchestrationAirflow", - "defaultService": "orchestrationairflow\/readme", - "services": [ - { - "title": "Overview", - "type": "orchestrationairflow\/readme" - }, - { - "title": "EnvironmentsClient (v1)", - "type": "orchestrationairflow\/v1\/environmentsclient" - }, - { - "title": "ImageVersionsClient (v1)", - "type": "orchestrationairflow\/v1\/imageversionsclient" - } - ], - "pattern": "orchestrationairflow\/\\w{1,}" -} diff --git a/docs/contents/cloud-org-policy.json b/docs/contents/cloud-org-policy.json deleted file mode 100644 index cffd86a86f04..000000000000 --- a/docs/contents/cloud-org-policy.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "OrgPolicy", - "defaultService": "orgpolicy\/readme", - "services": [ - { - "title": "Overview", - "type": "orgpolicy\/readme" - }, - { - "title": "OrgPolicyClient (v2)", - "type": "orgpolicy\/v2\/orgpolicyclient" - } - ], - "pattern": "orgpolicy\/\\w{1,}" -} diff --git a/docs/contents/cloud-osconfig.json b/docs/contents/cloud-osconfig.json deleted file mode 100644 index a40929ee92f0..000000000000 --- a/docs/contents/cloud-osconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "title": "OsConfig", - "defaultService": "osconfig\/readme", - "services": [ - { - "title": "Overview", - "type": "osconfig\/readme" - }, - { - "title": "v1", - "type": "osconfig\/v1\/readme", - "nav": [ - { - "title": "OsConfigServiceClient", - "type": "osconfig\/v1\/osconfigserviceclient" - } - ], - "patterns": [ - "osconfig\/v1\/\\w{1,}" - ] - } - ], - "pattern": "osconfig\/\\w{1,}" -} diff --git a/docs/contents/cloud-oslogin.json b/docs/contents/cloud-oslogin.json deleted file mode 100644 index 07e800d1f4e4..000000000000 --- a/docs/contents/cloud-oslogin.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "OsLogin", - "defaultService": "oslogin\/readme", - "services": [ - { - "title": "Overview", - "type": "oslogin\/readme" - }, - { - "title": "OsLoginServiceClient", - "type": "oslogin\/v1beta\/osloginserviceclient", - "nav": [], - "patterns": [ - "oslogin\/v1beta\/\\w{1,}" - ] - } - ], - "pattern": "oslogin\/\\w{1,}" -} diff --git a/docs/contents/cloud-policy-troubleshooter.json b/docs/contents/cloud-policy-troubleshooter.json deleted file mode 100644 index 56c4777a41d7..000000000000 --- a/docs/contents/cloud-policy-troubleshooter.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "PolicyTroubleshooter", - "defaultService": "policytroubleshooter\/readme", - "services": [ - { - "title": "Overview", - "type": "policytroubleshooter\/readme" - }, - { - "title": "IamCheckerClient (v1)", - "type": "policytroubleshooter\/v1\/iamcheckerclient" - } - ], - "pattern": "policytroubleshooter\/\\w{1,}" -} diff --git a/docs/contents/cloud-private-catalog.json b/docs/contents/cloud-private-catalog.json deleted file mode 100644 index ef55b55db3c2..000000000000 --- a/docs/contents/cloud-private-catalog.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "privatecatalog", - "defaultService": "privatecatalog\/readme", - "services": [ - { - "title": "Overview", - "type": "privatecatalog\/readme" - }, - { - "title": "PrivateCatalogClient (v1beta1)", - "type": "privatecatalog\/v1beta1\/privatecatalogclient" - } - ], - "pattern": "privatecatalog\/\\w{1,}" -} diff --git a/docs/contents/cloud-profiler.json b/docs/contents/cloud-profiler.json deleted file mode 100644 index cf70f415ac39..000000000000 --- a/docs/contents/cloud-profiler.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Profiler", - "defaultService": "profiler\/readme", - "services": [ - { - "title": "Overview", - "type": "profiler\/readme" - }, - { - "title": "ProfilerServiceClient (v2)", - "type": "profiler\/v2\/profilerserviceclient" - } - ], - "pattern": "profiler\/\\w{1,}" -} diff --git a/docs/contents/cloud-pubsub.json b/docs/contents/cloud-pubsub.json deleted file mode 100644 index d6ec46d9e208..000000000000 --- a/docs/contents/cloud-pubsub.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "Pub/Sub", - "pattern": "pubsub\/\\w{1,}", - "defaultService": "pubsub/readme", - "services": [{ - "title": "Overview", - "type": "pubsub/readme" - },{ - "title": "PubSubClient", - "type": "pubsub/pubsubclient" - }, { - "title": "Message", - "type": "pubsub/message" - }, { - "title": "Snapshot", - "type": "pubsub/snapshot" - }, { - "title": "Subscription", - "type": "pubsub/subscription" - }, { - "title": "Topic", - "type": "pubsub/topic" - }, { - "title": "v1", - "type": "pubsub/v1/readme", - "patterns": [ - "pubsub/v1/\\w{1,}" - ], - "nav": [{ - "title": "PublisherClient", - "type": "pubsub/v1/publisherclient" - }, { - "title": "SubscriberClient", - "type": "pubsub/v1/subscriberclient" - }] - }] -} diff --git a/docs/contents/cloud-recaptcha-enterprise.json b/docs/contents/cloud-recaptcha-enterprise.json deleted file mode 100644 index 25b2721607b6..000000000000 --- a/docs/contents/cloud-recaptcha-enterprise.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "title": "RecaptchaEnterprise", - "defaultService": "recaptchaenterprise\/readme", - "services": [ - { - "title": "Overview", - "type": "recaptchaenterprise\/readme" - }, { - "title": "RecaptchaEnterpriseServiceClient", - "type": "recaptchaenterprise/v1/recaptchaenterpriseserviceclient" - } - ], - "pattern": "recaptchaenterprise\/\\w{1,}" -} diff --git a/docs/contents/cloud-recommendations-ai.json b/docs/contents/cloud-recommendations-ai.json deleted file mode 100644 index 39cbfc16322d..000000000000 --- a/docs/contents/cloud-recommendations-ai.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "title": "Recommendations AI", - "defaultService": "recommendationengine\/readme", - "services": [ - { - "title": "Overview", - "type": "recommendationengine\/readme" - }, - { - "title": "v1beta1", - "type": "recommendationengine\/v1beta1\/readme", - "nav": [ - { - "title": "CatalogServiceClient", - "type": "recommendationengine\/v1beta1\/catalogserviceclient" - }, { - "title": "PredictionApiKeyRegistryClient", - "type": "recommendationengine\/v1beta1\/predictionapikeyregistryclient" - }, { - "title": "PredictionServiceClient", - "type": "recommendationengine\/v1beta1\/predictionserviceclient" - }, { - "title": "UserEventServiceClient", - "type": "recommendationengine\/v1beta1\/usereventserviceclient" - } - ], - "patterns": [ - "recommendationengine\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "recommendationengine\/\\w{1,}" -} diff --git a/docs/contents/cloud-recommender.json b/docs/contents/cloud-recommender.json deleted file mode 100644 index 71a7eb09872e..000000000000 --- a/docs/contents/cloud-recommender.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "title": "Recommender", - "defaultService": "recommender\/readme", - "services": [ - { - "title": "Overview", - "type": "recommender\/readme" - }, - { - "title": "v1", - "type": "recommender\/v1\/readme", - "nav": [ - { - "title": "RecommenderClient", - "type": "recommender\/v1\/recommenderclient" - } - ], - "patterns": [ - "recommender\/v1\/\\w{1,}" - ] - } - ], - "pattern": "recommender\/\\w{1,}" -} diff --git a/docs/contents/cloud-redis.json b/docs/contents/cloud-redis.json deleted file mode 100644 index 142b73b1834f..000000000000 --- a/docs/contents/cloud-redis.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Redis", - "defaultService": "redis\/readme", - "services": [ - { - "title": "Overview", - "type": "redis\/readme" - }, - { - "title": "CloudRedisClient", - "type": "redis\/v1\/cloudredisclient", - "nav": [], - "patterns": [ - "redis\/v1\/\\w{1,}" - ] - } - ], - "pattern": "redis\/\\w{1,}" -} diff --git a/docs/contents/cloud-resource-manager.json b/docs/contents/cloud-resource-manager.json deleted file mode 100644 index 9d18de9cc8d0..000000000000 --- a/docs/contents/cloud-resource-manager.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "title": "ResourceManager", - "defaultService": "resourcemanager\/readme", - "services": [ - { - "title": "Overview", - "type": "resourcemanager\/readme" - }, - { - "title": "FoldersClient (v3)", - "type": "resourcemanager\/v3\/foldersclient" - }, - { - "title": "OrganizationsClient (v3)", - "type": "resourcemanager\/v3\/organizationsclient" - }, - { - "title": "ProjectsClient (v3)", - "type": "resourcemanager\/v3\/projectsclient" - }, - { - "title": "TagBindingsClient (v3)", - "type": "resourcemanager\/v3\/tagbindingsclient" - }, - { - "title": "TagKeysClient (v3)", - "type": "resourcemanager\/v3\/tagkeysclient" - }, - { - "title": "TagValuesClient (v3)", - "type": "resourcemanager\/v3\/tagvaluesclient" - } - ], - "pattern": "resourcemanager\/\\w{1,}" -} diff --git a/docs/contents/cloud-resource-settings.json b/docs/contents/cloud-resource-settings.json deleted file mode 100644 index 4c91eaceb505..000000000000 --- a/docs/contents/cloud-resource-settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "ResourceSettings", - "defaultService": "resourcesettings\/readme", - "services": [ - { - "title": "Overview", - "type": "resourcesettings\/readme" - }, - { - "title": "ResourceSettingsServiceClient (v1)", - "type": "resourcesettings\/v1\/resourcesettingsserviceclient" - } - ], - "pattern": "resourcesettings\/\\w{1,}" -} diff --git a/docs/contents/cloud-retail.json b/docs/contents/cloud-retail.json deleted file mode 100644 index 49219cc3ab82..000000000000 --- a/docs/contents/cloud-retail.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "title": "Retail", - "defaultService": "retail\/readme", - "services": [ - { - "title": "Overview", - "type": "retail\/readme" - }, - { - "title": "CatalogServiceClient", - "type": "retail\/v2\/catalogserviceclient" - }, - { - "title": "PredictionServiceClient", - "type": "retail\/v2\/predictionserviceclient" - }, - { - "title": "ProductServiceClient", - "type": "retail\/v2\/productserviceclient" - }, - { - "title": "UserEventServiceClient", - "type": "retail\/v2\/usereventserviceclient" - } - ], - "pattern": "retail\/\\w{1,}" -} diff --git a/docs/contents/cloud-run.json b/docs/contents/cloud-run.json deleted file mode 100644 index a6b821d6fa60..000000000000 --- a/docs/contents/cloud-run.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "Run", - "defaultService": "run\/readme", - "services": [ - { - "title": "Overview", - "type": "run\/readme" - }, - { - "title": "RevisionsClient (v2)", - "type": "run\/v2\/revisionsclient" - }, - { - "title": "ServicesClient (v2)", - "type": "run\/v2\/servicesclient" - } - ], - "pattern": "run\/\\w{1,}" -} diff --git a/docs/contents/cloud-scheduler.json b/docs/contents/cloud-scheduler.json deleted file mode 100644 index 882370cf39da..000000000000 --- a/docs/contents/cloud-scheduler.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "title": "Scheduler", - "defaultService": "scheduler\/readme", - "services": [ - { - "title": "Overview", - "type": "scheduler\/readme" - }, { - "title": "CloudSchedulerClient(V1)", - "type": "scheduler\/v1\/cloudschedulerclient", - "nav": [], - "patterns": [ - "scheduler\/v1\/\\w{1,}" - ] - }, { - "title": "CloudSchedulerClient(V1beta1)", - "type": "scheduler\/v1beta1\/cloudschedulerclient", - "nav": [], - "patterns": [ - "scheduler\/v1beta\/\\w{1,}" - ] - } - ], - "pattern": "scheduler\/\\w{1,}" -} diff --git a/docs/contents/cloud-secret-manager.json b/docs/contents/cloud-secret-manager.json deleted file mode 100644 index b545f537ead9..000000000000 --- a/docs/contents/cloud-secret-manager.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "SecretManager", - "defaultService": "secretmanager\/readme", - "services": [ - { - "title": "Overview", - "type": "secretmanager\/readme" - }, - { - "title": "v1", - "type": "secretmanager\/v1\/readme", - "nav": [ - { - "title": "SecretManagerServiceClient", - "type": "secretmanager\/v1\/secretmanagerserviceclient" - } - ], - "patterns": [ - "secretmanager\/v1\/\\w{1,}" - ] - }, - { - "title": "v1beta1", - "type": "secretmanager\/v1beta1\/readme", - "nav": [ - { - "title": "SecretManagerServiceClient", - "type": "secretmanager\/v1beta1\/secretmanagerserviceclient" - } - ], - "patterns": [ - "secretmanager\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "secretmanager\/\\w{1,}" -} diff --git a/docs/contents/cloud-security-center.json b/docs/contents/cloud-security-center.json deleted file mode 100644 index bd10b83fb8d8..000000000000 --- a/docs/contents/cloud-security-center.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "SecurityCenter", - "defaultService": "securitycenter\/readme", - "services": [ - { - "title": "Overview", - "type": "securitycenter\/readme" - }, - { - "title": "v1", - "type": "securitycenter\/v1\/readme", - "nav": [ - { - "title": "SecurityCenterClient", - "type": "securitycenter\/v1\/securitycenterclient" - } - ], - "patterns": [ - "securitycenter\/v1\/\\w{1,}" - ] - }, - { - "title": "v1p1beta1", - "type": "securitycenter\/v1p1beta1\/readme", - "nav": [ - { - "title": "SecurityCenterClient", - "type": "securitycenter\/v1p1beta1\/securitycenterclient" - } - ], - "patterns": [ - "securitycenter\/v1p1beta1\/\\w{1,}" - ] - } - ], - "pattern": "securitycenter\/\\w{1,}" -} diff --git a/docs/contents/cloud-security-private-ca.json b/docs/contents/cloud-security-private-ca.json deleted file mode 100644 index 7733ee68ce63..000000000000 --- a/docs/contents/cloud-security-private-ca.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "title": "securityprivateca", - "defaultService": "securityprivateca\/readme", - "services": [ - { - "title": "Overview", - "type": "securityprivateca\/readme" - }, - { - "title": "v1", - "type": "securityprivateca\/v1\/readme", - "nav": [ - { - "title": "CertificateAuthorityServiceClient", - "type": "securityprivateca\/v1\/certificateauthorityserviceclient" - } - ], - "patterns": [ - "securityprivateca\/v1\/\\w{1,}" - ] - }, - { - "title": "v1beta1", - "type": "securityprivateca\/v1beta1\/readme", - "nav": [ - { - "title": "CertificateAuthorityServiceClient", - "type": "securityprivateca\/v1beta1\/certificateauthorityserviceclient" - } - ], - "patterns": [ - "securityprivateca\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "securityprivateca\/\\w{1,}" -} - diff --git a/docs/contents/cloud-security-public-ca.json b/docs/contents/cloud-security-public-ca.json deleted file mode 100644 index daf0010bb429..000000000000 --- a/docs/contents/cloud-security-public-ca.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "SecurityPublicCA", - "defaultService": "securitypublicca\/readme", - "services": [ - { - "title": "Overview", - "type": "securitypublicca\/readme" - }, - { - "title": "PublicCertificateAuthorityServiceClient (v1beta1)", - "type": "securitypublicca\/v1beta1\/publiccertificateauthorityserviceclient" - } - ], - "pattern": "securitypublicca\/\\w{1,}" -} diff --git a/docs/contents/cloud-service-control.json b/docs/contents/cloud-service-control.json deleted file mode 100644 index ed7664240cfc..000000000000 --- a/docs/contents/cloud-service-control.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "servicecontrol", - "defaultService": "servicecontrol\/readme", - "services": [ - { - "title": "Overview", - "type": "servicecontrol\/readme" - }, - { - "title": "QuotaControllerClient (v1)", - "type": "servicecontrol\/v1\/quotacontrollerclient" - }, - { - "title": "ServiceControllerClient (v1)", - "type": "servicecontrol\/v1\/servicecontrollerclient" - } - ], - "pattern": "servicecontrol\/\\w{1,}" -} diff --git a/docs/contents/cloud-service-directory.json b/docs/contents/cloud-service-directory.json deleted file mode 100644 index ecf600826b94..000000000000 --- a/docs/contents/cloud-service-directory.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "title": "servicedirectory", - "defaultService": "servicedirectory\/readme", - "services": [ - { - "title": "Overview", - "type": "servicedirectory\/readme" - }, - { - "title": "v1", - "type": "servicedirectory\/v1\/readme", - "nav": [ - { - "title": "LookupServiceClient", - "type": "servicedirectory\/v1\/lookupserviceclient" - }, - { - "title": "RegistrationServiceClient", - "type": "servicedirectory\/v1\/registrationserviceclient" - } - ], - "patterns": [ - "servicedirectory\/v1\/\\w{1,}" - ] - }, - { - "title": "v1beta1", - "type": "servicedirectory\/v1beta1\/readme", - "nav": [ - { - "title": "LookupServiceClient", - "type": "servicedirectory\/v1beta1\/lookupserviceclient" - }, - { - "title": "RegistrationServiceClient", - "type": "servicedirectory\/v1beta1\/registrationserviceclient" - } - ], - "patterns": [ - "servicedirectory\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "servicedirectory\/\\w{1,}" -} diff --git a/docs/contents/cloud-service-management.json b/docs/contents/cloud-service-management.json deleted file mode 100644 index e09d550c8a79..000000000000 --- a/docs/contents/cloud-service-management.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "servicemanagement", - "defaultService": "servicemanagement\/readme", - "services": [ - { - "title": "Overview", - "type": "servicemanagement\/readme" - }, - { - "title": "ServiceManagerClient (v1)", - "type": "servicemanagement\/v1\/servicemanagerclient" - } - ], - "pattern": "servicemanagement\/\\w{1,}" -} diff --git a/docs/contents/cloud-service-usage.json b/docs/contents/cloud-service-usage.json deleted file mode 100644 index 9f216acc1430..000000000000 --- a/docs/contents/cloud-service-usage.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "serviceusage", - "defaultService": "serviceusage\/readme", - "services": [ - { - "title": "Overview", - "type": "serviceusage\/readme" - }, - { - "title": "ServiceUsageClient (v1)", - "type": "serviceusage\/v1\/serviceusageclient" - } - ], - "pattern": "serviceusage\/\\w{1,}" -} diff --git a/docs/contents/cloud-shell.json b/docs/contents/cloud-shell.json deleted file mode 100644 index 18b716e6a1b1..000000000000 --- a/docs/contents/cloud-shell.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Shell", - "defaultService": "shell\/readme", - "services": [ - { - "title": "Overview", - "type": "shell\/readme" - }, - { - "title": "CloudShellServiceClient (v1)", - "type": "shell\/v1\/cloudshellserviceclient" - } - ], - "pattern": "shell\/\\w{1,}" -} diff --git a/docs/contents/cloud-spanner.json b/docs/contents/cloud-spanner.json deleted file mode 100644 index 23c0c35f38ef..000000000000 --- a/docs/contents/cloud-spanner.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "title": "Spanner", - "pattern": "spanner\/\\w{1,}", - "defaultService": "spanner/readme", - "services": [{ - "title": "Overview", - "type": "spanner/readme" - },{ - "title": "SpannerClient", - "type": "spanner/spannerclient" - }, { - "title": "Database", - "type": "spanner/database" - }, { - "title": "Instance", - "type": "spanner/instance" - }, { - "title": "InstanceConfiguration", - "type": "spanner/instanceconfiguration" - }, { - "title": "Snapshot", - "type": "spanner/snapshot" - }, { - "title": "Transaction", - "type": "spanner/transaction" - }, { - "title": "Bytes", - "type": "spanner/bytes" - }, { - "title": "Date", - "type": "spanner/date" - }, { - "title": "Duration", - "type": "spanner/duration" - }, { - "title": "KeyRange", - "type": "spanner/keyrange" - }, { - "title": "KeySet", - "type": "spanner/keyset" - }, { - "title": "Result", - "type": "spanner/result" - }, { - "title": "Timestamp", - "type": "spanner/timestamp" - },{ - "title": "CacheSessionPool", - "type": "spanner/session/cachesessionpool" - }, { - "title": "v1", - "type": "spanner/v1/readme", - "patterns": [ - "spanner/v1/\\w{1,}", - "spanner/admin/database/v1/\\w{1,}", - "spanner/admin/instance/v1/\\w{1,}" - ], - "nav": [{ - "title": "SpannerClient", - "type": "spanner/v1/spannerclient" - }, { - "title": "DatabaseAdminClient", - "type": "spanner/admin/database/v1/databaseadminclient" - }, { - "title": "InstanceAdminClient", - "type": "spanner/admin/instance/v1/instanceadminclient" - }] - }] -} diff --git a/docs/contents/cloud-speech.json b/docs/contents/cloud-speech.json deleted file mode 100644 index 5f303b471ba1..000000000000 --- a/docs/contents/cloud-speech.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "title": "Speech", - "pattern": "speech\/\\w{1,}", - "defaultService": "speech/readme", - "services": [{ - "title": "Overview", - "type": "speech/readme" - },{ - "title": "SpeechClient", - "type": "speech/speechclient" - }, { - "title": "Operation", - "type": "speech/operation" - }, { - "title": "Result", - "type": "speech/result" - }, { - "title": "SpeechClient (v2)", - "type": "speech/v2/speechclient", - "patterns": [ - "speech/v2/\\w{1,}" - ], - "nav": [] - }, { - }, { - "title": "SpeechClient (v1)", - "type": "speech/v1/speechclient", - "patterns": [ - "speech/v1/\\w{1,}" - ], - "nav": [] - }, { - "title": "SpeechClient (v1p1beta1)", - "type": "speech/v1p1beta1/speechclient", - "patterns": [ - "speech/v1p1beta1/\\w{1,}" - ], - "nav": [] - }] -} diff --git a/docs/contents/cloud-sql-admin.json b/docs/contents/cloud-sql-admin.json deleted file mode 100644 index 8e7ff736796c..000000000000 --- a/docs/contents/cloud-sql-admin.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "title": "SqlAdmin", - "defaultService": "sqladmin\/readme", - "services": [ - { - "title": "Overview", - "type": "sqladmin\/readme" - }, - { - "title": "SqlBackupRunsServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqlbackuprunsserviceclient" - }, - { - "title": "SqlDatabasesServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqldatabasesserviceclient" - }, - { - "title": "SqlFlagsServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqlflagsserviceclient" - }, - { - "title": "SqlInstancesServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqlinstancesserviceclient" - }, - { - "title": "SqlOperationsServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqloperationsserviceclient" - }, - { - "title": "SqlSslCertsServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqlsslcertsserviceclient" - }, - { - "title": "SqlTiersServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqltiersserviceclient" - }, - { - "title": "SqlUsersServiceClient (v1beta4)", - "type": "sqladmin\/v1beta4\/sqlusersserviceclient" - } - ], - "pattern": "sqladmin\/\\w{1,}" -} diff --git a/docs/contents/cloud-storage-transfer.json b/docs/contents/cloud-storage-transfer.json deleted file mode 100644 index 9625ee0b636a..000000000000 --- a/docs/contents/cloud-storage-transfer.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "StorageTransfer", - "defaultService": "storagetransfer\/readme", - "services": [ - { - "title": "Overview", - "type": "storagetransfer\/readme" - }, - { - "title": "StorageTransferServiceClient (v1)", - "type": "storagetransfer\/v1\/storagetransferserviceclient" - } - ], - "pattern": "storagetransfer\/\\w{1,}" -} diff --git a/docs/contents/cloud-storage.json b/docs/contents/cloud-storage.json deleted file mode 100644 index e461dd398afa..000000000000 --- a/docs/contents/cloud-storage.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "title": "Storage", - "pattern": "storage\/\\w{1,}", - "defaultService": "storage/readme", - "services": [{ - "title": "Overview", - "type": "storage/readme" - },{ - "title": "StorageClient", - "type": "storage/storageclient" - }, { - "title": "ACL", - "type": "storage/acl" - }, { - "title": "Bucket", - "type": "storage/bucket" - }, { - "title": "StorageObject", - "type": "storage/storageobject" - }] -} diff --git a/docs/contents/cloud-talent.json b/docs/contents/cloud-talent.json deleted file mode 100644 index 6ca17762d73a..000000000000 --- a/docs/contents/cloud-talent.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "title": "Talent", - "defaultService": "talent\/readme", - "services": [ - { - "title": "Overview", - "type": "talent\/readme" - }, - { - "title": "v4", - "type": "talent\/v4\/readme", - "nav": [ - { - "title": "CompanyServiceClient", - "type": "talent\/v4\/companyserviceclient" - }, - { - "title": "CompletionClient", - "type": "talent\/v4\/completionclient" - }, - { - "title": "EventServiceClient", - "type": "talent\/v4\/eventserviceclient" - }, - { - "title": "JobServiceClient", - "type": "talent\/v4\/jobserviceclient" - }, - { - "title": "TenantServiceClient", - "type": "talent\/v4\/tenantserviceclient" - } - ], - "patterns": [ - "talent\/v4\/\\w{1,}" - ] - }, - { - "title": "v4beta1", - "type": "talent\/v4beta1\/readme", - "nav": [ - { - "title": "CompanyServiceClient", - "type": "talent\/v4beta1\/companyserviceclient" - }, - { - "title": "CompletionClient", - "type": "talent\/v4beta1\/completionclient" - }, - { - "title": "EventServiceClient", - "type": "talent\/v4beta1\/eventserviceclient" - }, - { - "title": "JobServiceClient", - "type": "talent\/v4beta1\/jobserviceclient" - }, - { - "title": "TenantServiceClient", - "type": "talent\/v4beta1\/tenantserviceclient" - } - ], - "patterns": [ - "talent\/v4beta1\/\\w{1,}" - ] - } - ], - "pattern": "talent\/\\w{1,}" -} diff --git a/docs/contents/cloud-tasks.json b/docs/contents/cloud-tasks.json deleted file mode 100644 index f81f51cc0968..000000000000 --- a/docs/contents/cloud-tasks.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "title": "Tasks", - "defaultService": "tasks\/readme", - "services": [ - { - "title": "Overview", - "type": "tasks\/readme" - }, - { - "title": "CloudTasksClient(v2)", - "type": "tasks/v2/cloudtasksclient" - }, - { - "title": "CloudTasksClient(v2beta2)", - "type": "tasks/v2beta2/cloudtasksclient" - }, - { - "title": "CloudTasksClient(v2beta3)", - "type": "tasks/v2beta3/cloudtasksclient" - } - ], - "pattern": "tasks\/\\w{1,}" -} diff --git a/docs/contents/cloud-text-to-speech.json b/docs/contents/cloud-text-to-speech.json deleted file mode 100644 index 590c6efec922..000000000000 --- a/docs/contents/cloud-text-to-speech.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "TextToSpeech", - "defaultService": "texttospeech\/readme", - "services": [ - { - "title": "Overview", - "type": "texttospeech\/readme" - }, - { - "title": "TextToSpeechClient", - "type": "texttospeech\/v1\/texttospeechclient", - "nav": [], - "patterns": [ - "texttospeech\/v1\/\\w{1,}" - ] - } - ], - "pattern": "texttospeech\/\\w{1,}" -} diff --git a/docs/contents/cloud-tpu.json b/docs/contents/cloud-tpu.json deleted file mode 100644 index bd617c0edb83..000000000000 --- a/docs/contents/cloud-tpu.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Tpu", - "defaultService": "tpu\/readme", - "services": [ - { - "title": "Overview", - "type": "tpu\/readme" - }, - { - "title": "TpuClient (v1)", - "type": "tpu\/v1\/tpuclient" - } - ], - "pattern": "tpu\/\\w{1,}" -} diff --git a/docs/contents/cloud-trace.json b/docs/contents/cloud-trace.json deleted file mode 100644 index 65f192692ceb..000000000000 --- a/docs/contents/cloud-trace.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "title": "Trace", - "pattern": "trace\/\\w{1,}", - "defaultService": "trace/readme", - "services": [{ - "title": "Overview", - "type": "trace/readme" - },{ - "title": "TraceClient", - "type": "trace/traceclient" - }, { - "title": "Trace", - "type": "trace/trace" - }, { - "title": "Span", - "type": "trace/span" - }, { - "title": "v2", - "type": "trace\/v2\/readme", - "nav": [{ - "title": "TraceServiceClient", - "type": "trace\/v2\/traceserviceclient" - }], - "patterns": [ - "trace\/v2\/\\w{1,}" - ] - }] -} diff --git a/docs/contents/cloud-translate.json b/docs/contents/cloud-translate.json deleted file mode 100644 index ded58a5d96c7..000000000000 --- a/docs/contents/cloud-translate.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "title": "Translation", - "pattern": "translate\/\\w{1,}", - "defaultService": "translate/readme", - "services": [{ - "title": "Overview", - "type": "translate/readme" - }, { - "title": "V2", - "type": "translate/v2/translateclient" - }, { - "title": "V3", - "type": "translate/v3/readme", - "patterns": [ - "translate/v3/\\w{1,}" - ], - "nav": [{ - "title": "TranslationServiceClient", - "type": "translate/v3/translationserviceclient" - }] - }] -} diff --git a/docs/contents/cloud-video-live-stream.json b/docs/contents/cloud-video-live-stream.json deleted file mode 100644 index 04a00bb9d88a..000000000000 --- a/docs/contents/cloud-video-live-stream.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "videolivestream", - "defaultService": "videolivestream\/readme", - "services": [ - { - "title": "Overview", - "type": "videolivestream\/readme" - }, - { - "title": "LivestreamServiceClient (v1)", - "type": "videolivestream\/v1\/livestreamserviceclient" - } - ], - "pattern": "videolivestream\/\\w{1,}" -} diff --git a/docs/contents/cloud-video-stitcher.json b/docs/contents/cloud-video-stitcher.json deleted file mode 100644 index e7717f9dcf69..000000000000 --- a/docs/contents/cloud-video-stitcher.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "videostitcher", - "defaultService": "videostitcher\/readme", - "services": [ - { - "title": "Overview", - "type": "videostitcher\/readme" - }, - { - "title": "VideoStitcherServiceClient (v1)", - "type": "videostitcher\/v1\/videostitcherserviceclient" - } - ], - "pattern": "videostitcher\/\\w{1,}" -} diff --git a/docs/contents/cloud-video-transcoder.json b/docs/contents/cloud-video-transcoder.json deleted file mode 100644 index 0918cea7aad4..000000000000 --- a/docs/contents/cloud-video-transcoder.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "title": "videotranscoder", - "defaultService": "videotranscoder\/readme", - "services": [ - { - "title": "Overview", - "type": "videotranscoder\/readme" - }, - { - "title": "TranscoderServiceClient (v1)", - "type": "videotranscoder\/v1\/transcoderserviceclient" - }, - { - "title": "TranscoderServiceClient (v1beta1)", - "type": "videotranscoder\/v1beta1\/transcoderserviceclient" - } - ], - "pattern": "videotranscoder\/\\w{1,}" -} diff --git a/docs/contents/cloud-videointelligence.json b/docs/contents/cloud-videointelligence.json deleted file mode 100644 index d1001ebf2ef1..000000000000 --- a/docs/contents/cloud-videointelligence.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "Video Intelligence", - "pattern": "videointelligence\/\\w{1,}", - "services": [{ - "title": "Overview", - "type": "videointelligence/readme" - }, { - "title": "VideoIntelligenceServiceClient", - "type": "videointelligence/v1/videointelligenceserviceclient" - }] -} diff --git a/docs/contents/cloud-vision.json b/docs/contents/cloud-vision.json deleted file mode 100644 index f51f23b3188d..000000000000 --- a/docs/contents/cloud-vision.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "title": "Vision", - "pattern": "vision\/\\w{1,}", - "defaultService": "vision/readme", - "services": [{ - "title": "Overview", - "type": "vision/readme" - }, { - "title": "VisionClient", - "type": "vision/visionclient" - }, { - "title": "Image", - "type": "vision/image" - }, { - "title": "Annotation", - "type": "vision/annotation", - "nav": [ - { - "title": "CropHint", - "type": "vision/annotation/crophint" - }, { - "title": "Document", - "type": "vision/annotation/document" - }, { - "title": "Entity", - "type": "vision/annotation/entity" - }, { - "title": "Face", - "type": "vision/annotation/face" - }, { - "title": "ImageProperties", - "type": "vision/annotation/imageproperties" - }, { - "title": "SafeSearch", - "type": "vision/annotation/safesearch" - }, { - "title": "Web", - "type": "vision/annotation/web" - } - ] - }, { - "title": "v1", - "type": "vision/v1/readme", - "patterns": [ - "vision/v1/\\w{1,}" - ], - "nav": [{ - "title": "ImageAnnotatorClient", - "type": "vision/v1/imageannotatorclient" - }, { - "title": "ProductSearchClient", - "type": "vision/v1/productsearchclient" - }] - }] -} diff --git a/docs/contents/cloud-vm-migration.json b/docs/contents/cloud-vm-migration.json deleted file mode 100644 index efe308ed3069..000000000000 --- a/docs/contents/cloud-vm-migration.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "vmmigration", - "defaultService": "vmmigration\/readme", - "services": [ - { - "title": "Overview", - "type": "vmmigration\/readme" - }, - { - "title": "VmMigrationClient (v1)", - "type": "vmmigration\/v1\/vmmigrationclient" - } - ], - "pattern": "vmmigration\/\\w{1,}" -} diff --git a/docs/contents/cloud-vmware-engine.json b/docs/contents/cloud-vmware-engine.json deleted file mode 100644 index fbcc9dc19961..000000000000 --- a/docs/contents/cloud-vmware-engine.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "vmwareengine", - "defaultService": "vmwareengine\/readme", - "services": [ - { - "title": "Overview", - "type": "vmwareengine\/readme" - }, - { - "title": "VmwareEngineClient (v1)", - "type": "vmwareengine\/v1\/vmwareengineclient" - } - ], - "pattern": "vmwareengine\/\\w{1,}" -} diff --git a/docs/contents/cloud-vpc-access.json b/docs/contents/cloud-vpc-access.json deleted file mode 100644 index c6ae45d4c368..000000000000 --- a/docs/contents/cloud-vpc-access.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "vpcaccess", - "defaultService": "vpcaccess\/readme", - "services": [ - { - "title": "Overview", - "type": "vpcaccess\/readme" - }, - { - "title": "VpcAccessServiceClient (v1)", - "type": "vpcaccess\/v1\/vpcaccessserviceclient" - } - ], - "pattern": "vpcaccess\/\\w{1,}" -} diff --git a/docs/contents/cloud-web-risk.json b/docs/contents/cloud-web-risk.json deleted file mode 100644 index 38e1b63b914d..000000000000 --- a/docs/contents/cloud-web-risk.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "title": "WebRisk", - "defaultService": "webrisk\/readme", - "services": [ - { - "title": "Overview", - "type": "webrisk\/readme" - }, - { - "title": "v1", - "type": "webrisk\/v1\/readme", - "nav": [ - { - "title": "WebRiskServiceClient", - "type": "webrisk\/v1\/webriskserviceclient" - } - ], - "patterns": [ - "webrisk\/v1\/\\w{1,}" - ] - }, - { - "title": "v1beta1", - "type": "webrisk\/v1beta1\/readme", - "nav": [ - { - "title": "WebRiskServiceV1Beta1Client", - "type": "webrisk\/v1beta1\/webriskservicev1beta1client" - } - ], - "patterns": [ - "webrisk\/v1beta1\/\\w{1,}" - ] - } - ], - "pattern": "webrisk\/\\w{1,}" -} diff --git a/docs/contents/cloud-web-security-scanner.json b/docs/contents/cloud-web-security-scanner.json deleted file mode 100644 index 8bce14abef25..000000000000 --- a/docs/contents/cloud-web-security-scanner.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "title": "WebSecurityScanner", - "defaultService": "websecurityscanner\/readme", - "services": [ - { - "title": "Overview", - "type": "websecurityscanner\/readme" - }, - { - "title": "v1beta", - "type": "websecurityscanner\/v1beta\/readme", - "nav": [ - { - "title": "WebSecurityScannerClient", - "type": "websecurityscanner\/v1beta\/websecurityscannerclient" - } - ], - "patterns": [ - "securitycenter\/v1beta\/\\w{1,}" - ] - } - ], - "pattern": "websecurityscanner\/\\w{1,}" -} diff --git a/docs/contents/cloud-workflows.json b/docs/contents/cloud-workflows.json deleted file mode 100644 index 84b48b6a4b6b..000000000000 --- a/docs/contents/cloud-workflows.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "title": "Workflows", - "defaultService": "workflows\/readme", - "services": [ - { - "title": "Overview", - "type": "workflows\/readme" - }, - { - "title": "Workflows Executions", - "type": "workflows\/executions\/v1beta\/executionsclient", - "nav": [], - "patterns": [ - "workflows\/executions\/v1beta\/\\w{1,}" - ] - }, - { - "title": "Workflows", - "type": "workflows\/v1beta\/workflowsclient", - "nav": [], - "patterns": [ - "workflows\/v1beta\/\\w{1,}" - ] - } - ], - "pattern": "workflows\/\\w{1,}" -} diff --git a/docs/contents/google-cloud.json b/docs/contents/google-cloud.json deleted file mode 100644 index 6c997188d9dd..000000000000 --- a/docs/contents/google-cloud.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "title": "Google Cloud PHP", - "services": [ - { - "title": "ServiceBuilder", - "type": "servicebuilder" - } - ], - "includes": [ - "access-context-manager", - "analytics-admin", - "analytics-data", - "cloud-access-approval", - "cloud-ai-platform", - "cloud-api-gateway", - "cloud-api-keys", - "cloud-apigee-connect", - "cloud-apigee-registry", - "cloud-appengine-admin", - "cloud-artifact-registry", - "cloud-asset", - "cloud-assured-workloads", - "cloud-automl", - "cloud-bare-metal-solution", - "cloud-batch", - "cloud-beyondcorp-appconnections", - "cloud-beyondcorp-appconnectors", - "cloud-beyondcorp-appgateways", - "cloud-beyondcorp-clientconnectorservices", - "cloud-beyondcorp-clientgateways", - "cloud-bigquery", - "cloud-bigquery-analyticshub", - "cloud-bigquery-connection", - "cloud-bigquery-data-exchange", - "cloud-bigquery-datapolicies", - "cloud-bigquery-migration", - "cloud-bigquery-reservation", - "cloud-bigquery-storage", - "cloud-bigquerydatatransfer", - "cloud-bigtable", - "cloud-billing", - "cloud-billing-budgets", - "cloud-binary-authorization", - "cloud-build", - "cloud-certificate-manager", - "cloud-channel", - "cloud-compute", - "cloud-contact-center-insights", - "cloud-container", - "cloud-container-analysis", - "cloud-core", - "cloud-data-catalog", - "cloud-data-fusion", - "cloud-dataflow", - "cloud-dataform", - "cloud-datalabeling", - "cloud-dataplex", - "cloud-dataproc", - "cloud-dataproc-metastore", - "cloud-datastore", - "cloud-datastore-admin", - "cloud-datastream", - "cloud-debugger", - "cloud-deploy", - "cloud-dialogflow", - "cloud-dlp", - "cloud-dms", - "cloud-document-ai", - "cloud-domains", - "cloud-error-reporting", - "cloud-essential-contacts", - "cloud-eventarc", - "cloud-eventarc-publishing", - "cloud-filestore", - "cloud-firestore", - "cloud-functions", - "cloud-game-servers", - "cloud-gke-backup", - "cloud-gke-connect-gateway", - "cloud-gke-hub", - "cloud-gke-multi-cloud", - "cloud-gsuite-addons", - "cloud-iam", - "cloud-iam-credentials", - "cloud-iap", - "cloud-ids", - "cloud-iot", - "cloud-kms", - "cloud-language", - "cloud-life-sciences", - "cloud-logging", - "cloud-managed-identities", - "cloud-media-translation", - "cloud-memcache", - "cloud-monitoring", - "cloud-network-connectivity", - "cloud-network-management", - "cloud-network-security", - "cloud-notebooks", - "cloud-optimization", - "cloud-orchestration-airflow", - "cloud-org-policy", - "cloud-osconfig", - "cloud-oslogin", - "cloud-policy-troubleshooter", - "cloud-private-catalog", - "cloud-profiler", - "cloud-pubsub", - "cloud-recaptcha-enterprise", - "cloud-recommendations-ai", - "cloud-recommender", - "cloud-redis", - "cloud-resource-manager", - "cloud-resource-settings", - "cloud-retail", - "cloud-run", - "cloud-scheduler", - "cloud-secret-manager", - "cloud-security-center", - "cloud-security-private-ca", - "cloud-security-public-ca", - "cloud-service-control", - "cloud-service-directory", - "cloud-service-management", - "cloud-service-usage", - "cloud-shell", - "cloud-spanner", - "cloud-speech", - "cloud-sql-admin", - "cloud-storage", - "cloud-storage-transfer", - "cloud-talent", - "cloud-tasks", - "cloud-text-to-speech", - "cloud-tpu", - "cloud-trace", - "cloud-translate", - "cloud-video-live-stream", - "cloud-video-stitcher", - "cloud-video-transcoder", - "cloud-videointelligence", - "cloud-vision", - "cloud-vm-migration", - "cloud-vmware-engine", - "cloud-vpc-access", - "cloud-web-risk", - "cloud-web-security-scanner", - "cloud-workflows", - "grafeas", - "longrunning" - ] -} diff --git a/docs/contents/grafeas.json b/docs/contents/grafeas.json deleted file mode 100644 index 539255856cf9..000000000000 --- a/docs/contents/grafeas.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Grafeas", - "defaultService": "grafeas\/readme", - "services": [ - { - "title": "Overview", - "type": "grafeas\/readme" - }, - { - "title": "GrafeasClient (v1)", - "type": "grafeas\/v1\/grafeasclient" - } - ], - "pattern": "grafeas\/\\w{1,}" -} diff --git a/docs/contents/longrunning.json b/docs/contents/longrunning.json deleted file mode 100644 index 1f8f5d84af07..000000000000 --- a/docs/contents/longrunning.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "title": "Google LongRunning", - "defaultService": "longrunning\/readme", - "services": [ - { - "title": "Overview", - "type": "longrunning\/readme" - }, - { - "title": "OperationsClient", - "type": "longrunning\/apicore\/longrunning\/operationsclient" - } - ], - "pattern": "longrunning\/\\w{1,}" -} diff --git a/docs/external-classes.php b/docs/external-classes.php deleted file mode 100644 index 463bbc18eca1..000000000000 --- a/docs/external-classes.php +++ /dev/null @@ -1,139 +0,0 @@ - "array", - "uri" => "http://php.net/manual/en/language.types.array.php" - ], [ - "name" => "bool", - "uri" => "http://php.net/manual/en/language.types.boolean.php" - ], [ - "name" => "Boolean", - "uri" => "http://php.net/manual/en/language.types.boolean.php" - ], [ - "name" => "callable", - "uri" => "http://php.net/manual/en/language.types.callable.php" - ], [ - "name" => "float", - "uri" => "http://php.net/manual/en/language.types.float.php" - ], [ - "name" => "int", - "uri" => "http://php.net/manual/en/language.types.integer.php" - ], [ - "name" => "mixed", - "uri" => "http://php.net/manual/en/language.pseudo-types.php#language.types.mixed" - ], [ - "name" => "null", - "uri" => "http://php.net/manual/en/language.types.null.php" - ], [ - "name" => "resource", - "uri" => "http://php.net/manual/en/language.types.resource.php" - ], [ - "name" => "string", - "uri" => "http://php.net/manual/en/language.types.string.php" - ], [ - "name" => "void", - "uri" => "http://php.net/manual/en/language.pseudo-types.php#language.types.void" - ], - - // PHP native classes - [ - "name" => "ArrayAccess", - "uri" => "https://php.net/arrayaccess" - ], [ - "name" => "Countable", - "uri" => "https://php.net/countable" - ], [ - "name" => "DateTimeInterface", - "uri" => "http://php.net/manual/en/class.datetimeinterface.php" - ], [ - "name" => "Exception", - "uri" => "http://php.net/manual/en/class.exception.php" - ], [ - "name" => "Generator", - "uri" => "http://php.net/manual/en/class.generator.php" - ], [ - "name" => "Iterator", - "uri" => "http://php.net/manual/en/class.iterator.php" - ], [ - "name" => "JsonSerializable", - "uri" => "http://php.net/manual/en/class.jsonserializable.php" - ], [ - "name" => "Reflector", - "uri" => "https://php.net/reflector" - ], [ - "name" => "Traversable", - "uri" => "http://php.net/manual/en/class.traversable.php" - ], - - // Dependency types - [ - "name" => "Google\\ApiCore\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "Google\\Auth\\", - "uri" => "https://github.com/googleapis/google-auth-library-php/tree/{depVersion}/src{/type*}.php", - "depName" => "google/auth", - "strip" => true - ], [ - "name" => "Google\\Api\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "Google\\Cloud\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "Google\\LongRunning\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "Google\\Protobuf\\", - "uri" => "https://github.com/protocolbuffers/protobuf-php/tree/{depVersion}/src{/type*}.php", - "depName" => "google/protobuf" - ], [ - "name" => "Google\\Rpc\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "Google\\Type\\", - "uri" => "https://googleapis.github.io/gax-php/{depVersion}{/type*}.html", - "depName" => "google/gax" - ], [ - "name" => "GuzzleHttp\\Promise", - "uri" => "https://github.com/guzzle/promises/tree/{depVersion}/src{/type*}.php", - "depName" => "guzzlehttp/promises", - "strip" => true - ], [ - "name" => "Psr\\Cache\\", - "uri" => "https://github.com/php-fig/cache/tree/{depVersion}/src{/type*}.php", - "depName" => "psr/cache", - "strip" => true - ], [ - "name" => "Psr\\Log\\", - "uri" => "https://github.com/php-fig/log/tree/{depVersion}{/type*}.php", - "depName" => "psr/log" - ], [ - "name" => "Psr\\Http\\Message\\", - "uri" => "https://github.com/php-fig/http-message/tree/{depVersion}/src{/type*}.php", - "depName" => "psr/http-message", - "strip" => true - ] -]; diff --git a/docs/home.html b/docs/home.html deleted file mode 100644 index c051b08578f1..000000000000 --- a/docs/home.html +++ /dev/null @@ -1,119 +0,0 @@ -
-
-
-

google/cloud

-

Google Cloud Client Library for PHP - - an idiomatic, intuitive, and natural way for PHP developers to - integrate with Google Cloud Platform services, like Cloud Datastore - and Cloud Storage.

-
- -
-
$ composer require google/cloud
-

- Latest Release {{home.latestRelease.name}} - {{home.latestRelease.date|date}} -

-
-
-
- -
- -
- -
-
-
-

What is it?

- -

The Google Cloud Client Library is a client - library for accessing Google Cloud Platform services that significantly - reduces the boilerplate code you have to write. The library provides - high-level API abstractions so they're easier to understand. It embraces - idioms of PHP, works well with the standard library, and - integrates better with your codebase. - All this means you spend more time creating code that matters - to you.

- -

The Google Cloud Client Library is configured to - access Google Cloud Platform services and authenticate (OAuth 2.0) - automatically on your behalf. With a one-line install and a private key, - you are up and ready to go. Better yet, if you are running on a Google - Compute Engine instance, the one-line install is enough!

-
- -
-

Example: Retrieve a bucket from Cloud Storage

-
-use Google\Cloud\Storage\StorageClient; - -$storage = new StorageClient([ - 'keyFilePath' => '/path/to/key/file.json', -]); - -$bucket = $storage->bucket('myBucket');
-
-
-
- -
-
-

FAQ

- -

What is the relationship between the Google Cloud Client Library package - and the gcloud command-line tool?

-

Both the gcloud command-line tool and the - Google Cloud Client Library package are a part of the Google - Cloud SDK: a collection of tools and libraries that enable you to easily - create and manage resources on the Google Cloud Platform. - The gcloud command-line tool can be used to manage both your - development workflow and your Google Cloud Platform resources while the - Google Cloud Client Library package is the offical library - for interacting with PHP.

- -

What is the relationship between the Google Cloud Client Library - and the Google APIs PHP Client?

-

The - Google APIs PHP Client is a client library for - using the broad set of Google APIs. - The Google Cloud Client Library is built specifically for the - Google Cloud Platform and is the recommended way to integrate Google Cloud - APIs into your PHP applications. If your application requires both Google - Cloud Platform and other Google APIs, the 2 libraries may be used by your - application.

-
-
diff --git a/docs/manifest.json b/docs/manifest.json deleted file mode 100644 index 4c009901be29..000000000000 --- a/docs/manifest.json +++ /dev/null @@ -1,5127 +0,0 @@ -{ - "lang": "php", - "friendlyLang": "PHP", - "libraryTitle": "Google Cloud Client Library", - "moduleName": "google-cloud-php", - "markdown": "php", - "defaultModule": "google-cloud", - "modules": [ - { - "id": "google-cloud", - "name": "google/cloud", - "defaultService": "servicebuilder", - "versions": [ - "v0.200.0", - "v0.199.0", - "v0.198.0", - "v0.197.0", - "v0.196.0", - "v0.195.0", - "v0.194.0", - "v0.193.0", - "v0.192.0", - "v0.191.0", - "v0.190.0", - "v0.189.0", - "v0.188.0", - "v0.187.0", - "v0.186.0", - "v0.185.0", - "v0.184.0", - "v0.183.0", - "v0.182.0", - "v0.181.0", - "v0.180.0", - "v0.179.0", - "v0.178.0", - "v0.177.0", - "v0.176.0", - "v0.175.0", - "v0.174.0", - "v0.173.1", - "v0.173.0", - "v0.172.0", - "v0.171.1", - "v0.171.0", - "v0.170.0", - "v0.169.0", - "v0.168.0", - "v0.167.1", - "v0.167.0", - "v0.166.0", - "v0.165.0", - "v0.164.0", - "v0.163.1", - "v0.163.0", - "v0.162.0", - "v0.161.0", - "v0.160.0", - "v0.159.1", - "v0.159.0", - "v0.158.0", - "v0.157.0", - "v0.156.0", - "v0.155.1", - "v0.155.0", - "v0.154.0", - "v0.153.0", - "v0.152.0", - "v0.151.0", - "v0.150.0", - "v0.149.0", - "v0.148.0", - "v0.147.0", - "v0.146.0", - "v0.145.0", - "v0.144.0", - "v0.143.0", - "v0.142.0", - "v0.141.0", - "v0.140.0", - "v0.139.0", - "v0.138.0", - "v0.137.0", - "v0.136.0", - "v0.135.0", - "v0.134.0", - "v0.133.1", - "v0.133.0", - "v0.132.0", - "v0.131.0", - "v0.130.0", - "v0.129.0", - "v0.128.0", - "v0.127.0", - "v0.126.0", - "v0.125.0", - "v0.124.0", - "v0.123.0", - "v0.122.0", - "v0.121.0", - "v0.120.0", - "main" - ] - }, - { - "id": "access-context-manager", - "name": "google/access-context-manager", - "defaultService": "accesscontextmanager/readme", - "versions": [ - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "analytics-admin", - "name": "google/analytics-admin", - "defaultService": "analyticsadmin/readme", - "versions": [ - "v0.10.0", - "v0.9.0", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.4", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "analytics-data", - "name": "google/analytics-data", - "defaultService": "analyticsdata/readme", - "versions": [ - "v0.9.4", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.6", - "v0.8.5", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-access-approval", - "name": "google/cloud-access-approval", - "defaultService": "accessapproval/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-ai-platform", - "name": "google/cloud-ai-platform", - "defaultService": "aiplatform/readme", - "versions": [ - "v0.13.0", - "v0.12.0", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.0", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-api-gateway", - "name": "google/cloud-api-gateway", - "defaultService": "apigateway/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-api-keys", - "name": "google/cloud-api-keys", - "defaultService": "apikeys/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-apigee-connect", - "name": "google/cloud-apigee-connect", - "defaultService": "apigeeconnect/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-apigee-registry", - "name": "google/cloud-apigee-registry", - "defaultService": "apigeeregistry/readme", - "versions": [ - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-appengine-admin", - "name": "google/cloud-appengine-admin", - "defaultService": "appengineadmin/readme", - "versions": [ - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-artifact-registry", - "name": "google/cloud-artifact-registry", - "defaultService": "artifactregistry/readme", - "versions": [ - "v0.3.9", - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-asset", - "name": "google/cloud-asset", - "defaultService": "asset/readme", - "versions": [ - "v1.10.2", - "v1.10.1", - "v1.10.0", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.8", - "v1.6.7", - "v1.6.6", - "v1.6.5", - "v1.6.4", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.0", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-assured-workloads", - "name": "google/cloud-assured-workloads", - "defaultService": "assuredworkloads/readme", - "versions": [ - "v0.8.0", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-automl", - "name": "google/cloud-automl", - "defaultService": "automl/readme", - "versions": [ - "v1.4.15", - "v1.4.14", - "v1.4.13", - "v1.4.12", - "v1.4.11", - "v1.4.10", - "v1.4.9", - "v1.4.8", - "v1.4.7", - "v1.4.6", - "v1.4.5", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.10.0", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bare-metal-solution", - "name": "google/cloud-bare-metal-solution", - "defaultService": "baremetalsolution/readme", - "versions": [ - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-batch", - "name": "google/cloud-batch", - "defaultService": "batch/readme", - "versions": [ - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-beyondcorp-appconnections", - "name": "google/cloud-beyondcorp-appconnections", - "defaultService": "beyondcorpappconnections/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-beyondcorp-appconnectors", - "name": "google/cloud-beyondcorp-appconnectors", - "defaultService": "beyondcorpappconnectors/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-beyondcorp-appgateways", - "name": "google/cloud-beyondcorp-appgateways", - "defaultService": "beyondcorpappgateways/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-beyondcorp-clientconnectorservices", - "name": "google/cloud-beyondcorp-clientconnectorservices", - "defaultService": "beyondcorpclientconnectorservices/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-beyondcorp-clientgateways", - "name": "google/cloud-beyondcorp-clientgateways", - "defaultService": "beyondcorpclientgateways/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery", - "name": "google/cloud-bigquery", - "defaultService": "bigquery/bigqueryclient", - "versions": [ - "v1.24.0", - "v1.23.10", - "v1.23.9", - "v1.23.8", - "v1.23.7", - "v1.23.6", - "v1.23.5", - "v1.23.4", - "v1.23.3", - "v1.23.2", - "v1.23.1", - "v1.23.0", - "v1.22.2", - "v1.22.1", - "v1.22.0", - "v1.21.0", - "v1.20.1", - "v1.20.0", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.0", - "v1.15.1", - "v1.15.0", - "v1.14.0", - "v1.13.0", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.0", - "v1.10.0", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.0", - "v1.5.0", - "v1.4.6", - "v1.4.5", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-analyticshub", - "name": "google/cloud-bigquery-analyticshub", - "defaultService": "bigqueryanalyticshub/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-connection", - "name": "google/cloud-bigquery-connection", - "defaultService": "bigqueryconnection/readme", - "versions": [ - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.8.0", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-data-exchange", - "name": "google/cloud-bigquery-data-exchange", - "defaultService": "bigquerydataexchange/readme", - "versions": [ - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-datapolicies", - "name": "google/cloud-bigquery-datapolicies", - "defaultService": "bigquerydatapolicies/readme", - "versions": [ - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-migration", - "name": "google/cloud-bigquery-migration", - "defaultService": "bigquerymigration/readme", - "versions": [ - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-reservation", - "name": "google/cloud-bigquery-reservation", - "defaultService": "bigqueryreservation/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.6.4", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquery-storage", - "name": "google/cloud-bigquery-storage", - "defaultService": "bigquerystorage/readme", - "versions": [ - "v1.2.11", - "v1.2.10", - "v1.2.9", - "v1.2.8", - "v1.2.7", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-bigquerydatatransfer", - "name": "google/cloud-bigquerydatatransfer", - "defaultService": "bigquerydatatransfer/readme", - "versions": [ - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.8", - "v1.3.7", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.7", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.17.1", - "v0.17.0", - "v0.16.0", - "v0.15.1", - "v0.15.0", - "v0.14.0", - "v0.13.0", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.4", - "v0.10.3", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.0", - "v0.8.6", - "v0.8.5", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "main" - ] - }, - { - "id": "cloud-bigtable", - "name": "google/cloud-bigtable", - "defaultService": "bigtable/readme", - "versions": [ - "v1.22.0", - "v1.21.1", - "v1.21.0", - "v1.20.3", - "v1.20.2", - "v1.20.1", - "v1.20.0", - "v1.19.1", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.0", - "v1.15.2", - "v1.15.1", - "v1.15.0", - "v1.14.1", - "v1.14.0", - "v1.13.0", - "v1.12.1", - "v1.12.0", - "v1.11.3", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.1", - "v1.9.0", - "v1.8.1", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.15.0", - "v0.14.0", - "v0.13.0", - "v0.12.4", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.1", - "v0.10.0", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.1", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-billing", - "name": "google/cloud-billing", - "defaultService": "billing/readme", - "versions": [ - "v1.5.4", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-billing-budgets", - "name": "google/cloud-billing-budgets", - "defaultService": "billingbudgets/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-binary-authorization", - "name": "google/cloud-binary-authorization", - "defaultService": "binaryauthorization/readme", - "versions": [ - "v0.5.7", - "v0.5.6", - "v0.5.5", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-build", - "name": "google/cloud-build", - "defaultService": "build/readme", - "versions": [ - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-certificate-manager", - "name": "google/cloud-certificate-manager", - "defaultService": "certificatemanager/readme", - "versions": [ - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-channel", - "name": "google/cloud-channel", - "defaultService": "channel/readme", - "versions": [ - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.6.6", - "v0.6.5", - "v0.6.4", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-common-protos", - "name": "google/cloud-common-protos", - "defaultService": "commonprotos/readme", - "versions": [ - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-compute", - "name": "google/cloud-compute", - "defaultService": "compute/readme", - "versions": [ - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.0", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.6.0", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-contact-center-insights", - "name": "google/cloud-contact-center-insights", - "defaultService": "contactcenterinsights/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-container", - "name": "google/cloud-container", - "defaultService": "container/readme", - "versions": [ - "v1.10.3", - "v1.10.2", - "v1.10.1", - "v1.10.0", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.4", - "v0.10.3", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.0", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-container-analysis", - "name": "google/cloud-container-analysis", - "defaultService": "containeranalysis/readme", - "versions": [ - "v0.2.11", - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-core", - "name": "google/cloud-core", - "defaultService": "core/servicebuilder", - "versions": [ - "v1.49.3", - "v1.49.2", - "v1.49.1", - "v1.49.0", - "v1.48.1", - "v1.48.0", - "v1.47.4", - "v1.47.3", - "v1.47.2", - "v1.47.1", - "v1.47.0", - "v1.46.1", - "v1.46.0", - "v1.45.0", - "v1.44.4", - "v1.44.3", - "v1.44.2", - "v1.44.1", - "v1.44.0", - "v1.43.2", - "v1.43.1", - "v1.43.0", - "v1.42.2", - "v1.42.1", - "v1.42.0", - "v1.41.1", - "v1.41.0", - "v1.41.0", - "v1.40.0", - "v1.39.0", - "v1.38.0", - "v1.37.1", - "v1.37.0", - "v1.36.2", - "v1.36.1", - "v1.36.0", - "v1.35.0", - "v1.34.0", - "v1.33.1", - "v1.33.0", - "v1.32.0", - "v1.31.0", - "v1.30.0", - "v1.29.0", - "v1.28.2", - "v1.28.1", - "v1.28.0", - "v1.27.0", - "v1.26.0", - "v1.25.1", - "v1.25.0", - "v1.24.0", - "v1.23.8", - "v1.23.7", - "v1.23.6", - "v1.23.5", - "v1.23.4", - "v1.23.3", - "v1.23.2", - "v1.23.1", - "v1.23.0", - "v1.22.0", - "v1.21.1", - "v1.21.0", - "v1.20.7", - "v1.20.6", - "v1.20.5", - "v1.20.4", - "v1.20.3", - "v1.20.2", - "v1.20.1", - "v1.20.0", - "v1.19.2", - "v1.19.1", - "v1.19.0", - "v1.18.0", - "v1.17.1", - "v1.17.0", - "v1.16.0", - "v1.15.3", - "v1.15.2", - "v1.15.1", - "v1.15.0", - "v1.14.1", - "v1.14.0", - "v1.13.2", - "v1.13.1", - "v1.13.0", - "v1.12.1", - "v1.12.0", - "v1.11.0", - "v1.10.0", - "v1.9.0", - "v1.8.1", - "v1.8.0", - "v1.7.0", - "v1.6.0", - "v1.5.1", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-data-catalog", - "name": "google/cloud-data-catalog", - "defaultService": "datacatalog/readme", - "versions": [ - "v1.4.0", - "v1.3.9", - "v1.3.8", - "v1.3.7", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.0", - "v1.0.6", - "v1.0.5", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-data-fusion", - "name": "google/cloud-data-fusion", - "defaultService": "datafusion/readme", - "versions": [ - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-datacatalog-lineage", - "name": "google/cloud-datacatalog-lineage", - "defaultService": "datacataloglineage/readme", - "versions": [ - "0.1.0", - "main" - ] - }, - { - "id": "cloud-dataflow", - "name": "google/cloud-dataflow", - "defaultService": "dataflow/readme", - "versions": [ - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dataform", - "name": "google/cloud-dataform", - "defaultService": "dataform/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-datalabeling", - "name": "google/cloud-datalabeling", - "defaultService": "datalabeling/readme", - "versions": [ - "v0.1.12", - "v0.1.11", - "v0.1.10", - "v0.1.9", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dataplex", - "name": "google/cloud-dataplex", - "defaultService": "dataplex/readme", - "versions": [ - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dataproc", - "name": "google/cloud-dataproc", - "defaultService": "dataproc/readme", - "versions": [ - "v3.5.1", - "v3.5.0", - "v3.4.0", - "v3.3.0", - "v3.2.2", - "v3.2.1", - "v3.2.0", - "v3.1.2", - "v3.1.1", - "v3.1.0", - "v3.0.0", - "v2.4.3", - "v2.4.2", - "v2.4.1", - "v2.4.0", - "v2.3.1", - "v2.3.0", - "v2.2.1", - "v2.2.0", - "v2.1.0", - "v2.0.1", - "v2.0.0", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.18.1", - "v0.18.0", - "v0.17.0", - "v0.16.1", - "v0.16.0", - "v0.15.1", - "v0.15.0", - "v0.14.0", - "v0.13.0", - "v0.12.0", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dataproc-metastore", - "name": "google/cloud-dataproc-metastore", - "defaultService": "dataprocmetastore/readme", - "versions": [ - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-datastore", - "name": "google/cloud-datastore", - "defaultService": "datastore/datastoreclient", - "versions": [ - "v1.19.0", - "v1.18.1", - "v1.18.0", - "v1.17.1", - "v1.17.0", - "v1.16.4", - "v1.16.3", - "v1.16.2", - "v1.16.1", - "v1.16.0", - "v1.15.0", - "v1.14.2", - "v1.14.1", - "v1.14.0", - "v1.13.4", - "v1.13.3", - "v1.13.2", - "v1.13.1", - "v1.13.0", - "v1.12.4", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.6", - "v1.11.5", - "v1.11.4", - "v1.11.3", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.5", - "v1.9.4", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.1", - "v1.6.0", - "v1.5.10", - "v1.5.9", - "v1.5.8", - "v1.5.7", - "v1.5.6", - "v1.5.5", - "v1.5.4", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.1", - "v1.3.0", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-datastore-admin", - "name": "google/cloud-datastore-admin", - "defaultService": "datastoreadmin/readme", - "versions": [ - "v0.5.6", - "v0.5.5", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-datastream", - "name": "google/cloud-datastream", - "defaultService": "datastream/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-debugger", - "name": "google/cloud-debugger", - "defaultService": "debugger/debuggerclient", - "versions": [ - "v1.4.14", - "v1.4.13", - "v1.4.12", - "v1.4.11", - "v1.4.10", - "v1.4.9", - "v1.4.8", - "v1.4.7", - "v1.4.6", - "v1.4.5", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.21.2", - "v0.21.1", - "v0.21.0", - "v0.20.0", - "v0.19.1", - "v0.19.0", - "v0.18.5", - "v0.18.4", - "v0.18.3", - "v0.18.2", - "v0.18.1", - "v0.18.0", - "v0.17.0", - "v0.16.3", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.0", - "v0.14.2", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.0", - "v0.9.0", - "v0.8.0", - "v0.7.0", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-deploy", - "name": "google/cloud-deploy", - "defaultService": "deploy/readme", - "versions": [ - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dialogflow", - "name": "google/cloud-dialogflow", - "defaultService": "dialogflow/readme", - "versions": [ - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.29.0", - "v0.28.1", - "v0.28.0", - "v0.27.1", - "v0.27.0", - "v0.26.0", - "v0.25.0", - "v0.24.0", - "v0.23.4", - "v0.23.3", - "v0.23.2", - "v0.23.1", - "v0.23.0", - "v0.22.0", - "v0.21.0", - "v0.20.1", - "v0.20.0", - "v0.19.1", - "v0.19.0", - "v0.18.0", - "v0.17.4", - "v0.17.3", - "v0.17.2", - "v0.17.1", - "v0.17.0", - "v0.16.0", - "v0.15.1", - "v0.15.0", - "v0.14.1", - "v0.14.0", - "v0.13.1", - "v0.13.0", - "v0.12.0", - "v0.11.0", - "v0.10.0", - "v0.9.0", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.5", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dlp", - "name": "google/cloud-dlp", - "defaultService": "dlp/readme", - "versions": [ - "v1.8.3", - "v1.8.2", - "v1.8.1", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.1", - "v1.6.0", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.5", - "v1.1.4", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.27.0", - "v0.26.1", - "v0.26.0", - "v0.25.1", - "v0.25.0", - "v0.24.0", - "v0.23.0", - "v0.22.0", - "v0.21.0", - "v0.20.0", - "v0.19.0", - "v0.18.4", - "v0.18.3", - "v0.18.2", - "v0.18.1", - "v0.18.0", - "v0.17.0", - "v0.16.0", - "v0.15.3", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.0", - "v0.13.0", - "v0.12.1", - "v0.12.0", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-dms", - "name": "google/cloud-dms", - "defaultService": "dms/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-document-ai", - "name": "google/cloud-document-ai", - "defaultService": "documentai/readme", - "versions": [ - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-domains", - "name": "google/cloud-domains", - "defaultService": "domains/readme", - "versions": [ - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-error-reporting", - "name": "google/cloud-error-reporting", - "defaultService": "errorreporting/readme", - "versions": [ - "v0.19.10", - "v0.19.9", - "v0.19.8", - "v0.19.7", - "v0.19.6", - "v0.19.5", - "v0.19.4", - "v0.19.3", - "v0.19.2", - "v0.19.1", - "v0.19.0", - "v0.18.4", - "v0.18.3", - "v0.18.2", - "v0.18.1", - "v0.18.0", - "v0.17.0", - "v0.16.5", - "v0.16.4", - "v0.16.3", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.0", - "v0.14.5", - "v0.14.4", - "v0.14.3", - "v0.14.2", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.5", - "v0.12.4", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.5", - "v0.11.4", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.1", - "v0.10.0", - "v0.9.5", - "v0.9.4", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-essential-contacts", - "name": "google/cloud-essential-contacts", - "defaultService": "essentialcontacts/readme", - "versions": [ - "v0.2.11", - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-eventarc", - "name": "google/cloud-eventarc", - "defaultService": "eventarc/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-eventarc-publishing", - "name": "google/cloud-eventarc-publishing", - "defaultService": "eventarcpublishing/readme", - "versions": [ - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-filestore", - "name": "google/cloud-filestore", - "defaultService": "filestore/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-firestore", - "name": "google/cloud-firestore", - "defaultService": "firestore/firestoreclient", - "versions": [ - "v1.28.0", - "v1.27.3", - "v1.27.2", - "v1.27.1", - "v1.27.0", - "v1.26.0", - "v1.25.3", - "v1.25.2", - "v1.25.1", - "v1.25.0", - "v1.24.0", - "v1.23.0", - "v1.22.1", - "v1.22.0", - "v1.21.2", - "v1.21.1", - "v1.21.0", - "v1.20.4", - "v1.20.3", - "v1.20.2", - "v1.20.1", - "v1.20.0", - "v1.19.4", - "v1.19.3", - "v1.19.2", - "v1.19.1", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.0", - "v1.15.0", - "v1.14.1", - "v1.14.0", - "v1.13.0", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.1", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.0", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.15.8", - "v0.15.7", - "v0.15.6", - "v0.15.5", - "v0.15.4", - "v0.15.3", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.1", - "v0.12.0", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.1", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-functions", - "name": "google/cloud-functions", - "defaultService": "functions/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-game-servers", - "name": "google/cloud-game-servers", - "defaultService": "gaming/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.4.5", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-gke-backup", - "name": "google/cloud-gke-backup", - "defaultService": "gkebackup/readme", - "versions": [ - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-gke-connect-gateway", - "name": "google/cloud-gke-connect-gateway", - "defaultService": "gkeconnectgateway/readme", - "versions": [ - "v0.1.11", - "v0.1.10", - "v0.1.9", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-gke-hub", - "name": "google/cloud-gke-hub", - "defaultService": "gkehub/readme", - "versions": [ - "v0.5.6", - "v0.5.5", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-gke-multi-cloud", - "name": "google/cloud-gke-multi-cloud", - "defaultService": "gkemulticloud/readme", - "versions": [ - "v0.2.1", - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-gsuite-addons", - "name": "google/cloud-gsuite-addons", - "defaultService": "gsuiteaddons/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-iam", - "name": "google/cloud-iam", - "defaultService": "iam/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-iam-credentials", - "name": "google/cloud-iam-credentials", - "defaultService": "iamcredentials/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-iap", - "name": "google/cloud-iap", - "defaultService": "iap/readme", - "versions": [ - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-ids", - "name": "google/cloud-ids", - "defaultService": "ids/readme", - "versions": [ - "v0.1.10", - "v0.1.9", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-iot", - "name": "google/cloud-iot", - "defaultService": "iot/readme", - "versions": [ - "v1.5.10", - "v1.5.9", - "v1.5.8", - "v1.5.7", - "v1.5.6", - "v1.5.5", - "v1.5.4", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.0", - "v0.8.0", - "v0.7.5", - "v0.7.4", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-kms", - "name": "google/cloud-kms", - "defaultService": "kms/readme", - "versions": [ - "v1.16.1", - "v1.16.0", - "v1.15.3", - "v1.15.2", - "v1.15.1", - "v1.15.0", - "v1.14.0", - "v1.13.4", - "v1.13.3", - "v1.13.2", - "v1.13.1", - "v1.13.0", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.4", - "v1.11.3", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.2", - "v1.10.1", - "v1.10.0", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.0", - "v1.5.0", - "v1.4.0", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-language", - "name": "google/cloud-language", - "defaultService": "language/languageclient", - "versions": [ - "v0.28.3", - "v0.28.2", - "v0.28.1", - "v0.28.0", - "v0.27.0", - "v0.26.8", - "v0.26.7", - "v0.26.6", - "v0.26.5", - "v0.26.4", - "v0.26.3", - "v0.26.2", - "v0.26.1", - "v0.26.0", - "v0.25.0", - "v0.24.7", - "v0.24.6", - "v0.24.5", - "v0.24.4", - "v0.24.3", - "v0.24.2", - "v0.24.1", - "v0.24.0", - "v0.23.0", - "v0.22.5", - "v0.22.4", - "v0.22.3", - "v0.22.2", - "v0.22.1", - "v0.22.0", - "v0.21.0", - "v0.20.0", - "v0.19.4", - "v0.19.3", - "v0.19.2", - "v0.19.1", - "v0.19.0", - "v0.18.0", - "v0.17.0", - "v0.16.5", - "v0.16.4", - "v0.16.3", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.5", - "v0.15.4", - "v0.15.3", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.1", - "v0.14.0", - "v0.13.4", - "v0.13.3", - "v0.13.2", - "v0.13.1", - "v0.13.0", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-life-sciences", - "name": "google/cloud-life-sciences", - "defaultService": "lifesciences/readme", - "versions": [ - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-logging", - "name": "google/cloud-logging", - "defaultService": "logging/loggingclient", - "versions": [ - "v1.25.2", - "v1.25.1", - "v1.25.0", - "v1.24.10", - "v1.24.9", - "v1.24.8", - "v1.24.7", - "v1.24.6", - "v1.24.5", - "v1.24.4", - "v1.24.3", - "v1.24.2", - "v1.24.1", - "v1.24.0", - "v1.23.0", - "v1.22.3", - "v1.22.2", - "v1.22.1", - "v1.22.0", - "v1.21.1", - "v1.21.0", - "v1.20.1", - "v1.20.0", - "v1.19.1", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.5", - "v1.16.4", - "v1.16.3", - "v1.16.2", - "v1.16.1", - "v1.16.0", - "v1.15.0", - "v1.14.5", - "v1.14.4", - "v1.14.3", - "v1.14.2", - "v1.14.1", - "v1.14.0", - "v1.13.0", - "v1.12.9", - "v1.12.8", - "v1.12.7", - "v1.12.6", - "v1.12.5", - "v1.12.4", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.1", - "v1.11.0", - "v1.10.5", - "v1.10.4", - "v1.10.3", - "v1.10.2", - "v1.10.1", - "v1.10.0", - "v1.9.4", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.3", - "v1.8.2", - "v1.8.1", - "v1.8.0", - "v1.7.0", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.0", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.0", - "v1.0.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-managed-identities", - "name": "google/cloud-managed-identities", - "defaultService": "managedidentities/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-media-translation", - "name": "google/cloud-media-translation", - "defaultService": "mediatranslation/readme", - "versions": [ - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-memcache", - "name": "google/cloud-memcache", - "defaultService": "memcache/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.5.7", - "v0.5.6", - "v0.5.5", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-monitoring", - "name": "google/cloud-monitoring", - "defaultService": "monitoring/readme", - "versions": [ - "v1.3.1", - "v1.3.0", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.8", - "v1.1.7", - "v1.1.6", - "v1.1.5", - "v1.1.4", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.21.0", - "v0.20.2", - "v0.20.1", - "v0.20.0", - "v0.19.0", - "v0.18.0", - "v0.17.0", - "v0.16.5", - "v0.16.4", - "v0.16.3", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.0", - "v0.14.2", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.4", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.1", - "v0.10.0", - "v0.9.4", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-network-connectivity", - "name": "google/cloud-network-connectivity", - "defaultService": "networkconnectivity/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-network-management", - "name": "google/cloud-network-management", - "defaultService": "networkmanagement/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-network-security", - "name": "google/cloud-network-security", - "defaultService": "networksecurity/readme", - "versions": [ - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-notebooks", - "name": "google/cloud-notebooks", - "defaultService": "notebooks/readme", - "versions": [ - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-optimization", - "name": "google/cloud-optimization", - "defaultService": "optimization/readme", - "versions": [ - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-orchestration-airflow", - "name": "google/cloud-orchestration-airflow", - "defaultService": "orchestrationairflow/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-org-policy", - "name": "google/cloud-org-policy", - "defaultService": "orgpolicy/readme", - "versions": [ - "v0.4.0", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-osconfig", - "name": "google/cloud-osconfig", - "defaultService": "osconfig/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.5.4", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-oslogin", - "name": "google/cloud-oslogin", - "defaultService": "oslogin/readme", - "versions": [ - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.7", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.5", - "v0.9.4", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.0", - "v0.7.4", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-policy-troubleshooter", - "name": "google/cloud-policy-troubleshooter", - "defaultService": "policytroubleshooter/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-private-catalog", - "name": "google/cloud-private-catalog", - "defaultService": "privatecatalog/readme", - "versions": [ - "v0.2.12", - "v0.2.11", - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-profiler", - "name": "google/cloud-profiler", - "defaultService": "profiler/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-pubsub", - "name": "google/cloud-pubsub", - "defaultService": "pubsub/pubsubclient", - "versions": [ - "v1.41.0", - "v1.40.1", - "v1.40.0", - "v1.39.3", - "v1.39.2", - "v1.39.1", - "v1.39.0", - "v1.38.4", - "v1.38.3", - "v1.38.2", - "v1.38.1", - "v1.38.0", - "v1.37.0", - "v1.36.1", - "v1.36.0", - "v1.35.1", - "v1.35.0", - "v1.34.3", - "v1.34.2", - "v1.34.1", - "v1.34.0", - "v1.33.0", - "v1.32.0", - "v1.31.1", - "v1.31.0", - "v1.30.3", - "v1.30.2", - "v1.30.1", - "v1.30.0", - "v1.29.4", - "v1.29.3", - "v1.29.2", - "v1.29.1", - "v1.29.0", - "v1.28.0", - "v1.27.0", - "v1.26.0", - "v1.25.0", - "v1.24.1", - "v1.24.0", - "v1.23.0", - "v1.22.0", - "v1.21.1", - "v1.21.0", - "v1.20.0", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.0", - "v1.15.0", - "v1.14.0", - "v1.13.0", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.0", - "v1.9.0", - "v1.8.2", - "v1.8.1", - "v1.8.0", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.0", - "v1.5.1", - "v1.5.0", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.4", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.0", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.0", - "v0.7.0", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-recaptcha-enterprise", - "name": "google/cloud-recaptcha-enterprise", - "defaultService": "recaptchaenterprise/readme", - "versions": [ - "v1.3.0", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.6", - "v1.0.5", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-recommendations-ai", - "name": "google/cloud-recommendations-ai", - "defaultService": "recommendationengine/readme", - "versions": [ - "v0.4.10", - "v0.4.9", - "v0.4.8", - "v0.4.7", - "v0.4.6", - "v0.4.5", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-recommender", - "name": "google/cloud-recommender", - "defaultService": "recommender/readme", - "versions": [ - "v1.7.6", - "v1.7.5", - "v1.7.4", - "v1.7.3", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-redis", - "name": "google/cloud-redis", - "defaultService": "redis/readme", - "versions": [ - "v1.6.10", - "v1.6.9", - "v1.6.8", - "v1.6.7", - "v1.6.6", - "v1.6.5", - "v1.6.4", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.1", - "v1.3.0", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.0", - "v0.9.0", - "v0.8.4", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.6", - "v0.4.5", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-resource-manager", - "name": "google/cloud-resource-manager", - "defaultService": "resourcemanager/readme", - "versions": [ - "v0.3.9", - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-resource-settings", - "name": "google/cloud-resource-settings", - "defaultService": "resourcesettings/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-retail", - "name": "google/cloud-retail", - "defaultService": "retail/readme", - "versions": [ - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.7.0", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-run", - "name": "google/cloud-run", - "defaultService": "run/readme", - "versions": [ - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-scheduler", - "name": "google/cloud-scheduler", - "defaultService": "scheduler/readme", - "versions": [ - "v1.8.1", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.8", - "v1.6.7", - "v1.6.6", - "v1.6.5", - "v1.6.4", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.5", - "v1.5.4", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-secret-manager", - "name": "google/cloud-secret-manager", - "defaultService": "secretmanager/readme", - "versions": [ - "v1.10.3", - "v1.10.2", - "v1.10.1", - "v1.10.0", - "v1.9.7", - "v1.9.6", - "v1.9.5", - "v1.9.4", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.3", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.0", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-security-center", - "name": "google/cloud-security-center", - "defaultService": "securitycenter/readme", - "versions": [ - "v1.14.2", - "v1.14.1", - "v1.14.0", - "v1.13.1", - "v1.13.0", - "v1.12.0", - "v1.11.0", - "v1.10.0", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.0", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-security-private-ca", - "name": "google/cloud-security-private-ca", - "defaultService": "securityprivateca/readme", - "versions": [ - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-security-public-ca", - "name": "google/cloud-security-public-ca", - "defaultService": "securitypublicca/readme", - "versions": [ - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-service-control", - "name": "google/cloud-service-control", - "defaultService": "servicecontrol/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.9", - "v0.3.8", - "v0.3.7", - "v0.3.6", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-service-directory", - "name": "google/cloud-service-directory", - "defaultService": "servicedirectory/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.7.5", - "v0.7.4", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-service-management", - "name": "google/cloud-service-management", - "defaultService": "servicemanagement/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-service-usage", - "name": "google/cloud-service-usage", - "defaultService": "serviceusage/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-shell", - "name": "google/cloud-shell", - "defaultService": "shell/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-spanner", - "name": "google/cloud-spanner", - "defaultService": "spanner/spannerclient", - "versions": [ - "v1.58.1", - "v1.58.0", - "v1.57.0", - "v1.56.0", - "v1.55.0", - "v1.54.2", - "v1.54.1", - "v1.54.0", - "v1.53.0", - "v1.52.0", - "v1.51.2", - "v1.51.1", - "v1.51.0", - "v1.50.0", - "v1.49.2", - "v1.49.1", - "v1.49.0", - "v1.48.2", - "v1.48.1", - "v1.48.0", - "v1.47.0", - "v1.46.3", - "v1.46.2", - "v1.46.1", - "v1.46.0", - "v1.45.0", - "v1.44.0", - "v1.43.0", - "v1.42.0", - "v1.41.0", - "v1.40.0", - "v1.39.0", - "v1.38.0", - "v1.37.0", - "v1.36.0", - "v1.35.0", - "v1.34.0", - "v1.33.0", - "v1.32.3", - "v1.32.2", - "v1.32.1", - "v1.32.0", - "v1.31.0", - "v1.30.1", - "v1.30.0", - "v1.29.2", - "v1.29.1", - "v1.29.0", - "v1.28.0", - "v1.27.1", - "v1.27.0", - "v1.26.0", - "v1.25.0", - "v1.24.1", - "v1.24.0", - "v1.23.0", - "v1.22.0", - "v1.21.0", - "v1.20.0", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.1", - "v1.16.0", - "v1.15.6", - "v1.15.5", - "v1.15.4", - "v1.15.3", - "v1.15.2", - "v1.15.1", - "v1.15.0", - "v1.14.0", - "v1.13.0", - "v1.12.0", - "v1.11.7", - "v1.11.6", - "v1.11.5", - "v1.11.4", - "v1.11.3", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.1", - "v1.0.0", - "v0.11.0", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-speech", - "name": "google/cloud-speech", - "defaultService": "speech/speechclient", - "versions": [ - "v1.11.0", - "v1.10.0", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.0", - "v1.6.5", - "v1.6.4", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.1", - "v1.5.0", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.31.1", - "v0.31.0", - "v0.30.0", - "v0.29.0", - "v0.28.0", - "v0.27.0", - "v0.26.0", - "v0.25.0", - "v0.24.1", - "v0.24.0", - "v0.23.3", - "v0.23.2", - "v0.23.1", - "v0.23.0", - "v0.22.0", - "v0.21.1", - "v0.21.0", - "v0.20.0", - "v0.19.0", - "v0.18.2", - "v0.18.1", - "v0.18.0", - "v0.17.1", - "v0.17.0", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.1", - "v0.14.0", - "v0.13.1", - "v0.13.0", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.0", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-sql-admin", - "name": "google/cloud-sql-admin", - "defaultService": "sqladmin/readme", - "versions": [ - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-storage", - "name": "google/cloud-storage", - "defaultService": "storage/storageclient", - "versions": [ - "v1.30.2", - "v1.30.1", - "v1.30.0", - "v1.29.0", - "v1.28.2", - "v1.28.1", - "v1.28.0", - "v1.27.1", - "v1.27.0", - "v1.26.3", - "v1.26.2", - "v1.26.1", - "v1.26.0", - "v1.25.2", - "v1.25.1", - "v1.25.0", - "v1.24.1", - "v1.24.0", - "v1.23.2", - "v1.23.1", - "v1.23.0", - "v1.22.0", - "v1.21.1", - "v1.21.0", - "v1.20.1", - "v1.20.0", - "v1.19.0", - "v1.18.0", - "v1.17.0", - "v1.16.1", - "v1.16.0", - "v1.15.0", - "v1.14.0", - "v1.13.0", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.4", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.3", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.0", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.1", - "v1.2.0", - "v1.1.5", - "v1.1.4", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-storage-transfer", - "name": "google/cloud-storage-transfer", - "defaultService": "storagetransfer/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-talent", - "name": "google/cloud-talent", - "defaultService": "talent/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.19.1", - "v0.19.0", - "v0.18.0", - "v0.17.0", - "v0.16.6", - "v0.16.5", - "v0.16.4", - "v0.16.3", - "v0.16.2", - "v0.16.1", - "v0.16.0", - "v0.15.3", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.0", - "v0.13.1", - "v0.13.0", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-tasks", - "name": "google/cloud-tasks", - "defaultService": "tasks/readme", - "versions": [ - "v1.11.9", - "v1.11.8", - "v1.11.7", - "v1.11.6", - "v1.11.5", - "v1.11.4", - "v1.11.3", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.0", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.2", - "v1.8.1", - "v1.8.0", - "v1.7.1", - "v1.7.0", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.0", - "v1.4.0", - "v1.3.0", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.10.0", - "v0.9.0", - "v0.8.0", - "v0.7.1", - "v0.7.0", - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-text-to-speech", - "name": "google/cloud-text-to-speech", - "defaultService": "texttospeech/readme", - "versions": [ - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.5", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.1", - "v0.2.0", - "v0.1.8", - "v0.1.7", - "v0.1.6", - "v0.1.5", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-tpu", - "name": "google/cloud-tpu", - "defaultService": "tpu/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-trace", - "name": "google/cloud-trace", - "defaultService": "trace/traceclient", - "versions": [ - "v1.5.1", - "v1.5.0", - "v1.4.11", - "v1.4.10", - "v1.4.9", - "v1.4.8", - "v1.4.7", - "v1.4.6", - "v1.4.5", - "v1.4.4", - "v1.4.3", - "v1.4.2", - "v1.4.1", - "v1.4.0", - "v1.3.6", - "v1.3.5", - "v1.3.4", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.0", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.0", - "v0.18.0", - "v0.17.1", - "v0.17.0", - "v0.16.0", - "v0.15.0", - "v0.14.4", - "v0.14.3", - "v0.14.2", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.5", - "v0.12.4", - "v0.12.3", - "v0.12.2", - "v0.12.1", - "v0.12.0", - "v0.11.0", - "v0.10.6", - "v0.10.5", - "v0.10.4", - "v0.10.3", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.0", - "v0.8.0", - "v0.7.4", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.0", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-translate", - "name": "google/cloud-translate", - "defaultService": "translate/translateclient", - "versions": [ - "v1.13.1", - "v1.13.0", - "v1.12.12", - "v1.12.11", - "v1.12.10", - "v1.12.9", - "v1.12.8", - "v1.12.7", - "v1.12.6", - "v1.12.5", - "v1.12.4", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.0", - "v1.10.1", - "v1.10.0", - "v1.9.1", - "v1.9.0", - "v1.8.1", - "v1.8.0", - "v1.7.4", - "v1.7.3", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.0", - "v1.5.0", - "v1.4.1", - "v1.4.0", - "v1.3.0", - "v1.2.9", - "v1.2.8", - "v1.2.7", - "v1.2.6", - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-video-live-stream", - "name": "google/cloud-video-live-stream", - "defaultService": "videolivestream/readme", - "versions": [ - "v0.3.0", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-video-stitcher", - "name": "google/cloud-video-stitcher", - "defaultService": "videostitcher/readme", - "versions": [ - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-video-transcoder", - "name": "google/cloud-video-transcoder", - "defaultService": "videotranscoder/readme", - "versions": [ - "v0.6.0", - "v0.5.3", - "v0.5.2", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.5", - "v0.3.4", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-videointelligence", - "name": "google/cloud-videointelligence", - "defaultService": "videointelligence/readme", - "versions": [ - "v1.12.14", - "v1.12.13", - "v1.12.12", - "v1.12.11", - "v1.12.10", - "v1.12.9", - "v1.12.8", - "v1.12.7", - "v1.12.6", - "v1.12.5", - "v1.12.4", - "v1.12.3", - "v1.12.2", - "v1.12.1", - "v1.12.0", - "v1.11.2", - "v1.11.1", - "v1.11.0", - "v1.10.0", - "v1.9.3", - "v1.9.2", - "v1.9.1", - "v1.9.0", - "v1.8.0", - "v1.7.2", - "v1.7.1", - "v1.7.0", - "v1.6.1", - "v1.6.0", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.1", - "v1.3.0", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.0", - "v1.0.8", - "v1.0.7", - "v1.0.6", - "v1.0.5", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.12.0", - "v0.11.1", - "v0.11.0", - "v0.10.4", - "v0.10.3", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.3", - "v0.9.2", - "v0.9.1", - "v0.9.0", - "v0.8.3", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.0", - "v0.5.0", - "v0.4.0", - "v0.3.3", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-vision", - "name": "google/cloud-vision", - "defaultService": "vision/visionclient", - "versions": [ - "v1.6.5", - "v1.6.4", - "v1.6.3", - "v1.6.2", - "v1.6.1", - "v1.6.0", - "v1.5.10", - "v1.5.9", - "v1.5.8", - "v1.5.7", - "v1.5.6", - "v1.5.5", - "v1.5.4", - "v1.5.3", - "v1.5.2", - "v1.5.1", - "v1.5.0", - "v1.4.0", - "v1.3.3", - "v1.3.2", - "v1.3.1", - "v1.3.0", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.1", - "v1.1.0", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.25.1", - "v0.25.0", - "v0.24.1", - "v0.24.0", - "v0.23.0", - "v0.22.5", - "v0.22.4", - "v0.22.3", - "v0.22.2", - "v0.22.1", - "v0.22.0", - "v0.21.1", - "v0.21.0", - "v0.20.0", - "v0.19.3", - "v0.19.2", - "v0.19.1", - "v0.19.0", - "v0.18.0", - "v0.17.2", - "v0.17.1", - "v0.17.0", - "v0.16.0", - "v0.15.4", - "v0.15.3", - "v0.15.2", - "v0.15.1", - "v0.15.0", - "v0.14.2", - "v0.14.1", - "v0.14.0", - "v0.13.0", - "v0.12.0", - "v0.11.4", - "v0.11.3", - "v0.11.2", - "v0.11.1", - "v0.11.0", - "v0.10.2", - "v0.10.1", - "v0.10.0", - "v0.9.1", - "v0.9.0", - "v0.8.2", - "v0.8.1", - "v0.8.0", - "v0.7.0", - "v0.6.1", - "v0.6.0", - "v0.5.0", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-vm-migration", - "name": "google/cloud-vm-migration", - "defaultService": "vmmigration/readme", - "versions": [ - "v0.3.0", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.4", - "v0.1.3", - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-vmware-engine", - "name": "google/cloud-vmware-engine", - "defaultService": "vmwareengine/readme", - "versions": [ - "v0.1.2", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-vpc-access", - "name": "google/cloud-vpc-access", - "defaultService": "vpcaccess/readme", - "versions": [ - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.3.0", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-web-risk", - "name": "google/cloud-web-risk", - "defaultService": "webrisk/readme", - "versions": [ - "v1.2.5", - "v1.2.4", - "v1.2.3", - "v1.2.2", - "v1.2.1", - "v1.2.0", - "v1.1.7", - "v1.1.6", - "v1.1.5", - "v1.1.4", - "v1.1.3", - "v1.1.2", - "v1.1.1", - "v1.1.0", - "v1.0.7", - "v1.0.6", - "v1.0.5", - "v1.0.4", - "v1.0.3", - "v1.0.2", - "v1.0.1", - "v1.0.0", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-web-security-scanner", - "name": "google/cloud-web-security-scanner", - "defaultService": "websecurityscanner/readme", - "versions": [ - "v0.7.11", - "v0.7.10", - "v0.7.9", - "v0.7.8", - "v0.7.7", - "v0.7.6", - "v0.7.5", - "v0.7.4", - "v0.7.3", - "v0.7.2", - "v0.7.1", - "v0.7.0", - "v0.6.6", - "v0.6.5", - "v0.6.4", - "v0.6.3", - "v0.6.2", - "v0.6.1", - "v0.6.0", - "v0.5.1", - "v0.5.0", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.0", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "cloud-workflows", - "name": "google/cloud-workflows", - "defaultService": "workflows/readme", - "versions": [ - "v0.2.12", - "v0.2.11", - "v0.2.10", - "v0.2.9", - "v0.2.8", - "v0.2.7", - "v0.2.6", - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - }, - { - "id": "grafeas", - "name": "google/grafeas", - "defaultService": "grafeas/readme", - "versions": [ - "v0.6.0", - "v0.5.0", - "v0.4.4", - "v0.4.3", - "v0.4.2", - "v0.4.1", - "v0.4.0", - "v0.3.2", - "v0.3.1", - "v0.3.0", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.1", - "v0.1.0", - "main" - ] - }, - { - "id": "longrunning", - "name": "google/longrunning", - "defaultService": "longrunning/readme", - "versions": [ - "v0.2.5", - "v0.2.4", - "v0.2.3", - "v0.2.2", - "v0.2.1", - "v0.2.0", - "v0.1.0", - "main" - ] - } - ], - "content": "json", - "home": "home.html", - "package": { - "title": "Packagist", - "href": "https://packagist.org/packages/google/cloud" - } -} diff --git a/docs/toc.json b/docs/toc.json deleted file mode 100644 index f66782208cec..000000000000 --- a/docs/toc.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "guides": [{ - "title": "Troubleshooting", - "id": "troubleshooting", - "edit": "https://github.com/googleapis/google-cloud-common/edit/master/troubleshooting/readme.md", - "contents": [ - "https://raw.githubusercontent.com/googleapis/google-cloud-common/master/troubleshooting/readme.md", - "troubleshooting.md" - ] - }, { - "title": "Contributing", - "id": "contributing", - "edit": "https://github.com/googleapis/google-cloud-php/edit/master/CONTRIBUTING.md", - "contents": "https://raw.githubusercontent.com/googleapis/google-cloud-php/master/CONTRIBUTING.md" - }], - "services": [] -} diff --git a/phpunit-php5.xml.dist b/phpunit-php5.xml.dist index 3d2a6bbc1377..d5d25adc5acc 100644 --- a/phpunit-php5.xml.dist +++ b/phpunit-php5.xml.dist @@ -5,12 +5,20 @@ */tests/Unit - ./tests/Unit ./Compute/tests/Unit/* ./SqlAdmin/tests/Unit/* - ./dev/tests/Unit/DocFx/CommandTest.php - ./dev/tests/Unit/DocFx/NodeTest.php - ./dev/tests/Unit/DocFx/PageTest.php + dev/tests/Unit/Command/AddComponentCommandTest.php + dev/tests/Unit/Command/DocFxCommandTest.php + dev/tests/Unit/DocFx/PageTest.php + dev/tests/Unit/DocFx/NodeTest.php + dev/tests/Unit/SplitTest.php + dev/tests/Unit/GitHubTest.php + dev/tests/Unit/ReleaseNotesTest.php + dev/tests/Unit/RunShellTest.php + dev/tests/Unit/JsonFileTest.php + dev/tests/Unit/NewComponentTest.php + dev/tests/Unit/SplitInstallTest.php + dev/tests/Unit/ComponentTest.php diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 6e34d547a10d..0e060d92ce98 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -16,8 +16,18 @@ */tests/Unit - ./tests/Unit - ./dev/tests/Unit/DocFx + dev/tests/Unit/Command/AddComponentCommandTest.php + dev/tests/Unit/Command/DocFxCommandTest.php + dev/tests/Unit/DocFx/PageTest.php + dev/tests/Unit/DocFx/NodeTest.php + dev/tests/Unit/SplitTest.php + dev/tests/Unit/GitHubTest.php + dev/tests/Unit/ReleaseNotesTest.php + dev/tests/Unit/RunShellTest.php + dev/tests/Unit/JsonFileTest.php + dev/tests/Unit/NewComponentTest.php + dev/tests/Unit/SplitInstallTest.php + dev/tests/Unit/ComponentTest.php