From ac14a65c2eec11541171b34fc54001e579c16514 Mon Sep 17 00:00:00 2001 From: balexey88 Date: Thu, 19 Sep 2024 18:30:41 +0300 Subject: [PATCH] Prepare 4.1.0 release --- .github/workflows/publish-release.yml | 2 + changelog.txt | 24 + changes.md | 24 + composer.json | 2 +- composer.lock | 218 +- l10n.php | 1 + lib/Google/CHANGELOG.md | 38 + lib/Google/README.md | 11 +- lib/Google/composer.json | 35 +- lib/Google/composer.lock | 1409 +- lib/Google/src/Client.php | 145 +- lib/Google/src/Http/Batch.php | 7 +- lib/Google/src/Http/REST.php | 2 +- lib/Google/src/Service.php | 6 +- lib/Google/src/Service/Resource.php | 26 +- lib/Google/vendor/autoload.php | 2 +- .../vendor/composer/autoload_classmap.php | 6 + lib/Google/vendor/composer/autoload_psr4.php | 20 + lib/Google/vendor/composer/autoload_real.php | 10 +- .../vendor/composer/autoload_static.php | 114 +- lib/Google/vendor/composer/installed.json | 555 +- lib/Google/vendor/composer/installed.php | 138 +- .../vendor/firebase/php-jwt/CHANGELOG.md | 8 + lib/Google/vendor/firebase/php-jwt/README.md | 2 +- .../vendor/firebase/php-jwt/composer.json | 6 +- .../firebase/php-jwt/src/CachedKeySet.php | 14 +- .../vendor/firebase/php-jwt/src/JWT.php | 3 + .../google/apiclient-services/composer.json | 4 +- .../google/apiclient-services/src/Storage.php | 169 +- .../src/Storage/AnywhereCache.php | 18 + .../apiclient-services/src/Storage/Bucket.php | 16 + .../Storage/BucketHierarchicalNamespace.php | 44 + .../src/Storage/BucketStorageLayout.php | 130 + ...cketStorageLayoutCustomPlacementConfig.php | 45 + ...cketStorageLayoutHierarchicalNamespace.php | 44 + .../apiclient-services/src/Storage/Folder.php | 186 + .../src/Storage/FolderPendingRenameInfo.php | 44 + .../src/Storage/Folders.php | 79 + ...oogleLongrunningListOperationsResponse.php | 18 + .../Storage/GoogleLongrunningOperation.php | 36 + .../src/Storage/Resource/AnywhereCache.php | 14 +- .../src/Storage/Resource/AnywhereCaches.php | 149 + .../Storage/Resource/BucketAccessControls.php | 6 + .../src/Storage/Resource/Buckets.php | 31 + .../src/Storage/Resource/Channels.php | 1 + .../Resource/DefaultObjectAccessControls.php | 6 + .../src/Storage/Resource/Folders.php | 157 + .../src/Storage/Resource/ManagedFolders.php | 13 +- .../src/Storage/Resource/Notifications.php | 4 + .../Storage/Resource/ObjectAccessControls.php | 6 + .../src/Storage/Resource/Objects.php | 20 +- .../src/Storage/Resource/Operations.php | 3 + .../src/Storage/Resource/ProjectsHmacKeys.php | 5 + .../Resource/ProjectsServiceAccount.php | 1 + lib/Google/vendor/google/auth/README.md | 41 +- lib/Google/vendor/google/auth/VERSION | 1 + lib/Google/vendor/google/auth/composer.json | 16 +- .../vendor/google/auth/src/AccessToken.php | 72 +- .../src/ApplicationDefaultCredentials.php | 10 +- .../vendor/google/auth/src/Cache/Item.php | 1 + .../auth/src/Cache/MemoryCacheItemPool.php | 3 +- .../auth/src/Cache/SysVCacheItemPool.php | 3 +- .../src/CredentialSource/AwsNativeSource.php | 4 +- .../src/CredentialSource/ExecutableSource.php | 260 + .../ExternalAccountCredentials.php | 139 +- .../auth/src/Credentials/GCECredentials.php | 155 +- .../ImpersonatedServiceAccountCredentials.php | 13 +- .../Credentials/ServiceAccountCredentials.php | 45 +- .../ServiceAccountJwtAccessCredentials.php | 18 +- .../Credentials/UserRefreshCredentials.php | 24 +- .../ExecutableHandler/ExecutableHandler.php | 83 + .../ExecutableResponseError.php | 27 + .../google/auth/src/FetchAuthTokenCache.php | 38 +- lib/Google/vendor/google/auth/src/Iam.php | 16 +- .../vendor/google/auth/src/IamSignerTrait.php | 7 +- .../vendor/google/auth/src/MetricsTrait.php | 120 + .../src/Middleware/AuthTokenMiddleware.php | 2 +- lib/Google/vendor/google/auth/src/OAuth2.php | 25 +- .../auth/src/ServiceAccountSignerTrait.php | 11 +- .../google/auth/src/UpdateMetadataTrait.php | 14 +- .../google/cloud-core/.repo-metadata.json | 8 - lib/Google/vendor/google/cloud-core/VERSION | 2 +- .../vendor/google/cloud-core/composer.json | 17 +- .../google/cloud-core/snippet-bootstrap.php | 7 + .../google/cloud-core/src/ApiHelperTrait.php | 268 + .../cloud-core/src/DetectProjectIdTrait.php | 104 + .../google/cloud-core/src/EmulatorTrait.php | 14 +- .../cloud-core/src/GrpcRequestWrapper.php | 123 +- .../google/cloud-core/src/GrpcTrait.php | 28 +- .../vendor/google/cloud-core/src/Iam/Iam.php | 8 +- .../google/cloud-core/src/Iam/IamManager.php | 232 + .../src/InsecureCredentialsWrapper.php | 12 +- .../src/Report/CloudRunMetadataProvider.php | 16 +- .../google/cloud-core/src/RequestHandler.php | 142 + .../cloud-core/src/RequestProcessorTrait.php | 151 + .../google/cloud-core/src/RequestWrapper.php | 57 +- .../google/cloud-core/src/RestTrait.php | 40 +- .../google/cloud-core/src/ServiceBuilder.php | 2 +- .../cloud-core/src/Testing/TestHelpers.php | 3 +- .../src/Upload/ResumableUploader.php | 7 +- .../google/cloud-core/unit-bootstrap.php | 7 + .../google/cloud-storage/.repo-metadata.json | 8 - .../vendor/google/cloud-storage/README.md | 8 +- .../vendor/google/cloud-storage/VERSION | 2 +- .../vendor/google/cloud-storage/composer.json | 9 +- .../google/cloud-storage/src/Bucket.php | 57 +- .../src/Connection/ConnectionInterface.php | 5 + .../cloud-storage/src/Connection/Rest.php | 54 +- .../ServiceDefinition/storage-v1.json | 10614 ++++++++-------- .../google/cloud-storage/src/Lifecycle.php | 73 + .../cloud-storage/src/StorageClient.php | 4 +- .../cloud-storage/src/StreamWrapper.php | 39 +- .../vendor/google/common-protos/CHANGELOG.md | 108 + .../google/common-protos/CODE_OF_CONDUCT.md | 43 + .../google/common-protos/CONTRIBUTING.md | 45 + .../vendor/google/common-protos/LICENSE | 201 + .../vendor/google/common-protos/README.md | 46 + .../vendor/google/common-protos/SECURITY.md | 7 + .../vendor/google/common-protos/composer.json | 30 + .../metadata/Api/Annotations.php | 29 + .../common-protos/metadata/Api/Auth.php | Bin 0 -> 1303 bytes .../common-protos/metadata/Api/Backend.php | Bin 0 -> 1291 bytes .../common-protos/metadata/Api/Billing.php | 33 + .../common-protos/metadata/Api/Client.php | Bin 0 -> 3578 bytes .../metadata/Api/ConfigChange.php | Bin 0 -> 960 bytes .../common-protos/metadata/Api/Consumer.php | Bin 0 -> 909 bytes .../common-protos/metadata/Api/Context.php | 36 + .../common-protos/metadata/Api/Control.php | 32 + .../metadata/Api/Distribution.php | Bin 0 -> 1699 bytes .../metadata/Api/Documentation.php | 43 + .../common-protos/metadata/Api/Endpoint.php | 34 + .../metadata/Api/ErrorReason.php | Bin 0 -> 1600 bytes .../metadata/Api/FieldBehavior.php | Bin 0 -> 915 bytes .../common-protos/metadata/Api/FieldInfo.php | Bin 0 -> 946 bytes .../common-protos/metadata/Api/Http.php | Bin 0 -> 1057 bytes .../common-protos/metadata/Api/Httpbody.php | 34 + .../common-protos/metadata/Api/Label.php | Bin 0 -> 812 bytes .../metadata/Api/LaunchStage.php | Bin 0 -> 811 bytes .../google/common-protos/metadata/Api/Log.php | 34 + .../common-protos/metadata/Api/Logging.php | 34 + .../common-protos/metadata/Api/Metric.php | Bin 0 -> 1808 bytes .../metadata/Api/MonitoredResource.php | 50 + .../common-protos/metadata/Api/Monitoring.php | 35 + .../common-protos/metadata/Api/Policy.php | 35 + .../common-protos/metadata/Api/Quota.php | 55 + .../common-protos/metadata/Api/Resource.php | Bin 0 -> 1135 bytes .../common-protos/metadata/Api/Routing.php | 33 + .../common-protos/metadata/Api/Service.php | 80 + .../common-protos/metadata/Api/SourceInfo.php | 32 + .../metadata/Api/SystemParameter.php | 38 + .../common-protos/metadata/Api/Usage.php | 37 + .../common-protos/metadata/Api/Visibility.php | 34 + .../metadata/Cloud/ExtendedOperations.php | Bin 0 -> 862 bytes .../metadata/Cloud/Location/Locations.php | 53 + .../metadata/Iam/V1/IamPolicy.php | 53 + .../metadata/Iam/V1/Logging/AuditData.php | 30 + .../common-protos/metadata/Iam/V1/Options.php | 29 + .../common-protos/metadata/Iam/V1/Policy.php | Bin 0 -> 1757 bytes .../metadata/Logging/Type/HttpRequest.php | 46 + .../metadata/Logging/Type/LogSeverity.php | Bin 0 -> 948 bytes .../common-protos/metadata/Rpc/Code.php | Bin 0 -> 957 bytes .../metadata/Rpc/Context/AttributeContext.php | 109 + .../metadata/Rpc/Context/AuditContext.php | 34 + .../metadata/Rpc/ErrorDetails.php | 77 + .../common-protos/metadata/Rpc/Status.php | 33 + .../metadata/Type/CalendarPeriod.php | Bin 0 -> 840 bytes .../common-protos/metadata/Type/Color.php | 34 + .../common-protos/metadata/Type/Date.php | 31 + .../common-protos/metadata/Type/Datetime.php | Bin 0 -> 1004 bytes .../common-protos/metadata/Type/Dayofweek.php | Bin 0 -> 814 bytes .../common-protos/metadata/Type/Decimal.php | 29 + .../common-protos/metadata/Type/Expr.php | 33 + .../common-protos/metadata/Type/Fraction.php | 30 + .../common-protos/metadata/Type/Interval.php | 32 + .../common-protos/metadata/Type/Latlng.php | 30 + .../metadata/Type/LocalizedText.php | 30 + .../common-protos/metadata/Type/Money.php | 32 + .../common-protos/metadata/Type/Month.php | Bin 0 -> 834 bytes .../metadata/Type/PhoneNumber.php | Bin 0 -> 872 bytes .../metadata/Type/PostalAddress.php | 41 + .../metadata/Type/Quaternion.php | 33 + .../common-protos/metadata/Type/Timeofday.php | 32 + .../vendor/google/common-protos/renovate.json | 7 + .../google/common-protos/src/Api/Advice.php | 72 + .../common-protos/src/Api/AuthProvider.php | 419 + .../common-protos/src/Api/AuthRequirement.php | 159 + .../common-protos/src/Api/Authentication.php | 120 + .../src/Api/AuthenticationRule.php | 197 + .../google/common-protos/src/Api/Backend.php | 71 + .../common-protos/src/Api/BackendRule.php | 525 + .../src/Api/BackendRule/PathTranslation.php | 93 + .../google/common-protos/src/Api/Billing.php | 107 + .../src/Api/Billing/BillingDestination.php | 119 + .../common-protos/src/Api/ChangeType.php | 72 + .../src/Api/ClientLibraryDestination.php | 63 + .../src/Api/ClientLibraryOrganization.php | 97 + .../src/Api/ClientLibrarySettings.php | 499 + .../src/Api/CommonLanguageSettings.php | 110 + .../common-protos/src/Api/ConfigChange.php | 251 + .../google/common-protos/src/Api/Context.php | 98 + .../common-protos/src/Api/ContextRule.php | 228 + .../google/common-protos/src/Api/Control.php | 112 + .../common-protos/src/Api/CppSettings.php | 77 + .../src/Api/CustomHttpPattern.php | 101 + .../common-protos/src/Api/Distribution.php | 390 + .../src/Api/Distribution/BucketOptions.php | 155 + .../Distribution/BucketOptions/Explicit.php | 75 + .../BucketOptions/Exponential.php | 142 + .../Api/Distribution/BucketOptions/Linear.php | 142 + .../src/Api/Distribution/Exemplar.php | 178 + .../src/Api/Distribution/Range.php | 102 + .../common-protos/src/Api/Documentation.php | 362 + .../src/Api/DocumentationRule.php | 171 + .../common-protos/src/Api/DotnetSettings.php | 307 + .../google/common-protos/src/Api/Endpoint.php | 231 + .../common-protos/src/Api/ErrorReason.php | 653 + .../common-protos/src/Api/FieldBehavior.php | 133 + .../common-protos/src/Api/FieldInfo.php | 117 + .../src/Api/FieldInfo/Format.php | 90 + .../common-protos/src/Api/FieldPolicy.php | 181 + .../common-protos/src/Api/GoSettings.php | 77 + .../google/common-protos/src/Api/Http.php | 123 + .../google/common-protos/src/Api/HttpBody.php | 168 + .../google/common-protos/src/Api/HttpRule.php | 651 + .../common-protos/src/Api/JavaSettings.php | 221 + .../common-protos/src/Api/JwtLocation.php | 199 + .../common-protos/src/Api/LabelDescriptor.php | 135 + .../src/Api/LabelDescriptor/ValueType.php | 62 + .../common-protos/src/Api/LaunchStage.php | 118 + .../common-protos/src/Api/LogDescriptor.php | 203 + .../google/common-protos/src/Api/Logging.php | 151 + .../src/Api/Logging/LoggingDestination.php | 123 + .../common-protos/src/Api/MethodPolicy.php | 121 + .../common-protos/src/Api/MethodSettings.php | 245 + .../src/Api/MethodSettings/LongRunning.php | 224 + .../google/common-protos/src/Api/Metric.php | 114 + .../src/Api/MetricDescriptor.php | 831 ++ .../MetricDescriptorMetadata.php | 189 + .../src/Api/MetricDescriptor/MetricKind.php | 75 + .../src/Api/MetricDescriptor/ValueType.php | 92 + .../common-protos/src/Api/MetricRule.php | 126 + .../src/Api/MonitoredResource.php | 147 + .../src/Api/MonitoredResourceDescriptor.php | 309 + .../src/Api/MonitoredResourceMetadata.php | 148 + .../common-protos/src/Api/Monitoring.php | 190 + .../Api/Monitoring/MonitoringDestination.php | 119 + .../common-protos/src/Api/NodeSettings.php | 77 + .../src/Api/OAuthRequirements.php | 96 + .../google/common-protos/src/Api/Page.php | 200 + .../common-protos/src/Api/PhpSettings.php | 77 + .../src/Api/ProjectProperties.php | 80 + .../google/common-protos/src/Api/Property.php | 142 + .../src/Api/Property/PropertyType.php | 76 + .../common-protos/src/Api/Publishing.php | 453 + .../common-protos/src/Api/PythonSettings.php | 77 + .../google/common-protos/src/Api/Quota.php | 144 + .../common-protos/src/Api/QuotaLimit.php | 527 + .../src/Api/ResourceDescriptor.php | 495 + .../src/Api/ResourceDescriptor/History.php | 66 + .../src/Api/ResourceDescriptor/Style.php | 60 + .../src/Api/ResourceReference.php | 190 + .../src/Api/RoutingParameter.php | 281 + .../common-protos/src/Api/RoutingRule.php | 353 + .../common-protos/src/Api/RubySettings.php | 77 + .../google/common-protos/src/Api/Service.php | 1246 ++ .../common-protos/src/Api/SourceInfo.php | 67 + .../common-protos/src/Api/SystemParameter.php | 145 + .../src/Api/SystemParameterRule.php | 130 + .../src/Api/SystemParameters.php | 155 + .../common-protos/src/Api/TypeReference.php | 91 + .../google/common-protos/src/Api/Usage.php | 191 + .../common-protos/src/Api/UsageRule.php | 180 + .../common-protos/src/Api/Visibility.php | 88 + .../common-protos/src/Api/VisibilityRule.php | 150 + .../src/Cloud/Iam/V1/AuditConfig.php | 155 + .../src/Cloud/Iam/V1/AuditConfigDelta.php | 202 + .../Cloud/Iam/V1/AuditConfigDelta/Action.php | 62 + .../src/Cloud/Iam/V1/AuditLogConfig.php | 129 + .../Cloud/Iam/V1/AuditLogConfig/LogType.php | 70 + .../src/Cloud/Iam/V1/Binding.php | 301 + .../src/Cloud/Iam/V1/BindingDelta.php | 200 + .../src/Cloud/Iam/V1/BindingDelta/Action.php | 62 + .../src/Cloud/Iam/V1/GetIamPolicyRequest.php | 119 + .../src/Cloud/Iam/V1/GetPolicyOptions.php | 119 + .../common-protos/src/Cloud/Iam/V1/Policy.php | 377 + .../src/Cloud/Iam/V1/PolicyDelta.php | 101 + .../src/Cloud/Iam/V1/SetIamPolicyRequest.php | 183 + .../Iam/V1/TestIamPermissionsRequest.php | 117 + .../Iam/V1/TestIamPermissionsResponse.php | 71 + .../src/Cloud/Location/GetLocationRequest.php | 67 + .../Cloud/Location/ListLocationsRequest.php | 169 + .../Cloud/Location/ListLocationsResponse.php | 101 + .../src/Cloud/Location/Location.php | 229 + .../src/Cloud/Logging/Type/HttpRequest.php | 627 + .../src/Cloud/Logging/Type/LogSeverity.php | 119 + .../src/Cloud/OperationResponseMapping.php | 86 + .../src/Iam/V1/Logging/AuditData.php | 79 + .../common-protos/src/Rpc/BadRequest.php | 68 + .../src/Rpc/BadRequest/FieldViolation.php | 214 + .../google/common-protos/src/Rpc/Code.php | 243 + .../src/Rpc/Context/AttributeContext.php | 419 + .../src/Rpc/Context/AttributeContext/Api.php | 196 + .../src/Rpc/Context/AttributeContext/Auth.php | 356 + .../src/Rpc/Context/AttributeContext/Peer.php | 223 + .../Rpc/Context/AttributeContext/Request.php | 508 + .../Rpc/Context/AttributeContext/Resource.php | 610 + .../Rpc/Context/AttributeContext/Response.php | 249 + .../src/Rpc/Context/AuditContext.php | 247 + .../common-protos/src/Rpc/DebugInfo.php | 101 + .../common-protos/src/Rpc/ErrorInfo.php | 213 + .../google/common-protos/src/Rpc/Help.php | 70 + .../common-protos/src/Rpc/Help/Link.php | 102 + .../src/Rpc/LocalizedMessage.php | 110 + .../src/Rpc/PreconditionFailure.php | 70 + .../src/Rpc/PreconditionFailure/Violation.php | 160 + .../common-protos/src/Rpc/QuotaFailure.php | 75 + .../src/Rpc/QuotaFailure/Violation.php | 131 + .../common-protos/src/Rpc/RequestInfo.php | 110 + .../common-protos/src/Rpc/ResourceInfo.php | 205 + .../common-protos/src/Rpc/RetryInfo.php | 87 + .../google/common-protos/src/Rpc/Status.php | 160 + .../common-protos/src/Type/CalendarPeriod.php | 102 + .../google/common-protos/src/Type/Color.php | 360 + .../google/common-protos/src/Type/Date.php | 161 + .../common-protos/src/Type/DateTime.php | 393 + .../common-protos/src/Type/DayOfWeek.php | 96 + .../google/common-protos/src/Type/Decimal.php | 244 + .../google/common-protos/src/Type/Expr.php | 210 + .../common-protos/src/Type/Fraction.php | 105 + .../common-protos/src/Type/Interval.php | 141 + .../google/common-protos/src/Type/LatLng.php | 105 + .../common-protos/src/Type/LocalizedText.php | 109 + .../google/common-protos/src/Type/Money.php | 159 + .../google/common-protos/src/Type/Month.php | 131 + .../common-protos/src/Type/PhoneNumber.php | 230 + .../src/Type/PhoneNumber/ShortCode.php | 125 + .../common-protos/src/Type/PostalAddress.php | 628 + .../common-protos/src/Type/Quaternion.php | 211 + .../common-protos/src/Type/TimeOfDay.php | 180 + .../common-protos/src/Type/TimeZone.php | 102 + lib/Google/vendor/google/gax/CHANGELOG.md | 310 + .../vendor/google/gax/CODE_OF_CONDUCT.md | 43 + lib/Google/vendor/google/gax/LICENSE | 25 + lib/Google/vendor/google/gax/README.md | 97 + lib/Google/vendor/google/gax/SECURITY.md | 7 + lib/Google/vendor/google/gax/VERSION | 1 + lib/Google/vendor/google/gax/composer.json | 48 + .../gax/metadata/ApiCore/Testing/Mocks.php | Bin 0 -> 1988 bytes .../Google/ApiCore/Tests/Unit/Example.php | 28 + .../vendor/google/gax/metadata/README.md | 6 + .../vendor/google/gax/phpstan.neon.dist | 5 + lib/Google/vendor/google/gax/phpunit.xml.dist | 16 + lib/Google/vendor/google/gax/renovate.json | 7 + .../vendor/google/gax/src/AgentHeader.php | 132 + .../vendor/google/gax/src/ApiException.php | 346 + .../vendor/google/gax/src/ApiStatus.php | 171 + .../vendor/google/gax/src/ArrayTrait.php | 156 + .../vendor/google/gax/src/BidiStream.php | 177 + lib/Google/vendor/google/gax/src/Call.php | 131 + .../google/gax/src/ClientOptionsTrait.php | 313 + .../vendor/google/gax/src/ClientStream.php | 107 + .../google/gax/src/CredentialsWrapper.php | 360 + .../google/gax/src/FixedSizeCollection.php | 190 + lib/Google/vendor/google/gax/src/GPBLabel.php | 43 + lib/Google/vendor/google/gax/src/GPBType.php | 58 + .../google/gax/src/GapicClientTrait.php | 953 ++ .../google/gax/src/GrpcSupportTrait.php | 63 + .../gax/src/InsecureCredentialsWrapper.php | 56 + .../CredentialsWrapperMiddleware.php | 63 + .../src/Middleware/FixedHeaderMiddleware.php | 73 + .../src/Middleware/MiddlewareInterface.php | 91 + .../src/Middleware/OperationsMiddleware.php | 74 + .../Middleware/OptionsFilterMiddleware.php | 66 + .../gax/src/Middleware/PagedMiddleware.php | 79 + .../RequestAutoPopulationMiddleware.php | 104 + .../Middleware/ResponseMetadataMiddleware.php | 71 + .../gax/src/Middleware/RetryMiddleware.php | 194 + .../google/gax/src/OperationResponse.php | 524 + .../google/gax/src/Options/CallOptions.php | 148 + .../google/gax/src/Options/ClientOptions.php | 317 + .../google/gax/src/Options/OptionsTrait.php | 90 + .../gax/src/Options/TransportOptions.php | 90 + .../GrpcFallbackTransportOptions.php | 95 + .../TransportOptions/GrpcTransportOptions.php | 131 + .../TransportOptions/RestTransportOptions.php | 111 + lib/Google/vendor/google/gax/src/Page.php | 271 + .../gax/src/PageStreamingDescriptor.php | 178 + .../google/gax/src/PagedListResponse.php | 197 + .../vendor/google/gax/src/PathTemplate.php | 113 + .../vendor/google/gax/src/PollingTrait.php | 97 + .../vendor/google/gax/src/RequestBuilder.php | 290 + .../gax/src/RequestParamsHeaderDescriptor.php | 78 + .../google/gax/src/ResourceHelperTrait.php | 110 + .../AbsoluteResourceTemplate.php | 146 + .../gax/src/ResourceTemplate/Parser.php | 227 + .../RelativeResourceTemplate.php | 390 + .../ResourceTemplateInterface.php | 91 + .../gax/src/ResourceTemplate/Segment.php | 195 + .../vendor/google/gax/src/RetrySettings.php | 547 + .../vendor/google/gax/src/Serializer.php | 530 + .../vendor/google/gax/src/ServerStream.php | 97 + .../gax/src/ServerStreamingCallInterface.php | 95 + .../google/gax/src/ServiceAddressTrait.php | 64 + .../google/gax/src/Testing/GeneratedTest.php | 102 + .../Testing/MessageAwareArrayComparator.php | 32 + .../gax/src/Testing/MessageAwareExporter.php | 47 + .../gax/src/Testing/MockBidiStreamingCall.php | 168 + .../src/Testing/MockClientStreamingCall.php | 111 + .../gax/src/Testing/MockGrpcTransport.php | 141 + .../google/gax/src/Testing/MockRequest.php | 86 + .../gax/src/Testing/MockRequestBody.php | 644 + .../google/gax/src/Testing/MockResponse.php | 166 + .../src/Testing/MockServerStreamingCall.php | 98 + .../google/gax/src/Testing/MockStatus.php | 53 + .../google/gax/src/Testing/MockStubTrait.php | 296 + .../google/gax/src/Testing/MockTransport.php | 114 + .../google/gax/src/Testing/MockUnaryCall.php | 83 + .../Testing/ProtobufGPBEmptyComparator.php | 61 + .../src/Testing/ProtobufMessageComparator.php | 79 + .../gax/src/Testing/ReceivedRequest.php | 79 + .../gax/src/Testing/SerializationTrait.php | 72 + .../vendor/google/gax/src/Testing/mocks.proto | 46 + .../gax/src/Transport/Grpc/ForwardingCall.php | 90 + .../Grpc/ForwardingServerStreamingCall.php | 65 + .../Transport/Grpc/ForwardingUnaryCall.php | 56 + .../Grpc/ServerStreamingCallWrapper.php | 123 + .../Grpc/UnaryInterceptorInterface.php | 61 + .../src/Transport/GrpcFallbackTransport.php | 211 + .../gax/src/Transport/GrpcTransport.php | 286 + .../src/Transport/HttpUnaryTransportTrait.php | 170 + .../src/Transport/Rest/JsonStreamDecoder.php | 238 + .../Rest/RestServerStreamingCall.php | 197 + .../gax/src/Transport/RestTransport.php | 267 + .../gax/src/Transport/TransportInterface.php | 91 + lib/Google/vendor/google/gax/src/UriTrait.php | 69 + .../google/gax/src/ValidationException.php | 41 + .../vendor/google/gax/src/ValidationTrait.php | 81 + lib/Google/vendor/google/gax/src/Version.php | 77 + .../grpc-gcp/.github/release-please.yml | 3 + .../grpc-gcp/.github/workflows/tests.yml | 30 + lib/Google/vendor/google/grpc-gcp/.gitmodules | 3 + .../vendor/google/grpc-gcp/.php_cs.dist | 15 + lib/Google/vendor/google/grpc-gcp/LICENSE | 202 + lib/Google/vendor/google/grpc-gcp/README.md | 14 + .../cloudprober/bins/opt/grpc_php_plugin | Bin 0 -> 2295352 bytes .../grpc-gcp/cloudprober/cloudprober.cfg | 31 + .../google/grpc-gcp/cloudprober/codegen.sh | 13 + .../google/grpc-gcp/cloudprober/composer.json | 9 + .../grpc_gpc_prober/firestore_probes.php | 33 + .../cloudprober/grpc_gpc_prober/prober.php | 102 + .../grpc_gpc_prober/spanner_probes.php | 307 + .../grpc_gpc_prober/stackdriver_util.php | 64 + .../vendor/google/grpc-gcp/composer.json | 24 + .../grpc-gcp/doc/gRPC-client-user-guide.md | 217 + .../vendor/google/grpc-gcp/src/ChannelRef.php | 98 + .../vendor/google/grpc-gcp/src/Config.php | 113 + .../src/CreatedByDeserializeCheck.php | 84 + .../grpc-gcp/src/GCPBidiStreamingCall.php | 108 + .../google/grpc-gcp/src/GCPCallInvoker.php | 86 + .../grpc-gcp/src/GCPClientStreamCall.php | 76 + .../grpc-gcp/src/GCPServerStreamCall.php | 89 + .../google/grpc-gcp/src/GCPUnaryCall.php | 70 + .../google/grpc-gcp/src/GcpBaseCall.php | 223 + .../grpc-gcp/src/GcpExtensionChannel.php | 281 + .../src/generated/GPBMetadata/GrpcGcp.php | 39 + .../src/generated/Grpc/Gcp/AffinityConfig.php | 87 + .../Grpc/Gcp/AffinityConfig_Command.php | 38 + .../src/generated/Grpc/Gcp/ApiConfig.php | 84 + .../generated/Grpc/Gcp/ChannelPoolConfig.php | 122 + .../src/generated/Grpc/Gcp/MethodConfig.php | 90 + .../vendor/google/grpc-gcp/src/grpc_gcp.proto | 70 + .../vendor/google/longrunning/.gitattributes | 6 + .../google/longrunning/CODE_OF_CONDUCT.md | 43 + .../vendor/google/longrunning/CONTRIBUTING.md | 10 + lib/Google/vendor/google/longrunning/LICENSE | 202 + .../vendor/google/longrunning/README.md | 39 + .../vendor/google/longrunning/SECURITY.md | 7 + lib/Google/vendor/google/longrunning/VERSION | 1 + .../vendor/google/longrunning/composer.json | 26 + .../metadata/Longrunning/Operations.php | Bin 0 -> 2587 bytes .../google/longrunning/metadata/README.md | 6 + .../Gapic/OperationsGapicClient.php | 16 + .../ApiCore/LongRunning/OperationsClient.php | 15 + .../LongRunning/CancelOperationRequest.php | 80 + .../LongRunning/Client/OperationsClient.php | 335 + .../LongRunning/DeleteOperationRequest.php | 80 + .../Gapic/OperationsGapicClient.php | 483 + .../src/LongRunning/GetOperationRequest.php | 80 + .../src/LongRunning/ListOperationsRequest.php | 184 + .../LongRunning/ListOperationsResponse.php | 101 + .../longrunning/src/LongRunning/Operation.php | 270 + .../src/LongRunning/OperationInfo.php | 145 + .../src/LongRunning/OperationsClient.php | 36 + .../src/LongRunning/OperationsGrpcClient.php | 149 + .../src/LongRunning/WaitOperationRequest.php | 119 + .../resources/operations_client_config.json | 59 + .../operations_descriptor_config.php | 88 + .../operations_rest_client_config.php | 76 + lib/Google/vendor/google/protobuf/LICENSE | 29 + lib/Google/vendor/google/protobuf/README.md | 2 + .../vendor/google/protobuf/composer.json | 23 + .../src/GPBMetadata/Google/Protobuf/Any.php | 30 + .../src/GPBMetadata/Google/Protobuf/Api.php | 48 + .../GPBMetadata/Google/Protobuf/Duration.php | 30 + .../GPBMetadata/Google/Protobuf/FieldMask.php | 29 + .../GPBMetadata/Google/Protobuf/GPBEmpty.php | 29 + .../Google/Protobuf/Internal/Descriptor.php | 282 + .../Google/Protobuf/SourceContext.php | 29 + .../GPBMetadata/Google/Protobuf/Struct.php | Bin 0 -> 1162 bytes .../GPBMetadata/Google/Protobuf/Timestamp.php | 30 + .../src/GPBMetadata/Google/Protobuf/Type.php | Bin 0 -> 2205 bytes .../GPBMetadata/Google/Protobuf/Wrappers.php | 49 + .../protobuf/src/Google/Protobuf/Any.php | 257 + .../protobuf/src/Google/Protobuf/Api.php | 360 + .../src/Google/Protobuf/BoolValue.php | 68 + .../src/Google/Protobuf/BytesValue.php | 68 + .../src/Google/Protobuf/Descriptor.php | 85 + .../src/Google/Protobuf/DescriptorPool.php | 53 + .../src/Google/Protobuf/DoubleValue.php | 68 + .../protobuf/src/Google/Protobuf/Duration.php | 173 + .../protobuf/src/Google/Protobuf/Enum.php | 213 + .../src/Google/Protobuf/EnumDescriptor.php | 56 + .../src/Google/Protobuf/EnumValue.php | 135 + .../Google/Protobuf/EnumValueDescriptor.php | 41 + .../protobuf/src/Google/Protobuf/Field.php | 381 + .../src/Google/Protobuf/Field/Cardinality.php | 71 + .../src/Google/Protobuf/Field/Kind.php | 176 + .../src/Google/Protobuf/FieldDescriptor.php | 121 + .../src/Google/Protobuf/FieldMask.php | 217 + .../src/Google/Protobuf/Field_Cardinality.php | 16 + .../src/Google/Protobuf/Field_Kind.php | 16 + .../src/Google/Protobuf/FloatValue.php | 68 + .../protobuf/src/Google/Protobuf/GPBEmpty.php | 38 + .../src/Google/Protobuf/Int32Value.php | 68 + .../src/Google/Protobuf/Int64Value.php | 68 + .../src/Google/Protobuf/Internal/AnyBase.php | 86 + .../Protobuf/Internal/CodedInputStream.php | 358 + .../Protobuf/Internal/CodedOutputStream.php | 136 + .../Google/Protobuf/Internal/Descriptor.php | 213 + .../Protobuf/Internal/DescriptorPool.php | 171 + .../Protobuf/Internal/DescriptorProto.php | 336 + .../DescriptorProto/ExtensionRange.php | 161 + .../DescriptorProto/ReservedRange.php | 128 + .../DescriptorProto_ExtensionRange.php | 16 + .../DescriptorProto_ReservedRange.php | 16 + .../Protobuf/Internal/EnumBuilderContext.php | 40 + .../Protobuf/Internal/EnumDescriptor.php | 116 + .../Protobuf/Internal/EnumDescriptorProto.php | 216 + .../EnumDescriptorProto/EnumReservedRange.php | 130 + .../EnumDescriptorProto_EnumReservedRange.php | 16 + .../Google/Protobuf/Internal/EnumOptions.php | 242 + .../Internal/EnumValueDescriptorProto.php | 146 + .../Protobuf/Internal/EnumValueOptions.php | 123 + .../Internal/ExtensionRangeOptions.php | 67 + .../Protobuf/Internal/FieldDescriptor.php | 303 + .../Internal/FieldDescriptorProto.php | 611 + .../Internal/FieldDescriptorProto/Label.php | 58 + .../Internal/FieldDescriptorProto/Type.php | 153 + .../Internal/FieldDescriptorProto_Label.php | 16 + .../Internal/FieldDescriptorProto_Type.php | 16 + .../Google/Protobuf/Internal/FieldOptions.php | 559 + .../Protobuf/Internal/FieldOptions/CType.php | 58 + .../Protobuf/Internal/FieldOptions/JSType.php | 62 + .../Protobuf/Internal/FieldOptions_CType.php | 16 + .../Protobuf/Internal/FieldOptions_JSType.php | 16 + .../Protobuf/Internal/FileDescriptor.php | 66 + .../Protobuf/Internal/FileDescriptorProto.php | 533 + .../Protobuf/Internal/FileDescriptorSet.php | 63 + .../Google/Protobuf/Internal/FileOptions.php | 1106 ++ .../Internal/FileOptions/OptimizeMode.php | 64 + .../Internal/FileOptions_OptimizeMode.php | 16 + .../Protobuf/Internal/GPBDecodeException.php | 24 + .../Google/Protobuf/Internal/GPBJsonWire.php | 281 + .../src/Google/Protobuf/Internal/GPBLabel.php | 17 + .../src/Google/Protobuf/Internal/GPBType.php | 32 + .../src/Google/Protobuf/Internal/GPBUtil.php | 644 + .../src/Google/Protobuf/Internal/GPBWire.php | 599 + .../Google/Protobuf/Internal/GPBWireType.php | 20 + .../Protobuf/Internal/GeneratedCodeInfo.php | 75 + .../Internal/GeneratedCodeInfo/Annotation.php | 255 + .../Internal/GeneratedCodeInfo_Annotation.php | 16 + .../Internal/GetPublicDescriptorTrait.php | 18 + .../Internal/HasPublicDescriptorTrait.php | 20 + .../src/Google/Protobuf/Internal/MapEntry.php | 48 + .../src/Google/Protobuf/Internal/MapField.php | 275 + .../Google/Protobuf/Internal/MapFieldIter.php | 123 + .../src/Google/Protobuf/Internal/Message.php | 2069 +++ .../Internal/MessageBuilderContext.php | 97 + .../Protobuf/Internal/MessageOptions.php | 466 + .../Internal/MethodDescriptorProto.php | 282 + .../Protobuf/Internal/MethodOptions.php | 160 + .../MethodOptions/IdempotencyLevel.php | 64 + .../MethodOptions_IdempotencyLevel.php | 16 + .../Protobuf/Internal/OneofDescriptor.php | 64 + .../Internal/OneofDescriptorProto.php | 109 + .../Google/Protobuf/Internal/OneofField.php | 54 + .../Google/Protobuf/Internal/OneofOptions.php | 67 + .../Protobuf/Internal/RawInputStream.php | 27 + .../Protobuf/Internal/RepeatedField.php | 254 + .../Protobuf/Internal/RepeatedFieldIter.php | 102 + .../Internal/ServiceDescriptorProto.php | 136 + .../Protobuf/Internal/ServiceOptions.php | 123 + .../Protobuf/Internal/SourceCodeInfo.php | 230 + .../Internal/SourceCodeInfo/Location.php | 448 + .../Internal/SourceCodeInfo_Location.php | 16 + .../Protobuf/Internal/TimestampBase.php | 32 + .../Protobuf/Internal/UninterpretedOption.php | 300 + .../Internal/UninterpretedOption/NamePart.php | 116 + .../Internal/UninterpretedOption_NamePart.php | 16 + .../src/Google/Protobuf/ListValue.php | 68 + .../protobuf/src/Google/Protobuf/Method.php | 271 + .../protobuf/src/Google/Protobuf/Mixin.php | 166 + .../src/Google/Protobuf/NullValue.php | 49 + .../src/Google/Protobuf/OneofDescriptor.php | 64 + .../protobuf/src/Google/Protobuf/Option.php | 136 + .../src/Google/Protobuf/SourceContext.php | 72 + .../src/Google/Protobuf/StringValue.php | 68 + .../protobuf/src/Google/Protobuf/Struct.php | 73 + .../protobuf/src/Google/Protobuf/Syntax.php | 54 + .../src/Google/Protobuf/Timestamp.php | 186 + .../protobuf/src/Google/Protobuf/Type.php | 247 + .../src/Google/Protobuf/UInt32Value.php | 68 + .../src/Google/Protobuf/UInt64Value.php | 68 + .../protobuf/src/Google/Protobuf/Value.php | 244 + .../google/protobuf/src/phpdoc.dist.xml | 15 + lib/Google/vendor/grpc/grpc/LICENSE | 201 + lib/Google/vendor/grpc/grpc/MAINTAINERS.md | 16 + lib/Google/vendor/grpc/grpc/README.md | 9 + lib/Google/vendor/grpc/grpc/composer.json | 24 + lib/Google/vendor/grpc/grpc/etc/roots.pem | 4337 +++++++ .../vendor/grpc/grpc/src/lib/AbstractCall.php | 147 + .../vendor/grpc/grpc/src/lib/BaseStub.php | 618 + .../grpc/grpc/src/lib/BidiStreamingCall.php | 105 + .../vendor/grpc/grpc/src/lib/CallInvoker.php | 32 + .../grpc/grpc/src/lib/ClientStreamingCall.php | 80 + .../grpc/grpc/src/lib/DefaultCallInvoker.php | 46 + .../vendor/grpc/grpc/src/lib/Interceptor.php | 91 + .../src/lib/Internal/InterceptorChannel.php | 76 + .../grpc/grpc/src/lib/MethodDescriptor.php | 52 + .../vendor/grpc/grpc/src/lib/RpcServer.php | 151 + .../grpc/grpc/src/lib/ServerCallReader.php | 52 + .../grpc/grpc/src/lib/ServerCallWriter.php | 109 + .../grpc/grpc/src/lib/ServerContext.php | 76 + .../grpc/grpc/src/lib/ServerStreamingCall.php | 100 + .../vendor/grpc/grpc/src/lib/Status.php | 55 + .../vendor/grpc/grpc/src/lib/UnaryCall.php | 85 + .../vendor/monolog/monolog/CHANGELOG.md | 4 + .../vendor/monolog/monolog/composer.json | 4 +- .../monolog/src/Monolog/DateTimeImmutable.php | 2 + .../src/Monolog/Handler/FilterHandler.php | 2 +- .../Monolog/Handler/FingersCrossedHandler.php | 2 +- .../src/Monolog/Handler/SamplingHandler.php | 2 +- .../src/Monolog/Handler/Slack/SlackRecord.php | 2 +- .../Monolog/Handler/TelegramBotHandler.php | 12 +- .../monolog/monolog/src/Monolog/Logger.php | 2 +- .../src/Monolog/Processor/WebProcessor.php | 2 +- .../constant_time_encoding/README.md | 12 +- .../constant_time_encoding/composer.json | 6 +- .../constant_time_encoding/src/Base32.php | 56 +- .../constant_time_encoding/src/Base64.php | 43 +- .../constant_time_encoding/src/Binary.php | 9 +- .../constant_time_encoding/src/Encoding.php | 108 +- .../constant_time_encoding/src/Hex.php | 13 +- .../constant_time_encoding/src/RFC4648.php | 62 +- .../vendor/phpseclib/phpseclib/BACKERS.md | 3 +- .../vendor/phpseclib/phpseclib/composer.json | 2 +- .../phpseclib/phpseclib/Crypt/Blowfish.php | 297 +- .../Crypt/Common/Formats/Keys/OpenSSH.php | 8 +- .../phpseclib/Crypt/EC/Formats/Keys/PKCS8.php | 14 +- .../InvalidPacketLengthException.php | 10 + .../Engines/BCMath/Reductions/Barrett.php | 2 +- .../Engines/PHP/Reductions/Barrett.php | 2 +- .../Engines/PHP/Reductions/EvalBarrett.php | 2 +- .../phpseclib/phpseclib/Net/SFTP.php | 19 +- .../phpseclib/phpseclib/Net/SSH2.php | 507 +- .../psr/cache/src/CacheItemInterface.php | 12 +- .../psr/cache/src/CacheItemPoolInterface.php | 22 +- .../vendor/psr/http-factory/composer.json | 7 +- .../src/UploadedFileFactoryInterface.php | 12 +- lib/Google/vendor/ramsey/uuid/composer.json | 2 +- .../uuid/src/Math/BrickMathCalculator.php | 6 +- .../vendor/rize/uri-template/.gitattributes | 1 - .../rize/uri-template/.github/FUNDING.yml | 3 - .../uri-template/.github/workflows/ci.yml | 52 - .../vendor/rize/uri-template/.gitignore | 3 - .../Resources/stubs/CURLStringFile.php | 2 +- .../symfony/polyfill-php81/composer.json | 3 - .../batch/class-batch-task-manager.php | 14 +- lib/classes/batch/class-migration.php | 9 + lib/classes/class-addons.php | 92 +- lib/classes/class-api.php | 9 +- lib/classes/class-bootstrap.php | 37 +- lib/classes/class-db.php | 255 +- lib/classes/class-google-app-engine.php | 6 + lib/classes/class-migrator.php | 64 +- lib/classes/class-module.php | 20 - lib/classes/class-sync-non-media.php | 147 +- lib/classes/class-upgrader.php | 45 +- lib/classes/class-utility.php | 26 + lib/classes/compatibility/buddypress.php | 173 +- lib/classes/compatibility/divi.php | 67 - .../compatibility/gravity-forms-signature.php | 140 - lib/classes/compatibility/gravity-forms.php | 298 - lib/classes/compatibility/imagify.php | 2 +- lib/classes/compatibility/siteorigin-css.php | 185 +- .../siteorigin-widget-bundle.php | 147 +- lib/classes/compatibility/woocommerce.php | 51 - lib/classes/compatibility/wpforms.php | 490 +- .../status/class-info-google_cloud.php | 125 + lib/classes/status/class-info-stateless.php | 33 +- lib/classes/status/class-info.php | 64 +- lib/classes/status/class-migrations.php | 48 +- lib/classes/sync/class-non-library-sync.php | 6 +- lib/cli/class-sm-cli-command.php | 162 +- lib/cli/class-sm-cli-process.php | 2 +- lib/meta-box-tabs/meta-box-tabs.php | 10 +- .../classes/wp-async-request.php | 2 +- .../classes/wp-background-process.php | 93 +- readme.md | 6 +- readme.txt | 39 +- static/data/addons.php | 48 +- static/migrations/20240219175240.php | 17 - static/migrations/20240423174109.php | 141 + static/scripts/wp-stateless-batch.js | 166 +- static/scripts/wp-stateless.js | 4 +- static/styles/wp-stateless-status.css | 119 +- static/views/addons-tab.php | 28 +- static/views/settings-sections/file-url.php | 2 +- static/views/settings_interface.php | 17 +- static/views/status-sections/migrations.php | 35 +- vendor/composer/autoload_classmap.php | 5 +- vendor/composer/autoload_static.php | 5 +- vendor/composer/installed.json | 86 +- vendor/composer/installed.php | 34 +- .../workflows/continuous-integration.yml | 21 +- .../installers/.github/workflows/lint.yml | 7 +- .../installers/.github/workflows/phpstan.yml | 9 +- vendor/composer/installers/composer.json | 33 +- vendor/composer/installers/phpstan.neon.dist | 10 - .../src/Composer/Installers/AglInstaller.php | 12 +- .../Composer/Installers/AimeosInstaller.php | 9 - .../Installers/AkauntingInstaller.php | 23 + .../Installers/AnnotateCmsInstaller.php | 2 + .../Composer/Installers/AsgardInstaller.php | 21 +- .../Composer/Installers/AttogramInstaller.php | 2 + .../src/Composer/Installers/BaseInstaller.php | 56 +- .../Composer/Installers/BitrixInstaller.php | 23 +- .../Composer/Installers/BonefishInstaller.php | 2 + .../Composer/Installers/BotbleInstaller.php | 12 + .../Composer/Installers/CakePHPInstaller.php | 19 +- .../src/Composer/Installers/ChefInstaller.php | 3 +- .../Composer/Installers/CiviCrmInstaller.php | 2 + .../Installers/ClanCatsFrameworkInstaller.php | 12 +- .../Composer/Installers/CockpitInstaller.php | 14 +- .../Installers/CodeIgniterInstaller.php | 2 + .../Installers/Concrete5Installer.php | 2 + .../Installers/ConcreteCMSInstaller.php | 15 + .../Composer/Installers/CraftInstaller.php | 35 - .../Composer/Installers/CroogoInstaller.php | 4 +- .../Composer/Installers/DecibelInstaller.php | 2 + .../Composer/Installers/DframeInstaller.php | 1 + .../Composer/Installers/DokuWikiInstaller.php | 31 +- .../Composer/Installers/DolibarrInstaller.php | 2 + .../Composer/Installers/DrupalInstaller.php | 3 + .../src/Composer/Installers/ElggInstaller.php | 2 + .../Composer/Installers/EliasisInstaller.php | 2 + .../Installers/ExpressionEngineInstaller.php | 18 +- .../Installers/EzPlatformInstaller.php | 2 + .../Composer/Installers/ForkCMSInstaller.php | 58 + .../src/Composer/Installers/FuelInstaller.php | 2 + .../Composer/Installers/FuelphpInstaller.php | 2 + .../src/Composer/Installers/GravInstaller.php | 11 +- .../Composer/Installers/HuradInstaller.php | 6 +- .../Composer/Installers/ImageCMSInstaller.php | 2 + .../src/Composer/Installers/Installer.php | 92 +- .../src/Composer/Installers/ItopInstaller.php | 2 + .../Composer/Installers/JoomlaInstaller.php | 15 - .../Composer/Installers/KanboardInstaller.php | 2 + .../Composer/Installers/KirbyInstaller.php | 11 - .../Composer/Installers/KnownInstaller.php | 2 + .../Composer/Installers/KodiCMSInstaller.php | 4 +- .../Composer/Installers/KohanaInstaller.php | 2 + .../LanManagementSystemInstaller.php | 6 +- .../Composer/Installers/LaravelInstaller.php | 2 + .../Composer/Installers/LavaLiteInstaller.php | 2 + .../Composer/Installers/LithiumInstaller.php | 2 + .../Installers/MODULEWorkInstaller.php | 2 + .../Composer/Installers/MODXEvoInstaller.php | 2 + .../Composer/Installers/MagentoInstaller.php | 2 + .../Composer/Installers/MajimaInstaller.php | 21 +- .../src/Composer/Installers/MakoInstaller.php | 2 + .../Composer/Installers/MantisBTInstaller.php | 6 +- ...mcoreInstaller.php => MatomoInstaller.php} | 13 +- .../Composer/Installers/MauticInstaller.php | 15 +- .../src/Composer/Installers/MayaInstaller.php | 13 +- .../Installers/MediaWikiInstaller.php | 23 +- .../Composer/Installers/MiaoxingInstaller.php | 1 + .../Installers/MicroweberInstaller.php | 86 +- .../src/Composer/Installers/ModxInstaller.php | 2 + .../Composer/Installers/MoodleInstaller.php | 14 + .../Composer/Installers/OctoberInstaller.php | 25 +- .../Composer/Installers/OntoWikiInstaller.php | 10 +- .../Composer/Installers/OsclassInstaller.php | 6 +- .../src/Composer/Installers/OxidInstaller.php | 78 +- .../src/Composer/Installers/PPIInstaller.php | 2 + .../Composer/Installers/PhiftyInstaller.php | 2 + .../Composer/Installers/PhpBBInstaller.php | 2 + .../Composer/Installers/PiwikInstaller.php | 12 +- .../Installers/PlentymarketsInstaller.php | 17 +- .../src/Composer/Installers/Plugin.php | 7 +- .../Composer/Installers/PortoInstaller.php | 2 + .../Installers/PrestashopInstaller.php | 2 + .../Installers/ProcessWireInstaller.php | 5 +- .../Composer/Installers/PuppetInstaller.php | 1 + .../Composer/Installers/PxcmsInstaller.php | 23 +- .../Composer/Installers/RadPHPInstaller.php | 6 +- .../Composer/Installers/ReIndexInstaller.php | 2 + .../Composer/Installers/Redaxo5Installer.php | 2 + .../Composer/Installers/RedaxoInstaller.php | 2 + .../Installers/RoundcubeInstaller.php | 7 +- .../src/Composer/Installers/SMFInstaller.php | 2 + .../Composer/Installers/ShopwareInstaller.php | 26 +- .../Installers/SilverStripeInstaller.php | 8 +- .../Installers/SiteDirectInstaller.php | 13 +- .../Composer/Installers/StarbugInstaller.php | 2 + .../Composer/Installers/SyDESInstaller.php | 22 +- .../Composer/Installers/SyliusInstaller.php | 2 + .../Composer/Installers/Symfony1Installer.php | 26 - .../Composer/Installers/TYPO3CmsInstaller.php | 16 - .../Installers/TYPO3FlowInstaller.php | 38 - .../src/Composer/Installers/TaoInstaller.php | 4 +- .../Installers/TastyIgniterInstaller.php | 67 +- .../Composer/Installers/TheliaInstaller.php | 2 + .../src/Composer/Installers/TuskInstaller.php | 29 +- .../Installers/UserFrostingInstaller.php | 2 + .../Composer/Installers/VanillaInstaller.php | 2 + .../Composer/Installers/VgmcpInstaller.php | 20 +- .../Composer/Installers/WHMCSInstaller.php | 1 + .../Composer/Installers/WinterInstaller.php | 31 +- .../Composer/Installers/WolfCMSInstaller.php | 2 + .../Installers/WordPressInstaller.php | 2 + .../Composer/Installers/YawikInstaller.php | 17 +- .../src/Composer/Installers/ZendInstaller.php | 2 + .../Composer/Installers/ZikulaInstaller.php | 2 + vendor/composer/installers/src/bootstrap.php | 7 +- vendor/composer/platform_check.php | 4 +- vendor/firebase/php-jwt/CHANGELOG.md | 15 + vendor/firebase/php-jwt/README.md | 2 +- vendor/firebase/php-jwt/composer.json | 6 +- vendor/firebase/php-jwt/src/CachedKeySet.php | 14 +- vendor/firebase/php-jwt/src/JWT.php | 12 +- vendor/wpmetabox/meta-box/css/icon.css | 14 + vendor/wpmetabox/meta-box/css/input.css | 3 +- vendor/wpmetabox/meta-box/css/modal.css | 18 + vendor/wpmetabox/meta-box/css/style.css | 4 + vendor/wpmetabox/meta-box/css/upload.css | 55 +- vendor/wpmetabox/meta-box/inc/about/about.php | 5 +- .../meta-box/inc/about/dashboard.php | 90 - .../inc/about/sections/extensions.php | 22 +- .../inc/about/sections/getting-started.php | 14 +- .../meta-box/inc/about/sections/support.php | 4 +- .../meta-box/inc/about/sections/upgrade.php | 2 +- .../meta-box/inc/about/sections/welcome.php | 6 +- vendor/wpmetabox/meta-box/inc/clone.php | 15 +- vendor/wpmetabox/meta-box/inc/field.php | 102 +- .../meta-box/inc/fields/autocomplete.php | 8 +- .../meta-box/inc/fields/background.php | 1 + .../meta-box/inc/fields/button-group.php | 1 + .../wpmetabox/meta-box/inc/fields/color.php | 1 + .../meta-box/inc/fields/datetime.php | 10 + .../wpmetabox/meta-box/inc/fields/divider.php | 1 + .../meta-box/inc/fields/fieldset-text.php | 5 + .../meta-box/inc/fields/file-input.php | 1 + .../meta-box/inc/fields/file-upload.php | 1 + vendor/wpmetabox/meta-box/inc/fields/file.php | 1 + .../wpmetabox/meta-box/inc/fields/heading.php | 1 + vendor/wpmetabox/meta-box/inc/fields/icon.php | 305 + .../meta-box/inc/fields/image-select.php | 1 + .../wpmetabox/meta-box/inc/fields/image.php | 1 + .../meta-box/inc/fields/input-list.php | 1 + .../wpmetabox/meta-box/inc/fields/input.php | 1 + .../meta-box/inc/fields/key-value.php | 1 + vendor/wpmetabox/meta-box/inc/fields/map.php | 44 +- .../wpmetabox/meta-box/inc/fields/media.php | 1 + .../meta-box/inc/fields/object-choice.php | 1 + .../wpmetabox/meta-box/inc/fields/oembed.php | 1 + vendor/wpmetabox/meta-box/inc/fields/osm.php | 45 +- vendor/wpmetabox/meta-box/inc/fields/post.php | 4 + .../wpmetabox/meta-box/inc/fields/range.php | 1 + .../meta-box/inc/fields/select-advanced.php | 3 + .../meta-box/inc/fields/select-tree.php | 1 + .../wpmetabox/meta-box/inc/fields/select.php | 1 + .../wpmetabox/meta-box/inc/fields/slider.php | 6 + .../wpmetabox/meta-box/inc/fields/switch.php | 1 + .../meta-box/inc/fields/taxonomy.php | 1 + .../meta-box/inc/fields/text-list.php | 1 + vendor/wpmetabox/meta-box/inc/fields/time.php | 10 +- vendor/wpmetabox/meta-box/inc/fields/user.php | 27 +- .../wpmetabox/meta-box/inc/fields/video.php | 1 + .../wpmetabox/meta-box/inc/fields/wysiwyg.php | 1 + vendor/wpmetabox/meta-box/inc/functions.php | 13 +- vendor/wpmetabox/meta-box/inc/loader.php | 17 +- vendor/wpmetabox/meta-box/inc/media-modal.php | 7 +- vendor/wpmetabox/meta-box/inc/meta-box.php | 10 +- vendor/wpmetabox/meta-box/inc/sanitizer.php | 2 +- vendor/wpmetabox/meta-box/inc/shortcode.php | 44 + .../meta-box/inc/templates/media.php | 6 + vendor/wpmetabox/meta-box/inc/validation.php | 32 +- vendor/wpmetabox/meta-box/js/clone.js | 41 +- vendor/wpmetabox/meta-box/js/date.js | 6 + vendor/wpmetabox/meta-box/js/datetime.js | 6 + vendor/wpmetabox/meta-box/js/file-upload.js | 75 +- vendor/wpmetabox/meta-box/js/icon.js | 27 + vendor/wpmetabox/meta-box/js/input-list.js | 2 +- vendor/wpmetabox/meta-box/js/modal.js | 46 +- vendor/wpmetabox/meta-box/js/notification.js | 16 - vendor/wpmetabox/meta-box/js/post.js | 45 +- .../wpmetabox/meta-box/js/select-advanced.js | 14 +- vendor/wpmetabox/meta-box/js/taxonomy.js | 7 +- vendor/wpmetabox/meta-box/js/time.js | 28 +- vendor/wpmetabox/meta-box/js/user.js | 3 +- vendor/wpmetabox/meta-box/meta-box.php | 2 +- vendor/wpmetabox/meta-box/phpunit.xml | 8 + vendor/wpmetabox/meta-box/readme.txt | 601 +- .../Register.php => Integrations/Block.php} | 4 +- .../Register.php => Integrations/Bricks.php} | 4 +- .../Elementor.php} | 4 +- .../Register.php => Integrations/Oxygen.php} | 4 +- vendor/wpmetabox/meta-box/src/Support/Arr.php | 34 + .../meta-box/src/Updater/Notification.php | 51 +- .../meta-box/src/Updater/Settings.php | 8 +- wp-stateless-media.php | 2 +- 932 files changed, 94077 insertions(+), 10108 deletions(-) create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/BucketHierarchicalNamespace.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayout.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutCustomPlacementConfig.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutHierarchicalNamespace.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/Folder.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/FolderPendingRenameInfo.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/Folders.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCaches.php create mode 100644 lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Folders.php create mode 100644 lib/Google/vendor/google/auth/VERSION create mode 100644 lib/Google/vendor/google/auth/src/CredentialSource/ExecutableSource.php create mode 100644 lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableHandler.php create mode 100644 lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableResponseError.php create mode 100644 lib/Google/vendor/google/auth/src/MetricsTrait.php delete mode 100644 lib/Google/vendor/google/cloud-core/.repo-metadata.json create mode 100644 lib/Google/vendor/google/cloud-core/src/ApiHelperTrait.php create mode 100644 lib/Google/vendor/google/cloud-core/src/DetectProjectIdTrait.php create mode 100644 lib/Google/vendor/google/cloud-core/src/Iam/IamManager.php create mode 100644 lib/Google/vendor/google/cloud-core/src/RequestHandler.php create mode 100644 lib/Google/vendor/google/cloud-core/src/RequestProcessorTrait.php delete mode 100644 lib/Google/vendor/google/cloud-storage/.repo-metadata.json create mode 100644 lib/Google/vendor/google/common-protos/CHANGELOG.md create mode 100644 lib/Google/vendor/google/common-protos/CODE_OF_CONDUCT.md create mode 100644 lib/Google/vendor/google/common-protos/CONTRIBUTING.md create mode 100644 lib/Google/vendor/google/common-protos/LICENSE create mode 100644 lib/Google/vendor/google/common-protos/README.md create mode 100644 lib/Google/vendor/google/common-protos/SECURITY.md create mode 100644 lib/Google/vendor/google/common-protos/composer.json create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Annotations.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Auth.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Backend.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Billing.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Client.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/ConfigChange.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Consumer.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Context.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Control.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Distribution.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Documentation.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Endpoint.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/ErrorReason.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/FieldBehavior.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/FieldInfo.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Http.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Httpbody.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Label.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/LaunchStage.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Log.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Logging.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Metric.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/MonitoredResource.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Monitoring.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Policy.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Quota.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Resource.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Routing.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Service.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/SourceInfo.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/SystemParameter.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Usage.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Api/Visibility.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Cloud/ExtendedOperations.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Cloud/Location/Locations.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Iam/V1/IamPolicy.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Iam/V1/Logging/AuditData.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Iam/V1/Options.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Iam/V1/Policy.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Logging/Type/HttpRequest.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Logging/Type/LogSeverity.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Rpc/Code.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AttributeContext.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AuditContext.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Rpc/ErrorDetails.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Rpc/Status.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/CalendarPeriod.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Color.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Date.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Datetime.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Dayofweek.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Decimal.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Expr.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Fraction.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Interval.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Latlng.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/LocalizedText.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Money.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Month.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/PhoneNumber.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/PostalAddress.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Quaternion.php create mode 100644 lib/Google/vendor/google/common-protos/metadata/Type/Timeofday.php create mode 100644 lib/Google/vendor/google/common-protos/renovate.json create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Advice.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/AuthProvider.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/AuthRequirement.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Authentication.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/AuthenticationRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Backend.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/BackendRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/BackendRule/PathTranslation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Billing.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Billing/BillingDestination.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ChangeType.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ClientLibraryDestination.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ClientLibraryOrganization.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ClientLibrarySettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/CommonLanguageSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ConfigChange.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Context.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ContextRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Control.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/CppSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/CustomHttpPattern.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Explicit.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Exponential.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Linear.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/Exemplar.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Distribution/Range.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Documentation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/DocumentationRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/DotnetSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Endpoint.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ErrorReason.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/FieldBehavior.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/FieldInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/FieldInfo/Format.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/FieldPolicy.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/GoSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Http.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/HttpBody.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/HttpRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/JavaSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/JwtLocation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor/ValueType.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/LaunchStage.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/LogDescriptor.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Logging.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Logging/LoggingDestination.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MethodPolicy.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MethodSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MethodSettings/LongRunning.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Metric.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricDescriptorMetadata.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricKind.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/ValueType.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MetricRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MonitoredResource.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceDescriptor.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceMetadata.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Monitoring.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Monitoring/MonitoringDestination.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/NodeSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/OAuthRequirements.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Page.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/PhpSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ProjectProperties.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Property.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Property/PropertyType.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Publishing.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/PythonSettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Quota.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/QuotaLimit.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/History.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/Style.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/ResourceReference.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/RoutingParameter.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/RoutingRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/RubySettings.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Service.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/SourceInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/SystemParameter.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/SystemParameterRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/SystemParameters.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/TypeReference.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Usage.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/UsageRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/Visibility.php create mode 100644 lib/Google/vendor/google/common-protos/src/Api/VisibilityRule.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfig.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta/Action.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig/LogType.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Binding.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta/Action.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetIamPolicyRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetPolicyOptions.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Policy.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/PolicyDelta.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/SetIamPolicyRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsResponse.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Location/GetLocationRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsResponse.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Location/Location.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/HttpRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/LogSeverity.php create mode 100644 lib/Google/vendor/google/common-protos/src/Cloud/OperationResponseMapping.php create mode 100644 lib/Google/vendor/google/common-protos/src/Iam/V1/Logging/AuditData.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/BadRequest.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/BadRequest/FieldViolation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Code.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Api.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Auth.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Peer.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Request.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Resource.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Response.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Context/AuditContext.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/DebugInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/ErrorInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Help.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Help/Link.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/LocalizedMessage.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure/Violation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure/Violation.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/RequestInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/ResourceInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/RetryInfo.php create mode 100644 lib/Google/vendor/google/common-protos/src/Rpc/Status.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/CalendarPeriod.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Color.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Date.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/DateTime.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/DayOfWeek.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Decimal.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Expr.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Fraction.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Interval.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/LatLng.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/LocalizedText.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Money.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Month.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/PhoneNumber.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/PhoneNumber/ShortCode.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/PostalAddress.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/Quaternion.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/TimeOfDay.php create mode 100644 lib/Google/vendor/google/common-protos/src/Type/TimeZone.php create mode 100644 lib/Google/vendor/google/gax/CHANGELOG.md create mode 100644 lib/Google/vendor/google/gax/CODE_OF_CONDUCT.md create mode 100644 lib/Google/vendor/google/gax/LICENSE create mode 100644 lib/Google/vendor/google/gax/README.md create mode 100644 lib/Google/vendor/google/gax/SECURITY.md create mode 100644 lib/Google/vendor/google/gax/VERSION create mode 100644 lib/Google/vendor/google/gax/composer.json create mode 100644 lib/Google/vendor/google/gax/metadata/ApiCore/Testing/Mocks.php create mode 100644 lib/Google/vendor/google/gax/metadata/Google/ApiCore/Tests/Unit/Example.php create mode 100644 lib/Google/vendor/google/gax/metadata/README.md create mode 100644 lib/Google/vendor/google/gax/phpstan.neon.dist create mode 100644 lib/Google/vendor/google/gax/phpunit.xml.dist create mode 100644 lib/Google/vendor/google/gax/renovate.json create mode 100644 lib/Google/vendor/google/gax/src/AgentHeader.php create mode 100644 lib/Google/vendor/google/gax/src/ApiException.php create mode 100644 lib/Google/vendor/google/gax/src/ApiStatus.php create mode 100644 lib/Google/vendor/google/gax/src/ArrayTrait.php create mode 100644 lib/Google/vendor/google/gax/src/BidiStream.php create mode 100644 lib/Google/vendor/google/gax/src/Call.php create mode 100644 lib/Google/vendor/google/gax/src/ClientOptionsTrait.php create mode 100644 lib/Google/vendor/google/gax/src/ClientStream.php create mode 100644 lib/Google/vendor/google/gax/src/CredentialsWrapper.php create mode 100644 lib/Google/vendor/google/gax/src/FixedSizeCollection.php create mode 100644 lib/Google/vendor/google/gax/src/GPBLabel.php create mode 100644 lib/Google/vendor/google/gax/src/GPBType.php create mode 100644 lib/Google/vendor/google/gax/src/GapicClientTrait.php create mode 100644 lib/Google/vendor/google/gax/src/GrpcSupportTrait.php create mode 100644 lib/Google/vendor/google/gax/src/InsecureCredentialsWrapper.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/CredentialsWrapperMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/FixedHeaderMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/MiddlewareInterface.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/OperationsMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/OptionsFilterMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/PagedMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/RequestAutoPopulationMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/ResponseMetadataMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/Middleware/RetryMiddleware.php create mode 100644 lib/Google/vendor/google/gax/src/OperationResponse.php create mode 100644 lib/Google/vendor/google/gax/src/Options/CallOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Options/ClientOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Options/OptionsTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Options/TransportOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcFallbackTransportOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcTransportOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Options/TransportOptions/RestTransportOptions.php create mode 100644 lib/Google/vendor/google/gax/src/Page.php create mode 100644 lib/Google/vendor/google/gax/src/PageStreamingDescriptor.php create mode 100644 lib/Google/vendor/google/gax/src/PagedListResponse.php create mode 100644 lib/Google/vendor/google/gax/src/PathTemplate.php create mode 100644 lib/Google/vendor/google/gax/src/PollingTrait.php create mode 100644 lib/Google/vendor/google/gax/src/RequestBuilder.php create mode 100644 lib/Google/vendor/google/gax/src/RequestParamsHeaderDescriptor.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceHelperTrait.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceTemplate/AbsoluteResourceTemplate.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceTemplate/Parser.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceTemplate/RelativeResourceTemplate.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceTemplate/ResourceTemplateInterface.php create mode 100644 lib/Google/vendor/google/gax/src/ResourceTemplate/Segment.php create mode 100644 lib/Google/vendor/google/gax/src/RetrySettings.php create mode 100644 lib/Google/vendor/google/gax/src/Serializer.php create mode 100644 lib/Google/vendor/google/gax/src/ServerStream.php create mode 100644 lib/Google/vendor/google/gax/src/ServerStreamingCallInterface.php create mode 100644 lib/Google/vendor/google/gax/src/ServiceAddressTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/GeneratedTest.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MessageAwareArrayComparator.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MessageAwareExporter.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockBidiStreamingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockClientStreamingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockGrpcTransport.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockRequest.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockRequestBody.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockResponse.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockServerStreamingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockStatus.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockStubTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockTransport.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/MockUnaryCall.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/ProtobufGPBEmptyComparator.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/ProtobufMessageComparator.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/ReceivedRequest.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/SerializationTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Testing/mocks.proto create mode 100644 lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingServerStreamingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingUnaryCall.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Grpc/ServerStreamingCallWrapper.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Grpc/UnaryInterceptorInterface.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/GrpcFallbackTransport.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/GrpcTransport.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/HttpUnaryTransportTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Rest/JsonStreamDecoder.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/Rest/RestServerStreamingCall.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/RestTransport.php create mode 100644 lib/Google/vendor/google/gax/src/Transport/TransportInterface.php create mode 100644 lib/Google/vendor/google/gax/src/UriTrait.php create mode 100644 lib/Google/vendor/google/gax/src/ValidationException.php create mode 100644 lib/Google/vendor/google/gax/src/ValidationTrait.php create mode 100644 lib/Google/vendor/google/gax/src/Version.php create mode 100644 lib/Google/vendor/google/grpc-gcp/.github/release-please.yml create mode 100644 lib/Google/vendor/google/grpc-gcp/.github/workflows/tests.yml create mode 100644 lib/Google/vendor/google/grpc-gcp/.gitmodules create mode 100644 lib/Google/vendor/google/grpc-gcp/.php_cs.dist create mode 100644 lib/Google/vendor/google/grpc-gcp/LICENSE create mode 100644 lib/Google/vendor/google/grpc-gcp/README.md create mode 100755 lib/Google/vendor/google/grpc-gcp/cloudprober/bins/opt/grpc_php_plugin create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/cloudprober.cfg create mode 100755 lib/Google/vendor/google/grpc-gcp/cloudprober/codegen.sh create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/composer.json create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/grpc_gpc_prober/firestore_probes.php create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/grpc_gpc_prober/prober.php create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/grpc_gpc_prober/spanner_probes.php create mode 100644 lib/Google/vendor/google/grpc-gcp/cloudprober/grpc_gpc_prober/stackdriver_util.php create mode 100644 lib/Google/vendor/google/grpc-gcp/composer.json create mode 100644 lib/Google/vendor/google/grpc-gcp/doc/gRPC-client-user-guide.md create mode 100644 lib/Google/vendor/google/grpc-gcp/src/ChannelRef.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/Config.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/CreatedByDeserializeCheck.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GCPBidiStreamingCall.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GCPCallInvoker.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GCPClientStreamCall.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GCPServerStreamCall.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GCPUnaryCall.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GcpBaseCall.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/GcpExtensionChannel.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/GPBMetadata/GrpcGcp.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig_Command.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/Grpc/Gcp/ApiConfig.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/Grpc/Gcp/ChannelPoolConfig.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/generated/Grpc/Gcp/MethodConfig.php create mode 100644 lib/Google/vendor/google/grpc-gcp/src/grpc_gcp.proto create mode 100644 lib/Google/vendor/google/longrunning/.gitattributes create mode 100644 lib/Google/vendor/google/longrunning/CODE_OF_CONDUCT.md create mode 100644 lib/Google/vendor/google/longrunning/CONTRIBUTING.md create mode 100644 lib/Google/vendor/google/longrunning/LICENSE create mode 100644 lib/Google/vendor/google/longrunning/README.md create mode 100644 lib/Google/vendor/google/longrunning/SECURITY.md create mode 100644 lib/Google/vendor/google/longrunning/VERSION create mode 100644 lib/Google/vendor/google/longrunning/composer.json create mode 100644 lib/Google/vendor/google/longrunning/metadata/Longrunning/Operations.php create mode 100644 lib/Google/vendor/google/longrunning/metadata/README.md create mode 100644 lib/Google/vendor/google/longrunning/src/ApiCore/LongRunning/Gapic/OperationsGapicClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/ApiCore/LongRunning/OperationsClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/CancelOperationRequest.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/Client/OperationsClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/DeleteOperationRequest.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/Gapic/OperationsGapicClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/GetOperationRequest.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/ListOperationsRequest.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/ListOperationsResponse.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/Operation.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/OperationInfo.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/OperationsClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/OperationsGrpcClient.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/WaitOperationRequest.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/resources/operations_client_config.json create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/resources/operations_descriptor_config.php create mode 100644 lib/Google/vendor/google/longrunning/src/LongRunning/resources/operations_rest_client_config.php create mode 100644 lib/Google/vendor/google/protobuf/LICENSE create mode 100644 lib/Google/vendor/google/protobuf/README.md create mode 100644 lib/Google/vendor/google/protobuf/composer.json create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Any.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Api.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Duration.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/FieldMask.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/GPBEmpty.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Internal/Descriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/SourceContext.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Struct.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Timestamp.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Type.php create mode 100644 lib/Google/vendor/google/protobuf/src/GPBMetadata/Google/Protobuf/Wrappers.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Any.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Api.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/BoolValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/BytesValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Descriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/DescriptorPool.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/DoubleValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Duration.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Enum.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/EnumDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/EnumValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/EnumValueDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Field.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Field/Cardinality.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Field/Kind.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/FieldDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/FieldMask.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Field_Cardinality.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Field_Kind.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/FloatValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/GPBEmpty.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Int32Value.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Int64Value.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/AnyBase.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedInputStream.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/CodedOutputStream.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/Descriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorPool.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorProto/ExtensionRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorProto/ReservedRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorProto_ExtensionRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/DescriptorProto_ReservedRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumBuilderContext.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumDescriptorProto/EnumReservedRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumDescriptorProto_EnumReservedRange.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumValueDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/EnumValueOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/ExtensionRangeOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptorProto/Label.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptorProto/Type.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptorProto_Label.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldDescriptorProto_Type.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldOptions/CType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldOptions/JSType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldOptions_CType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FieldOptions_JSType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileDescriptorSet.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileOptions/OptimizeMode.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/FileOptions_OptimizeMode.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBDecodeException.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBJsonWire.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBLabel.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBUtil.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBWire.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GPBWireType.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GeneratedCodeInfo.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GeneratedCodeInfo/Annotation.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GeneratedCodeInfo_Annotation.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/GetPublicDescriptorTrait.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/HasPublicDescriptorTrait.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MapEntry.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MapField.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MapFieldIter.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/Message.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MessageBuilderContext.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MessageOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MethodDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MethodOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MethodOptions/IdempotencyLevel.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/MethodOptions_IdempotencyLevel.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/OneofDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/OneofDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/OneofField.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/OneofOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/RawInputStream.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/RepeatedField.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/RepeatedFieldIter.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/ServiceDescriptorProto.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/ServiceOptions.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/SourceCodeInfo.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/SourceCodeInfo/Location.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/SourceCodeInfo_Location.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/TimestampBase.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/UninterpretedOption.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/UninterpretedOption/NamePart.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Internal/UninterpretedOption_NamePart.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/ListValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Method.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Mixin.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/NullValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/OneofDescriptor.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Option.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/SourceContext.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/StringValue.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Struct.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Syntax.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Timestamp.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Type.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/UInt32Value.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/UInt64Value.php create mode 100644 lib/Google/vendor/google/protobuf/src/Google/Protobuf/Value.php create mode 100644 lib/Google/vendor/google/protobuf/src/phpdoc.dist.xml create mode 100644 lib/Google/vendor/grpc/grpc/LICENSE create mode 100644 lib/Google/vendor/grpc/grpc/MAINTAINERS.md create mode 100644 lib/Google/vendor/grpc/grpc/README.md create mode 100644 lib/Google/vendor/grpc/grpc/composer.json create mode 100644 lib/Google/vendor/grpc/grpc/etc/roots.pem create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/AbstractCall.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/BaseStub.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/BidiStreamingCall.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/CallInvoker.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/ClientStreamingCall.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/DefaultCallInvoker.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/Interceptor.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/Internal/InterceptorChannel.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/MethodDescriptor.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/RpcServer.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/ServerCallReader.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/ServerCallWriter.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/ServerContext.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/ServerStreamingCall.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/Status.php create mode 100644 lib/Google/vendor/grpc/grpc/src/lib/UnaryCall.php create mode 100644 lib/Google/vendor/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php delete mode 100644 lib/Google/vendor/rize/uri-template/.gitattributes delete mode 100644 lib/Google/vendor/rize/uri-template/.github/FUNDING.yml delete mode 100644 lib/Google/vendor/rize/uri-template/.github/workflows/ci.yml delete mode 100644 lib/Google/vendor/rize/uri-template/.gitignore delete mode 100644 lib/classes/compatibility/divi.php delete mode 100644 lib/classes/compatibility/gravity-forms-signature.php delete mode 100644 lib/classes/compatibility/gravity-forms.php delete mode 100644 lib/classes/compatibility/woocommerce.php create mode 100644 lib/classes/status/class-info-google_cloud.php create mode 100644 static/migrations/20240423174109.php delete mode 100644 vendor/composer/installers/phpstan.neon.dist delete mode 100644 vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php create mode 100644 vendor/composer/installers/src/Composer/Installers/AkauntingInstaller.php create mode 100644 vendor/composer/installers/src/Composer/Installers/BotbleInstaller.php create mode 100644 vendor/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php delete mode 100644 vendor/composer/installers/src/Composer/Installers/CraftInstaller.php create mode 100644 vendor/composer/installers/src/Composer/Installers/ForkCMSInstaller.php delete mode 100644 vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php delete mode 100644 vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php rename vendor/composer/installers/src/Composer/Installers/{PimcoreInstaller.php => MatomoInstaller.php} (53%) delete mode 100644 vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php delete mode 100644 vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php delete mode 100644 vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php create mode 100644 vendor/wpmetabox/meta-box/css/icon.css delete mode 100644 vendor/wpmetabox/meta-box/inc/about/dashboard.php create mode 100644 vendor/wpmetabox/meta-box/inc/fields/icon.php create mode 100644 vendor/wpmetabox/meta-box/js/icon.js delete mode 100644 vendor/wpmetabox/meta-box/js/notification.js create mode 100644 vendor/wpmetabox/meta-box/phpunit.xml rename vendor/wpmetabox/meta-box/src/{Block/Register.php => Integrations/Block.php} (87%) rename vendor/wpmetabox/meta-box/src/{Bricks/Register.php => Integrations/Bricks.php} (82%) rename vendor/wpmetabox/meta-box/src/{Elementor/Register.php => Integrations/Elementor.php} (87%) rename vendor/wpmetabox/meta-box/src/{Oxygen/Register.php => Integrations/Oxygen.php} (87%) diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml index cfc35252f..9ff0505c1 100644 --- a/.github/workflows/publish-release.yml +++ b/.github/workflows/publish-release.yml @@ -84,6 +84,8 @@ jobs: - name: Cleanup files run: | rm -f composer.lock || true + rm -rf tests || true + rm -rf vendor/bin || true rm -rf vendor/composer/installers || true find ./ -name '.git*' -not -path './.git' -type f -delete || true find ./ -name '.git*' -not -path './.git' -type d -exec rm -rf {} \; || true diff --git a/changelog.txt b/changelog.txt index 6a10de348..749a23433 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,28 @@ == Changelog == += 4.1.0 = +* NEW - move compatibilities files from `wp_sm_sync` to `wp_stateless_files` table with extended information. +* COMPATIBILITY - WooCommerce Compatibility replaced with [WP-Stateless – WooCommerce Addon](https://wordpress.org/plugins/wp-stateless-woocommerce-addon/). +* COMPATIBILITY - Gravity Forms Compatibility replaced with [WP-Stateless – Gravity Forms Addon](https://wordpress.org/plugins/wp-stateless-gravity-forms-addon/). +* COMPATIBILITY - Gravity Forms Signature Compatibility replaced with [WP-Stateless – Gravity Forms Signature Addon](https://wordpress.org/plugins/wp-stateless-gravity-forms-signature-addon/). +* COMPATIBILITY - Divi Theme Compatibility replaced with [WP-Stateless – Divi Theme Addon](https://wordpress.org/plugins/wp-stateless-divi-theme-addon/). +* ENHANCEMENT - CLI command `wp stateless migrate` supports `auto` parameter to run all required Data Optimizations automatically. +* ENHANCEMENT - Updated Client library for Google APIs from 2.15.1 to 2.17.0. +* ENHANCEMENT - updated `firebase/php-jwt` library from from 6.9.0 to 6.10.1. +* ENHANCEMENT - updated `wpmetabox/meta-box` library from from 5.8.2 to 5.10.1. +* ENHANCEMENT - updated `deliciousbrains/wp-background-processing` library from from 1.1.1 to 1.3.1. +* ENHANCEMENT - updated `composer/installers` library from from 1.12.1 to 2.3.0. +* ENHANCEMENT - updated `Meta Box Tabs` library from 1.1.17 to 1.1.18. +* ENHANCEMENT - action `sm:sync::addFile` format changed, now it passes media object instead of file name. +* ENHANCEMENT - for installed Addons replace Download action with Activate. +* ENHANCEMENT - count compatibility files from the DB instead of listing actual files to increase performance. +* FIX - CLI command `wp stateless migrate` supports `--yes` parameter to skip confirmation. +* FIX - CLI command `wp stateless migrate` correctly works with `--progress` parameter in multisite. +* FIX - fixed synchronization for Compatibility files in Stateless Mode. +* FIX - CLI command `wp stateless upgrade` fixed when running with `--b` switch. +* FIX - limit index size for compatibility with different DB engines [757](https://github.com/udx/wp-stateless/issues/757). +* FIX - correctly disable `Cache-Busting` setting for Ephemeral Mode [758](https://github.com/udx/wp-stateless/issues/758), credits [@Jessedev1](https://github.com/Jessedev1). +* FIX - Data Optimization UI adjustments. + = 4.0.4 = * ENHANCEMENT - display success message after copying Status Info. * FIX - `Settings` page does not open or slow when there is big amount of attachments. diff --git a/changes.md b/changes.md index 9fba88a35..cac1c144e 100644 --- a/changes.md +++ b/changes.md @@ -1,3 +1,27 @@ +#### 4.1.0 +* NEW - move compatibilities files from `wp_sm_sync` to `wp_stateless_files` table with extended information. +* COMPATIBILITY - WooCommerce Compatibility replaced with [WP-Stateless – WooCommerce Addon](https://wordpress.org/plugins/wp-stateless-woocommerce-addon/). +* COMPATIBILITY - Gravity Forms Compatibility replaced with [WP-Stateless – Gravity Forms Addon](https://wordpress.org/plugins/wp-stateless-gravity-forms-addon/). +* COMPATIBILITY - Gravity Forms Signature Compatibility replaced with [WP-Stateless – Gravity Forms Signature Addon](https://wordpress.org/plugins/wp-stateless-gravity-forms-signature-addon/). +* COMPATIBILITY - Divi Theme Compatibility replaced with [WP-Stateless – Divi Theme Addon](https://wordpress.org/plugins/wp-stateless-divi-theme-addon/). +* ENHANCEMENT - CLI command `wp stateless migrate` supports `auto` parameter to run all required Data Optimizations automatically. +* ENHANCEMENT - Updated Client library for Google APIs from 2.15.1 to 2.17.0. +* ENHANCEMENT - updated `firebase/php-jwt` library from from 6.9.0 to 6.10.1. +* ENHANCEMENT - updated `wpmetabox/meta-box` library from from 5.8.2 to 5.10.1. +* ENHANCEMENT - updated `deliciousbrains/wp-background-processing` library from from 1.1.1 to 1.3.1. +* ENHANCEMENT - updated `composer/installers` library from from 1.12.1 to 2.3.0. +* ENHANCEMENT - updated `Meta Box Tabs` library from 1.1.17 to 1.1.18. +* ENHANCEMENT - action `sm:sync::addFile` format changed, now it passes media object instead of file name. +* ENHANCEMENT - for installed Addons replace Download action with Activate. +* ENHANCEMENT - count compatibility files from the DB instead of listing actual files to increase performance. +* FIX - CLI command `wp stateless migrate` supports `--yes` parameter to skip confirmation. +* FIX - CLI command `wp stateless migrate` correctly works with `--progress` parameter in multisite. +* FIX - fixed synchronization for Compatibility files in Stateless Mode. +* FIX - CLI command `wp stateless upgrade` fixed when running with `--b` switch. +* FIX - limit index size for compatibility with different DB engines [757](https://github.com/udx/wp-stateless/issues/757). +* FIX - correctly disable `Cache-Busting` setting for Ephemeral Mode [758](https://github.com/udx/wp-stateless/issues/758), credits [@Jessedev1](https://github.com/Jessedev1). +* FIX - Data Optimization UI adjustments. + #### 4.0.4 * ENHANCEMENT - display success message after copying Status Info. * FIX - `Settings` page does not open or slow when there is big amount of attachments. diff --git a/composer.json b/composer.json index 06685b617..926de7cab 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ ], "require": { "php": ">=5.6.20", - "composer/installers": "~1.0", + "composer/installers": "~2.2", "ccampbell/chromephp": "^4.1", "firebase/php-jwt": "^6.1.2", "wpmetabox/meta-box": "^5.6.3", diff --git a/composer.lock b/composer.lock index 324e7223f..8b9aee833 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ee72847ceb6d6c1c588115004311ecb7", + "content-hash": "d4dc2a56ca8676c853b9b81d56944b35", "packages": [ { "name": "ccampbell/chromephp", @@ -55,39 +55,37 @@ }, { "name": "composer/installers", - "version": "v1.12.0", + "version": "v2.3.0", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", + "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "replace": { - "roundcube/plugin-installer": "*", - "shama/baton": "*" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "1.6.* || ^2.0", - "composer/semver": "^1 || ^3", - "phpstan/phpstan": "^0.12.55", - "phpstan/phpstan-phpunit": "^0.12.16", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.3" + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-phpunit": "^1", + "symfony/phpunit-bridge": "^7.1.1", + "symfony/process": "^5 || ^6 || ^7" }, "type": "composer-plugin", "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-main": "1.x-dev" - } + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true }, "autoload": { "psr-4": { @@ -108,7 +106,6 @@ "description": "A multi-framework Composer library installer", "homepage": "https://composer.github.io/installers/", "keywords": [ - "Craft", "Dolibarr", "Eliasis", "Hurad", @@ -129,7 +126,6 @@ "Whmcs", "WolfCMS", "agl", - "aimeos", "annotatecms", "attogram", "bitrix", @@ -138,6 +134,7 @@ "cockpit", "codeigniter", "concrete5", + "concreteCMS", "croogo", "dokuwiki", "drupal", @@ -148,7 +145,6 @@ "grav", "installer", "itop", - "joomla", "known", "kohana", "laravel", @@ -157,6 +153,7 @@ "magento", "majima", "mako", + "matomo", "mediawiki", "miaoxing", "modulework", @@ -176,9 +173,7 @@ "silverstripe", "sydes", "sylius", - "symfony", "tastyigniter", - "typo3", "wordpress", "yawik", "zend", @@ -186,7 +181,7 @@ ], "support": { "issues": "https://github.com/composer/installers/issues", - "source": "https://github.com/composer/installers/tree/v1.12.0" + "source": "https://github.com/composer/installers/tree/v2.3.0" }, "funding": [ { @@ -202,30 +197,30 @@ "type": "tidelift" } ], - "time": "2021-09-13T08:19:44+00:00" + "time": "2024-06-24T20:46:46+00:00" }, { "name": "firebase/php-jwt", - "version": "v6.9.0", + "version": "v6.10.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f03270e63eaccf3019ef0f32849c497385774e11", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -263,9 +258,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.9.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, - "time": "2023-10-05T00:24:42+00:00" + "time": "2024-05-18T18:05:11+00:00" }, { "name": "udx/lib-ud-api-client", @@ -345,18 +340,21 @@ }, { "name": "wpmetabox/meta-box", - "version": "5.8.2", + "version": "5.10.1", "source": { "type": "git", "url": "https://github.com/wpmetabox/meta-box.git", - "reference": "de583a74171bdee1b5213232a5bf50f82c6fee14" + "reference": "6f571c95c2928703509f60de09be9c3d6df8ce0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wpmetabox/meta-box/zipball/de583a74171bdee1b5213232a5bf50f82c6fee14", - "reference": "de583a74171bdee1b5213232a5bf50f82c6fee14", + "url": "https://api.github.com/repos/wpmetabox/meta-box/zipball/6f571c95c2928703509f60de09be9c3d6df8ce0a", + "reference": "6f571c95c2928703509f60de09be9c3d6df8ce0a", "shasum": "" }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, "type": "wordpress-plugin", "autoload": { "psr-4": { @@ -388,9 +386,9 @@ ], "support": { "issues": "https://github.com/wpmetabox/meta-box/issues", - "source": "https://github.com/wpmetabox/meta-box/tree/5.8.2" + "source": "https://github.com/wpmetabox/meta-box/tree/5.10.1" }, - "time": "2023-10-13T13:53:33+00:00" + "time": "2024-09-07T03:49:09+00:00" } ], "packages-dev": [ @@ -454,20 +452,20 @@ }, { "name": "deliciousbrains/wp-background-processing", - "version": "1.1.1", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/deliciousbrains/wp-background-processing.git", - "reference": "ebbed762c42e70e76573ffbd36e591378ba5f2ee" + "reference": "6d1e48165e461260075b9f161b3861c7278f71e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/deliciousbrains/wp-background-processing/zipball/ebbed762c42e70e76573ffbd36e591378ba5f2ee", - "reference": "ebbed762c42e70e76573ffbd36e591378ba5f2ee", + "url": "https://api.github.com/repos/deliciousbrains/wp-background-processing/zipball/6d1e48165e461260075b9f161b3861c7278f71e7", + "reference": "6d1e48165e461260075b9f161b3861c7278f71e7", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.0" }, "require-dev": { "phpcompatibility/phpcompatibility-wp": "*", @@ -498,9 +496,9 @@ "description": "WP Background Processing can be used to fire off non-blocking asynchronous requests or as a background processing tool, allowing you to queue tasks.", "support": { "issues": "https://github.com/deliciousbrains/wp-background-processing/issues", - "source": "https://github.com/deliciousbrains/wp-background-processing/tree/1.1.1" + "source": "https://github.com/deliciousbrains/wp-background-processing/tree/1.3.1" }, - "time": "2023-07-18T10:22:06+00:00" + "time": "2024-02-28T13:39:06+00:00" }, { "name": "league/flysystem", @@ -598,16 +596,16 @@ }, { "name": "league/mime-type-detection", - "version": "1.14.0", + "version": "1.15.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", + "reference": "ce0f4d1e8a6f4eb0ddff33f57c69c50fd09f4301", "shasum": "" }, "require": { @@ -638,7 +636,7 @@ "description": "Mime-type detection for Flysystem", "support": { "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.15.0" }, "funding": [ { @@ -650,7 +648,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T14:13:20+00:00" + "time": "2024-01-28T23:22:08+00:00" }, { "name": "psr/container", @@ -707,16 +705,16 @@ }, { "name": "symfony/console", - "version": "v5.4.31", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a" + "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/11ac5f154e0e5c4c77af83ad11ead9165280b92a", - "reference": "11ac5f154e0e5c4c77af83ad11ead9165280b92a", + "url": "https://api.github.com/repos/symfony/console/zipball/f3e591c48688a0cfa1a3296205926c05e84b22b1", + "reference": "f3e591c48688a0cfa1a3296205926c05e84b22b1", "shasum": "" }, "require": { @@ -786,7 +784,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.31" + "source": "https://github.com/symfony/console/tree/v5.4.39" }, "funding": [ { @@ -802,7 +800,7 @@ "type": "tidelift" } ], - "time": "2023-10-31T07:58:33+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/deprecation-contracts", @@ -873,16 +871,16 @@ }, { "name": "symfony/finder", - "version": "v5.4.27", + "version": "v5.4.39", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + "reference": "f6a96e4fcd468a25fede16ee665f50ced856bd0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "url": "https://api.github.com/repos/symfony/finder/zipball/f6a96e4fcd468a25fede16ee665f50ced856bd0a", + "reference": "f6a96e4fcd468a25fede16ee665f50ced856bd0a", "shasum": "" }, "require": { @@ -916,7 +914,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.27" + "source": "https://github.com/symfony/finder/tree/v5.4.39" }, "funding": [ { @@ -932,20 +930,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:02:31+00:00" + "time": "2024-04-18T08:26:06+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", "shasum": "" }, "require": { @@ -959,9 +957,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -998,7 +993,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" }, "funding": [ { @@ -1014,20 +1009,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", "shasum": "" }, "require": { @@ -1038,9 +1033,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1079,7 +1071,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.29.0" }, "funding": [ { @@ -1095,20 +1087,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", "shasum": "" }, "require": { @@ -1119,9 +1111,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1163,7 +1152,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.29.0" }, "funding": [ { @@ -1179,20 +1168,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", "shasum": "" }, "require": { @@ -1206,9 +1195,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1246,7 +1232,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" }, "funding": [ { @@ -1262,20 +1248,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/21bd091060673a1177ae842c0ef8fe30893114d2", + "reference": "21bd091060673a1177ae842c0ef8fe30893114d2", "shasum": "" }, "require": { @@ -1283,9 +1269,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1325,7 +1308,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.29.0" }, "funding": [ { @@ -1341,20 +1324,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", "shasum": "" }, "require": { @@ -1362,9 +1345,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1408,7 +1388,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.29.0" }, "funding": [ { @@ -1424,7 +1404,7 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-01-29T20:11:03+00:00" }, { "name": "symfony/service-contracts", diff --git a/l10n.php b/l10n.php index 608704978..c9c490498 100644 --- a/l10n.php +++ b/l10n.php @@ -88,5 +88,6 @@ 'confirm' => __('Confirm', ud_get_stateless_media()->domain ), 'cancel' => __('Cancel', ud_get_stateless_media()->domain ), 'start_optimization' => __('Start Data Optimization', ud_get_stateless_media()->domain ), + 'starting' => __('Starting...', ud_get_stateless_media()->domain ), ); diff --git a/lib/Google/CHANGELOG.md b/lib/Google/CHANGELOG.md index b6d29393c..a43c59d90 100644 --- a/lib/Google/CHANGELOG.md +++ b/lib/Google/CHANGELOG.md @@ -1,5 +1,43 @@ # Changelog +## [2.17.0](https://github.com/googleapis/google-api-php-client/compare/v2.16.0...v2.17.0) (2024-07-10) + + +### Features + +* Add logger to client constructor config ([#2606](https://github.com/googleapis/google-api-php-client/issues/2606)) ([1f47133](https://github.com/googleapis/google-api-php-client/commit/1f4713329d71111a317cda8ef8603fa1bdc88858)) +* Add the protected apiVersion property ([#2588](https://github.com/googleapis/google-api-php-client/issues/2588)) ([7e79f3d](https://github.com/googleapis/google-api-php-client/commit/7e79f3d7be4811f760e19cc4a2c558e04196ec1d)) + +## [2.16.0](https://github.com/googleapis/google-api-php-client/compare/v2.15.4...v2.16.0) (2024-04-24) + + +### Features + +* Add universe domain support ([#2563](https://github.com/googleapis/google-api-php-client/issues/2563)) ([35895de](https://github.com/googleapis/google-api-php-client/commit/35895ded90b507074b3430a94a5790ddd01f39f0)) + +## [2.15.4](https://github.com/googleapis/google-api-php-client/compare/v2.15.3...v2.15.4) (2024-03-06) + + +### Bug Fixes + +* Updates phpseclib because of a security issue ([#2574](https://github.com/googleapis/google-api-php-client/issues/2574)) ([633d41f](https://github.com/googleapis/google-api-php-client/commit/633d41f1b65fdb71a83bf747f7a3ad9857f6d02a)) + +## [2.15.3](https://github.com/googleapis/google-api-php-client/compare/v2.15.2...v2.15.3) (2024-01-04) + + +### Bug Fixes + +* Guzzle dependency version ([#2546](https://github.com/googleapis/google-api-php-client/issues/2546)) ([c270f28](https://github.com/googleapis/google-api-php-client/commit/c270f28b00594a151a887edd3cfd205594a1256a)) + +## [2.15.2](https://github.com/googleapis/google-api-php-client/compare/v2.15.1...v2.15.2) (2024-01-03) + + +### Bug Fixes + +* Disallow vulnerable guzzle versions ([#2536](https://github.com/googleapis/google-api-php-client/issues/2536)) ([d1830ed](https://github.com/googleapis/google-api-php-client/commit/d1830ede17114a4951ab9e60b3b9bcd9393b8668)) +* Php 8.3 deprecated get_class method call without argument ([#2509](https://github.com/googleapis/google-api-php-client/issues/2509)) ([8c66021](https://github.com/googleapis/google-api-php-client/commit/8c6602119b631e1a9da4dbe219af18d51c8dab8e)) +* Phpseclib security vulnerability ([#2524](https://github.com/googleapis/google-api-php-client/issues/2524)) ([73705c2](https://github.com/googleapis/google-api-php-client/commit/73705c2a65bfc01fa6d7717b7f401b8288fe0587)) + ## [2.15.1](https://github.com/googleapis/google-api-php-client/compare/v2.15.0...v2.15.1) (2023-09-12) diff --git a/lib/Google/README.md b/lib/Google/README.md index b82f44f14..95150d9f1 100644 --- a/lib/Google/README.md +++ b/lib/Google/README.md @@ -25,7 +25,7 @@ For Google Cloud Platform APIs such as [Datastore][cloud-datastore], [Cloud Stor [cloud-compute]: https://github.com/googleapis/google-cloud-php-compute ## Requirements ## -* [PHP 7.4 or higher](https://www.php.net/) +* [PHP 8.0 or higher](https://www.php.net/) ## Developer Documentation ## @@ -47,6 +47,15 @@ Once composer is installed, execute the following command in your project root t composer require google/apiclient:^2.15.0 ``` +If you're facing a timeout error then either increase the timeout for composer by adding the env flag as `COMPOSER_PROCESS_TIMEOUT=600 composer install` or you can put this in the `config` section of the composer schema: +``` +{ + "config": { + "process-timeout": 600 + } +} +``` + Finally, be sure to include the autoloader: ```php diff --git a/lib/Google/composer.json b/lib/Google/composer.json index c646bcd68..bfe4a74e2 100644 --- a/lib/Google/composer.json +++ b/lib/Google/composer.json @@ -6,26 +6,25 @@ "homepage": "http://developers.google.com/api-client-library/php", "license": "Apache-2.0", "require": { - "php": "^7.4|^8.0", - "google/auth": "^1.28", - "firebase/php-jwt": "~6.0", + "php": "^8.0", + "google/auth": "^1.37", + "google/apiclient-services": "~0.350", + "firebase/php-jwt": "^6.0", "monolog/monolog": "^2.9||^3.0", - "phpseclib/phpseclib": "^3.0.19", - "guzzlehttp/guzzle": "~6.5||~7.0", - "guzzlehttp/psr7": "^1.8.4||^2.2.1", - "google/cloud-storage": "^1.34", - "google/cloud-core": "^1.52", - "google/apiclient-services": "^0.323.0" + "phpseclib/phpseclib": "^3.0.36", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.6", + "google/cloud-storage": "^1.42", + "google/cloud-core": "^1.59" }, "require-dev": { - "squizlabs/php_codesniffer": "^3.0", + "squizlabs/php_codesniffer": "^3.8", "symfony/dom-crawler": "~2.1", "symfony/css-selector": "~2.1", "phpcompatibility/php-compatibility": "^9.2", - "composer/composer": "^1.10.22", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.5", - "cache/filesystem-adapter": "^1.2" + "composer/composer": "^1.10.23", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6" }, "suggest": { "cache/filesystem-adapter": "For caching certs and tokens (using Google\\Client::setCache)" @@ -45,11 +44,11 @@ "pre-autoload-dump": "Google\\Task\\Composer::cleanup" }, "extra": { - "google/apiclient-services": [ - "Storage" - ], "branch-alias": { "dev-main": "2.x-dev" - } + }, + "google/apiclient-services": [ + "Storage" + ] } } diff --git a/lib/Google/composer.lock b/lib/Google/composer.lock index 351a8bea8..9e09f86ec 100644 --- a/lib/Google/composer.lock +++ b/lib/Google/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a24978434a3e0a329346faa11f43a9d9", + "content-hash": "5f8095bfc4b39d1dfaa576eaf319db82", "packages": [ { "name": "brick/math", @@ -63,26 +63,26 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.0", + "version": "v6.10.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -120,29 +120,29 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, - "time": "2023-12-01T16:26:39+00:00" + "time": "2024-05-18T18:05:11+00:00" }, { "name": "google/apiclient-services", - "version": "v0.323.0", + "version": "v0.363.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6" + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d5497d30ddfafe7592102ca48bedaf222a4ca7a6", - "reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/5a0943e498e98e23dccdd98c5a3f74bc1b442053", + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.7||^8.5.13" + "phpunit/phpunit": "^9.6" }, "type": "library", "autoload": { @@ -164,40 +164,42 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.323.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.363.0" }, - "time": "2023-11-06T01:08:38+00:00" + "time": "2024-07-02T01:04:18+00:00" }, { "name": "google/auth", - "version": "v1.33.0", + "version": "v1.40.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "682dc6c30bb509953c9e43bb0960d901582da00b" + "reference": "bff9f2d01677e71a98394b5ac981b99523df5178" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/682dc6c30bb509953c9e43bb0960d901582da00b", - "reference": "682dc6c30bb509953c9e43bb0960d901582da00b", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/bff9f2d01677e71a98394b5ac981b99523df5178", + "reference": "bff9f2d01677e71a98394b5ac981b99523df5178", "shasum": "" }, "require": { "firebase/php-jwt": "^6.0", - "guzzlehttp/guzzle": "^6.2.1|^7.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.4.5", - "php": "^7.4||^8.0", - "psr/cache": "^1.0||^2.0||^3.0", + "php": "^8.0", + "psr/cache": "^2.0||^3.0", "psr/http-message": "^1.1||^2.0" }, "require-dev": { "guzzlehttp/promises": "^2.0", "kelvinmo/simplejwt": "0.7.1", - "phpseclib/phpseclib": "^3.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.0.0", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." @@ -222,40 +224,41 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.33.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.40.0" }, - "time": "2023-11-30T15:49:27+00:00" + "time": "2024-05-31T19:16:15+00:00" }, { "name": "google/cloud-core", - "version": "v1.52.10", + "version": "v1.59.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "5e34556498ecadee2161402fd1024bec7ce33186" + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/5e34556498ecadee2161402fd1024bec7ce33186", - "reference": "5e34556498ecadee2161402fd1024bec7ce33186", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/35aae23dc4d0b860b6c3733e5cf381a510b506d9", + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9", "shasum": "" }, "require": { - "google/auth": "^1.18", + "google/auth": "^1.34", + "google/gax": "^1.34.0", "guzzlehttp/guzzle": "^6.5.8|^7.4.4", "guzzlehttp/promises": "^1.4||^2.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "monolog/monolog": "^1.1|^2.0|^3.0", - "php": ">=7.4", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9|^3.0", + "php": "^8.0", "psr/http-message": "^1.0|^2.0", "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-common-protos": "^0.4", - "google/gax": "^1.24.0", + "google/cloud-common-protos": "~0.5", "opis/closure": "^3", - "phpdocumentor/reflection": "^5.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", "squizlabs/php_codesniffer": "2.*" @@ -287,33 +290,34 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.52.10" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.59.1" }, - "time": "2023-12-08T22:36:35+00:00" + "time": "2024-08-10T02:24:23+00:00" }, { "name": "google/cloud-storage", - "version": "v1.36.0", + "version": "v1.42.1", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-storage.git", - "reference": "94215228fd03e548590134d1e521a34ec727460c" + "reference": "2a418cad887e44d08a86de19a878ea3607212edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/94215228fd03e548590134d1e521a34ec727460c", - "reference": "94215228fd03e548590134d1e521a34ec727460c", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/2a418cad887e44d08a86de19a878ea3607212edb", + "reference": "2a418cad887e44d08a86de19a878ea3607212edb", "shasum": "" }, "require": { - "google/cloud-core": "^1.52.7", - "php": ">=7.4", + "google/cloud-core": "^1.55", + "php": "^8.0", "ramsey/uuid": "^4.2.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-pubsub": "^1.0", - "phpdocumentor/reflection": "^5.0", + "google/cloud-pubsub": "^2.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpseclib/phpseclib": "^2.0||^3.0", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", @@ -343,9 +347,295 @@ ], "description": "Cloud Storage Client for PHP", "support": { - "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.36.0" + "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.42.1" + }, + "time": "2024-07-08T23:14:13+00:00" + }, + { + "name": "google/common-protos", + "version": "v4.7.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/e58068776f57605c336e32c7db373f0a81da17b8", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8", + "shasum": "" + }, + "require": { + "google/protobuf": "^v3.25.3||^4.26.1", + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v4.7.0" + }, + "time": "2024-07-25T20:20:43+00:00" + }, + { + "name": "google/gax", + "version": "v1.34.1", + "source": { + "type": "git", + "url": "https://github.com/googleapis/gax-php.git", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "shasum": "" + }, + "require": { + "google/auth": "^1.34.0", + "google/common-protos": "^4.4", + "google/grpc-gcp": "^0.4", + "google/longrunning": "~0.4", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "ramsey/uuid": "^4.0" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/gax-php/issues", + "source": "https://github.com/googleapis/gax-php/tree/v1.34.1" + }, + "time": "2024-08-15T18:00:58+00:00" + }, + { + "name": "google/grpc-gcp", + "version": "v0.4.0", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^v1.13.0", + "php": "^8.0", + "psr/cache": "^1.0.1||^2.0.0||^3.0.0" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "support": { + "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", + "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.0" + }, + "time": "2024-04-03T16:37:55+00:00" + }, + { + "name": "google/longrunning", + "version": "0.4.3", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-longrunning.git", + "reference": "ed718a735e407826c3332b7197a44602eb03e608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-longrunning/zipball/ed718a735e407826c3332b7197a44602eb03e608", + "reference": "ed718a735e407826c3332b7197a44602eb03e608", + "shasum": "" + }, + "require-dev": { + "google/gax": "^1.34.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "component": { + "id": "longrunning", + "path": "LongRunning", + "entry": null, + "target": "googleapis/php-longrunning" + } + }, + "autoload": { + "psr-4": { + "Google\\LongRunning\\": "src/LongRunning", + "Google\\ApiCore\\LongRunning\\": "src/ApiCore/LongRunning", + "GPBMetadata\\Google\\Longrunning\\": "metadata/Longrunning" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google LongRunning Client for PHP", + "support": { + "source": "https://github.com/googleapis/php-longrunning/tree/v0.4.3" + }, + "time": "2024-06-01T03:14:01+00:00" + }, + { + "name": "google/protobuf", + "version": "v4.27.3", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "ff079fe467bf86ac8f3359e2eb77a1613ebd204d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/ff079fe467bf86ac8f3359e2eb77a1613ebd204d", + "reference": "ff079fe467bf86ac8f3359e2eb77a1613ebd204d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.27.3" }, - "time": "2023-12-08T22:36:35+00:00" + "time": "2024-07-31T13:27:16+00:00" + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "type": "library", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "time": "2023-08-14T23:57:54+00:00" }, { "name": "guzzlehttp/guzzle", @@ -674,16 +964,16 @@ }, { "name": "monolog/monolog", - "version": "2.9.2", + "version": "2.9.3", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215", "shasum": "" }, "require": { @@ -704,8 +994,8 @@ "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", "predis/predis": "^1.1 || ^2.0", "rollbar/rollbar": "^1.3 || ^2 || ^3", "ruflin/elastica": "^7", @@ -760,7 +1050,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/2.9.3" }, "funding": [ { @@ -772,28 +1062,28 @@ "type": "tidelift" } ], - "time": "2023-10-27T15:25:26+00:00" + "time": "2024-04-12T20:52:51+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.6.3", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" }, "type": "library", "autoload": { @@ -839,7 +1129,7 @@ "issues": "https://github.com/paragonie/constant_time_encoding/issues", "source": "https://github.com/paragonie/constant_time_encoding" }, - "time": "2022-06-14T06:56:20+00:00" + "time": "2024-05-08T12:36:18+00:00" }, { "name": "paragonie/random_compat", @@ -893,20 +1183,20 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.37", + "version": "3.0.39", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1|^2", + "paragonie/constant_time_encoding": "^1|^2|^3", "paragonie/random_compat": "^1.4|^2.0|^9.99.99", "php": ">=5.6.1" }, @@ -983,7 +1273,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" }, "funding": [ { @@ -999,20 +1289,20 @@ "type": "tidelift" } ], - "time": "2024-03-03T02:14:58+00:00" + "time": "2024-06-24T06:27:33+00:00" }, { "name": "psr/cache", - "version": "2.0.0", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { @@ -1046,9 +1336,9 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/2.0.0" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2021-02-03T23:23:37+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/http-client", @@ -1104,20 +1394,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -1141,7 +1431,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1153,9 +1443,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -1396,20 +1686,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", + "version": "4.7.6", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -1472,7 +1762,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -1484,20 +1774,20 @@ "type": "tidelift" } ], - "time": "2023-11-08T05:53:05+00:00" + "time": "2024-04-27T21:32:50+00:00" }, { "name": "rize/uri-template", - "version": "0.3.5", + "version": "0.3.6", "source": { "type": "git", "url": "https://github.com/rize/UriTemplate.git", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168" + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/5ed4ba8ea34af84485dea815d4b6b620794d1168", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/34efe65c79710eed0883884f2285ae6d4a0aad19", + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19", "shasum": "" }, "require": { @@ -1530,7 +1820,7 @@ ], "support": { "issues": "https://github.com/rize/UriTemplate/issues", - "source": "https://github.com/rize/UriTemplate/tree/0.3.5" + "source": "https://github.com/rize/UriTemplate/tree/0.3.6" }, "funding": [ { @@ -1546,7 +1836,7 @@ "type": "open_collective" } ], - "time": "2022-10-12T17:22:51+00:00" + "time": "2024-03-10T08:07:49+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1617,16 +1907,16 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", "shasum": "" }, "require": { @@ -1634,9 +1924,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1676,7 +1963,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" }, "funding": [ { @@ -1692,229 +1979,34 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-06-19T12:30:46+00:00" } ], "packages-dev": [ - { - "name": "cache/adapter-common", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/php-cache/adapter-common.git", - "reference": "8788309be72aa7be69b88cdc0687549c74a7d479" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-cache/adapter-common/zipball/8788309be72aa7be69b88cdc0687549c74a7d479", - "reference": "8788309be72aa7be69b88cdc0687549c74a7d479", - "shasum": "" - }, - "require": { - "cache/tag-interop": "^1.0", - "php": ">=7.4", - "psr/cache": "^1.0 || ^2.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "psr/simple-cache": "^1.0" - }, - "require-dev": { - "cache/integration-tests": "^0.17", - "phpunit/phpunit": "^7.5.20 || ^9.5.10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Cache\\Adapter\\Common\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Scherer", - "email": "aequasi@gmail.com", - "homepage": "https://github.com/aequasi" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" - } - ], - "description": "Common classes for PSR-6 adapters", - "homepage": "http://www.php-cache.com/en/latest/", - "keywords": [ - "cache", - "psr-6", - "tag" - ], - "support": { - "source": "https://github.com/php-cache/adapter-common/tree/1.3.0" - }, - "time": "2022-01-15T15:47:19+00:00" - }, - { - "name": "cache/filesystem-adapter", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/php-cache/filesystem-adapter.git", - "reference": "f1faaae40aaa696ef899cef6f6888aedb90b419b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-cache/filesystem-adapter/zipball/f1faaae40aaa696ef899cef6f6888aedb90b419b", - "reference": "f1faaae40aaa696ef899cef6f6888aedb90b419b", - "shasum": "" - }, - "require": { - "cache/adapter-common": "^1.0", - "league/flysystem": "^1.0", - "php": ">=7.4", - "psr/cache": "^1.0 || ^2.0", - "psr/simple-cache": "^1.0" - }, - "provide": { - "psr/cache-implementation": "^1.0", - "psr/simple-cache-implementation": "^1.0" - }, - "require-dev": { - "cache/integration-tests": "^0.17", - "phpunit/phpunit": "^7.5.20 || ^9.5.10" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Cache\\Adapter\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Aaron Scherer", - "email": "aequasi@gmail.com", - "homepage": "https://github.com/aequasi" - }, - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" - } - ], - "description": "A PSR-6 cache implementation using filesystem. This implementation supports tags", - "homepage": "http://www.php-cache.com/en/latest/", - "keywords": [ - "cache", - "filesystem", - "psr-6", - "tag" - ], - "support": { - "source": "https://github.com/php-cache/filesystem-adapter/tree/1.2.0" - }, - "time": "2022-01-15T15:47:19+00:00" - }, - { - "name": "cache/tag-interop", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/php-cache/tag-interop.git", - "reference": "b062b1d735357da50edf8387f7a8696f3027d328" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-cache/tag-interop/zipball/b062b1d735357da50edf8387f7a8696f3027d328", - "reference": "b062b1d735357da50edf8387f7a8696f3027d328", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0 || ^8.0", - "psr/cache": "^1.0 || ^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "Cache\\TagInterop\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Tobias Nyholm", - "email": "tobias.nyholm@gmail.com", - "homepage": "https://github.com/nyholm" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com", - "homepage": "https://github.com/nicolas-grekas" - } - ], - "description": "Framework interoperable interfaces for tags", - "homepage": "https://www.php-cache.com/en/latest/", - "keywords": [ - "cache", - "psr", - "psr6", - "tag" - ], - "support": { - "issues": "https://github.com/php-cache/tag-interop/issues", - "source": "https://github.com/php-cache/tag-interop/tree/1.1.0" - }, - "time": "2021-12-31T10:03:23+00:00" - }, { "name": "composer/ca-bundle", - "version": "1.4.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "b66d11b7479109ab547f9405b97205640b17d385" + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", - "reference": "b66d11b7479109ab547f9405b97205640b17d385", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", "shasum": "" }, "require": { "ext-openssl": "*", "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" + "php": "^7.2 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", + "phpstan/phpstan": "^1.10", + "psr/log": "^1.0 || ^2.0 || ^3.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -1949,7 +2041,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.4.0" + "source": "https://github.com/composer/ca-bundle/tree/1.5.1" }, "funding": [ { @@ -1965,7 +2057,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T12:05:55+00:00" + "time": "2024-07-08T15:28:20+00:00" }, { "name": "composer/composer", @@ -2292,16 +2384,16 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931" + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/4f2d4f2836e7ec4e7a8625e75c6aa916004db931", - "reference": "4f2d4f2836e7ec4e7a8625e75c6aa916004db931", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", "shasum": "" }, "require": { @@ -2333,9 +2425,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.2" + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" }, - "time": "2023-09-27T20:04:15+00:00" + "time": "2024-01-30T19:34:25+00:00" }, { "name": "doctrine/instantiator", @@ -2409,20 +2501,20 @@ }, { "name": "justinrainbow/json-schema", - "version": "v5.2.13", + "version": "5.3.0", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", - "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.1" }, "require-dev": { "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", @@ -2433,11 +2525,6 @@ "bin/validate-json" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, "autoload": { "psr-4": { "JsonSchema\\": "src/JsonSchema/" @@ -2472,173 +2559,23 @@ "schema" ], "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/v5.2.13" - }, - "time": "2023-09-26T02:20:38+00:00" - }, - { - "name": "league/flysystem", - "version": "1.1.10", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" - }, - "conflict": { - "league/flysystem-sftp": "<1.0.6" - }, - "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frenky.net" - } - ], - "description": "Filesystem abstraction: Many filesystems, one API.", - "keywords": [ - "Cloud Files", - "WebDAV", - "abstraction", - "aws", - "cloud", - "copy.com", - "dropbox", - "file systems", - "files", - "filesystem", - "filesystems", - "ftp", - "rackspace", - "remote", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" }, - "funding": [ - { - "url": "https://offset.earth/frankdejonge", - "type": "other" - } - ], - "time": "2022-10-04T09:16:37+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.14.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b6a5854368533df0295c5761a0253656a2e52d9e", - "reference": "b6a5854368533df0295c5761a0253656a2e52d9e", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.14.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2023-10-17T14:13:20+00:00" + "time": "2024-07-06T21:00:26+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -2646,11 +2583,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -2676,7 +2614,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -2684,29 +2622,31 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v5.1.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", "shasum": "" }, "require": { + "ext-ctype": "*", + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -2714,7 +2654,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -2738,26 +2678,27 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-07-01T20:03:41+00:00" }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-phar": "*", "ext-xmlwriter": "*", "phar-io/version": "^3.0.1", @@ -2798,9 +2739,15 @@ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", "support": { "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -2970,28 +2917,35 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", + "version": "5.4.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", "shasum": "" }, "require": { + "doctrine/deprecations": "^1.1", "ext-filter": "*", - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", "webmozart/assert": "^1.9.1" }, "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" }, "type": "library", "extra": { @@ -3015,33 +2969,33 @@ }, { "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" + "email": "opensource@ijaap.nl" } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" }, - "time": "2021-10-19T17:43:47+00:00" + "time": "2024-05-21T05:55:05+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "1.7.3", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419" + "reference": "153ae662783729388a584b4361f2545e4d841e3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", - "reference": "3219c6ee25c9ea71e3d9bbaf39c67c9ebd499419", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", "shasum": "" }, "require": { "doctrine/deprecations": "^1.0", - "php": "^7.4 || ^8.0", + "php": "^7.3 || ^8.0", "phpdocumentor/reflection-common": "^2.0", "phpstan/phpdoc-parser": "^1.13" }, @@ -3079,30 +3033,30 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.7.3" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" }, - "time": "2023-08-12T11:01:26+00:00" + "time": "2024-02-23T11:10:43+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.18.0", + "version": "v1.19.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c" + "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d4f454f7e1193933f04e6500de3e79191648ed0c", - "reference": "d4f454f7e1193933f04e6500de3e79191648ed0c", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/67a759e7d8746d501c41536ba40cd9c0a07d6a87", + "reference": "67a759e7d8746d501c41536ba40cd9c0a07d6a87", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2 || ^2.0", "php": "^7.2 || 8.0.* || 8.1.* || 8.2.* || 8.3.*", "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0 || ^5.0", - "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0" + "sebastian/comparator": "^3.0 || ^4.0 || ^5.0 || ^6.0", + "sebastian/recursion-context": "^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { "phpspec/phpspec": "^6.0 || ^7.0", @@ -3148,33 +3102,33 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.18.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.19.0" }, - "time": "2023-12-07T16:22:33+00:00" + "time": "2024-02-29T11:52:51+00:00" }, { "name": "phpspec/prophecy-phpunit", - "version": "v2.1.0", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy-phpunit.git", - "reference": "29f8114c2c319a4308e6b070902211e062efa392" + "reference": "16e1247e139434bce0bac09848bc5c8d882940fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/29f8114c2c319a4308e6b070902211e062efa392", - "reference": "29f8114c2c319a4308e6b070902211e062efa392", + "url": "https://api.github.com/repos/phpspec/prophecy-phpunit/zipball/16e1247e139434bce0bac09848bc5c8d882940fc", + "reference": "16e1247e139434bce0bac09848bc5c8d882940fc", "shasum": "" }, "require": { "php": "^7.3 || ^8", "phpspec/prophecy": "^1.18", - "phpunit/phpunit": "^9.1 || ^10.1" + "phpunit/phpunit": "^9.1 || ^10.1 || ^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -3200,22 +3154,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy-phpunit/issues", - "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.1.0" + "source": "https://github.com/phpspec/prophecy-phpunit/tree/v2.2.0" }, - "time": "2023-12-08T12:48:02+00:00" + "time": "2024-03-01T08:33:58+00:00" }, { "name": "phpstan/phpdoc-parser", - "version": "1.24.5", + "version": "1.29.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc" + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fedf211ff14ec8381c9bf5714e33a7a552dd1acc", - "reference": "fedf211ff14ec8381c9bf5714e33a7a552dd1acc", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/fcaefacf2d5c417e928405b71b400d4ce10daaf4", + "reference": "fcaefacf2d5c417e928405b71b400d4ce10daaf4", "shasum": "" }, "require": { @@ -3247,22 +3201,22 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.24.5" + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.29.1" }, - "time": "2023-12-16T09:33:33+00:00" + "time": "2024-05-31T08:52:43+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.30", + "version": "9.2.31", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", - "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", + "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", "shasum": "" }, "require": { @@ -3319,7 +3273,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31" }, "funding": [ { @@ -3327,7 +3281,7 @@ "type": "github" } ], - "time": "2023-12-22T06:47:57+00:00" + "time": "2024-03-02T06:37:42+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3572,45 +3526,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.15", + "version": "9.6.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1" + "reference": "49d7820565836236411f5dc002d16dd689cde42f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/05017b80304e0eb3f31d90194a563fd53a6021f1", - "reference": "05017b80304e0eb3f31d90194a563fd53a6021f1", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", + "reference": "49d7820565836236411f5dc002d16dd689cde42f", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { @@ -3655,7 +3609,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.15" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" }, "funding": [ { @@ -3671,7 +3625,7 @@ "type": "tidelift" } ], - "time": "2023-12-01T16:55:19+00:00" + "time": "2024-07-10T11:45:39+00:00" }, { "name": "psr/container", @@ -3726,69 +3680,18 @@ }, "time": "2021-11-05T16:47:00+00:00" }, - { - "name": "psr/simple-cache", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\SimpleCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interfaces for simple caching", - "keywords": [ - "cache", - "caching", - "psr", - "psr-16", - "simple-cache" - ], - "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" - }, - "time": "2017-10-23T01:57:42+00:00" - }, { "name": "sebastian/cli-parser", - "version": "1.0.1", + "version": "1.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", "shasum": "" }, "require": { @@ -3823,7 +3726,7 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" }, "funding": [ { @@ -3831,7 +3734,7 @@ "type": "github" } ], - "time": "2020-09-28T06:08:49+00:00" + "time": "2024-03-02T06:27:43+00:00" }, { "name": "sebastian/code-unit", @@ -4077,16 +3980,16 @@ }, { "name": "sebastian/diff", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131" + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/74be17022044ebaaecfdf0c5cd504fc9cd5a7131", - "reference": "74be17022044ebaaecfdf0c5cd504fc9cd5a7131", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", "shasum": "" }, "require": { @@ -4131,7 +4034,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" }, "funding": [ { @@ -4139,7 +4042,7 @@ "type": "github" } ], - "time": "2023-05-07T05:35:17+00:00" + "time": "2024-03-02T06:30:58+00:00" }, { "name": "sebastian/environment", @@ -4206,16 +4109,16 @@ }, { "name": "sebastian/exporter", - "version": "4.0.5", + "version": "4.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", - "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", "shasum": "" }, "require": { @@ -4271,7 +4174,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" }, "funding": [ { @@ -4279,20 +4182,20 @@ "type": "github" } ], - "time": "2022-09-14T06:03:37+00:00" + "time": "2024-03-02T06:33:00+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.6", + "version": "5.0.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bde739e7565280bda77be70044ac1047bc007e34" + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bde739e7565280bda77be70044ac1047bc007e34", - "reference": "bde739e7565280bda77be70044ac1047bc007e34", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", "shasum": "" }, "require": { @@ -4335,7 +4238,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.6" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" }, "funding": [ { @@ -4343,7 +4246,7 @@ "type": "github" } ], - "time": "2023-08-02T09:26:13+00:00" + "time": "2024-03-02T06:35:11+00:00" }, { "name": "sebastian/lines-of-code", @@ -4579,16 +4482,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -4600,7 +4503,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -4621,8 +4524,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -4630,7 +4532,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -4743,16 +4645,16 @@ }, { "name": "seld/jsonlint", - "version": "1.10.1", + "version": "1.10.2", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "76d449a358ece77d6f1d6331c68453e657172202" + "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/76d449a358ece77d6f1d6331c68453e657172202", - "reference": "76d449a358ece77d6f1d6331c68453e657172202", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9bb7db07b5d66d90f6ebf542f09fc67d800e5259", + "reference": "9bb7db07b5d66d90f6ebf542f09fc67d800e5259", "shasum": "" }, "require": { @@ -4791,7 +4693,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.1" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.2" }, "funding": [ { @@ -4803,7 +4705,7 @@ "type": "tidelift" } ], - "time": "2023-12-18T13:03:25+00:00" + "time": "2024-02-07T12:57:50+00:00" }, { "name": "seld/phar-utils", @@ -4855,16 +4757,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.8.0", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7" + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5805f7a4e4958dbb5e944ef1e6edae0a303765e7", - "reference": "5805f7a4e4958dbb5e944ef1e6edae0a303765e7", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", "shasum": "" }, "require": { @@ -4874,11 +4776,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -4931,20 +4833,20 @@ "type": "open_collective" } ], - "time": "2023-12-08T12:32:31+00:00" + "time": "2024-05-22T21:24:41+00:00" }, { "name": "symfony/console", - "version": "v5.4.32", + "version": "v5.4.41", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7" + "reference": "6473d441a913cb997123b59ff2dbe3d1cf9e11ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", - "reference": "c70df1ffaf23a8d340bded3cfab1b86752ad6ed7", + "url": "https://api.github.com/repos/symfony/console/zipball/6473d441a913cb997123b59ff2dbe3d1cf9e11ba", + "reference": "6473d441a913cb997123b59ff2dbe3d1cf9e11ba", "shasum": "" }, "require": { @@ -5014,7 +4916,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.32" + "source": "https://github.com/symfony/console/tree/v5.4.41" }, "funding": [ { @@ -5030,7 +4932,7 @@ "type": "tidelift" } ], - "time": "2023-11-18T18:23:04+00:00" + "time": "2024-06-28T07:48:55+00:00" }, { "name": "symfony/css-selector", @@ -5150,16 +5052,16 @@ }, { "name": "symfony/filesystem", - "version": "v5.4.25", + "version": "v5.4.41", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364" + "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", - "reference": "0ce3a62c9579a53358d3a7eb6b3dfb79789a6364", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/6d29dd9340b372fa603f04e6df4dd76bb808591e", + "reference": "6d29dd9340b372fa603f04e6df4dd76bb808591e", "shasum": "" }, "require": { @@ -5168,6 +5070,9 @@ "symfony/polyfill-mbstring": "~1.8", "symfony/polyfill-php80": "^1.16" }, + "require-dev": { + "symfony/process": "^5.4|^6.4" + }, "type": "library", "autoload": { "psr-4": { @@ -5194,7 +5099,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.4.25" + "source": "https://github.com/symfony/filesystem/tree/v5.4.41" }, "funding": [ { @@ -5210,20 +5115,20 @@ "type": "tidelift" } ], - "time": "2023-05-31T13:04:02+00:00" + "time": "2024-06-28T09:36:24+00:00" }, { "name": "symfony/finder", - "version": "v5.4.27", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d" + "reference": "f51cff4687547641c7d8180d74932ab40b2205ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ff4bce3c33451e7ec778070e45bd23f74214cd5d", - "reference": "ff4bce3c33451e7ec778070e45bd23f74214cd5d", + "url": "https://api.github.com/repos/symfony/finder/zipball/f51cff4687547641c7d8180d74932ab40b2205ce", + "reference": "f51cff4687547641c7d8180d74932ab40b2205ce", "shasum": "" }, "require": { @@ -5257,7 +5162,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.27" + "source": "https://github.com/symfony/finder/tree/v5.4.40" }, "funding": [ { @@ -5273,20 +5178,20 @@ "type": "tidelift" } ], - "time": "2023-07-31T08:02:31+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", - "reference": "ea208ce43cbb04af6867b4fdddb1bdbf84cc28cb", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -5300,9 +5205,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5339,7 +5241,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -5355,20 +5257,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "875e90aeea2777b6f135677f618529449334a612" + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/875e90aeea2777b6f135677f618529449334a612", - "reference": "875e90aeea2777b6f135677f618529449334a612", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", + "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", "shasum": "" }, "require": { @@ -5379,9 +5281,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5420,7 +5319,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" }, "funding": [ { @@ -5436,20 +5335,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92" + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", - "reference": "8c4ad05dd0120b6a53c1ca374dca2ad0a1c4ed92", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", "shasum": "" }, "require": { @@ -5460,9 +5359,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5504,7 +5400,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" }, "funding": [ { @@ -5520,20 +5416,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "42292d99c55abe617799667f454222c54c60e229" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/42292d99c55abe617799667f454222c54c60e229", - "reference": "42292d99c55abe617799667f454222c54c60e229", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -5547,9 +5443,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5587,7 +5480,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -5603,20 +5496,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T09:04:16+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", - "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", "shasum": "" }, "require": { @@ -5624,9 +5517,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5666,7 +5556,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" }, "funding": [ { @@ -5682,20 +5572,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.28.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5" + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/6caa57379c4aec19c0a12a38b59b26487dcfe4b5", - "reference": "6caa57379c4aec19c0a12a38b59b26487dcfe4b5", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", + "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", "shasum": "" }, "require": { @@ -5703,9 +5593,6 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -5749,7 +5636,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" }, "funding": [ { @@ -5765,20 +5652,20 @@ "type": "tidelift" } ], - "time": "2023-01-26T09:26:14+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/process", - "version": "v5.4.28", + "version": "v5.4.40", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "url": "https://api.github.com/repos/symfony/process/zipball/deedcb3bb4669cae2148bc920eafd2b16dc7c046", + "reference": "deedcb3bb4669cae2148bc920eafd2b16dc7c046", "shasum": "" }, "require": { @@ -5811,7 +5698,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.28" + "source": "https://github.com/symfony/process/tree/v5.4.40" }, "funding": [ { @@ -5827,7 +5714,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:36:04+00:00" + "time": "2024-05-31T14:33:22+00:00" }, { "name": "symfony/service-contracts", @@ -5998,16 +5885,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -6036,7 +5923,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -6044,7 +5931,7 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "webmozart/assert", @@ -6111,7 +5998,7 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^7.4|^8.0" + "php": "^8.0" }, "platform-dev": [], "plugin-api-version": "2.6.0" diff --git a/lib/Google/src/Client.php b/lib/Google/src/Client.php index 31b3f1d5f..330e8ac6b 100644 --- a/lib/Google/src/Client.php +++ b/lib/Google/src/Client.php @@ -27,6 +27,7 @@ use Google\Auth\Credentials\UserRefreshCredentials; use Google\Auth\CredentialsLoader; use Google\Auth\FetchAuthTokenCache; +use Google\Auth\GetUniverseDomainInterface; use Google\Auth\HttpHandler\HttpHandlerFactory; use Google\Auth\OAuth2; use Google\AuthHandler\AuthHandlerFactory; @@ -105,78 +106,110 @@ class Client /** * Construct the Google Client. * - * @param array $config + * @param array $config { + * An array of required and optional arguments. + * + * @type string $application_name + * The name of your application + * @type string $base_path + * The base URL for the service. This is only accounted for when calling + * {@see Client::authorize()} directly. + * @type string $client_id + * Your Google Cloud client ID found in https://developers.google.com/console + * @type string $client_secret + * Your Google Cloud client secret found in https://developers.google.com/console + * @type string|array|CredentialsLoader $credentials + * Can be a path to JSON credentials or an array representing those + * credentials (@see Google\Client::setAuthConfig), or an instance of + * {@see CredentialsLoader}. + * @type string|array $scopes + * {@see Google\Client::setScopes} + * @type string $quota_project + * Sets X-Goog-User-Project, which specifies a user project to bill + * for access charges associated with the request. + * @type string $redirect_uri + * @type string $state + * @type string $developer_key + * Simple API access key, also from the API console. Ensure you get + * a Server key, and not a Browser key. + * **NOTE:** The universe domain is assumed to be "googleapis.com" unless + * explicitly set. When setting an API ley directly via this option, there + * is no way to verify the universe domain. Be sure to set the + * "universe_domain" option if "googleapis.com" is not intended. + * @type bool $use_application_default_credentials + * For use with Google Cloud Platform + * fetch the ApplicationDefaultCredentials, if applicable + * {@see https://developers.google.com/identity/protocols/application-default-credentials} + * @type string $signing_key + * @type string $signing_algorithm + * @type string $subject + * @type string $hd + * @type string $prompt + * @type string $openid + * @type bool $include_granted_scopes + * @type string $login_hint + * @type string $request_visible_actions + * @type string $access_type + * @type string $approval_prompt + * @type array $retry + * Task Runner retry configuration + * {@see \Google\Task\Runner} + * @type array $retry_map + * @type CacheItemPoolInterface $cache + * Cache class implementing {@see CacheItemPoolInterface}. Defaults + * to {@see MemoryCacheItemPool}. + * @type array $cache_config + * Cache config for downstream auth caching. + * @type callable $token_callback + * Function to be called when an access token is fetched. Follows + * the signature `function (string $cacheKey, string $accessToken)`. + * @type \Firebase\JWT $jwt + * Service class used in {@see Client::verifyIdToken()}. Explicitly + * pass this in to avoid setting {@see \Firebase\JWT::$leeway} + * @type bool $api_format_v2 + * Setting api_format_v2 will return more detailed error messages + * from certain APIs. + * @type string $universe_domain + * Setting the universe domain will change the default rootUrl of the service. + * If not set explicitly, the universe domain will be the value provided in the + *. "GOOGLE_CLOUD_UNIVERSE_DOMAIN" environment variable, or "googleapis.com". + * } */ public function __construct(array $config = []) { $this->config = array_merge([ 'application_name' => '', - - // Don't change these unless you're working against a special development - // or testing environment. 'base_path' => self::API_BASE_PATH, - - // https://developers.google.com/console 'client_id' => '', 'client_secret' => '', - - // Can be a path to JSON credentials or an array representing those - // credentials (@see Google\Client::setAuthConfig), or an instance of - // Google\Auth\CredentialsLoader. 'credentials' => null, - // @see Google\Client::setScopes 'scopes' => null, - // Sets X-Goog-User-Project, which specifies a user project to bill - // for access charges associated with the request 'quota_project' => null, - 'redirect_uri' => null, 'state' => null, - - // Simple API access key, also from the API console. Ensure you get - // a Server key, and not a Browser key. 'developer_key' => '', - - // For use with Google Cloud Platform - // fetch the ApplicationDefaultCredentials, if applicable - // @see https://developers.google.com/identity/protocols/application-default-credentials 'use_application_default_credentials' => false, 'signing_key' => null, 'signing_algorithm' => null, 'subject' => null, - - // Other OAuth2 parameters. 'hd' => '', 'prompt' => '', 'openid.realm' => '', 'include_granted_scopes' => null, + 'logger' => null, 'login_hint' => '', 'request_visible_actions' => '', 'access_type' => 'online', 'approval_prompt' => 'auto', - - // Task Runner retry configuration - // @see Google\Task\Runner 'retry' => [], 'retry_map' => null, - - // Cache class implementing Psr\Cache\CacheItemPoolInterface. - // Defaults to Google\Auth\Cache\MemoryCacheItemPool. 'cache' => null, - // cache config for downstream auth caching 'cache_config' => [], - - // function to be called when an access token is fetched - // follows the signature function ($cacheKey, $accessToken) 'token_callback' => null, - - // Service class used in Google\Client::verifyIdToken. - // Explicitly pass this in to avoid setting JWT::$leeway 'jwt' => null, - - // Setting api_format_v2 will return more detailed error messages - // from certain APIs. - 'api_format_v2' => false + 'api_format_v2' => false, + 'universe_domain' => getenv('GOOGLE_CLOUD_UNIVERSE_DOMAIN') + ?: GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN, ], $config); if (!is_null($this->config['credentials'])) { @@ -210,6 +243,11 @@ public function __construct(array $config = []) $this->setCache($this->config['cache']); unset($this->config['cache']); } + + if (!is_null($this->config['logger'])) { + $this->setLogger($this->config['logger']); + unset($this->config['logger']); + } } /** @@ -428,6 +466,7 @@ public function authorize(ClientInterface $http = null) // 3b. If access token exists but is expired, try to refresh it // 4. Check for API Key if ($this->credentials) { + $this->checkUniverseDomain($this->credentials); return $authHandler->attachCredentials( $http, $this->credentials, @@ -437,6 +476,7 @@ public function authorize(ClientInterface $http = null) if ($this->isUsingApplicationDefaultCredentials()) { $credentials = $this->createApplicationDefaultCredentials(); + $this->checkUniverseDomain($credentials); return $authHandler->attachCredentialsCache( $http, $credentials, @@ -452,6 +492,7 @@ public function authorize(ClientInterface $http = null) $scopes, $token['refresh_token'] ); + $this->checkUniverseDomain($credentials); return $authHandler->attachCredentials( $http, $credentials, @@ -504,6 +545,11 @@ public function isUsingApplicationDefaultCredentials() * as calling `clear()` will remove all cache items, including any items not * related to Google API PHP Client.) * + * **NOTE:** The universe domain is assumed to be "googleapis.com" unless + * explicitly set. When setting an access token directly via this method, there + * is no way to verify the universe domain. Be sure to set the "universe_domain" + * option if "googleapis.com" is not intended. + * * @param string|array $token * @throws InvalidArgumentException */ @@ -1297,4 +1343,23 @@ private function createUserRefreshCredentials($scope, $refreshToken) return new UserRefreshCredentials($scope, $creds); } + + private function checkUniverseDomain($credentials) + { + $credentialsUniverse = $credentials instanceof GetUniverseDomainInterface + ? $credentials->getUniverseDomain() + : GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN; + if ($credentialsUniverse !== $this->getUniverseDomain()) { + throw new DomainException(sprintf( + 'The configured universe domain (%s) does not match the credential universe domain (%s)', + $this->getUniverseDomain(), + $credentialsUniverse + )); + } + } + + public function getUniverseDomain() + { + return $this->config['universe_domain']; + } } diff --git a/lib/Google/src/Http/Batch.php b/lib/Google/src/Http/Batch.php index f37045c01..d16708f20 100644 --- a/lib/Google/src/Http/Batch.php +++ b/lib/Google/src/Http/Batch.php @@ -62,7 +62,12 @@ public function __construct( ) { $this->client = $client; $this->boundary = $boundary ?: mt_rand(); - $this->rootUrl = rtrim($rootUrl ?: $this->client->getConfig('base_path'), '/'); + $rootUrl = rtrim($rootUrl ?: $this->client->getConfig('base_path'), '/'); + $this->rootUrl = str_replace( + 'UNIVERSE_DOMAIN', + $this->client->getUniverseDomain(), + $rootUrl + ); $this->batchPath = $batchPath ?: self::BATCH_PATH; } diff --git a/lib/Google/src/Http/REST.php b/lib/Google/src/Http/REST.php index 1519f60da..70e48e4b8 100644 --- a/lib/Google/src/Http/REST.php +++ b/lib/Google/src/Http/REST.php @@ -55,7 +55,7 @@ public static function execute( $runner = new Runner( $config, sprintf('%s %s', $request->getMethod(), (string) $request->getUri()), - [get_class(), 'doExecute'], + [self::class, 'doExecute'], [$client, $request, $expectedClass] ); diff --git a/lib/Google/src/Service.php b/lib/Google/src/Service.php index c97ee9d4f..8c8fe5fa7 100644 --- a/lib/Google/src/Service.php +++ b/lib/Google/src/Service.php @@ -23,7 +23,11 @@ class Service { public $batchPath; + /** + * Only used in getBatch + */ public $rootUrl; + public $rootUrlTemplate; public $version; public $servicePath; public $serviceName; @@ -65,7 +69,7 @@ public function createBatch() return new Batch( $this->client, false, - $this->rootUrl, + $this->rootUrlTemplate ?? $this->rootUrl, $this->batchPath ); } diff --git a/lib/Google/src/Service/Resource.php b/lib/Google/src/Service/Resource.php index ecf402b18..693aaa781 100644 --- a/lib/Google/src/Service/Resource.php +++ b/lib/Google/src/Service/Resource.php @@ -45,8 +45,11 @@ class Resource 'prettyPrint' => ['type' => 'string', 'location' => 'query'], ]; - /** @var string $rootUrl */ - private $rootUrl; + /** @var string $rootUrlTemplate */ + private $rootUrlTemplate; + + /** @var string $apiVersion */ + protected $apiVersion; /** @var \Google\Client $client */ private $client; @@ -65,7 +68,7 @@ class Resource public function __construct($service, $serviceName, $resourceName, $resource) { - $this->rootUrl = $service->rootUrl; + $this->rootUrlTemplate = $service->rootUrlTemplate ?? $service->rootUrl; $this->client = $service->getClient(); $this->servicePath = $service->servicePath; $this->serviceName = $serviceName; @@ -225,6 +228,13 @@ public function call($name, $arguments, $expectedClass = null) $expectedClass = null; } + // If the class which is extending from this one contains + // an Api Version, add it to the header + if ($this->apiVersion) { + $request = $request + ->withHeader('X-Goog-Api-Version', $this->apiVersion); + } + // if the client is marked for deferring, rather than // execute the request, return the response if ($this->client->shouldDefer()) { @@ -268,12 +278,14 @@ public function createRequestUri($restPath, $params) $requestUrl = $this->servicePath . $restPath; } - // code for leading slash - if ($this->rootUrl) { - if ('/' !== substr($this->rootUrl, -1) && '/' !== substr($requestUrl, 0, 1)) { + if ($this->rootUrlTemplate) { + // code for universe domain + $rootUrl = str_replace('UNIVERSE_DOMAIN', $this->client->getUniverseDomain(), $this->rootUrlTemplate); + // code for leading slash + if ('/' !== substr($rootUrl, -1) && '/' !== substr($requestUrl, 0, 1)) { $requestUrl = '/' . $requestUrl; } - $requestUrl = $this->rootUrl . $requestUrl; + $requestUrl = $rootUrl . $requestUrl; } $uriTemplateVars = []; $queryVars = []; diff --git a/lib/Google/vendor/autoload.php b/lib/Google/vendor/autoload.php index 67e940915..599daf634 100644 --- a/lib/Google/vendor/autoload.php +++ b/lib/Google/vendor/autoload.php @@ -22,4 +22,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit2cd6126242849aa869f10969652c4467::getLoader(); +return ComposerAutoloaderInitbd131085cfdbf47b26d7ae00fe412ae4::getLoader(); diff --git a/lib/Google/vendor/composer/autoload_classmap.php b/lib/Google/vendor/composer/autoload_classmap.php index 2bda8e960..c80dde643 100644 --- a/lib/Google/vendor/composer/autoload_classmap.php +++ b/lib/Google/vendor/composer/autoload_classmap.php @@ -8,6 +8,7 @@ return array( 'CURLStringFile' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'GPBMetadata\\GrpcGcp' => $vendorDir . '/google/grpc-gcp/src/generated/GPBMetadata/GrpcGcp.php', 'Google_AccessToken_Revoke' => $baseDir . '/src/aliases.php', 'Google_AccessToken_Verify' => $baseDir . '/src/aliases.php', 'Google_AuthHandler_AuthHandlerFactory' => $baseDir . '/src/aliases.php', @@ -28,5 +29,10 @@ 'Google_Task_Retryable' => $baseDir . '/src/aliases.php', 'Google_Task_Runner' => $baseDir . '/src/aliases.php', 'Google_Utils_UriTemplate' => $baseDir . '/src/aliases.php', + 'Grpc\\Gcp\\AffinityConfig' => $vendorDir . '/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig.php', + 'Grpc\\Gcp\\AffinityConfig_Command' => $vendorDir . '/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig_Command.php', + 'Grpc\\Gcp\\ApiConfig' => $vendorDir . '/google/grpc-gcp/src/generated/Grpc/Gcp/ApiConfig.php', + 'Grpc\\Gcp\\ChannelPoolConfig' => $vendorDir . '/google/grpc-gcp/src/generated/Grpc/Gcp/ChannelPoolConfig.php', + 'Grpc\\Gcp\\MethodConfig' => $vendorDir . '/google/grpc-gcp/src/generated/Grpc/Gcp/MethodConfig.php', 'ReturnTypeWillChange' => $vendorDir . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', ); diff --git a/lib/Google/vendor/composer/autoload_psr4.php b/lib/Google/vendor/composer/autoload_psr4.php index 8f8c57ddb..a6b60b0d6 100644 --- a/lib/Google/vendor/composer/autoload_psr4.php +++ b/lib/Google/vendor/composer/autoload_psr4.php @@ -20,11 +20,31 @@ 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), + 'Grpc\\Gcp\\' => array($vendorDir . '/google/grpc-gcp/src'), + 'Grpc\\' => array($vendorDir . '/grpc/grpc/src/lib'), + 'Google\\Type\\' => array($vendorDir . '/google/common-protos/src/Type'), 'Google\\Service\\' => array($vendorDir . '/google/apiclient-services/src'), + 'Google\\Rpc\\' => array($vendorDir . '/google/common-protos/src/Rpc'), + 'Google\\Protobuf\\' => array($vendorDir . '/google/protobuf/src/Google/Protobuf'), + 'Google\\LongRunning\\' => array($vendorDir . '/google/longrunning/src/LongRunning'), + 'Google\\Iam\\' => array($vendorDir . '/google/common-protos/src/Iam'), 'Google\\Cloud\\Storage\\' => array($vendorDir . '/google/cloud-storage/src'), 'Google\\Cloud\\Core\\' => array($vendorDir . '/google/cloud-core/src'), + 'Google\\Cloud\\' => array($vendorDir . '/google/common-protos/src/Cloud'), 'Google\\Auth\\' => array($vendorDir . '/google/auth/src'), + 'Google\\Api\\' => array($vendorDir . '/google/common-protos/src/Api'), + 'Google\\ApiCore\\LongRunning\\' => array($vendorDir . '/google/longrunning/src/ApiCore/LongRunning'), + 'Google\\ApiCore\\' => array($vendorDir . '/google/gax/src'), 'Google\\' => array($baseDir . '/src'), + 'GPBMetadata\\Google\\Type\\' => array($vendorDir . '/google/common-protos/metadata/Type'), + 'GPBMetadata\\Google\\Rpc\\' => array($vendorDir . '/google/common-protos/metadata/Rpc'), + 'GPBMetadata\\Google\\Protobuf\\' => array($vendorDir . '/google/protobuf/src/GPBMetadata/Google/Protobuf'), + 'GPBMetadata\\Google\\Longrunning\\' => array($vendorDir . '/google/longrunning/metadata/Longrunning'), + 'GPBMetadata\\Google\\Logging\\' => array($vendorDir . '/google/common-protos/metadata/Logging'), + 'GPBMetadata\\Google\\Iam\\' => array($vendorDir . '/google/common-protos/metadata/Iam'), + 'GPBMetadata\\Google\\Cloud\\' => array($vendorDir . '/google/common-protos/metadata/Cloud'), + 'GPBMetadata\\Google\\Api\\' => array($vendorDir . '/google/common-protos/metadata/Api'), + 'GPBMetadata\\ApiCore\\' => array($vendorDir . '/google/gax/metadata/ApiCore'), 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), 'Brick\\Math\\' => array($vendorDir . '/brick/math/src'), ); diff --git a/lib/Google/vendor/composer/autoload_real.php b/lib/Google/vendor/composer/autoload_real.php index a9a344d5e..9659486a6 100644 --- a/lib/Google/vendor/composer/autoload_real.php +++ b/lib/Google/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit2cd6126242849aa869f10969652c4467 +class ComposerAutoloaderInitbd131085cfdbf47b26d7ae00fe412ae4 { private static $loader; @@ -24,16 +24,16 @@ public static function getLoader() require __DIR__ . '/platform_check.php'; - spl_autoload_register(array('ComposerAutoloaderInit2cd6126242849aa869f10969652c4467', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitbd131085cfdbf47b26d7ae00fe412ae4', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit2cd6126242849aa869f10969652c4467', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitbd131085cfdbf47b26d7ae00fe412ae4', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit2cd6126242849aa869f10969652c4467::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4::getInitializer($loader)); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit2cd6126242849aa869f10969652c4467::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/lib/Google/vendor/composer/autoload_static.php b/lib/Google/vendor/composer/autoload_static.php index 05dbabeaa..2cad9318a 100644 --- a/lib/Google/vendor/composer/autoload_static.php +++ b/lib/Google/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit2cd6126242849aa869f10969652c4467 +class ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4 { public static $files = array ( '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', @@ -49,11 +49,31 @@ class ComposerStaticInit2cd6126242849aa869f10969652c4467 'GuzzleHttp\\Psr7\\' => 16, 'GuzzleHttp\\Promise\\' => 19, 'GuzzleHttp\\' => 11, + 'Grpc\\Gcp\\' => 9, + 'Grpc\\' => 5, + 'Google\\Type\\' => 12, 'Google\\Service\\' => 15, + 'Google\\Rpc\\' => 11, + 'Google\\Protobuf\\' => 16, + 'Google\\LongRunning\\' => 19, + 'Google\\Iam\\' => 11, 'Google\\Cloud\\Storage\\' => 21, 'Google\\Cloud\\Core\\' => 18, + 'Google\\Cloud\\' => 13, 'Google\\Auth\\' => 12, + 'Google\\Api\\' => 11, + 'Google\\ApiCore\\LongRunning\\' => 27, + 'Google\\ApiCore\\' => 15, 'Google\\' => 7, + 'GPBMetadata\\Google\\Type\\' => 24, + 'GPBMetadata\\Google\\Rpc\\' => 23, + 'GPBMetadata\\Google\\Protobuf\\' => 28, + 'GPBMetadata\\Google\\Longrunning\\' => 31, + 'GPBMetadata\\Google\\Logging\\' => 27, + 'GPBMetadata\\Google\\Iam\\' => 23, + 'GPBMetadata\\Google\\Cloud\\' => 25, + 'GPBMetadata\\Google\\Api\\' => 23, + 'GPBMetadata\\ApiCore\\' => 20, ), 'F' => array ( @@ -123,10 +143,38 @@ class ComposerStaticInit2cd6126242849aa869f10969652c4467 array ( 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', ), + 'Grpc\\Gcp\\' => + array ( + 0 => __DIR__ . '/..' . '/google/grpc-gcp/src', + ), + 'Grpc\\' => + array ( + 0 => __DIR__ . '/..' . '/grpc/grpc/src/lib', + ), + 'Google\\Type\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/src/Type', + ), 'Google\\Service\\' => array ( 0 => __DIR__ . '/..' . '/google/apiclient-services/src', ), + 'Google\\Rpc\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/src/Rpc', + ), + 'Google\\Protobuf\\' => + array ( + 0 => __DIR__ . '/..' . '/google/protobuf/src/Google/Protobuf', + ), + 'Google\\LongRunning\\' => + array ( + 0 => __DIR__ . '/..' . '/google/longrunning/src/LongRunning', + ), + 'Google\\Iam\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/src/Iam', + ), 'Google\\Cloud\\Storage\\' => array ( 0 => __DIR__ . '/..' . '/google/cloud-storage/src', @@ -135,14 +183,66 @@ class ComposerStaticInit2cd6126242849aa869f10969652c4467 array ( 0 => __DIR__ . '/..' . '/google/cloud-core/src', ), + 'Google\\Cloud\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/src/Cloud', + ), 'Google\\Auth\\' => array ( 0 => __DIR__ . '/..' . '/google/auth/src', ), + 'Google\\Api\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/src/Api', + ), + 'Google\\ApiCore\\LongRunning\\' => + array ( + 0 => __DIR__ . '/..' . '/google/longrunning/src/ApiCore/LongRunning', + ), + 'Google\\ApiCore\\' => + array ( + 0 => __DIR__ . '/..' . '/google/gax/src', + ), 'Google\\' => array ( 0 => __DIR__ . '/../..' . '/src', ), + 'GPBMetadata\\Google\\Type\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Type', + ), + 'GPBMetadata\\Google\\Rpc\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Rpc', + ), + 'GPBMetadata\\Google\\Protobuf\\' => + array ( + 0 => __DIR__ . '/..' . '/google/protobuf/src/GPBMetadata/Google/Protobuf', + ), + 'GPBMetadata\\Google\\Longrunning\\' => + array ( + 0 => __DIR__ . '/..' . '/google/longrunning/metadata/Longrunning', + ), + 'GPBMetadata\\Google\\Logging\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Logging', + ), + 'GPBMetadata\\Google\\Iam\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Iam', + ), + 'GPBMetadata\\Google\\Cloud\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Cloud', + ), + 'GPBMetadata\\Google\\Api\\' => + array ( + 0 => __DIR__ . '/..' . '/google/common-protos/metadata/Api', + ), + 'GPBMetadata\\ApiCore\\' => + array ( + 0 => __DIR__ . '/..' . '/google/gax/metadata/ApiCore', + ), 'Firebase\\JWT\\' => array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', @@ -156,6 +256,7 @@ class ComposerStaticInit2cd6126242849aa869f10969652c4467 public static $classMap = array ( 'CURLStringFile' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/CURLStringFile.php', 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'GPBMetadata\\GrpcGcp' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/GPBMetadata/GrpcGcp.php', 'Google_AccessToken_Revoke' => __DIR__ . '/../..' . '/src/aliases.php', 'Google_AccessToken_Verify' => __DIR__ . '/../..' . '/src/aliases.php', 'Google_AuthHandler_AuthHandlerFactory' => __DIR__ . '/../..' . '/src/aliases.php', @@ -176,15 +277,20 @@ class ComposerStaticInit2cd6126242849aa869f10969652c4467 'Google_Task_Retryable' => __DIR__ . '/../..' . '/src/aliases.php', 'Google_Task_Runner' => __DIR__ . '/../..' . '/src/aliases.php', 'Google_Utils_UriTemplate' => __DIR__ . '/../..' . '/src/aliases.php', + 'Grpc\\Gcp\\AffinityConfig' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig.php', + 'Grpc\\Gcp\\AffinityConfig_Command' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/Grpc/Gcp/AffinityConfig_Command.php', + 'Grpc\\Gcp\\ApiConfig' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/Grpc/Gcp/ApiConfig.php', + 'Grpc\\Gcp\\ChannelPoolConfig' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/Grpc/Gcp/ChannelPoolConfig.php', + 'Grpc\\Gcp\\MethodConfig' => __DIR__ . '/..' . '/google/grpc-gcp/src/generated/Grpc/Gcp/MethodConfig.php', 'ReturnTypeWillChange' => __DIR__ . '/..' . '/symfony/polyfill-php81/Resources/stubs/ReturnTypeWillChange.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit2cd6126242849aa869f10969652c4467::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit2cd6126242849aa869f10969652c4467::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit2cd6126242849aa869f10969652c4467::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitbd131085cfdbf47b26d7ae00fe412ae4::$classMap; }, null, ClassLoader::class); } diff --git a/lib/Google/vendor/composer/installed.json b/lib/Google/vendor/composer/installed.json index 761f6d17c..fee314ef9 100644 --- a/lib/Google/vendor/composer/installed.json +++ b/lib/Google/vendor/composer/installed.json @@ -60,27 +60,27 @@ }, { "name": "firebase/php-jwt", - "version": "v6.10.0", - "version_normalized": "6.10.0.0", + "version": "v6.10.1", + "version_normalized": "6.10.1.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", - "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -88,7 +88,7 @@ "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, - "time": "2023-12-01T16:26:39+00:00", + "time": "2024-05-18T18:05:11+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -120,32 +120,32 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, "install-path": "../firebase/php-jwt" }, { "name": "google/apiclient-services", - "version": "v0.323.0", - "version_normalized": "0.323.0.0", + "version": "v0.363.0", + "version_normalized": "0.363.0.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6" + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/d5497d30ddfafe7592102ca48bedaf222a4ca7a6", - "reference": "d5497d30ddfafe7592102ca48bedaf222a4ca7a6", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/5a0943e498e98e23dccdd98c5a3f74bc1b442053", + "reference": "5a0943e498e98e23dccdd98c5a3f74bc1b442053", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.7||^8.5.13" + "phpunit/phpunit": "^9.6" }, - "time": "2023-11-06T01:08:38+00:00", + "time": "2024-07-02T01:04:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -167,46 +167,48 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.323.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.363.0" }, "install-path": "../google/apiclient-services" }, { "name": "google/auth", - "version": "v1.33.0", - "version_normalized": "1.33.0.0", + "version": "v1.40.0", + "version_normalized": "1.40.0.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "682dc6c30bb509953c9e43bb0960d901582da00b" + "reference": "bff9f2d01677e71a98394b5ac981b99523df5178" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/682dc6c30bb509953c9e43bb0960d901582da00b", - "reference": "682dc6c30bb509953c9e43bb0960d901582da00b", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/bff9f2d01677e71a98394b5ac981b99523df5178", + "reference": "bff9f2d01677e71a98394b5ac981b99523df5178", "shasum": "" }, "require": { "firebase/php-jwt": "^6.0", - "guzzlehttp/guzzle": "^6.2.1|^7.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.4.5", - "php": "^7.4||^8.0", - "psr/cache": "^1.0||^2.0||^3.0", + "php": "^8.0", + "psr/cache": "^2.0||^3.0", "psr/http-message": "^1.1||^2.0" }, "require-dev": { "guzzlehttp/promises": "^2.0", "kelvinmo/simplejwt": "0.7.1", - "phpseclib/phpseclib": "^3.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.0.0", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." }, - "time": "2023-11-30T15:49:27+00:00", + "time": "2024-05-31T19:16:15+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -228,41 +230,42 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.33.0" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.40.0" }, "install-path": "../google/auth" }, { "name": "google/cloud-core", - "version": "v1.52.10", - "version_normalized": "1.52.10.0", + "version": "v1.59.1", + "version_normalized": "1.59.1.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "5e34556498ecadee2161402fd1024bec7ce33186" + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/5e34556498ecadee2161402fd1024bec7ce33186", - "reference": "5e34556498ecadee2161402fd1024bec7ce33186", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/35aae23dc4d0b860b6c3733e5cf381a510b506d9", + "reference": "35aae23dc4d0b860b6c3733e5cf381a510b506d9", "shasum": "" }, "require": { - "google/auth": "^1.18", + "google/auth": "^1.34", + "google/gax": "^1.34.0", "guzzlehttp/guzzle": "^6.5.8|^7.4.4", "guzzlehttp/promises": "^1.4||^2.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "monolog/monolog": "^1.1|^2.0|^3.0", - "php": ">=7.4", + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9|^3.0", + "php": "^8.0", "psr/http-message": "^1.0|^2.0", "rize/uri-template": "~0.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-common-protos": "^0.4", - "google/gax": "^1.24.0", + "google/cloud-common-protos": "~0.5", "opis/closure": "^3", - "phpdocumentor/reflection": "^5.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", "squizlabs/php_codesniffer": "2.*" @@ -271,7 +274,7 @@ "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", "symfony/lock": "Required for the Spanner cached based session pool. Please require the following commit: 3.3.x-dev#1ba6ac9" }, - "time": "2023-12-08T22:36:35+00:00", + "time": "2024-08-10T02:24:23+00:00", "bin": [ "bin/google-cloud-batch" ], @@ -296,34 +299,35 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.52.10" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.59.1" }, "install-path": "../google/cloud-core" }, { "name": "google/cloud-storage", - "version": "v1.36.0", - "version_normalized": "1.36.0.0", + "version": "v1.42.1", + "version_normalized": "1.42.1.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-storage.git", - "reference": "94215228fd03e548590134d1e521a34ec727460c" + "reference": "2a418cad887e44d08a86de19a878ea3607212edb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/94215228fd03e548590134d1e521a34ec727460c", - "reference": "94215228fd03e548590134d1e521a34ec727460c", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-storage/zipball/2a418cad887e44d08a86de19a878ea3607212edb", + "reference": "2a418cad887e44d08a86de19a878ea3607212edb", "shasum": "" }, "require": { - "google/cloud-core": "^1.52.7", - "php": ">=7.4", + "google/cloud-core": "^1.55", + "php": "^8.0", "ramsey/uuid": "^4.2.3" }, "require-dev": { "erusev/parsedown": "^1.6", - "google/cloud-pubsub": "^1.0", - "phpdocumentor/reflection": "^5.0", + "google/cloud-pubsub": "^2.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "phpseclib/phpseclib": "^2.0||^3.0", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.0", @@ -333,7 +337,7 @@ "google/cloud-pubsub": "May be used to register a topic to receive bucket notifications.", "phpseclib/phpseclib": "May be used in place of OpenSSL for creating signed Cloud Storage URLs. Please require version ^2." }, - "time": "2023-12-08T22:36:35+00:00", + "time": "2024-07-08T23:14:13+00:00", "type": "library", "extra": { "component": { @@ -355,10 +359,314 @@ ], "description": "Cloud Storage Client for PHP", "support": { - "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.36.0" + "source": "https://github.com/googleapis/google-cloud-php-storage/tree/v1.42.1" }, "install-path": "../google/cloud-storage" }, + { + "name": "google/common-protos", + "version": "v4.7.0", + "version_normalized": "4.7.0.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/common-protos-php.git", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/e58068776f57605c336e32c7db373f0a81da17b8", + "reference": "e58068776f57605c336e32c7db373f0a81da17b8", + "shasum": "" + }, + "require": { + "google/protobuf": "^v3.25.3||^4.26.1", + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "time": "2024-07-25T20:20:43+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "Google\\Cloud\\": "src/Cloud", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google API Common Protos for PHP", + "homepage": "https://github.com/googleapis/common-protos-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/common-protos-php/issues", + "source": "https://github.com/googleapis/common-protos-php/tree/v4.7.0" + }, + "install-path": "../google/common-protos" + }, + { + "name": "google/gax", + "version": "v1.34.1", + "version_normalized": "1.34.1.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/gax-php.git", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/gax-php/zipball/173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "reference": "173f0a97323284f91fd453c4ed7ed8317ecf6cfa", + "shasum": "" + }, + "require": { + "google/auth": "^1.34.0", + "google/common-protos": "^4.4", + "google/grpc-gcp": "^0.4", + "google/longrunning": "~0.4", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^1.13", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "ramsey/uuid": "^4.0" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "time": "2024-08-15T18:00:58+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Google API Core for PHP", + "homepage": "https://github.com/googleapis/gax-php", + "keywords": [ + "google" + ], + "support": { + "issues": "https://github.com/googleapis/gax-php/issues", + "source": "https://github.com/googleapis/gax-php/tree/v1.34.1" + }, + "install-path": "../google/gax" + }, + { + "name": "google/grpc-gcp", + "version": "v0.4.0", + "version_normalized": "0.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "reference": "2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9", + "shasum": "" + }, + "require": { + "google/auth": "^1.3", + "google/protobuf": "^v3.25.3||^4.26.1", + "grpc/grpc": "^v1.13.0", + "php": "^8.0", + "psr/cache": "^1.0.1||^2.0.0||^3.0.0" + }, + "require-dev": { + "google/cloud-spanner": "^1.7", + "phpunit/phpunit": "^9.0" + }, + "time": "2024-04-03T16:37:55+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Grpc\\Gcp\\": "src/" + }, + "classmap": [ + "src/generated/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC GCP library for channel management", + "support": { + "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", + "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.4.0" + }, + "install-path": "../google/grpc-gcp" + }, + { + "name": "google/longrunning", + "version": "0.4.3", + "version_normalized": "0.4.3.0", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-longrunning.git", + "reference": "ed718a735e407826c3332b7197a44602eb03e608" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-longrunning/zipball/ed718a735e407826c3332b7197a44602eb03e608", + "reference": "ed718a735e407826c3332b7197a44602eb03e608", + "shasum": "" + }, + "require-dev": { + "google/gax": "^1.34.0", + "phpunit/phpunit": "^9.0" + }, + "time": "2024-06-01T03:14:01+00:00", + "type": "library", + "extra": { + "component": { + "id": "longrunning", + "path": "LongRunning", + "entry": null, + "target": "googleapis/php-longrunning" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\LongRunning\\": "src/LongRunning", + "Google\\ApiCore\\LongRunning\\": "src/ApiCore/LongRunning", + "GPBMetadata\\Google\\Longrunning\\": "metadata/Longrunning" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Google LongRunning Client for PHP", + "support": { + "source": "https://github.com/googleapis/php-longrunning/tree/v0.4.3" + }, + "install-path": "../google/longrunning" + }, + { + "name": "google/protobuf", + "version": "v4.27.3", + "version_normalized": "4.27.3.0", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "ff079fe467bf86ac8f3359e2eb77a1613ebd204d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/ff079fe467bf86ac8f3359e2eb77a1613ebd204d", + "reference": "ff079fe467bf86ac8f3359e2eb77a1613ebd204d", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "time": "2024-07-31T13:27:16+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v4.27.3" + }, + "install-path": "../google/protobuf" + }, + { + "name": "grpc/grpc", + "version": "1.57.0", + "version_normalized": "1.57.0.0", + "source": { + "type": "git", + "url": "https://github.com/grpc/grpc-php.git", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/grpc/grpc-php/zipball/b610c42022ed3a22f831439cb93802f2a4502fdf", + "reference": "b610c42022ed3a22f831439cb93802f2a4502fdf", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "google/auth": "^v1.3.0" + }, + "suggest": { + "ext-protobuf": "For better performance, install the protobuf C extension.", + "google/protobuf": "To get started using grpc quickly, install the native protobuf library." + }, + "time": "2023-08-14T23:57:54+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Grpc\\": "src/lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "gRPC library for PHP", + "homepage": "https://grpc.io", + "keywords": [ + "rpc" + ], + "support": { + "source": "https://github.com/grpc/grpc-php/tree/v1.57.0" + }, + "install-path": "../grpc/grpc" + }, { "name": "guzzlehttp/guzzle", "version": "7.8.1", @@ -695,17 +1003,17 @@ }, { "name": "monolog/monolog", - "version": "2.9.2", - "version_normalized": "2.9.2.0", + "version": "2.9.3", + "version_normalized": "2.9.3.0", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f" + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", - "reference": "437cb3628f4cf6042cc10ae97fc2b8472e48ca1f", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/a30bfe2e142720dfa990d0a7e573997f5d884215", + "reference": "a30bfe2e142720dfa990d0a7e573997f5d884215", "shasum": "" }, "require": { @@ -726,8 +1034,8 @@ "mongodb/mongodb": "^1.8", "php-amqplib/php-amqplib": "~2.4 || ^3", "phpspec/prophecy": "^1.15", - "phpstan/phpstan": "^0.12.91", - "phpunit/phpunit": "^8.5.14", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", "predis/predis": "^1.1 || ^2.0", "rollbar/rollbar": "^1.3 || ^2 || ^3", "ruflin/elastica": "^7", @@ -751,7 +1059,7 @@ "rollbar/rollbar": "Allow sending log messages to Rollbar", "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, - "time": "2023-10-27T15:25:26+00:00", + "time": "2024-04-12T20:52:51+00:00", "type": "library", "extra": { "branch-alias": { @@ -784,7 +1092,7 @@ ], "support": { "issues": "https://github.com/Seldaek/monolog/issues", - "source": "https://github.com/Seldaek/monolog/tree/2.9.2" + "source": "https://github.com/Seldaek/monolog/tree/2.9.3" }, "funding": [ { @@ -800,27 +1108,27 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.6.3", - "version_normalized": "2.6.3.0", + "version": "v3.0.0", + "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "58c3f47f650c94ec05a151692652a868995d2938" + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", - "reference": "58c3f47f650c94ec05a151692652a868995d2938", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", "shasum": "" }, "require": { - "php": "^7|^8" + "php": "^8" }, "require-dev": { - "phpunit/phpunit": "^6|^7|^8|^9", - "vimeo/psalm": "^1|^2|^3|^4" + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" }, - "time": "2022-06-14T06:56:20+00:00", + "time": "2024-05-08T12:36:18+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -923,21 +1231,21 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.37", - "version_normalized": "3.0.37.0", + "version": "3.0.39", + "version_normalized": "3.0.39.0", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8" + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/cfa2013d0f68c062055180dd4328cc8b9d1f30b8", - "reference": "cfa2013d0f68c062055180dd4328cc8b9d1f30b8", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/211ebc399c6e73c225a018435fe5ae209d1d1485", + "reference": "211ebc399c6e73c225a018435fe5ae209d1d1485", "shasum": "" }, "require": { - "paragonie/constant_time_encoding": "^1|^2", + "paragonie/constant_time_encoding": "^1|^2|^3", "paragonie/random_compat": "^1.4|^2.0|^9.99.99", "php": ">=5.6.1" }, @@ -951,7 +1259,7 @@ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." }, - "time": "2024-03-03T02:14:58+00:00", + "time": "2024-06-24T06:27:33+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1016,7 +1324,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.37" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.39" }, "funding": [ { @@ -1036,23 +1344,23 @@ }, { "name": "psr/cache", - "version": "2.0.0", - "version_normalized": "2.0.0.0", + "version": "3.0.0", + "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/cache.git", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { "php": ">=8.0.0" }, - "time": "2021-02-03T23:23:37+00:00", + "time": "2021-02-03T23:26:27+00:00", "type": "library", "extra": { "branch-alias": { @@ -1082,7 +1390,7 @@ "psr-6" ], "support": { - "source": "https://github.com/php-fig/cache/tree/2.0.0" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, "install-path": "../psr/cache" }, @@ -1143,24 +1451,24 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", - "version_normalized": "1.0.2.0", + "version": "1.1.0", + "version_normalized": "1.1.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, - "time": "2023-04-10T20:10:41+00:00", + "time": "2024-04-15T12:06:14+00:00", "type": "library", "extra": { "branch-alias": { @@ -1183,7 +1491,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1195,7 +1503,7 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, "install-path": "../psr/http-factory" }, @@ -1450,21 +1758,21 @@ }, { "name": "ramsey/uuid", - "version": "4.7.5", - "version_normalized": "4.7.5.0", + "version": "4.7.6", + "version_normalized": "4.7.6.0", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e" + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", - "reference": "5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -1501,7 +1809,7 @@ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." }, - "time": "2023-11-08T05:53:05+00:00", + "time": "2024-04-27T21:32:50+00:00", "type": "library", "extra": { "captainhook": { @@ -1529,7 +1837,7 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.5" + "source": "https://github.com/ramsey/uuid/tree/4.7.6" }, "funding": [ { @@ -1545,17 +1853,17 @@ }, { "name": "rize/uri-template", - "version": "0.3.5", - "version_normalized": "0.3.5.0", + "version": "0.3.6", + "version_normalized": "0.3.6.0", "source": { "type": "git", "url": "https://github.com/rize/UriTemplate.git", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168" + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/5ed4ba8ea34af84485dea815d4b6b620794d1168", - "reference": "5ed4ba8ea34af84485dea815d4b6b620794d1168", + "url": "https://api.github.com/repos/rize/UriTemplate/zipball/34efe65c79710eed0883884f2285ae6d4a0aad19", + "reference": "34efe65c79710eed0883884f2285ae6d4a0aad19", "shasum": "" }, "require": { @@ -1564,7 +1872,7 @@ "require-dev": { "phpunit/phpunit": "~4.8.36" }, - "time": "2022-10-12T17:22:51+00:00", + "time": "2024-03-10T08:07:49+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1590,7 +1898,7 @@ ], "support": { "issues": "https://github.com/rize/UriTemplate/issues", - "source": "https://github.com/rize/UriTemplate/tree/0.3.5" + "source": "https://github.com/rize/UriTemplate/tree/0.3.6" }, "funding": [ { @@ -1680,28 +1988,25 @@ }, { "name": "symfony/polyfill-php81", - "version": "v1.28.0", - "version_normalized": "1.28.0.0", + "version": "v1.30.0", + "version_normalized": "1.30.0.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b" + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/7581cd600fa9fd681b797d00b02f068e2f13263b", - "reference": "7581cd600fa9fd681b797d00b02f068e2f13263b", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", + "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", "shasum": "" }, "require": { "php": ">=7.1" }, - "time": "2023-01-26T09:26:14+00:00", + "time": "2024-06-19T12:30:46+00:00", "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.28-dev" - }, "thanks": { "name": "symfony/polyfill", "url": "https://github.com/symfony/polyfill" @@ -1742,7 +2047,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.28.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" }, "funding": [ { diff --git a/lib/Google/vendor/composer/installed.php b/lib/Google/vendor/composer/installed.php index 2b0615279..66824ea8c 100644 --- a/lib/Google/vendor/composer/installed.php +++ b/lib/Google/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'google/apiclient', 'pretty_version' => 'dev-latest', 'version' => 'dev-latest', - 'reference' => 'cb005f7d32cc2da68e63ac4cc39bbd53a556d581', + 'reference' => 'ef13b8486768945c2b8c6b32e4aa2914eaeb468d', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -20,9 +20,9 @@ 'dev_requirement' => false, ), 'firebase/php-jwt' => array( - 'pretty_version' => 'v6.10.0', - 'version' => '6.10.0.0', - 'reference' => 'a49db6f0a5033aef5143295342f1c95521b075ff', + 'pretty_version' => 'v6.10.1', + 'version' => '6.10.1.0', + 'reference' => '500501c2ce893c824c801da135d02661199f60c5', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), @@ -31,48 +31,102 @@ 'google/apiclient' => array( 'pretty_version' => 'dev-latest', 'version' => 'dev-latest', - 'reference' => 'cb005f7d32cc2da68e63ac4cc39bbd53a556d581', + 'reference' => 'ef13b8486768945c2b8c6b32e4aa2914eaeb468d', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'google/apiclient-services' => array( - 'pretty_version' => 'v0.323.0', - 'version' => '0.323.0.0', - 'reference' => 'd5497d30ddfafe7592102ca48bedaf222a4ca7a6', + 'pretty_version' => 'v0.363.0', + 'version' => '0.363.0.0', + 'reference' => '5a0943e498e98e23dccdd98c5a3f74bc1b442053', 'type' => 'library', 'install_path' => __DIR__ . '/../google/apiclient-services', 'aliases' => array(), 'dev_requirement' => false, ), 'google/auth' => array( - 'pretty_version' => 'v1.33.0', - 'version' => '1.33.0.0', - 'reference' => '682dc6c30bb509953c9e43bb0960d901582da00b', + 'pretty_version' => 'v1.40.0', + 'version' => '1.40.0.0', + 'reference' => 'bff9f2d01677e71a98394b5ac981b99523df5178', 'type' => 'library', 'install_path' => __DIR__ . '/../google/auth', 'aliases' => array(), 'dev_requirement' => false, ), 'google/cloud-core' => array( - 'pretty_version' => 'v1.52.10', - 'version' => '1.52.10.0', - 'reference' => '5e34556498ecadee2161402fd1024bec7ce33186', + 'pretty_version' => 'v1.59.1', + 'version' => '1.59.1.0', + 'reference' => '35aae23dc4d0b860b6c3733e5cf381a510b506d9', 'type' => 'library', 'install_path' => __DIR__ . '/../google/cloud-core', 'aliases' => array(), 'dev_requirement' => false, ), 'google/cloud-storage' => array( - 'pretty_version' => 'v1.36.0', - 'version' => '1.36.0.0', - 'reference' => '94215228fd03e548590134d1e521a34ec727460c', + 'pretty_version' => 'v1.42.1', + 'version' => '1.42.1.0', + 'reference' => '2a418cad887e44d08a86de19a878ea3607212edb', 'type' => 'library', 'install_path' => __DIR__ . '/../google/cloud-storage', 'aliases' => array(), 'dev_requirement' => false, ), + 'google/common-protos' => array( + 'pretty_version' => 'v4.7.0', + 'version' => '4.7.0.0', + 'reference' => 'e58068776f57605c336e32c7db373f0a81da17b8', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/common-protos', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/gax' => array( + 'pretty_version' => 'v1.34.1', + 'version' => '1.34.1.0', + 'reference' => '173f0a97323284f91fd453c4ed7ed8317ecf6cfa', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/gax', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/grpc-gcp' => array( + 'pretty_version' => 'v0.4.0', + 'version' => '0.4.0.0', + 'reference' => '2a80dbf690922aa52bb6bb79b9a32a9637a5c2d9', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/grpc-gcp', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/longrunning' => array( + 'pretty_version' => '0.4.3', + 'version' => '0.4.3.0', + 'reference' => 'ed718a735e407826c3332b7197a44602eb03e608', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/longrunning', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'google/protobuf' => array( + 'pretty_version' => 'v4.27.3', + 'version' => '4.27.3.0', + 'reference' => 'ff079fe467bf86ac8f3359e2eb77a1613ebd204d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../google/protobuf', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'grpc/grpc' => array( + 'pretty_version' => '1.57.0', + 'version' => '1.57.0.0', + 'reference' => 'b610c42022ed3a22f831439cb93802f2a4502fdf', + 'type' => 'library', + 'install_path' => __DIR__ . '/../grpc/grpc', + 'aliases' => array(), + 'dev_requirement' => false, + ), 'guzzlehttp/guzzle' => array( 'pretty_version' => '7.8.1', 'version' => '7.8.1.0', @@ -101,18 +155,18 @@ 'dev_requirement' => false, ), 'monolog/monolog' => array( - 'pretty_version' => '2.9.2', - 'version' => '2.9.2.0', - 'reference' => '437cb3628f4cf6042cc10ae97fc2b8472e48ca1f', + 'pretty_version' => '2.9.3', + 'version' => '2.9.3.0', + 'reference' => 'a30bfe2e142720dfa990d0a7e573997f5d884215', 'type' => 'library', 'install_path' => __DIR__ . '/../monolog/monolog', 'aliases' => array(), 'dev_requirement' => false, ), 'paragonie/constant_time_encoding' => array( - 'pretty_version' => 'v2.6.3', - 'version' => '2.6.3.0', - 'reference' => '58c3f47f650c94ec05a151692652a868995d2938', + 'pretty_version' => 'v3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'df1e7fde177501eee2037dd159cf04f5f301a512', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/constant_time_encoding', 'aliases' => array(), @@ -128,18 +182,18 @@ 'dev_requirement' => false, ), 'phpseclib/phpseclib' => array( - 'pretty_version' => '3.0.37', - 'version' => '3.0.37.0', - 'reference' => 'cfa2013d0f68c062055180dd4328cc8b9d1f30b8', + 'pretty_version' => '3.0.39', + 'version' => '3.0.39.0', + 'reference' => '211ebc399c6e73c225a018435fe5ae209d1d1485', 'type' => 'library', 'install_path' => __DIR__ . '/../phpseclib/phpseclib', 'aliases' => array(), 'dev_requirement' => false, ), 'psr/cache' => array( - 'pretty_version' => '2.0.0', - 'version' => '2.0.0.0', - 'reference' => '213f9dbc5b9bfbc4f8db86d2838dc968752ce13b', + 'pretty_version' => '3.0.0', + 'version' => '3.0.0.0', + 'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/cache', 'aliases' => array(), @@ -161,9 +215,9 @@ ), ), 'psr/http-factory' => array( - 'pretty_version' => '1.0.2', - 'version' => '1.0.2.0', - 'reference' => 'e616d01114759c4c489f93b099585439f795fe35', + 'pretty_version' => '1.1.0', + 'version' => '1.1.0.0', + 'reference' => '2b4765fddfe3b508ac62f829e852b1501d3f6e8a', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/http-factory', 'aliases' => array(), @@ -224,9 +278,9 @@ 'dev_requirement' => false, ), 'ramsey/uuid' => array( - 'pretty_version' => '4.7.5', - 'version' => '4.7.5.0', - 'reference' => '5f0df49ae5ad6efb7afa69e6bfab4e5b1e080d8e', + 'pretty_version' => '4.7.6', + 'version' => '4.7.6.0', + 'reference' => '91039bc1faa45ba123c4328958e620d382ec7088', 'type' => 'library', 'install_path' => __DIR__ . '/../ramsey/uuid', 'aliases' => array(), @@ -235,13 +289,13 @@ 'rhumsaa/uuid' => array( 'dev_requirement' => false, 'replaced' => array( - 0 => '4.7.5', + 0 => '4.7.6', ), ), 'rize/uri-template' => array( - 'pretty_version' => '0.3.5', - 'version' => '0.3.5.0', - 'reference' => '5ed4ba8ea34af84485dea815d4b6b620794d1168', + 'pretty_version' => '0.3.6', + 'version' => '0.3.6.0', + 'reference' => '34efe65c79710eed0883884f2285ae6d4a0aad19', 'type' => 'library', 'install_path' => __DIR__ . '/../rize/uri-template', 'aliases' => array(), @@ -257,9 +311,9 @@ 'dev_requirement' => false, ), 'symfony/polyfill-php81' => array( - 'pretty_version' => 'v1.28.0', - 'version' => '1.28.0.0', - 'reference' => '7581cd600fa9fd681b797d00b02f068e2f13263b', + 'pretty_version' => 'v1.30.0', + 'version' => '1.30.0.0', + 'reference' => '3fb075789fb91f9ad9af537c4012d523085bd5af', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-php81', 'aliases' => array(), diff --git a/lib/Google/vendor/firebase/php-jwt/CHANGELOG.md b/lib/Google/vendor/firebase/php-jwt/CHANGELOG.md index 644fa0bea..2662b0502 100644 --- a/lib/Google/vendor/firebase/php-jwt/CHANGELOG.md +++ b/lib/Google/vendor/firebase/php-jwt/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [6.10.1](https://github.com/firebase/php-jwt/compare/v6.10.0...v6.10.1) (2024-05-18) + + +### Bug Fixes + +* ensure ratelimit expiry is set every time ([#556](https://github.com/firebase/php-jwt/issues/556)) ([09cb208](https://github.com/firebase/php-jwt/commit/09cb2081c2c3bc0f61e2f2a5fbea5741f7498648)) +* ratelimit cache expiration ([#550](https://github.com/firebase/php-jwt/issues/550)) ([dda7250](https://github.com/firebase/php-jwt/commit/dda725033585ece30ff8cae8937320d7e9f18bae)) + ## [6.10.0](https://github.com/firebase/php-jwt/compare/v6.9.0...v6.10.0) (2023-11-28) diff --git a/lib/Google/vendor/firebase/php-jwt/README.md b/lib/Google/vendor/firebase/php-jwt/README.md index 701de23a8..4fd140745 100644 --- a/lib/Google/vendor/firebase/php-jwt/README.md +++ b/lib/Google/vendor/firebase/php-jwt/README.md @@ -17,7 +17,7 @@ composer require firebase/php-jwt ``` Optionally, install the `paragonie/sodium_compat` package from composer if your -php is < 7.2 or does not have libsodium installed: +php env does not have libsodium installed: ```bash composer require paragonie/sodium_compat diff --git a/lib/Google/vendor/firebase/php-jwt/composer.json b/lib/Google/vendor/firebase/php-jwt/composer.json index e23dfe378..816cfd0bd 100644 --- a/lib/Google/vendor/firebase/php-jwt/composer.json +++ b/lib/Google/vendor/firebase/php-jwt/composer.json @@ -20,7 +20,7 @@ ], "license": "BSD-3-Clause", "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "suggest": { "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present", @@ -32,10 +32,10 @@ } }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" } diff --git a/lib/Google/vendor/firebase/php-jwt/src/CachedKeySet.php b/lib/Google/vendor/firebase/php-jwt/src/CachedKeySet.php index ee529f9f5..65bab74f2 100644 --- a/lib/Google/vendor/firebase/php-jwt/src/CachedKeySet.php +++ b/lib/Google/vendor/firebase/php-jwt/src/CachedKeySet.php @@ -212,15 +212,21 @@ private function rateLimitExceeded(): bool } $cacheItem = $this->cache->getItem($this->rateLimitCacheKey); - if (!$cacheItem->isHit()) { - $cacheItem->expiresAfter(1); // # of calls are cached each minute + + $cacheItemData = []; + if ($cacheItem->isHit() && \is_array($data = $cacheItem->get())) { + $cacheItemData = $data; } - $callsPerMinute = (int) $cacheItem->get(); + $callsPerMinute = $cacheItemData['callsPerMinute'] ?? 0; + $expiry = $cacheItemData['expiry'] ?? new \DateTime('+60 seconds', new \DateTimeZone('UTC')); + if (++$callsPerMinute > $this->maxCallsPerMinute) { return true; } - $cacheItem->set($callsPerMinute); + + $cacheItem->set(['expiry' => $expiry, 'callsPerMinute' => $callsPerMinute]); + $cacheItem->expiresAt($expiry); $this->cache->save($cacheItem); return false; } diff --git a/lib/Google/vendor/firebase/php-jwt/src/JWT.php b/lib/Google/vendor/firebase/php-jwt/src/JWT.php index 263492068..e9d756398 100644 --- a/lib/Google/vendor/firebase/php-jwt/src/JWT.php +++ b/lib/Google/vendor/firebase/php-jwt/src/JWT.php @@ -251,6 +251,9 @@ public static function sign( return \hash_hmac($algorithm, $msg, $key, true); case 'openssl': $signature = ''; + if (!\is_resource($key) && !openssl_pkey_get_private($key)) { + throw new DomainException('OpenSSL unable to validate key'); + } $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line if (!$success) { throw new DomainException('OpenSSL unable to sign data'); diff --git a/lib/Google/vendor/google/apiclient-services/composer.json b/lib/Google/vendor/google/apiclient-services/composer.json index ecc41f4e1..586694df8 100644 --- a/lib/Google/vendor/google/apiclient-services/composer.json +++ b/lib/Google/vendor/google/apiclient-services/composer.json @@ -6,10 +6,10 @@ "homepage": "http://developers.google.com/api-client-library/php", "license": "Apache-2.0", "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "phpunit/phpunit": "^5.7||^8.5.13" + "phpunit/phpunit": "^9.6" }, "autoload": { "psr-4": { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage.php b/lib/Google/vendor/google/apiclient-services/src/Storage.php index 9f8fb34e4..4efde3e30 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage.php @@ -50,11 +50,12 @@ class Storage extends \Google\Service const DEVSTORAGE_READ_WRITE = "https://www.googleapis.com/auth/devstorage.read_write"; - public $anywhereCache; + public $anywhereCaches; public $bucketAccessControls; public $buckets; public $channels; public $defaultObjectAccessControls; + public $folders; public $managedFolders; public $notifications; public $objectAccessControls; @@ -62,6 +63,7 @@ class Storage extends \Google\Service public $operations; public $projects_hmacKeys; public $projects_serviceAccount; + public $rootUrlTemplate; /** * Constructs the internal representation of the Storage service. @@ -74,15 +76,16 @@ public function __construct($clientOrConfig = [], $rootUrl = null) { parent::__construct($clientOrConfig); $this->rootUrl = $rootUrl ?: 'https://storage.googleapis.com/'; + $this->rootUrlTemplate = $rootUrl ?: 'https://storage.UNIVERSE_DOMAIN/'; $this->servicePath = 'storage/v1/'; $this->batchPath = 'batch/storage/v1'; $this->version = 'v1'; $this->serviceName = 'storage'; - $this->anywhereCache = new Storage\Resource\AnywhereCache( + $this->anywhereCaches = new Storage\Resource\AnywhereCaches( $this, $this->serviceName, - 'anywhereCache', + 'anywhereCaches', [ 'methods' => [ 'disable' => [ @@ -126,7 +129,7 @@ public function __construct($clientOrConfig = [], $rootUrl = null) ], ], ],'list' => [ - 'path' => 'b/{bucket}/anywhereCache', + 'path' => 'b/{bucket}/anywhereCaches', 'httpMethod' => 'GET', 'parameters' => [ 'bucket' => [ @@ -378,6 +381,20 @@ public function __construct($clientOrConfig = [], $rootUrl = null) 'type' => 'string', ], ], + ],'getStorageLayout' => [ + 'path' => 'b/{bucket}/storageLayout', + 'httpMethod' => 'GET', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'prefix' => [ + 'location' => 'query', + 'type' => 'string', + ], + ], ],'insert' => [ 'path' => 'b', 'httpMethod' => 'POST', @@ -699,6 +716,138 @@ public function __construct($clientOrConfig = [], $rootUrl = null) ] ] ); + $this->folders = new Storage\Resource\Folders( + $this, + $this->serviceName, + 'folders', + [ + 'methods' => [ + 'delete' => [ + 'path' => 'b/{bucket}/folders/{folder}', + 'httpMethod' => 'DELETE', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'folder' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'ifMetagenerationMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'ifMetagenerationNotMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + ], + ],'get' => [ + 'path' => 'b/{bucket}/folders/{folder}', + 'httpMethod' => 'GET', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'folder' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'ifMetagenerationMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'ifMetagenerationNotMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + ], + ],'insert' => [ + 'path' => 'b/{bucket}/folders', + 'httpMethod' => 'POST', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'recursive' => [ + 'location' => 'query', + 'type' => 'boolean', + ], + ], + ],'list' => [ + 'path' => 'b/{bucket}/folders', + 'httpMethod' => 'GET', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'delimiter' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'endOffset' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'pageSize' => [ + 'location' => 'query', + 'type' => 'integer', + ], + 'pageToken' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'prefix' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'startOffset' => [ + 'location' => 'query', + 'type' => 'string', + ], + ], + ],'rename' => [ + 'path' => 'b/{bucket}/folders/{sourceFolder}/renameTo/folders/{destinationFolder}', + 'httpMethod' => 'POST', + 'parameters' => [ + 'bucket' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'sourceFolder' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'destinationFolder' => [ + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ], + 'ifSourceMetagenerationMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + 'ifSourceMetagenerationNotMatch' => [ + 'location' => 'query', + 'type' => 'string', + ], + ], + ], + ] + ] + ); $this->managedFolders = new Storage\Resource\ManagedFolders( $this, $this->serviceName, @@ -719,6 +868,10 @@ public function __construct($clientOrConfig = [], $rootUrl = null) 'type' => 'string', 'required' => true, ], + 'allowNonEmpty' => [ + 'location' => 'query', + 'type' => 'boolean', + ], 'ifMetagenerationMatch' => [ 'location' => 'query', 'type' => 'string', @@ -1512,15 +1665,15 @@ public function __construct($clientOrConfig = [], $rootUrl = null) 'type' => 'string', 'required' => true, ], - 'copySourceAcl' => [ - 'location' => 'query', - 'type' => 'boolean', - ], 'generation' => [ 'location' => 'query', 'type' => 'string', 'required' => true, ], + 'copySourceAcl' => [ + 'location' => 'query', + 'type' => 'boolean', + ], 'ifGenerationMatch' => [ 'location' => 'query', 'type' => 'string', diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/AnywhereCache.php b/lib/Google/vendor/google/apiclient-services/src/Storage/AnywhereCache.php index d31c489a5..a80f1c9c5 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/AnywhereCache.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/AnywhereCache.php @@ -63,6 +63,10 @@ class AnywhereCache extends \Google\Model * @var string */ public $updateTime; + /** + * @var string + */ + public $zone; /** * @param string @@ -218,6 +222,20 @@ public function getUpdateTime() { return $this->updateTime; } + /** + * @param string + */ + public function setZone($zone) + { + $this->zone = $zone; + } + /** + * @return string + */ + public function getZone() + { + return $this->zone; + } } // Adding a class alias for backwards compatibility with the previous class name. diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Bucket.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Bucket.php index ac732ea62..690ce0694 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Bucket.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Bucket.php @@ -42,6 +42,8 @@ class Bucket extends \Google\Collection * @var string */ public $etag; + protected $hierarchicalNamespaceType = BucketHierarchicalNamespace::class; + protected $hierarchicalNamespaceDataType = ''; protected $iamConfigurationType = BucketIamConfiguration::class; protected $iamConfigurationDataType = ''; /** @@ -243,6 +245,20 @@ public function getEtag() { return $this->etag; } + /** + * @param BucketHierarchicalNamespace + */ + public function setHierarchicalNamespace(BucketHierarchicalNamespace $hierarchicalNamespace) + { + $this->hierarchicalNamespace = $hierarchicalNamespace; + } + /** + * @return BucketHierarchicalNamespace + */ + public function getHierarchicalNamespace() + { + return $this->hierarchicalNamespace; + } /** * @param BucketIamConfiguration */ diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/BucketHierarchicalNamespace.php b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketHierarchicalNamespace.php new file mode 100644 index 000000000..efcd78d23 --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketHierarchicalNamespace.php @@ -0,0 +1,44 @@ +enabled = $enabled; + } + /** + * @return bool + */ + public function getEnabled() + { + return $this->enabled; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(BucketHierarchicalNamespace::class, 'Google_Service_Storage_BucketHierarchicalNamespace'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayout.php b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayout.php new file mode 100644 index 000000000..a8036e51a --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayout.php @@ -0,0 +1,130 @@ +bucket = $bucket; + } + /** + * @return string + */ + public function getBucket() + { + return $this->bucket; + } + /** + * @param BucketStorageLayoutCustomPlacementConfig + */ + public function setCustomPlacementConfig(BucketStorageLayoutCustomPlacementConfig $customPlacementConfig) + { + $this->customPlacementConfig = $customPlacementConfig; + } + /** + * @return BucketStorageLayoutCustomPlacementConfig + */ + public function getCustomPlacementConfig() + { + return $this->customPlacementConfig; + } + /** + * @param BucketStorageLayoutHierarchicalNamespace + */ + public function setHierarchicalNamespace(BucketStorageLayoutHierarchicalNamespace $hierarchicalNamespace) + { + $this->hierarchicalNamespace = $hierarchicalNamespace; + } + /** + * @return BucketStorageLayoutHierarchicalNamespace + */ + public function getHierarchicalNamespace() + { + return $this->hierarchicalNamespace; + } + /** + * @param string + */ + public function setKind($kind) + { + $this->kind = $kind; + } + /** + * @return string + */ + public function getKind() + { + return $this->kind; + } + /** + * @param string + */ + public function setLocation($location) + { + $this->location = $location; + } + /** + * @return string + */ + public function getLocation() + { + return $this->location; + } + /** + * @param string + */ + public function setLocationType($locationType) + { + $this->locationType = $locationType; + } + /** + * @return string + */ + public function getLocationType() + { + return $this->locationType; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(BucketStorageLayout::class, 'Google_Service_Storage_BucketStorageLayout'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutCustomPlacementConfig.php b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutCustomPlacementConfig.php new file mode 100644 index 000000000..57ae92bfa --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutCustomPlacementConfig.php @@ -0,0 +1,45 @@ +dataLocations = $dataLocations; + } + /** + * @return string[] + */ + public function getDataLocations() + { + return $this->dataLocations; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(BucketStorageLayoutCustomPlacementConfig::class, 'Google_Service_Storage_BucketStorageLayoutCustomPlacementConfig'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutHierarchicalNamespace.php b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutHierarchicalNamespace.php new file mode 100644 index 000000000..8e6bc3f35 --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/BucketStorageLayoutHierarchicalNamespace.php @@ -0,0 +1,44 @@ +enabled = $enabled; + } + /** + * @return bool + */ + public function getEnabled() + { + return $this->enabled; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(BucketStorageLayoutHierarchicalNamespace::class, 'Google_Service_Storage_BucketStorageLayoutHierarchicalNamespace'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Folder.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Folder.php new file mode 100644 index 000000000..11a41f3ac --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Folder.php @@ -0,0 +1,186 @@ +bucket = $bucket; + } + /** + * @return string + */ + public function getBucket() + { + return $this->bucket; + } + /** + * @param string + */ + public function setCreateTime($createTime) + { + $this->createTime = $createTime; + } + /** + * @return string + */ + public function getCreateTime() + { + return $this->createTime; + } + /** + * @param string + */ + public function setId($id) + { + $this->id = $id; + } + /** + * @return string + */ + public function getId() + { + return $this->id; + } + /** + * @param string + */ + public function setKind($kind) + { + $this->kind = $kind; + } + /** + * @return string + */ + public function getKind() + { + return $this->kind; + } + /** + * @param string + */ + public function setMetageneration($metageneration) + { + $this->metageneration = $metageneration; + } + /** + * @return string + */ + public function getMetageneration() + { + return $this->metageneration; + } + /** + * @param string + */ + public function setName($name) + { + $this->name = $name; + } + /** + * @return string + */ + public function getName() + { + return $this->name; + } + /** + * @param FolderPendingRenameInfo + */ + public function setPendingRenameInfo(FolderPendingRenameInfo $pendingRenameInfo) + { + $this->pendingRenameInfo = $pendingRenameInfo; + } + /** + * @return FolderPendingRenameInfo + */ + public function getPendingRenameInfo() + { + return $this->pendingRenameInfo; + } + /** + * @param string + */ + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + /** + * @return string + */ + public function getSelfLink() + { + return $this->selfLink; + } + /** + * @param string + */ + public function setUpdateTime($updateTime) + { + $this->updateTime = $updateTime; + } + /** + * @return string + */ + public function getUpdateTime() + { + return $this->updateTime; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(Folder::class, 'Google_Service_Storage_Folder'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/FolderPendingRenameInfo.php b/lib/Google/vendor/google/apiclient-services/src/Storage/FolderPendingRenameInfo.php new file mode 100644 index 000000000..186f07a5d --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/FolderPendingRenameInfo.php @@ -0,0 +1,44 @@ +operationId = $operationId; + } + /** + * @return string + */ + public function getOperationId() + { + return $this->operationId; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(FolderPendingRenameInfo::class, 'Google_Service_Storage_FolderPendingRenameInfo'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Folders.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Folders.php new file mode 100644 index 000000000..9aae966c3 --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Folders.php @@ -0,0 +1,79 @@ +items = $items; + } + /** + * @return Folder[] + */ + public function getItems() + { + return $this->items; + } + /** + * @param string + */ + public function setKind($kind) + { + $this->kind = $kind; + } + /** + * @return string + */ + public function getKind() + { + return $this->kind; + } + /** + * @param string + */ + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + /** + * @return string + */ + public function getNextPageToken() + { + return $this->nextPageToken; + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(Folders::class, 'Google_Service_Storage_Folders'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningListOperationsResponse.php b/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningListOperationsResponse.php index 55efd1fed..0024c0108 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningListOperationsResponse.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningListOperationsResponse.php @@ -20,6 +20,10 @@ class GoogleLongrunningListOperationsResponse extends \Google\Collection { protected $collection_key = 'operations'; + /** + * @var string + */ + public $kind; /** * @var string */ @@ -27,6 +31,20 @@ class GoogleLongrunningListOperationsResponse extends \Google\Collection protected $operationsType = GoogleLongrunningOperation::class; protected $operationsDataType = 'array'; + /** + * @param string + */ + public function setKind($kind) + { + $this->kind = $kind; + } + /** + * @return string + */ + public function getKind() + { + return $this->kind; + } /** * @param string */ diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningOperation.php b/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningOperation.php index 42db42881..97ea2fdb7 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningOperation.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/GoogleLongrunningOperation.php @@ -25,6 +25,10 @@ class GoogleLongrunningOperation extends \Google\Model public $done; protected $errorType = GoogleRpcStatus::class; protected $errorDataType = ''; + /** + * @var string + */ + public $kind; /** * @var array[] */ @@ -37,6 +41,10 @@ class GoogleLongrunningOperation extends \Google\Model * @var array[] */ public $response; + /** + * @var string + */ + public $selfLink; /** * @param bool @@ -66,6 +74,20 @@ public function getError() { return $this->error; } + /** + * @param string + */ + public function setKind($kind) + { + $this->kind = $kind; + } + /** + * @return string + */ + public function getKind() + { + return $this->kind; + } /** * @param array[] */ @@ -108,6 +130,20 @@ public function getResponse() { return $this->response; } + /** + * @param string + */ + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + /** + * @return string + */ + public function getSelfLink() + { + return $this->selfLink; + } } // Adding a class alias for backwards compatibility with the previous class name. diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCache.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCache.php index 5b2a6934a..2f48d3721 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCache.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCache.php @@ -34,7 +34,7 @@ class AnywhereCache extends \Google\Service\Resource /** * Disables an Anywhere Cache instance. (anywhereCache.disable) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. * @param array $optParams Optional parameters. * @return AnywhereCacheModel @@ -48,7 +48,7 @@ public function disable($bucket, $anywhereCacheId, $optParams = []) /** * Returns the metadata of an Anywhere Cache instance. (anywhereCache.get) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. * @param array $optParams Optional parameters. * @return AnywhereCacheModel @@ -62,7 +62,7 @@ public function get($bucket, $anywhereCacheId, $optParams = []) /** * Creates an Anywhere Cache instance. (anywhereCache.insert) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param AnywhereCacheModel $postBody * @param array $optParams Optional parameters. * @return GoogleLongrunningOperation @@ -77,7 +77,7 @@ public function insert($bucket, AnywhereCacheModel $postBody, $optParams = []) * Returns a list of Anywhere Cache instances of the bucket matching the * criteria. (anywhereCache.listAnywhereCache) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param array $optParams Optional parameters. * * @opt_param int pageSize Maximum number of items return in a single page of @@ -95,7 +95,7 @@ public function listAnywhereCache($bucket, $optParams = []) /** * Pauses an Anywhere Cache instance. (anywhereCache.pause) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. * @param array $optParams Optional parameters. * @return AnywhereCacheModel @@ -109,7 +109,7 @@ public function pause($bucket, $anywhereCacheId, $optParams = []) /** * Resumes a paused or disabled Anywhere Cache instance. (anywhereCache.resume) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. * @param array $optParams Optional parameters. * @return AnywhereCacheModel @@ -124,7 +124,7 @@ public function resume($bucket, $anywhereCacheId, $optParams = []) * Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance. * (anywhereCache.update) * - * @param string $bucket Name of the partent bucket + * @param string $bucket Name of the parent bucket. * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. * @param AnywhereCacheModel $postBody * @param array $optParams Optional parameters. diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCaches.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCaches.php new file mode 100644 index 000000000..490aa12ae --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/AnywhereCaches.php @@ -0,0 +1,149 @@ + + * $storageService = new Google\Service\Storage(...); + * $anywhereCaches = $storageService->anywhereCaches; + * + */ +class AnywhereCaches extends \Google\Service\Resource +{ + /** + * Disables an Anywhere Cache instance. (anywhereCaches.disable) + * + * @param string $bucket Name of the parent bucket. + * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. + * @param array $optParams Optional parameters. + * @return AnywhereCache + * @throws \Google\Service\Exception + */ + public function disable($bucket, $anywhereCacheId, $optParams = []) + { + $params = ['bucket' => $bucket, 'anywhereCacheId' => $anywhereCacheId]; + $params = array_merge($params, $optParams); + return $this->call('disable', [$params], AnywhereCache::class); + } + /** + * Returns the metadata of an Anywhere Cache instance. (anywhereCaches.get) + * + * @param string $bucket Name of the parent bucket. + * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. + * @param array $optParams Optional parameters. + * @return AnywhereCache + * @throws \Google\Service\Exception + */ + public function get($bucket, $anywhereCacheId, $optParams = []) + { + $params = ['bucket' => $bucket, 'anywhereCacheId' => $anywhereCacheId]; + $params = array_merge($params, $optParams); + return $this->call('get', [$params], AnywhereCache::class); + } + /** + * Creates an Anywhere Cache instance. (anywhereCaches.insert) + * + * @param string $bucket Name of the parent bucket. + * @param AnywhereCache $postBody + * @param array $optParams Optional parameters. + * @return GoogleLongrunningOperation + * @throws \Google\Service\Exception + */ + public function insert($bucket, AnywhereCache $postBody, $optParams = []) + { + $params = ['bucket' => $bucket, 'postBody' => $postBody]; + $params = array_merge($params, $optParams); + return $this->call('insert', [$params], GoogleLongrunningOperation::class); + } + /** + * Returns a list of Anywhere Cache instances of the bucket matching the + * criteria. (anywhereCaches.listAnywhereCaches) + * + * @param string $bucket Name of the parent bucket. + * @param array $optParams Optional parameters. + * + * @opt_param int pageSize Maximum number of items to return in a single page of + * responses. Maximum 1000. + * @opt_param string pageToken A previously-returned page token representing + * part of the larger set of results to view. + * @return AnywhereCachesModel + * @throws \Google\Service\Exception + */ + public function listAnywhereCaches($bucket, $optParams = []) + { + $params = ['bucket' => $bucket]; + $params = array_merge($params, $optParams); + return $this->call('list', [$params], AnywhereCachesModel::class); + } + /** + * Pauses an Anywhere Cache instance. (anywhereCaches.pause) + * + * @param string $bucket Name of the parent bucket. + * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. + * @param array $optParams Optional parameters. + * @return AnywhereCache + * @throws \Google\Service\Exception + */ + public function pause($bucket, $anywhereCacheId, $optParams = []) + { + $params = ['bucket' => $bucket, 'anywhereCacheId' => $anywhereCacheId]; + $params = array_merge($params, $optParams); + return $this->call('pause', [$params], AnywhereCache::class); + } + /** + * Resumes a paused or disabled Anywhere Cache instance. (anywhereCaches.resume) + * + * @param string $bucket Name of the parent bucket. + * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. + * @param array $optParams Optional parameters. + * @return AnywhereCache + * @throws \Google\Service\Exception + */ + public function resume($bucket, $anywhereCacheId, $optParams = []) + { + $params = ['bucket' => $bucket, 'anywhereCacheId' => $anywhereCacheId]; + $params = array_merge($params, $optParams); + return $this->call('resume', [$params], AnywhereCache::class); + } + /** + * Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance. + * (anywhereCaches.update) + * + * @param string $bucket Name of the parent bucket. + * @param string $anywhereCacheId The ID of requested Anywhere Cache instance. + * @param AnywhereCache $postBody + * @param array $optParams Optional parameters. + * @return GoogleLongrunningOperation + * @throws \Google\Service\Exception + */ + public function update($bucket, $anywhereCacheId, AnywhereCache $postBody, $optParams = []) + { + $params = ['bucket' => $bucket, 'anywhereCacheId' => $anywhereCacheId, 'postBody' => $postBody]; + $params = array_merge($params, $optParams); + return $this->call('update', [$params], GoogleLongrunningOperation::class); + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(AnywhereCaches::class, 'Google_Service_Storage_Resource_AnywhereCaches'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/BucketAccessControls.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/BucketAccessControls.php index 9e3614a29..957c85814 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/BucketAccessControls.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/BucketAccessControls.php @@ -42,6 +42,7 @@ class BucketAccessControls extends \Google\Service\Resource * * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $entity, $optParams = []) { @@ -62,6 +63,7 @@ public function delete($bucket, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return BucketAccessControl + * @throws \Google\Service\Exception */ public function get($bucket, $entity, $optParams = []) { @@ -80,6 +82,7 @@ public function get($bucket, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return BucketAccessControl + * @throws \Google\Service\Exception */ public function insert($bucket, BucketAccessControl $postBody, $optParams = []) { @@ -97,6 +100,7 @@ public function insert($bucket, BucketAccessControl $postBody, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return BucketAccessControlsModel + * @throws \Google\Service\Exception */ public function listBucketAccessControls($bucket, $optParams = []) { @@ -117,6 +121,7 @@ public function listBucketAccessControls($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return BucketAccessControl + * @throws \Google\Service\Exception */ public function patch($bucket, $entity, BucketAccessControl $postBody, $optParams = []) { @@ -137,6 +142,7 @@ public function patch($bucket, $entity, BucketAccessControl $postBody, $optParam * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return BucketAccessControl + * @throws \Google\Service\Exception */ public function update($bucket, $entity, BucketAccessControl $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Buckets.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Buckets.php index 8e79cb55b..453ea479d 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Buckets.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Buckets.php @@ -18,6 +18,7 @@ namespace Google\Service\Storage\Resource; use Google\Service\Storage\Bucket; +use Google\Service\Storage\BucketStorageLayout; use Google\Service\Storage\Buckets as BucketsModel; use Google\Service\Storage\Policy; use Google\Service\Storage\TestIamPermissionsResponse; @@ -44,6 +45,7 @@ class Buckets extends \Google\Service\Resource * its metageneration does not match this value. * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $optParams = []) { @@ -67,6 +69,7 @@ public function delete($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Bucket + * @throws \Google\Service\Exception */ public function get($bucket, $optParams = []) { @@ -86,6 +89,7 @@ public function get($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function getIamPolicy($bucket, $optParams = []) { @@ -93,6 +97,26 @@ public function getIamPolicy($bucket, $optParams = []) $params = array_merge($params, $optParams); return $this->call('getIamPolicy', [$params], Policy::class); } + /** + * Returns the storage layout configuration for the specified bucket. Note that + * this operation requires storage.objects.list permission. + * (buckets.getStorageLayout) + * + * @param string $bucket Name of a bucket. + * @param array $optParams Optional parameters. + * + * @opt_param string prefix An optional prefix used for permission check. It is + * useful when the caller only has storage.objects.list permission under a + * specific prefix. + * @return BucketStorageLayout + * @throws \Google\Service\Exception + */ + public function getStorageLayout($bucket, $optParams = []) + { + $params = ['bucket' => $bucket]; + $params = array_merge($params, $optParams); + return $this->call('getStorageLayout', [$params], BucketStorageLayout::class); + } /** * Creates a new bucket. (buckets.insert) * @@ -111,6 +135,7 @@ public function getIamPolicy($bucket, $optParams = []) * it defaults to full. * @opt_param string userProject The project to be billed for this request. * @return Bucket + * @throws \Google\Service\Exception */ public function insert($project, Bucket $postBody, $optParams = []) { @@ -134,6 +159,7 @@ public function insert($project, Bucket $postBody, $optParams = []) * @opt_param string projection Set of properties to return. Defaults to noAcl. * @opt_param string userProject The project to be billed for this request. * @return BucketsModel + * @throws \Google\Service\Exception */ public function listBuckets($project, $optParams = []) { @@ -152,6 +178,7 @@ public function listBuckets($project, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Bucket + * @throws \Google\Service\Exception */ public function lockRetentionPolicy($bucket, $ifMetagenerationMatch, $optParams = []) { @@ -182,6 +209,7 @@ public function lockRetentionPolicy($bucket, $ifMetagenerationMatch, $optParams * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Bucket + * @throws \Google\Service\Exception */ public function patch($bucket, Bucket $postBody, $optParams = []) { @@ -199,6 +227,7 @@ public function patch($bucket, Bucket $postBody, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function setIamPolicy($bucket, Policy $postBody, $optParams = []) { @@ -217,6 +246,7 @@ public function setIamPolicy($bucket, Policy $postBody, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return TestIamPermissionsResponse + * @throws \Google\Service\Exception */ public function testIamPermissions($bucket, $permissions, $optParams = []) { @@ -247,6 +277,7 @@ public function testIamPermissions($bucket, $permissions, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Bucket + * @throws \Google\Service\Exception */ public function update($bucket, Bucket $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Channels.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Channels.php index d95d73ee1..4b8214437 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Channels.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Channels.php @@ -34,6 +34,7 @@ class Channels extends \Google\Service\Resource * * @param Channel $postBody * @param array $optParams Optional parameters. + * @throws \Google\Service\Exception */ public function stop(Channel $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/DefaultObjectAccessControls.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/DefaultObjectAccessControls.php index ac0002422..4e83ee516 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/DefaultObjectAccessControls.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/DefaultObjectAccessControls.php @@ -42,6 +42,7 @@ class DefaultObjectAccessControls extends \Google\Service\Resource * * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $entity, $optParams = []) { @@ -62,6 +63,7 @@ public function delete($bucket, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function get($bucket, $entity, $optParams = []) { @@ -80,6 +82,7 @@ public function get($bucket, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function insert($bucket, ObjectAccessControl $postBody, $optParams = []) { @@ -102,6 +105,7 @@ public function insert($bucket, ObjectAccessControl $postBody, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControlsModel + * @throws \Google\Service\Exception */ public function listDefaultObjectAccessControls($bucket, $optParams = []) { @@ -123,6 +127,7 @@ public function listDefaultObjectAccessControls($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function patch($bucket, $entity, ObjectAccessControl $postBody, $optParams = []) { @@ -144,6 +149,7 @@ public function patch($bucket, $entity, ObjectAccessControl $postBody, $optParam * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function update($bucket, $entity, ObjectAccessControl $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Folders.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Folders.php new file mode 100644 index 000000000..6b9347da0 --- /dev/null +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Folders.php @@ -0,0 +1,157 @@ + + * $storageService = new Google\Service\Storage(...); + * $folders = $storageService->folders; + * + */ +class Folders extends \Google\Service\Resource +{ + /** + * Permanently deletes a folder. Only applicable to buckets with hierarchical + * namespace enabled. (folders.delete) + * + * @param string $bucket Name of the bucket in which the folder resides. + * @param string $folder Name of a folder. + * @param array $optParams Optional parameters. + * + * @opt_param string ifMetagenerationMatch If set, only deletes the folder if + * its metageneration matches this value. + * @opt_param string ifMetagenerationNotMatch If set, only deletes the folder if + * its metageneration does not match this value. + * @throws \Google\Service\Exception + */ + public function delete($bucket, $folder, $optParams = []) + { + $params = ['bucket' => $bucket, 'folder' => $folder]; + $params = array_merge($params, $optParams); + return $this->call('delete', [$params]); + } + /** + * Returns metadata for the specified folder. Only applicable to buckets with + * hierarchical namespace enabled. (folders.get) + * + * @param string $bucket Name of the bucket in which the folder resides. + * @param string $folder Name of a folder. + * @param array $optParams Optional parameters. + * + * @opt_param string ifMetagenerationMatch Makes the return of the folder + * metadata conditional on whether the folder's current metageneration matches + * the given value. + * @opt_param string ifMetagenerationNotMatch Makes the return of the folder + * metadata conditional on whether the folder's current metageneration does not + * match the given value. + * @return Folder + * @throws \Google\Service\Exception + */ + public function get($bucket, $folder, $optParams = []) + { + $params = ['bucket' => $bucket, 'folder' => $folder]; + $params = array_merge($params, $optParams); + return $this->call('get', [$params], Folder::class); + } + /** + * Creates a new folder. Only applicable to buckets with hierarchical namespace + * enabled. (folders.insert) + * + * @param string $bucket Name of the bucket in which the folder resides. + * @param Folder $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool recursive If true, any parent folder which doesn’t exist will + * be created automatically. + * @return Folder + * @throws \Google\Service\Exception + */ + public function insert($bucket, Folder $postBody, $optParams = []) + { + $params = ['bucket' => $bucket, 'postBody' => $postBody]; + $params = array_merge($params, $optParams); + return $this->call('insert', [$params], Folder::class); + } + /** + * Retrieves a list of folders matching the criteria. Only applicable to buckets + * with hierarchical namespace enabled. (folders.listFolders) + * + * @param string $bucket Name of the bucket in which to look for folders. + * @param array $optParams Optional parameters. + * + * @opt_param string delimiter Returns results in a directory-like mode. The + * only supported value is '/'. If set, items will only contain folders that + * either exactly match the prefix, or are one level below the prefix. + * @opt_param string endOffset Filter results to folders whose names are + * lexicographically before endOffset. If startOffset is also set, the folders + * listed will have names between startOffset (inclusive) and endOffset + * (exclusive). + * @opt_param int pageSize Maximum number of items to return in a single page of + * responses. + * @opt_param string pageToken A previously-returned page token representing + * part of the larger set of results to view. + * @opt_param string prefix Filter results to folders whose paths begin with + * this prefix. If set, the value must either be an empty string or end with a + * '/'. + * @opt_param string startOffset Filter results to folders whose names are + * lexicographically equal to or after startOffset. If endOffset is also set, + * the folders listed will have names between startOffset (inclusive) and + * endOffset (exclusive). + * @return FoldersModel + * @throws \Google\Service\Exception + */ + public function listFolders($bucket, $optParams = []) + { + $params = ['bucket' => $bucket]; + $params = array_merge($params, $optParams); + return $this->call('list', [$params], FoldersModel::class); + } + /** + * Renames a source folder to a destination folder. Only applicable to buckets + * with hierarchical namespace enabled. (folders.rename) + * + * @param string $bucket Name of the bucket in which the folders are in. + * @param string $sourceFolder Name of the source folder. + * @param string $destinationFolder Name of the destination folder. + * @param array $optParams Optional parameters. + * + * @opt_param string ifSourceMetagenerationMatch Makes the operation conditional + * on whether the source object's current metageneration matches the given + * value. + * @opt_param string ifSourceMetagenerationNotMatch Makes the operation + * conditional on whether the source object's current metageneration does not + * match the given value. + * @return GoogleLongrunningOperation + * @throws \Google\Service\Exception + */ + public function rename($bucket, $sourceFolder, $destinationFolder, $optParams = []) + { + $params = ['bucket' => $bucket, 'sourceFolder' => $sourceFolder, 'destinationFolder' => $destinationFolder]; + $params = array_merge($params, $optParams); + return $this->call('rename', [$params], GoogleLongrunningOperation::class); + } +} + +// Adding a class alias for backwards compatibility with the previous class name. +class_alias(Folders::class, 'Google_Service_Storage_Resource_Folders'); diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ManagedFolders.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ManagedFolders.php index d5e06e144..02df1b6ed 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ManagedFolders.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ManagedFolders.php @@ -39,10 +39,15 @@ class ManagedFolders extends \Google\Service\Resource * @param string $managedFolder The managed folder name/path. * @param array $optParams Optional parameters. * + * @opt_param bool allowNonEmpty Allows the deletion of a managed folder even if + * it is not empty. A managed folder is empty if there are no objects or managed + * folders that it applies to. Callers must have + * storage.managedFolders.setIamPolicy permission. * @opt_param string ifMetagenerationMatch If set, only deletes the managed * folder if its metageneration matches this value. * @opt_param string ifMetagenerationNotMatch If set, only deletes the managed * folder if its metageneration does not match this value. + * @throws \Google\Service\Exception */ public function delete($bucket, $managedFolder, $optParams = []) { @@ -64,6 +69,7 @@ public function delete($bucket, $managedFolder, $optParams = []) * folder metadata conditional on whether the managed folder's current * metageneration does not match the given value. * @return ManagedFolder + * @throws \Google\Service\Exception */ public function get($bucket, $managedFolder, $optParams = []) { @@ -85,6 +91,7 @@ public function get($bucket, $managedFolder, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function getIamPolicy($bucket, $managedFolder, $optParams = []) { @@ -99,6 +106,7 @@ public function getIamPolicy($bucket, $managedFolder, $optParams = []) * @param ManagedFolder $postBody * @param array $optParams Optional parameters. * @return ManagedFolder + * @throws \Google\Service\Exception */ public function insert($bucket, ManagedFolder $postBody, $optParams = []) { @@ -113,13 +121,14 @@ public function insert($bucket, ManagedFolder $postBody, $optParams = []) * @param string $bucket Name of the bucket containing the managed folder. * @param array $optParams Optional parameters. * - * @opt_param int pageSize Maximum number of items return in a single page of + * @opt_param int pageSize Maximum number of items to return in a single page of * responses. * @opt_param string pageToken A previously-returned page token representing * part of the larger set of results to view. * @opt_param string prefix The managed folder name/path prefix to filter the * output list of results. * @return ManagedFoldersModel + * @throws \Google\Service\Exception */ public function listManagedFolders($bucket, $optParams = []) { @@ -139,6 +148,7 @@ public function listManagedFolders($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function setIamPolicy($bucket, $managedFolder, Policy $postBody, $optParams = []) { @@ -158,6 +168,7 @@ public function setIamPolicy($bucket, $managedFolder, Policy $postBody, $optPara * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return TestIamPermissionsResponse + * @throws \Google\Service\Exception */ public function testIamPermissions($bucket, $managedFolder, $permissions, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Notifications.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Notifications.php index 5c81c241f..22a144a21 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Notifications.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Notifications.php @@ -39,6 +39,7 @@ class Notifications extends \Google\Service\Resource * * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $notification, $optParams = []) { @@ -56,6 +57,7 @@ public function delete($bucket, $notification, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Notification + * @throws \Google\Service\Exception */ public function get($bucket, $notification, $optParams = []) { @@ -74,6 +76,7 @@ public function get($bucket, $notification, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Notification + * @throws \Google\Service\Exception */ public function insert($bucket, Notification $postBody, $optParams = []) { @@ -91,6 +94,7 @@ public function insert($bucket, Notification $postBody, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return NotificationsModel + * @throws \Google\Service\Exception */ public function listNotifications($bucket, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ObjectAccessControls.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ObjectAccessControls.php index 3976d1211..a8a605f75 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ObjectAccessControls.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ObjectAccessControls.php @@ -47,6 +47,7 @@ class ObjectAccessControls extends \Google\Service\Resource * object (as opposed to the latest version, the default). * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $object, $entity, $optParams = []) { @@ -72,6 +73,7 @@ public function delete($bucket, $object, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function get($bucket, $object, $entity, $optParams = []) { @@ -95,6 +97,7 @@ public function get($bucket, $object, $entity, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function insert($bucket, $object, ObjectAccessControl $postBody, $optParams = []) { @@ -117,6 +120,7 @@ public function insert($bucket, $object, ObjectAccessControl $postBody, $optPara * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControlsModel + * @throws \Google\Service\Exception */ public function listObjectAccessControls($bucket, $object, $optParams = []) { @@ -142,6 +146,7 @@ public function listObjectAccessControls($bucket, $object, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function patch($bucket, $object, $entity, ObjectAccessControl $postBody, $optParams = []) { @@ -167,6 +172,7 @@ public function patch($bucket, $object, $entity, ObjectAccessControl $postBody, * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return ObjectAccessControl + * @throws \Google\Service\Exception */ public function update($bucket, $object, $entity, ObjectAccessControl $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Objects.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Objects.php index fe3998c99..9c1c5b5ce 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Objects.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Objects.php @@ -45,6 +45,7 @@ class Objects extends \Google\Service\Resource * @param BulkRestoreObjectsRequest $postBody * @param array $optParams Optional parameters. * @return GoogleLongrunningOperation + * @throws \Google\Service\Exception */ public function bulkRestore($bucket, BulkRestoreObjectsRequest $postBody, $optParams = []) { @@ -78,6 +79,7 @@ public function bulkRestore($bucket, BulkRestoreObjectsRequest $postBody, $optPa * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function compose($destinationBucket, $destinationObject, ComposeRequest $postBody, $optParams = []) { @@ -144,6 +146,7 @@ public function compose($destinationBucket, $destinationObject, ComposeRequest $ * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function copy($sourceBucket, $sourceObject, $destinationBucket, $destinationObject, StorageObject $postBody, $optParams = []) { @@ -177,6 +180,7 @@ public function copy($sourceBucket, $sourceObject, $destinationBucket, $destinat * whether the object's current metageneration does not match the given value. * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. + * @throws \Google\Service\Exception */ public function delete($bucket, $object, $optParams = []) { @@ -212,6 +216,7 @@ public function delete($bucket, $object, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function get($bucket, $object, $optParams = []) { @@ -233,6 +238,7 @@ public function get($bucket, $object, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function getIamPolicy($bucket, $object, $optParams = []) { @@ -281,6 +287,7 @@ public function getIamPolicy($bucket, $object, $optParams = []) * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function insert($bucket, StorageObject $postBody, $optParams = []) { @@ -331,6 +338,7 @@ public function insert($bucket, StorageObject $postBody, $optParams = []) * @opt_param bool versions If true, lists all versions of an object as distinct * results. The default is false. For more information, see Object Versioning. * @return ObjectsModel + * @throws \Google\Service\Exception */ public function listObjects($bucket, $optParams = []) { @@ -370,6 +378,7 @@ public function listObjects($bucket, $optParams = []) * @opt_param string userProject The project to be billed for this request, for * Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function patch($bucket, $object, StorageObject $postBody, $optParams = []) { @@ -384,7 +393,6 @@ public function patch($bucket, $object, StorageObject $postBody, $optParams = [] * @param string $object Name of the object. For information about how to URL * encode object names to be path safe, see Encoding URI Path Parts. * @param string $generation Selects a specific revision of this object. - * @param StorageObject $postBody * @param array $optParams Optional parameters. * * @opt_param bool copySourceAcl If true, copies the source object's ACL; @@ -405,10 +413,11 @@ public function patch($bucket, $object, StorageObject $postBody, $optParams = [] * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ - public function restore($bucket, $object, $generation, StorageObject $postBody, $optParams = []) + public function restore($bucket, $object, $generation, $optParams = []) { - $params = ['bucket' => $bucket, 'object' => $object, 'generation' => $generation, 'postBody' => $postBody]; + $params = ['bucket' => $bucket, 'object' => $object, 'generation' => $generation]; $params = array_merge($params, $optParams); return $this->call('restore', [$params], StorageObject::class); } @@ -481,6 +490,7 @@ public function restore($bucket, $object, $generation, StorageObject $postBody, * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return RewriteResponse + * @throws \Google\Service\Exception */ public function rewrite($sourceBucket, $sourceObject, $destinationBucket, $destinationObject, StorageObject $postBody, $optParams = []) { @@ -503,6 +513,7 @@ public function rewrite($sourceBucket, $sourceObject, $destinationBucket, $desti * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return Policy + * @throws \Google\Service\Exception */ public function setIamPolicy($bucket, $object, Policy $postBody, $optParams = []) { @@ -526,6 +537,7 @@ public function setIamPolicy($bucket, $object, Policy $postBody, $optParams = [] * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return TestIamPermissionsResponse + * @throws \Google\Service\Exception */ public function testIamPermissions($bucket, $object, $permissions, $optParams = []) { @@ -565,6 +577,7 @@ public function testIamPermissions($bucket, $object, $permissions, $optParams = * @opt_param string userProject The project to be billed for this request. * Required for Requester Pays buckets. * @return StorageObject + * @throws \Google\Service\Exception */ public function update($bucket, $object, StorageObject $postBody, $optParams = []) { @@ -609,6 +622,7 @@ public function update($bucket, $object, StorageObject $postBody, $optParams = [ * @opt_param bool versions If true, lists all versions of an object as distinct * results. The default is false. For more information, see Object Versioning. * @return Channel + * @throws \Google\Service\Exception */ public function watchAll($bucket, Channel $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Operations.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Operations.php index bff19b4b4..6d473ab66 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Operations.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/Operations.php @@ -38,6 +38,7 @@ class Operations extends \Google\Service\Resource * @param string $bucket The parent bucket of the operation resource. * @param string $operationId The ID of the operation resource. * @param array $optParams Optional parameters. + * @throws \Google\Service\Exception */ public function cancel($bucket, $operationId, $optParams = []) { @@ -52,6 +53,7 @@ public function cancel($bucket, $operationId, $optParams = []) * @param string $operationId The ID of the operation resource. * @param array $optParams Optional parameters. * @return GoogleLongrunningOperation + * @throws \Google\Service\Exception */ public function get($bucket, $operationId, $optParams = []) { @@ -75,6 +77,7 @@ public function get($bucket, $operationId, $optParams = []) * @opt_param string pageToken A previously-returned page token representing * part of the larger set of results to view. * @return GoogleLongrunningListOperationsResponse + * @throws \Google\Service\Exception */ public function listOperations($bucket, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsHmacKeys.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsHmacKeys.php index bd8630d27..18c94e69c 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsHmacKeys.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsHmacKeys.php @@ -40,6 +40,7 @@ class ProjectsHmacKeys extends \Google\Service\Resource * * @opt_param string userProject The project to be billed for this request. * @return HmacKey + * @throws \Google\Service\Exception */ public function create($projectId, $serviceAccountEmail, $optParams = []) { @@ -55,6 +56,7 @@ public function create($projectId, $serviceAccountEmail, $optParams = []) * @param array $optParams Optional parameters. * * @opt_param string userProject The project to be billed for this request. + * @throws \Google\Service\Exception */ public function delete($projectId, $accessId, $optParams = []) { @@ -72,6 +74,7 @@ public function delete($projectId, $accessId, $optParams = []) * * @opt_param string userProject The project to be billed for this request. * @return HmacKeyMetadata + * @throws \Google\Service\Exception */ public function get($projectId, $accessId, $optParams = []) { @@ -100,6 +103,7 @@ public function get($projectId, $accessId, $optParams = []) * state. * @opt_param string userProject The project to be billed for this request. * @return HmacKeysMetadata + * @throws \Google\Service\Exception */ public function listProjectsHmacKeys($projectId, $optParams = []) { @@ -119,6 +123,7 @@ public function listProjectsHmacKeys($projectId, $optParams = []) * * @opt_param string userProject The project to be billed for this request. * @return HmacKeyMetadata + * @throws \Google\Service\Exception */ public function update($projectId, $accessId, HmacKeyMetadata $postBody, $optParams = []) { diff --git a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsServiceAccount.php b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsServiceAccount.php index 321cb08b2..a696b9275 100644 --- a/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsServiceAccount.php +++ b/lib/Google/vendor/google/apiclient-services/src/Storage/Resource/ProjectsServiceAccount.php @@ -38,6 +38,7 @@ class ProjectsServiceAccount extends \Google\Service\Resource * * @opt_param string userProject The project to be billed for this request. * @return ServiceAccount + * @throws \Google\Service\Exception */ public function get($projectId, $optParams = []) { diff --git a/lib/Google/vendor/google/auth/README.md b/lib/Google/vendor/google/auth/README.md index 87f6f6064..eac25a236 100644 --- a/lib/Google/vendor/google/auth/README.md +++ b/lib/Google/vendor/google/auth/README.md @@ -35,44 +35,28 @@ composer.phar require google/auth ## Application Default Credentials This library provides an implementation of -[application default credentials][application default credentials] for PHP. +[Application Default Credentials (ADC)][application default credentials] for PHP. -The Application Default Credentials provide a simple way to get authorization -credentials for use in calling Google APIs. +Application Default Credentials provides a simple way to get authorization +credentials for use in calling Google APIs, and is +the recommended approach to authorize calls to Cloud APIs. -They are best suited for cases when the call needs to have the same identity -and authorization level for the application independent of the user. This is -the recommended approach to authorize calls to Cloud APIs, particularly when -you're building an application that uses Google Compute Engine. +### Set up ADC -#### Download your Service Account Credentials JSON file +To use ADC, you must set it up by providing credentials. +How you set up ADC depends on the environment where your code is running, +and whether you are running code in a test or production environment. -To use `Application Default Credentials`, You first need to download a set of -JSON credentials for your project. Go to **APIs & Services** > **Credentials** in -the [Google Developers Console][developer console] and select -**Service account** from the **Add credentials** dropdown. +For more information, see [Set up Application Default Credentials][set-up-adc]. -> This file is your *only copy* of these credentials. It should never be -> committed with your source code, and should be stored securely. - -Once downloaded, store the path to this file in the -`GOOGLE_APPLICATION_CREDENTIALS` environment variable. - -```php -putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json'); -``` - -> PHP's `putenv` function is just one way to set an environment variable. -> Consider using `.htaccess` or apache configuration files as well. - -#### Enable the API you want to use +### Enable the API you want to use Before making your API call, you must be sure the API you're calling has been enabled. Go to **APIs & Auth** > **APIs** in the [Google Developers Console][developer console] and enable the APIs you'd like to call. For the example below, you must enable the `Drive API`. -#### Call the APIs +### Call the APIs As long as you update the environment variable below to point to *your* JSON credentials file, the following code should output a list of your Drive files. @@ -316,9 +300,10 @@ hesitate to about the client or APIs on [StackOverflow](http://stackoverflow.com). [google-apis-php-client]: https://github.com/google/google-api-php-client -[application default credentials]: https://developers.google.com/accounts/docs/application-default-credentials +[application default credentials]: https://cloud.google.com/docs/authentication/application-default-credentials [contributing]: https://github.com/google/google-auth-library-php/tree/main/.github/CONTRIBUTING.md [copying]: https://github.com/google/google-auth-library-php/tree/main/COPYING [Guzzle]: https://github.com/guzzle/guzzle [Guzzle 5]: http://docs.guzzlephp.org/en/5.3 [developer console]: https://console.developers.google.com +[set-up-adc]: https://cloud.google.com/docs/authentication/provide-credentials-adc diff --git a/lib/Google/vendor/google/auth/VERSION b/lib/Google/vendor/google/auth/VERSION new file mode 100644 index 000000000..32b7211cb --- /dev/null +++ b/lib/Google/vendor/google/auth/VERSION @@ -0,0 +1 @@ +1.40.0 diff --git a/lib/Google/vendor/google/auth/composer.json b/lib/Google/vendor/google/auth/composer.json index 9e6466d61..41a1d0532 100644 --- a/lib/Google/vendor/google/auth/composer.json +++ b/lib/Google/vendor/google/auth/composer.json @@ -9,21 +9,23 @@ "docs": "https://googleapis.github.io/google-auth-library-php/main/" }, "require": { - "php": "^7.4||^8.0", + "php": "^8.0", "firebase/php-jwt": "^6.0", - "guzzlehttp/guzzle": "^6.2.1|^7.0", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.4.5", "psr/http-message": "^1.1||^2.0", - "psr/cache": "^1.0||^2.0||^3.0" + "psr/cache": "^2.0||^3.0" }, "require-dev": { "guzzlehttp/promises": "^2.0", "squizlabs/php_codesniffer": "^3.5", - "phpunit/phpunit": "^9.0.0", - "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "phpspec/prophecy-phpunit": "^2.1", "sebastian/comparator": ">=1.2.3", - "phpseclib/phpseclib": "^3.0", - "kelvinmo/simplejwt": "0.7.1" + "phpseclib/phpseclib": "^3.0.35", + "kelvinmo/simplejwt": "0.7.1", + "webmozart/assert": "^1.11", + "symfony/process": "^6.0||^7.0" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." diff --git a/lib/Google/vendor/google/auth/src/AccessToken.php b/lib/Google/vendor/google/auth/src/AccessToken.php index 0afc4ca1e..630b27961 100644 --- a/lib/Google/vendor/google/auth/src/AccessToken.php +++ b/lib/Google/vendor/google/auth/src/AccessToken.php @@ -28,16 +28,16 @@ use GuzzleHttp\Psr7\Request; use GuzzleHttp\Psr7\Utils; use InvalidArgumentException; -use phpseclib\Crypt\RSA; -use phpseclib\Math\BigInteger as BigInteger2; use phpseclib3\Crypt\PublicKeyLoader; -use phpseclib3\Math\BigInteger as BigInteger3; +use phpseclib3\Crypt\RSA; +use phpseclib3\Math\BigInteger; use Psr\Cache\CacheItemPoolInterface; use RuntimeException; use SimpleJWT\InvalidTokenException; use SimpleJWT\JWT as SimpleJWT; use SimpleJWT\Keys\KeyFactory; use SimpleJWT\Keys\KeySet; +use TypeError; use UnexpectedValueException; /** @@ -394,72 +394,30 @@ private function retrieveCertsFromLocation($url, array $options = []) */ private function checkAndInitializePhpsec() { - if (!$this->checkAndInitializePhpsec2() && !$this->checkPhpsec3()) { - throw new RuntimeException('Please require phpseclib/phpseclib v2 or v3 to use this utility.'); + if (!class_exists(RSA::class)) { + throw new RuntimeException('Please require phpseclib/phpseclib v3 to use this utility.'); } } + /** + * @return string + * @throws TypeError If the key cannot be initialized to a string. + */ private function loadPhpsecPublicKey(string $modulus, string $exponent): string { - if (class_exists(RSA::class) && class_exists(BigInteger2::class)) { - $key = new RSA(); - $key->loadKey([ - 'n' => new BigInteger2($this->callJwtStatic('urlsafeB64Decode', [ - $modulus, - ]), 256), - 'e' => new BigInteger2($this->callJwtStatic('urlsafeB64Decode', [ - $exponent - ]), 256), - ]); - return $key->getPublicKey(); - } $key = PublicKeyLoader::load([ - 'n' => new BigInteger3($this->callJwtStatic('urlsafeB64Decode', [ + 'n' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ $modulus, ]), 256), - 'e' => new BigInteger3($this->callJwtStatic('urlsafeB64Decode', [ + 'e' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [ $exponent ]), 256), ]); - return $key->toString('PKCS8'); - } - - /** - * @return bool - */ - private function checkAndInitializePhpsec2(): bool - { - if (!class_exists('phpseclib\Crypt\RSA')) { - return false; + $formattedPublicKey = $key->toString('PKCS8'); + if (!is_string($formattedPublicKey)) { + throw new TypeError('Failed to initialize the key'); } - - /** - * phpseclib calls "phpinfo" by default, which requires special - * whitelisting in the AppEngine VM environment. This function - * sets constants to bypass the need for phpseclib to check phpinfo - * - * @see phpseclib/Math/BigInteger - * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 - * @codeCoverageIgnore - */ - if (filter_var(getenv('GAE_VM'), FILTER_VALIDATE_BOOLEAN)) { - if (!defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { - define('MATH_BIGINTEGER_OPENSSL_ENABLED', true); - } - if (!defined('CRYPT_RSA_MODE')) { - define('CRYPT_RSA_MODE', RSA::MODE_OPENSSL); - } - } - - return true; - } - - /** - * @return bool - */ - private function checkPhpsec3(): bool - { - return class_exists('phpseclib3\Crypt\RSA'); + return $formattedPublicKey; } /** diff --git a/lib/Google/vendor/google/auth/src/ApplicationDefaultCredentials.php b/lib/Google/vendor/google/auth/src/ApplicationDefaultCredentials.php index d556fac4e..80437c8c9 100644 --- a/lib/Google/vendor/google/auth/src/ApplicationDefaultCredentials.php +++ b/lib/Google/vendor/google/auth/src/ApplicationDefaultCredentials.php @@ -144,6 +144,8 @@ public static function getMiddleware( * @param string|string[] $defaultScope The default scope to use if no * user-defined scopes exist, expressed either as an Array or as a * space-delimited string. + * @param string $universeDomain Specifies a universe domain to use for the + * calling client library * * @return FetchAuthTokenInterface * @throws DomainException if no implementation can be obtained. @@ -154,7 +156,8 @@ public static function getCredentials( array $cacheConfig = null, CacheItemPoolInterface $cache = null, $quotaProject = null, - $defaultScope = null + $defaultScope = null, + string $universeDomain = null ) { $creds = null; $jsonKey = CredentialsLoader::fromEnv() @@ -179,6 +182,9 @@ public static function getCredentials( if ($quotaProject) { $jsonKey['quota_project_id'] = $quotaProject; } + if ($universeDomain) { + $jsonKey['universe_domain'] = $universeDomain; + } $creds = CredentialsLoader::makeCredentials( $scope, $jsonKey, @@ -187,7 +193,7 @@ public static function getCredentials( } elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) { $creds = new AppIdentityCredentials($anyScope); } elseif (self::onGce($httpHandler, $cacheConfig, $cache)) { - $creds = new GCECredentials(null, $anyScope, null, $quotaProject); + $creds = new GCECredentials(null, $anyScope, null, $quotaProject, null, $universeDomain); $creds->setIsOnGce(true); // save the credentials a trip to the metadata server } diff --git a/lib/Google/vendor/google/auth/src/Cache/Item.php b/lib/Google/vendor/google/auth/src/Cache/Item.php index 8628c5480..ff85afa71 100644 --- a/lib/Google/vendor/google/auth/src/Cache/Item.php +++ b/lib/Google/vendor/google/auth/src/Cache/Item.php @@ -28,6 +28,7 @@ * * This class will be used by MemoryCacheItemPool and SysVCacheItemPool * on PHP 7.4 and below. It is compatible with psr/cache 1.0 and 2.0 (PSR-6). + * @deprecated * @see TypedItem for compatiblity with psr/cache 3.0. */ final class Item implements CacheItemInterface diff --git a/lib/Google/vendor/google/auth/src/Cache/MemoryCacheItemPool.php b/lib/Google/vendor/google/auth/src/Cache/MemoryCacheItemPool.php index 2c7a9d574..1917cf144 100644 --- a/lib/Google/vendor/google/auth/src/Cache/MemoryCacheItemPool.php +++ b/lib/Google/vendor/google/auth/src/Cache/MemoryCacheItemPool.php @@ -57,9 +57,8 @@ public function getItem($key): CacheItemInterface public function getItems(array $keys = []): iterable { $items = []; - $itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class; foreach ($keys as $key) { - $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new $itemClass($key); + $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new TypedItem($key); } return $items; diff --git a/lib/Google/vendor/google/auth/src/Cache/SysVCacheItemPool.php b/lib/Google/vendor/google/auth/src/Cache/SysVCacheItemPool.php index 39a8c30fd..7821d6b09 100644 --- a/lib/Google/vendor/google/auth/src/Cache/SysVCacheItemPool.php +++ b/lib/Google/vendor/google/auth/src/Cache/SysVCacheItemPool.php @@ -110,11 +110,10 @@ public function getItems(array $keys = []): iterable { $this->loadItems(); $items = []; - $itemClass = \PHP_VERSION_ID >= 80000 ? TypedItem::class : Item::class; foreach ($keys as $key) { $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : - new $itemClass($key); + new TypedItem($key); } return $items; } diff --git a/lib/Google/vendor/google/auth/src/CredentialSource/AwsNativeSource.php b/lib/Google/vendor/google/auth/src/CredentialSource/AwsNativeSource.php index 3a8c20eaa..460d9e5ea 100644 --- a/lib/Google/vendor/google/auth/src/CredentialSource/AwsNativeSource.php +++ b/lib/Google/vendor/google/auth/src/CredentialSource/AwsNativeSource.php @@ -153,8 +153,8 @@ public static function getSignedRequestHeaders( $service = 'sts'; # Create a date for headers and the credential string in ISO-8601 format - $amzdate = date('Ymd\THis\Z'); - $datestamp = date('Ymd'); # Date w/o time, used in credential scope + $amzdate = gmdate('Ymd\THis\Z'); + $datestamp = gmdate('Ymd'); # Date w/o time, used in credential scope # Create the canonical headers and signed headers. Header names # must be trimmed and lowercase, and sorted in code point order from diff --git a/lib/Google/vendor/google/auth/src/CredentialSource/ExecutableSource.php b/lib/Google/vendor/google/auth/src/CredentialSource/ExecutableSource.php new file mode 100644 index 000000000..7661fc9cc --- /dev/null +++ b/lib/Google/vendor/google/auth/src/CredentialSource/ExecutableSource.php @@ -0,0 +1,260 @@ + + * OIDC response sample: + * { + * "version": 1, + * "success": true, + * "token_type": "urn:ietf:params:oauth:token-type:id_token", + * "id_token": "HEADER.PAYLOAD.SIGNATURE", + * "expiration_time": 1620433341 + * } + * + * SAML2 response sample: + * { + * "version": 1, + * "success": true, + * "token_type": "urn:ietf:params:oauth:token-type:saml2", + * "saml_response": "...", + * "expiration_time": 1620433341 + * } + * + * Error response sample: + * { + * "version": 1, + * "success": false, + * "code": "401", + * "message": "Error message." + * } + * + * + * The "expiration_time" field in the JSON response is only required for successful + * responses when an output file was specified in the credential configuration + * + * The auth libraries will populate certain environment variables that will be accessible by the + * executable, such as: GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE, GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE, + * GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE, GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL, and + * GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE. + */ +class ExecutableSource implements ExternalAccountCredentialSourceInterface +{ + private const GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES = 'GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES'; + private const SAML_SUBJECT_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:saml2'; + private const OIDC_SUBJECT_TOKEN_TYPE1 = 'urn:ietf:params:oauth:token-type:id_token'; + private const OIDC_SUBJECT_TOKEN_TYPE2 = 'urn:ietf:params:oauth:token-type:jwt'; + + private string $command; + private ExecutableHandler $executableHandler; + private ?string $outputFile; + + /** + * @param string $command The string command to run to get the subject token. + * @param string $outputFile + */ + public function __construct( + string $command, + ?string $outputFile, + ExecutableHandler $executableHandler = null, + ) { + $this->command = $command; + $this->outputFile = $outputFile; + $this->executableHandler = $executableHandler ?: new ExecutableHandler(); + } + + /** + * @param callable $httpHandler unused. + * @return string + * @throws RuntimeException if the executable is not allowed to run. + * @throws ExecutableResponseError if the executable response is invalid. + */ + public function fetchSubjectToken(callable $httpHandler = null): string + { + // Check if the executable is allowed to run. + if (getenv(self::GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES) !== '1') { + throw new RuntimeException( + 'Pluggable Auth executables need to be explicitly allowed to run by ' + . 'setting the GOOGLE_EXTERNAL_ACCOUNT_ALLOW_EXECUTABLES environment ' + . 'Variable to 1.' + ); + } + + if (!$executableResponse = $this->getCachedExecutableResponse()) { + // Run the executable. + $exitCode = ($this->executableHandler)($this->command); + $output = $this->executableHandler->getOutput(); + + // If the exit code is not 0, throw an exception with the output as the error details + if ($exitCode !== 0) { + throw new ExecutableResponseError( + 'The executable failed to run' + . ($output ? ' with the following error: ' . $output : '.'), + (string) $exitCode + ); + } + + $executableResponse = $this->parseExecutableResponse($output); + + // Validate expiration. + if (isset($executableResponse['expiration_time']) && time() >= $executableResponse['expiration_time']) { + throw new ExecutableResponseError('Executable response is expired.'); + } + } + + // Throw error when the request was unsuccessful + if ($executableResponse['success'] === false) { + throw new ExecutableResponseError($executableResponse['message'], (string) $executableResponse['code']); + } + + // Return subject token field based on the token type + return $executableResponse['token_type'] === self::SAML_SUBJECT_TOKEN_TYPE + ? $executableResponse['saml_response'] + : $executableResponse['id_token']; + } + + /** + * @return array|null + */ + private function getCachedExecutableResponse(): ?array + { + if ( + $this->outputFile + && file_exists($this->outputFile) + && !empty(trim($outputFileContents = (string) file_get_contents($this->outputFile))) + ) { + try { + $executableResponse = $this->parseExecutableResponse($outputFileContents); + } catch (ExecutableResponseError $e) { + throw new ExecutableResponseError( + 'Error in output file: ' . $e->getMessage(), + 'INVALID_OUTPUT_FILE' + ); + } + + if ($executableResponse['success'] === false) { + // If the cached token was unsuccessful, run the executable to get a new one. + return null; + } + + if (isset($executableResponse['expiration_time']) && time() >= $executableResponse['expiration_time']) { + // If the cached token is expired, run the executable to get a new one. + return null; + } + + return $executableResponse; + } + + return null; + } + + /** + * @return array + */ + private function parseExecutableResponse(string $response): array + { + $executableResponse = json_decode($response, true); + if (json_last_error() !== JSON_ERROR_NONE) { + throw new ExecutableResponseError( + 'The executable returned an invalid response: ' . $response, + 'INVALID_RESPONSE' + ); + } + if (!array_key_exists('version', $executableResponse)) { + throw new ExecutableResponseError('Executable response must contain a "version" field.'); + } + if (!array_key_exists('success', $executableResponse)) { + throw new ExecutableResponseError('Executable response must contain a "success" field.'); + } + + // Validate required fields for a successful response. + if ($executableResponse['success']) { + // Validate token type field. + $tokenTypes = [self::SAML_SUBJECT_TOKEN_TYPE, self::OIDC_SUBJECT_TOKEN_TYPE1, self::OIDC_SUBJECT_TOKEN_TYPE2]; + if (!isset($executableResponse['token_type'])) { + throw new ExecutableResponseError( + 'Executable response must contain a "token_type" field when successful' + ); + } + if (!in_array($executableResponse['token_type'], $tokenTypes)) { + throw new ExecutableResponseError(sprintf( + 'Executable response "token_type" field must be one of %s.', + implode(', ', $tokenTypes) + )); + } + + // Validate subject token for SAML and OIDC. + if ($executableResponse['token_type'] === self::SAML_SUBJECT_TOKEN_TYPE) { + if (empty($executableResponse['saml_response'])) { + throw new ExecutableResponseError(sprintf( + 'Executable response must contain a "saml_response" field when token_type=%s.', + self::SAML_SUBJECT_TOKEN_TYPE + )); + } + } elseif (empty($executableResponse['id_token'])) { + throw new ExecutableResponseError(sprintf( + 'Executable response must contain a "id_token" field when ' + . 'token_type=%s.', + $executableResponse['token_type'] + )); + } + + // Validate expiration exists when an output file is specified. + if ($this->outputFile) { + if (!isset($executableResponse['expiration_time'])) { + throw new ExecutableResponseError( + 'The executable response must contain a "expiration_time" field for successful responses ' . + 'when an output_file has been specified in the configuration.' + ); + } + } + } else { + // Both code and message must be provided for unsuccessful responses. + if (!array_key_exists('code', $executableResponse)) { + throw new ExecutableResponseError('Executable response must contain a "code" field when unsuccessful.'); + } + if (empty($executableResponse['message'])) { + throw new ExecutableResponseError('Executable response must contain a "message" field when unsuccessful.'); + } + } + + return $executableResponse; + } +} diff --git a/lib/Google/vendor/google/auth/src/Credentials/ExternalAccountCredentials.php b/lib/Google/vendor/google/auth/src/Credentials/ExternalAccountCredentials.php index b2716bfaa..98f427a33 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/ExternalAccountCredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/ExternalAccountCredentials.php @@ -18,28 +18,41 @@ namespace Google\Auth\Credentials; use Google\Auth\CredentialSource\AwsNativeSource; +use Google\Auth\CredentialSource\ExecutableSource; use Google\Auth\CredentialSource\FileSource; use Google\Auth\CredentialSource\UrlSource; +use Google\Auth\ExecutableHandler\ExecutableHandler; use Google\Auth\ExternalAccountCredentialSourceInterface; use Google\Auth\FetchAuthTokenInterface; use Google\Auth\GetQuotaProjectInterface; +use Google\Auth\GetUniverseDomainInterface; use Google\Auth\HttpHandler\HttpClientCache; use Google\Auth\HttpHandler\HttpHandlerFactory; use Google\Auth\OAuth2; +use Google\Auth\ProjectIdProviderInterface; use Google\Auth\UpdateMetadataInterface; use Google\Auth\UpdateMetadataTrait; use GuzzleHttp\Psr7\Request; use InvalidArgumentException; -class ExternalAccountCredentials implements FetchAuthTokenInterface, UpdateMetadataInterface, GetQuotaProjectInterface +class ExternalAccountCredentials implements + FetchAuthTokenInterface, + UpdateMetadataInterface, + GetQuotaProjectInterface, + GetUniverseDomainInterface, + ProjectIdProviderInterface { use UpdateMetadataTrait; private const EXTERNAL_ACCOUNT_TYPE = 'external_account'; + private const CLOUD_RESOURCE_MANAGER_URL = 'https://cloudresourcemanager.UNIVERSE_DOMAIN/v1/projects/%s'; private OAuth2 $auth; private ?string $quotaProject; private ?string $serviceAccountImpersonationUrl; + private ?string $workforcePoolUserProject; + private ?string $projectId; + private string $universeDomain; /** * @param string|string[] $scope The scope of the access request, expressed either as an array @@ -90,6 +103,8 @@ public function __construct( } $this->quotaProject = $jsonKey['quota_project_id'] ?? null; + $this->workforcePoolUserProject = $jsonKey['workforce_pool_user_project'] ?? null; + $this->universeDomain = $jsonKey['universe_domain'] ?? GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN; $this->auth = new OAuth2([ 'tokenCredentialUri' => $jsonKey['token_url'], @@ -97,7 +112,16 @@ public function __construct( 'scope' => $scope, 'subjectTokenType' => $jsonKey['subject_token_type'], 'subjectTokenFetcher' => self::buildCredentialSource($jsonKey), + 'additionalOptions' => $this->workforcePoolUserProject + ? ['userProject' => $this->workforcePoolUserProject] + : [], ]); + + if (!$this->isWorkforcePool() && $this->workforcePoolUserProject) { + throw new InvalidArgumentException( + 'workforce_pool_user_project should not be set for non-workforce pool credentials.' + ); + } } /** @@ -128,11 +152,6 @@ private static function buildCredentialSource(array $jsonKey): ExternalAccountCr 'The regional_cred_verification_url field is required for aws1 credential source.' ); } - if (!array_key_exists('audience', $jsonKey)) { - throw new InvalidArgumentException( - 'aws1 credential source requires an audience to be set in the JSON file.' - ); - } return new AwsNativeSource( $jsonKey['audience'], @@ -152,8 +171,46 @@ private static function buildCredentialSource(array $jsonKey): ExternalAccountCr ); } + if (isset($credentialSource['executable'])) { + if (!array_key_exists('command', $credentialSource['executable'])) { + throw new InvalidArgumentException( + 'executable source requires a command to be set in the JSON file.' + ); + } + + // Build command environment variables + $env = [ + 'GOOGLE_EXTERNAL_ACCOUNT_AUDIENCE' => $jsonKey['audience'], + 'GOOGLE_EXTERNAL_ACCOUNT_TOKEN_TYPE' => $jsonKey['subject_token_type'], + // Always set to 0 because interactive mode is not supported. + 'GOOGLE_EXTERNAL_ACCOUNT_INTERACTIVE' => '0', + ]; + + if ($outputFile = $credentialSource['executable']['output_file'] ?? null) { + $env['GOOGLE_EXTERNAL_ACCOUNT_OUTPUT_FILE'] = $outputFile; + } + + if ($serviceAccountImpersonationUrl = $jsonKey['service_account_impersonation_url'] ?? null) { + // Parse email from URL. The formal looks as follows: + // https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/name@project-id.iam.gserviceaccount.com:generateAccessToken + $regex = '/serviceAccounts\/(?[^:]+):generateAccessToken$/'; + if (preg_match($regex, $serviceAccountImpersonationUrl, $matches)) { + $env['GOOGLE_EXTERNAL_ACCOUNT_IMPERSONATED_EMAIL'] = $matches['email']; + } + } + + $timeoutMs = $credentialSource['executable']['timeout_millis'] ?? null; + + return new ExecutableSource( + $credentialSource['executable']['command'], + $outputFile, + $timeoutMs ? new ExecutableHandler($env, $timeoutMs) : new ExecutableHandler($env) + ); + } + throw new InvalidArgumentException('Unable to determine credential source from json key.'); } + /** * @param string $stsToken * @param callable $httpHandler @@ -181,7 +238,7 @@ private function getImpersonatedAccessToken(string $stsToken, callable $httpHand ], (string) json_encode([ 'lifetime' => sprintf('%ss', OAuth2::DEFAULT_EXPIRY_SECONDS), - 'scope' => $this->auth->getScope(), + 'scope' => explode(' ', $this->auth->getScope()), ]), ); if (is_null($httpHandler)) { @@ -190,8 +247,8 @@ private function getImpersonatedAccessToken(string $stsToken, callable $httpHand $response = $httpHandler($request); $body = json_decode((string) $response->getBody(), true); return [ - 'access_token' => $body['accessToken'], - 'expires_at' => strtotime($body['expireTime']), + 'access_token' => $body['accessToken'], + 'expires_at' => strtotime($body['expireTime']), ]; } @@ -238,4 +295,68 @@ public function getQuotaProject() { return $this->quotaProject; } + + /** + * Get the universe domain used for this API request + * + * @return string + */ + public function getUniverseDomain(): string + { + return $this->universeDomain; + } + + /** + * Get the project ID. + * + * @param callable $httpHandler Callback which delivers psr7 request + * @param string $accessToken The access token to use to sign the blob. If + * provided, saves a call to the metadata server for a new access + * token. **Defaults to** `null`. + * @return string|null + */ + public function getProjectId(callable $httpHandler = null, string $accessToken = null) + { + if (isset($this->projectId)) { + return $this->projectId; + } + + $projectNumber = $this->getProjectNumber() ?: $this->workforcePoolUserProject; + if (!$projectNumber) { + return null; + } + + if (is_null($httpHandler)) { + $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + } + + $url = str_replace( + 'UNIVERSE_DOMAIN', + $this->getUniverseDomain(), + sprintf(self::CLOUD_RESOURCE_MANAGER_URL, $projectNumber) + ); + + if (is_null($accessToken)) { + $accessToken = $this->fetchAuthToken($httpHandler)['access_token']; + } + + $request = new Request('GET', $url, ['authorization' => 'Bearer ' . $accessToken]); + $response = $httpHandler($request); + + $body = json_decode((string) $response->getBody(), true); + return $this->projectId = $body['projectId']; + } + + private function getProjectNumber(): ?string + { + $parts = explode('/', $this->auth->getAudience()); + $i = array_search('projects', $parts); + return $parts[$i + 1] ?? null; + } + + private function isWorkforcePool(): bool + { + $regex = '#//iam\.googleapis\.com/locations/[^/]+/workforcePools/#'; + return preg_match($regex, $this->auth->getAudience()) === 1; + } } diff --git a/lib/Google/vendor/google/auth/src/Credentials/GCECredentials.php b/lib/Google/vendor/google/auth/src/Credentials/GCECredentials.php index 991589b52..5fed54763 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/GCECredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/GCECredentials.php @@ -17,6 +17,8 @@ namespace Google\Auth\Credentials; +use COM; +use com_exception; use Google\Auth\CredentialsLoader; use Google\Auth\GetQuotaProjectInterface; use Google\Auth\HttpHandler\HttpClientCache; @@ -95,6 +97,11 @@ class GCECredentials extends CredentialsLoader implements */ const PROJECT_ID_URI_PATH = 'v1/project/project-id'; + /** + * The metadata path of the project ID. + */ + const UNIVERSE_DOMAIN_URI_PATH = 'v1/universe/universe_domain'; + /** * The header whose presence indicates GCE presence. */ @@ -105,6 +112,23 @@ class GCECredentials extends CredentialsLoader implements */ private const GKE_PRODUCT_NAME_FILE = '/sys/class/dmi/id/product_name'; + /** + * The Windows Registry key path to the product name + */ + private const WINDOWS_REGISTRY_KEY_PATH = 'HKEY_LOCAL_MACHINE\\SYSTEM\\HardwareConfig\\Current\\'; + + /** + * The Windows registry key name for the product name + */ + private const WINDOWS_REGISTRY_KEY_NAME = 'SystemProductName'; + + /** + * The Name of the product expected from the windows registry + */ + private const PRODUCT_NAME = 'Google'; + + private const CRED_TYPE = 'mds'; + /** * Note: the explicit `timeout` and `tries` below is a workaround. The underlying * issue is that resolving an unknown host on some networks will take @@ -169,6 +193,11 @@ class GCECredentials extends CredentialsLoader implements */ private $serviceAccountIdentity; + /** + * @var string + */ + private ?string $universeDomain; + /** * @param Iam $iam [optional] An IAM instance. * @param string|string[] $scope [optional] the scope of the access request, @@ -178,13 +207,16 @@ class GCECredentials extends CredentialsLoader implements * charges associated with the request. * @param string $serviceAccountIdentity [optional] Specify a service * account identity name to use instead of "default". + * @param string $universeDomain [optional] Specify a universe domain to use + * instead of fetching one from the metadata server. */ public function __construct( Iam $iam = null, $scope = null, $targetAudience = null, $quotaProject = null, - $serviceAccountIdentity = null + $serviceAccountIdentity = null, + string $universeDomain = null ) { $this->iam = $iam; @@ -212,6 +244,7 @@ public function __construct( $this->tokenUri = $tokenUri; $this->quotaProject = $quotaProject; $this->serviceAccountIdentity = $serviceAccountIdentity; + $this->universeDomain = $universeDomain; } /** @@ -294,6 +327,18 @@ private static function getProjectIdUri() return $base . self::PROJECT_ID_URI_PATH; } + /** + * The full uri for accessing the default universe domain. + * + * @return string + */ + private static function getUniverseDomainUri() + { + $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; + + return $base . self::UNIVERSE_DOMAIN_URI_PATH; + } + /** * Determines if this an App Engine Flexible instance, by accessing the * GAE_INSTANCE environment variable. @@ -333,7 +378,10 @@ public static function onGce(callable $httpHandler = null) new Request( 'GET', $checkUri, - [self::FLAVOR_HEADER => 'Google'] + [ + self::FLAVOR_HEADER => 'Google', + self::$metricMetadataKey => self::getMetricsHeader('', 'mds') + ] ), ['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S] ); @@ -346,9 +394,10 @@ public static function onGce(callable $httpHandler = null) } } - if (PHP_OS === 'Windows') { - // @TODO: implement GCE residency detection on Windows - return false; + if (PHP_OS === 'Windows' || PHP_OS === 'WINNT') { + return self::detectResidencyWindows( + self::WINDOWS_REGISTRY_KEY_PATH . self::WINDOWS_REGISTRY_KEY_NAME + ); } // Detect GCE residency on Linux @@ -359,11 +408,33 @@ private static function detectResidencyLinux(string $productNameFile): bool { if (file_exists($productNameFile)) { $productName = trim((string) file_get_contents($productNameFile)); - return 0 === strpos($productName, 'Google'); + return 0 === strpos($productName, self::PRODUCT_NAME); } return false; } + private static function detectResidencyWindows(string $registryProductKey): bool + { + if (!class_exists(COM::class)) { + // the COM extension must be installed and enabled to detect Windows residency + // see https://www.php.net/manual/en/book.com.php + return false; + } + + $shell = new COM('WScript.Shell'); + $productName = null; + + try { + $productName = $shell->regRead($registryProductKey); + } catch(com_exception) { + // This means that we tried to read a key that doesn't exist on the registry + // which might mean that it is a windows instance that is not on GCE + return false; + } + + return 0 === strpos($productName, self::PRODUCT_NAME); + } + /** * Implements FetchAuthTokenInterface#fetchAuthToken. * @@ -395,10 +466,14 @@ public function fetchAuthToken(callable $httpHandler = null) return []; // return an empty array with no access token } - $response = $this->getFromMetadata($httpHandler, $this->tokenUri); + $response = $this->getFromMetadata( + $httpHandler, + $this->tokenUri, + $this->applyTokenEndpointMetrics([], $this->targetAudience ? 'it' : 'at') + ); if ($this->targetAudience) { - return ['id_token' => $response]; + return $this->lastReceivedToken = ['id_token' => $response]; } if (null === $json = json_decode($response, true)) { @@ -422,14 +497,18 @@ public function getCacheKey() } /** - * @return array{access_token:string,expires_at:int}|null + * @return array|null */ public function getLastReceivedToken() { if ($this->lastReceivedToken) { + if (array_key_exists('id_token', $this->lastReceivedToken)) { + return $this->lastReceivedToken; + } + return [ 'access_token' => $this->lastReceivedToken['access_token'], - 'expires_at' => $this->lastReceivedToken['expires_at'], + 'expires_at' => $this->lastReceivedToken['expires_at'] ]; } @@ -500,20 +579,67 @@ public function getProjectId(callable $httpHandler = null) return $this->projectId; } + /** + * Fetch the default universe domain from the metadata server. + * + * @param callable $httpHandler Callback which delivers psr7 request + * @return string + */ + public function getUniverseDomain(callable $httpHandler = null): string + { + if (null !== $this->universeDomain) { + return $this->universeDomain; + } + + $httpHandler = $httpHandler + ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + + if (!$this->hasCheckedOnGce) { + $this->isOnGce = self::onGce($httpHandler); + $this->hasCheckedOnGce = true; + } + + try { + $this->universeDomain = $this->getFromMetadata( + $httpHandler, + self::getUniverseDomainUri() + ); + } catch (ClientException $e) { + // If the metadata server exists, but returns a 404 for the universe domain, the auth + // libraries should safely assume this is an older metadata server running in GCU, and + // should return the default universe domain. + if (!$e->hasResponse() || 404 != $e->getResponse()->getStatusCode()) { + throw $e; + } + $this->universeDomain = self::DEFAULT_UNIVERSE_DOMAIN; + } + + // We expect in some cases the metadata server will return an empty string for the universe + // domain. In this case, the auth library MUST return the default universe domain. + if ('' === $this->universeDomain) { + $this->universeDomain = self::DEFAULT_UNIVERSE_DOMAIN; + } + + return $this->universeDomain; + } + /** * Fetch the value of a GCE metadata server URI. * * @param callable $httpHandler An HTTP Handler to deliver PSR7 requests. * @param string $uri The metadata URI. + * @param array $headers [optional] If present, add these headers to the token + * endpoint request. + * * @return string */ - private function getFromMetadata(callable $httpHandler, $uri) + private function getFromMetadata(callable $httpHandler, $uri, array $headers = []) { $resp = $httpHandler( new Request( 'GET', $uri, - [self::FLAVOR_HEADER => 'Google'] + [self::FLAVOR_HEADER => 'Google'] + $headers ) ); @@ -545,4 +671,9 @@ public function setIsOnGce($isOnGce) // Set isOnGce $this->isOnGce = $isOnGce; } + + protected function getCredType(): string + { + return self::CRED_TYPE; + } } diff --git a/lib/Google/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php b/lib/Google/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php index 1b4e46eaf..791fe985a 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/ImpersonatedServiceAccountCredentials.php @@ -26,6 +26,8 @@ class ImpersonatedServiceAccountCredentials extends CredentialsLoader implements { use IamSignerTrait; + private const CRED_TYPE = 'imp'; + /** * @var string */ @@ -121,7 +123,11 @@ public function getClientName(callable $unusedHttpHandler = null) */ public function fetchAuthToken(callable $httpHandler = null) { - return $this->sourceCredentials->fetchAuthToken($httpHandler); + // We don't support id token endpoint requests as of now for Impersonated Cred + return $this->sourceCredentials->fetchAuthToken( + $httpHandler, + $this->applyTokenEndpointMetrics([], 'at') + ); } /** @@ -139,4 +145,9 @@ public function getLastReceivedToken() { return $this->sourceCredentials->getLastReceivedToken(); } + + protected function getCredType(): string + { + return self::CRED_TYPE; + } } diff --git a/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php b/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php index 086417c07..91238029d 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountCredentials.php @@ -65,6 +65,13 @@ class ServiceAccountCredentials extends CredentialsLoader implements { use ServiceAccountSignerTrait; + /** + * Used in observability metric headers + * + * @var string + */ + private const CRED_TYPE = 'sa'; + /** * The OAuth2 instance used to conduct authorization. * @@ -100,9 +107,9 @@ class ServiceAccountCredentials extends CredentialsLoader implements private $jwtAccessCredentials; /** - * @var string|null + * @var string */ - private ?string $universeDomain; + private string $universeDomain; /** * Create a new ServiceAccountCredentials. @@ -164,7 +171,7 @@ public function __construct( ]); $this->projectId = $jsonKey['project_id'] ?? null; - $this->universeDomain = $jsonKey['universe_domain'] ?? null; + $this->universeDomain = $jsonKey['universe_domain'] ?? self::DEFAULT_UNIVERSE_DOMAIN; } /** @@ -206,7 +213,9 @@ public function fetchAuthToken(callable $httpHandler = null) return $accessToken; } - return $this->auth->fetchAuthToken($httpHandler); + $authRequestType = empty($this->auth->getAdditionalClaims()['target_audience']) + ? 'at' : 'it'; + return $this->auth->fetchAuthToken($httpHandler, $this->applyTokenEndpointMetrics([], $authRequestType)); } /** @@ -341,17 +350,33 @@ public function getQuotaProject() */ public function getUniverseDomain(): string { - if (null === $this->universeDomain) { - return self::DEFAULT_UNIVERSE_DOMAIN; - } return $this->universeDomain; } + protected function getCredType(): string + { + return self::CRED_TYPE; + } + /** * @return bool */ private function useSelfSignedJwt() { + // When a sub is supplied, the user is using domain-wide delegation, which not available + // with self-signed JWTs + if (null !== $this->auth->getSub()) { + // If we are outside the GDU, we can't use domain-wide delegation + if ($this->getUniverseDomain() !== self::DEFAULT_UNIVERSE_DOMAIN) { + throw new \LogicException(sprintf( + 'Service Account subject is configured for the credential. Domain-wide ' . + 'delegation is not supported in universes other than %s.', + self::DEFAULT_UNIVERSE_DOMAIN + )); + } + return false; + } + // If claims are set, this call is for "id_tokens" if ($this->auth->getAdditionalClaims()) { return false; @@ -361,6 +386,12 @@ private function useSelfSignedJwt() if ($this->useJwtAccessWithScope) { return true; } + + // If the universe domain is outside the GDU, use JwtAccess for access tokens + if ($this->getUniverseDomain() !== self::DEFAULT_UNIVERSE_DOMAIN) { + return true; + } + return is_null($this->auth->getScope()); } } diff --git a/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php b/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php index 16c7d59ca..87baa7500 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php @@ -40,6 +40,13 @@ class ServiceAccountJwtAccessCredentials extends CredentialsLoader implements { use ServiceAccountSignerTrait; + /** + * Used in observability metric headers + * + * @var string + */ + private const CRED_TYPE = 'jwt'; + /** * The OAuth2 instance used to conduct authorization. * @@ -151,7 +158,11 @@ public function fetchAuthToken(callable $httpHandler = null) // Set the self-signed access token in OAuth2 for getLastReceivedToken $this->auth->setAccessToken($access_token); - return ['access_token' => $access_token]; + return [ + 'access_token' => $access_token, + 'expires_in' => $this->auth->getExpiry(), + 'token_type' => 'Bearer' + ]; } /** @@ -205,4 +216,9 @@ public function getQuotaProject() { return $this->quotaProject; } + + protected function getCredType(): string + { + return self::CRED_TYPE; + } } diff --git a/lib/Google/vendor/google/auth/src/Credentials/UserRefreshCredentials.php b/lib/Google/vendor/google/auth/src/Credentials/UserRefreshCredentials.php index e2f32d87f..69778f7c8 100644 --- a/lib/Google/vendor/google/auth/src/Credentials/UserRefreshCredentials.php +++ b/lib/Google/vendor/google/auth/src/Credentials/UserRefreshCredentials.php @@ -34,6 +34,13 @@ */ class UserRefreshCredentials extends CredentialsLoader implements GetQuotaProjectInterface { + /** + * Used in observability metric headers + * + * @var string + */ + private const CRED_TYPE = 'u'; + /** * The OAuth2 instance used to conduct authorization. * @@ -98,6 +105,10 @@ public function __construct( /** * @param callable $httpHandler + * @param array $metricsHeader [optional] Metrics headers to be inserted + * into the token endpoint request present. + * This could be passed from ImersonatedServiceAccountCredentials as it uses + * UserRefreshCredentials as source credentials. * * @return array { * A set of auth related metadata, containing the following @@ -109,9 +120,13 @@ public function __construct( * @type string $id_token * } */ - public function fetchAuthToken(callable $httpHandler = null) + public function fetchAuthToken(callable $httpHandler = null, array $metricsHeader = []) { - return $this->auth->fetchAuthToken($httpHandler); + // We don't support id token endpoint requests as of now for User Cred + return $this->auth->fetchAuthToken( + $httpHandler, + $this->applyTokenEndpointMetrics($metricsHeader, 'at') + ); } /** @@ -149,4 +164,9 @@ public function getGrantedScope() { return $this->auth->getGrantedScope(); } + + protected function getCredType(): string + { + return self::CRED_TYPE; + } } diff --git a/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableHandler.php b/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableHandler.php new file mode 100644 index 000000000..8f5e13f4e --- /dev/null +++ b/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableHandler.php @@ -0,0 +1,83 @@ + */ + private array $env = []; + + private ?string $output = null; + + /** + * @param array $env + */ + public function __construct( + array $env = [], + int $timeoutMs = self::DEFAULT_EXECUTABLE_TIMEOUT_MILLIS, + ) { + if (!class_exists(Process::class)) { + throw new RuntimeException(sprintf( + 'The "symfony/process" package is required to use %s.', + self::class + )); + } + $this->env = $env; + $this->timeoutMs = $timeoutMs; + } + + /** + * @param string $command + * @return int + */ + public function __invoke(string $command): int + { + $process = Process::fromShellCommandline( + $command, + null, + $this->env, + null, + ($this->timeoutMs / 1000) + ); + + try { + $process->run(); + } catch (ProcessTimedOutException $e) { + throw new ExecutableResponseError( + 'The executable failed to finish within the timeout specified.', + 'TIMEOUT_EXCEEDED' + ); + } + + $this->output = $process->getOutput() . $process->getErrorOutput(); + + return $process->getExitCode(); + } + + public function getOutput(): ?string + { + return $this->output; + } +} diff --git a/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableResponseError.php b/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableResponseError.php new file mode 100644 index 000000000..441090250 --- /dev/null +++ b/lib/Google/vendor/google/auth/src/ExecutableHandler/ExecutableResponseError.php @@ -0,0 +1,27 @@ +cacheConfig = array_merge([ 'lifetime' => 1500, 'prefix' => '', + 'cacheUniverseDomain' => $fetcher instanceof Credentials\GCECredentials, ], (array) $cacheConfig); } @@ -146,9 +147,12 @@ public function signBlob($stringToSign, $forceOpenSsl = false) ); } - // Pass the access token from cache to GCECredentials for signing a blob. - // This saves a call to the metadata server when a cached token exists. - if ($this->fetcher instanceof Credentials\GCECredentials) { + // Pass the access token from cache for credentials that sign blobs + // using the IAM API. This saves a call to fetch an access token when a + // cached token exists. + if ($this->fetcher instanceof Credentials\GCECredentials + || $this->fetcher instanceof Credentials\ImpersonatedServiceAccountCredentials + ) { $cached = $this->fetchAuthTokenFromCache(); $accessToken = $cached['access_token'] ?? null; return $this->fetcher->signBlob($stringToSign, $forceOpenSsl, $accessToken); @@ -189,6 +193,15 @@ public function getProjectId(callable $httpHandler = null) ); } + // Pass the access token from cache for credentials that require an + // access token to fetch the project ID. This saves a call to fetch an + // access token when a cached token exists. + if ($this->fetcher instanceof Credentials\ExternalAccountCredentials) { + $cached = $this->fetchAuthTokenFromCache(); + $accessToken = $cached['access_token'] ?? null; + return $this->fetcher->getProjectId($httpHandler, $accessToken); + } + return $this->fetcher->getProjectId($httpHandler); } @@ -200,6 +213,9 @@ public function getProjectId(callable $httpHandler = null) public function getUniverseDomain(): string { if ($this->fetcher instanceof GetUniverseDomainInterface) { + if ($this->cacheConfig['cacheUniverseDomain']) { + return $this->getCachedUniverseDomain($this->fetcher); + } return $this->fetcher->getUniverseDomain(); } @@ -237,6 +253,10 @@ public function updateMetadata( $metadata[self::AUTH_METADATA_KEY] = [ 'Bearer ' . $cached['access_token'] ]; + } elseif (isset($cached['id_token'])) { + $metadata[self::AUTH_METADATA_KEY] = [ + 'Bearer ' . $cached['id_token'] + ]; } } @@ -304,4 +324,16 @@ private function saveAuthTokenInCache($authToken, $authUri = null) $this->setCachedValue($cacheKey, $authToken); } } + + private function getCachedUniverseDomain(GetUniverseDomainInterface $fetcher): string + { + $cacheKey = $this->getFullCacheKey($fetcher->getCacheKey() . 'universe_domain'); // @phpstan-ignore-line + if ($universeDomain = $this->getCachedValue($cacheKey)) { + return $universeDomain; + } + + $universeDomain = $fetcher->getUniverseDomain(); + $this->setCachedValue($cacheKey, $universeDomain); + return $universeDomain; + } } diff --git a/lib/Google/vendor/google/auth/src/Iam.php b/lib/Google/vendor/google/auth/src/Iam.php index 943ecf2d6..2f67f0009 100644 --- a/lib/Google/vendor/google/auth/src/Iam.php +++ b/lib/Google/vendor/google/auth/src/Iam.php @@ -29,22 +29,31 @@ */ class Iam { + /** + * @deprecated + */ const IAM_API_ROOT = 'https://iamcredentials.googleapis.com/v1'; const SIGN_BLOB_PATH = '%s:signBlob?alt=json'; const SERVICE_ACCOUNT_NAME = 'projects/-/serviceAccounts/%s'; + private const IAM_API_ROOT_TEMPLATE = 'https://iamcredentials.UNIVERSE_DOMAIN/v1'; /** * @var callable */ private $httpHandler; + private string $universeDomain; + /** * @param callable $httpHandler [optional] The HTTP Handler to send requests. */ - public function __construct(callable $httpHandler = null) - { + public function __construct( + callable $httpHandler = null, + string $universeDomain = GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN + ) { $this->httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); + $this->universeDomain = $universeDomain; } /** @@ -66,7 +75,8 @@ public function signBlob($email, $accessToken, $stringToSign, array $delegates = { $httpHandler = $this->httpHandler; $name = sprintf(self::SERVICE_ACCOUNT_NAME, $email); - $uri = self::IAM_API_ROOT . '/' . sprintf(self::SIGN_BLOB_PATH, $name); + $apiRoot = str_replace('UNIVERSE_DOMAIN', $this->universeDomain, self::IAM_API_ROOT_TEMPLATE); + $uri = $apiRoot . '/' . sprintf(self::SIGN_BLOB_PATH, $name); if ($delegates) { foreach ($delegates as &$delegate) { diff --git a/lib/Google/vendor/google/auth/src/IamSignerTrait.php b/lib/Google/vendor/google/auth/src/IamSignerTrait.php index 9de18b3fd..da3c90903 100644 --- a/lib/Google/vendor/google/auth/src/IamSignerTrait.php +++ b/lib/Google/vendor/google/auth/src/IamSignerTrait.php @@ -51,7 +51,12 @@ public function signBlob($stringToSign, $forceOpenSsl = false, $accessToken = nu // Providing a signer is useful for testing, but it's undocumented // because it's not something a user would generally need to do. - $signer = $this->iam ?: new Iam($httpHandler); + $signer = $this->iam; + if (!$signer) { + $signer = $this instanceof GetUniverseDomainInterface + ? new Iam($httpHandler, $this->getUniverseDomain()) + : new Iam($httpHandler); + } $email = $this->getClientName($httpHandler); diff --git a/lib/Google/vendor/google/auth/src/MetricsTrait.php b/lib/Google/vendor/google/auth/src/MetricsTrait.php new file mode 100644 index 000000000..8d5c03cf8 --- /dev/null +++ b/lib/Google/vendor/google/auth/src/MetricsTrait.php @@ -0,0 +1,120 @@ + $metadata The metadata to update and return. + * @return array The updated metadata. + */ + protected function applyServiceApiUsageMetrics($metadata) + { + if ($credType = $this->getCredType()) { + // Add service api usage observability metrics info into metadata + // We expect upstream libries to have the metadata key populated already + $value = 'cred-type/' . $credType; + if (!isset($metadata[self::$metricMetadataKey])) { + // This case will happen only when someone invokes the updateMetadata + // method on the credentials fetcher themselves. + $metadata[self::$metricMetadataKey] = [$value]; + } elseif (is_array($metadata[self::$metricMetadataKey])) { + $metadata[self::$metricMetadataKey][0] .= ' ' . $value; + } else { + $metadata[self::$metricMetadataKey] .= ' ' . $value; + } + } + + return $metadata; + } + + /** + * @param array $metadata The metadata to update and return. + * @param string $authRequestType The auth request type. Possible values are + * `'at'`, `'it'`, `'mds'`. + * @return array The updated metadata. + */ + protected function applyTokenEndpointMetrics($metadata, $authRequestType) + { + $metricsHeader = self::getMetricsHeader($this->getCredType(), $authRequestType); + if (!isset($metadata[self::$metricMetadataKey])) { + $metadata[self::$metricMetadataKey] = $metricsHeader; + } + return $metadata; + } + + protected static function getVersion(): string + { + if (is_null(self::$version)) { + $versionFilePath = __DIR__ . '/../VERSION'; + self::$version = trim((string) file_get_contents($versionFilePath)); + } + return self::$version; + } + + protected function getCredType(): string + { + return ''; + } +} diff --git a/lib/Google/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php b/lib/Google/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php index b10cf9bff..798766efa 100644 --- a/lib/Google/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php +++ b/lib/Google/vendor/google/auth/src/Middleware/AuthTokenMiddleware.php @@ -132,7 +132,7 @@ private function addAuthHeaders(RequestInterface $request) ) { $token = $this->fetcher->fetchAuthToken(); $request = $request->withHeader( - 'authorization', 'Bearer ' . ($token['access_token'] ?? $token['id_token']) + 'authorization', 'Bearer ' . ($token['access_token'] ?? $token['id_token'] ?? '') ); } else { $headers = $this->fetcher->updateMetadata($request->getHeaders(), null, $this->httpHandler); diff --git a/lib/Google/vendor/google/auth/src/OAuth2.php b/lib/Google/vendor/google/auth/src/OAuth2.php index 2e5adcdcf..b1f9ae26d 100644 --- a/lib/Google/vendor/google/auth/src/OAuth2.php +++ b/lib/Google/vendor/google/auth/src/OAuth2.php @@ -321,6 +321,14 @@ class OAuth2 implements FetchAuthTokenInterface */ private ?string $issuedTokenType = null; + /** + * From STS response. + * An identifier for the representation of the issued security token. + * + * @var array + */ + private array $additionalOptions; + /** * Create a new OAuthCredentials. * @@ -438,6 +446,7 @@ public function __construct(array $config) 'subjectTokenType' => null, 'actorToken' => null, 'actorTokenType' => null, + 'additionalOptions' => [], ], $config); $this->setAuthorizationUri($opts['authorizationUri']); @@ -466,6 +475,7 @@ public function __construct(array $config) $this->subjectTokenType = $opts['subjectTokenType']; $this->actorToken = $opts['actorToken']; $this->actorTokenType = $opts['actorTokenType']; + $this->additionalOptions = $opts['additionalOptions']; $this->updateToken($opts); } @@ -572,9 +582,11 @@ public function toJwt(array $config = []) * Generates a request for token credentials. * * @param callable $httpHandler callback which delivers psr7 request + * @param array $headers [optional] Additional headers to pass to + * the token endpoint request. * @return RequestInterface the authorization Url. */ - public function generateCredentialsRequest(callable $httpHandler = null) + public function generateCredentialsRequest(callable $httpHandler = null, $headers = []) { $uri = $this->getTokenCredentialUri(); if (is_null($uri)) { @@ -616,6 +628,9 @@ public function generateCredentialsRequest(callable $httpHandler = null) 'actor_token' => $this->actorToken, 'actor_token_type' => $this->actorTokenType, ]); + if ($this->additionalOptions) { + $params['options'] = json_encode($this->additionalOptions); + } break; default: if (!is_null($this->getRedirectUri())) { @@ -633,7 +648,7 @@ public function generateCredentialsRequest(callable $httpHandler = null) $headers = [ 'Cache-Control' => 'no-store', 'Content-Type' => 'application/x-www-form-urlencoded', - ]; + ] + $headers; return new Request( 'POST', @@ -647,15 +662,17 @@ public function generateCredentialsRequest(callable $httpHandler = null) * Fetches the auth tokens based on the current state. * * @param callable $httpHandler callback which delivers psr7 request + * @param array $headers [optional] If present, add these headers to the token + * endpoint request. * @return array the response */ - public function fetchAuthToken(callable $httpHandler = null) + public function fetchAuthToken(callable $httpHandler = null, $headers = []) { if (is_null($httpHandler)) { $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); } - $response = $httpHandler($this->generateCredentialsRequest($httpHandler)); + $response = $httpHandler($this->generateCredentialsRequest($httpHandler, $headers)); $credentials = $this->parseTokenResponse($response); $this->updateToken($credentials); if (isset($credentials['scope'])) { diff --git a/lib/Google/vendor/google/auth/src/ServiceAccountSignerTrait.php b/lib/Google/vendor/google/auth/src/ServiceAccountSignerTrait.php index 2ef4cd90c..b032bf107 100644 --- a/lib/Google/vendor/google/auth/src/ServiceAccountSignerTrait.php +++ b/lib/Google/vendor/google/auth/src/ServiceAccountSignerTrait.php @@ -17,7 +17,8 @@ namespace Google\Auth; -use phpseclib\Crypt\RSA; +use phpseclib3\Crypt\PublicKeyLoader; +use phpseclib3\Crypt\RSA; /** * Sign a string using a Service Account private key. @@ -37,11 +38,9 @@ public function signBlob($stringToSign, $forceOpenssl = false) $privateKey = $this->auth->getSigningKey(); $signedString = ''; - if (class_exists('\\phpseclib\\Crypt\\RSA') && !$forceOpenssl) { - $rsa = new RSA(); - $rsa->loadKey($privateKey); - $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); - $rsa->setHash('sha256'); + if (class_exists(phpseclib3\Crypt\RSA::class) && !$forceOpenssl) { + $key = PublicKeyLoader::load($privateKey); + $rsa = $key->withHash('sha256')->withPadding(RSA::SIGNATURE_PKCS1); $signedString = $rsa->sign($stringToSign); } elseif (extension_loaded('openssl')) { diff --git a/lib/Google/vendor/google/auth/src/UpdateMetadataTrait.php b/lib/Google/vendor/google/auth/src/UpdateMetadataTrait.php index fd33e0dca..30d4060cf 100644 --- a/lib/Google/vendor/google/auth/src/UpdateMetadataTrait.php +++ b/lib/Google/vendor/google/auth/src/UpdateMetadataTrait.php @@ -26,6 +26,8 @@ */ trait UpdateMetadataTrait { + use MetricsTrait; + /** * export a callback function which updates runtime metadata. * @@ -50,12 +52,18 @@ public function updateMetadata( $authUri = null, callable $httpHandler = null ) { - if (isset($metadata[self::AUTH_METADATA_KEY])) { + $metadata_copy = $metadata; + + // We do need to set the service api usage metrics irrespective even if + // the auth token is set because invoking this method with auth tokens + // would mean the intention is to just explicitly set the metrics metadata. + $metadata_copy = $this->applyServiceApiUsageMetrics($metadata_copy); + + if (isset($metadata_copy[self::AUTH_METADATA_KEY])) { // Auth metadata has already been set - return $metadata; + return $metadata_copy; } $result = $this->fetchAuthToken($httpHandler); - $metadata_copy = $metadata; if (isset($result['access_token'])) { $metadata_copy[self::AUTH_METADATA_KEY] = ['Bearer ' . $result['access_token']]; } elseif (isset($result['id_token'])) { diff --git a/lib/Google/vendor/google/cloud-core/.repo-metadata.json b/lib/Google/vendor/google/cloud-core/.repo-metadata.json deleted file mode 100644 index 9f0a1e0ee..000000000 --- a/lib/Google/vendor/google/cloud-core/.repo-metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "language": "php", - "distribution_name": "google/cloud-core", - "release_level": "stable", - "client_documentation": "https://cloud.google.com/php/docs/reference/cloud-core/latest", - "library_type": "CORE", - "api_shortname": "" -} diff --git a/lib/Google/vendor/google/cloud-core/VERSION b/lib/Google/vendor/google/cloud-core/VERSION index a91664e0a..5b1ab2700 100644 --- a/lib/Google/vendor/google/cloud-core/VERSION +++ b/lib/Google/vendor/google/cloud-core/VERSION @@ -1 +1 @@ -1.52.10 +1.59.1 diff --git a/lib/Google/vendor/google/cloud-core/composer.json b/lib/Google/vendor/google/cloud-core/composer.json index 63aff87d1..f84a2979e 100644 --- a/lib/Google/vendor/google/cloud-core/composer.json +++ b/lib/Google/vendor/google/cloud-core/composer.json @@ -4,24 +4,25 @@ "license": "Apache-2.0", "minimum-stability": "stable", "require": { - "php": ">=7.4", + "php": "^8.0", "rize/uri-template": "~0.3", - "google/auth": "^1.18", + "google/auth": "^1.34", "guzzlehttp/guzzle": "^6.5.8|^7.4.4", "guzzlehttp/promises": "^1.4||^2.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "monolog/monolog": "^1.1|^2.0|^3.0", - "psr/http-message": "^1.0|^2.0" + "guzzlehttp/psr7": "^2.6", + "monolog/monolog": "^2.9|^3.0", + "psr/http-message": "^1.0|^2.0", + "google/gax": "^1.34.0" }, "require-dev": { "phpunit/phpunit": "^9.0", "phpspec/prophecy-phpunit": "^2.0", "squizlabs/php_codesniffer": "2.*", - "phpdocumentor/reflection": "^5.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "erusev/parsedown": "^1.6", - "google/gax": "^1.24.0", "opis/closure": "^3", - "google/cloud-common-protos": "^0.4" + "google/cloud-common-protos": "~0.5" }, "suggest": { "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", diff --git a/lib/Google/vendor/google/cloud-core/snippet-bootstrap.php b/lib/Google/vendor/google/cloud-core/snippet-bootstrap.php index b53df247d..156f1a322 100644 --- a/lib/Google/vendor/google/cloud-core/snippet-bootstrap.php +++ b/lib/Google/vendor/google/cloud-core/snippet-bootstrap.php @@ -1,7 +1,14 @@ $value) { + $fFields[$key] = $this->formatValueForApi($value); + } + + return ['fields' => $fFields]; + } + + private function unpackStructFromApi(array $struct) + { + $vals = []; + foreach ($struct['fields'] as $key => $val) { + $vals[$key] = $this->unpackValue($val); + } + return $vals; + } + + private function unpackValue($value) + { + if (count($value) > 1) { + throw new \RuntimeException("Unexpected fields in struct: $value"); + } + + foreach ($value as $setField => $setValue) { + switch ($setField) { + case 'listValue': + $valueList = []; + foreach ($setValue['values'] as $innerValue) { + $valueList[] = $this->unpackValue($innerValue); + } + return $valueList; + case 'structValue': + return $this->unpackStructFromApi($value['structValue']); + default: + return $setValue; + } + } + } + + private function flattenStruct(array $struct) + { + return $struct['fields']; + } + + private function flattenValue(array $value) + { + if (count($value) > 1) { + throw new \RuntimeException("Unexpected fields in struct: $value"); + } + + if (isset($value['nullValue'])) { + return null; + } + + return array_pop($value); + } + + private function flattenListValue(array $value) + { + return $value['values']; + } + + /** + * Format a list for the API. + * + * @param array $list + * @return array + */ + private function formatListForApi(array $list) + { + $values = []; + + foreach ($list as $value) { + $values[] = $this->formatValueForApi($value); + } + + return ['values' => $values]; + } + + /** + * Format a value for the API. + * + * @param mixed $value + * @return array + */ + private function formatValueForApi($value) + { + $type = gettype($value); + + switch ($type) { + case 'string': + return ['string_value' => $value]; + case 'double': + case 'integer': + return ['number_value' => $value]; + case 'boolean': + return ['bool_value' => $value]; + case 'NULL': + return ['null_value' => NullValue::NULL_VALUE]; + case 'array': + if (!empty($value) && $this->isAssoc($value)) { + return ['struct_value' => $this->formatStructForApi($value)]; + } + + return ['list_value' => $this->formatListForApi($value)]; + } + + return []; + } + + /** + * Format a gRPC timestamp to match the format returned by the REST API. + * + * @param array $timestamp + * @return string + */ + private function formatTimestampFromApi(array $timestamp) + { + $timestamp += [ + 'seconds' => 0, + 'nanos' => 0 + ]; + + $dt = $this->createDateTimeFromSeconds($timestamp['seconds']); + + return $this->formatTimeAsString($dt, $timestamp['nanos']); + } + + /** + * Format a timestamp for the API with nanosecond precision. + * + * @param string $value + * @return array + */ + private function formatTimestampForApi($value) + { + list ($dt, $nanos) = $this->parseTimeString($value); + + return [ + 'seconds' => (int) $dt->format('U'), + 'nanos' => (int) $nanos + ]; + } + + /** + * Format a duration for the API. + * + * @param string|mixed $value + * @return array + */ + private function formatDurationForApi($value) + { + if (is_string($value)) { + $d = explode('.', trim($value, 's')); + if (count($d) < 2) { + $seconds = $d[0]; + $nanos = 0; + } else { + $seconds = (int) $d[0]; + $nanos = $this->convertFractionToNanoSeconds($d[1]); + } + } elseif ($value instanceof Duration) { + $d = $value->get(); + $seconds = $d['seconds']; + $nanos = $d['nanos']; + } + + return [ + 'seconds' => $seconds, + 'nanos' => $nanos + ]; + } + + /** + * Construct a gapic client. Allows for tests to intercept. + * + * @param string $gapicName + * @param array $config + * @return mixed + */ + protected function constructGapic($gapicName, array $config) + { + return new $gapicName($config); + } + + /** + * Helper function to convert selective elements into protos out of a given input array. + * + * Example: + * ``` + * $output = $topic->convertDataToProtos(['schema' =>[], 'other vals'], ['schema' => Schema::class]); + * $output['schema']; // This will be of the Schema type. + * ``` + * + * @param array $input The input array. + * @param array $map The key,value pairs specifying the elements and the proto classes. + * + * @return array The modified array + */ + private function convertDataToProtos(array $input, array $map) : array + { + foreach ($map as $key => $className) { + if (isset($input[$key])) { + $input[$key] = $this->serializer->decodeMessage(new $className, $input[$key]); + } + } + + return $input; + } + + /** + * Helper method used to split a supplied set of options into parameters that are passed into + * a proto message and optional args. + * We strictly treat the parameters allowed by `CallOptions` in GAX as the optional params + * and everything else that is passed is passed to the Proto message constructor. + */ + private function splitOptionalArgs(array $input, array $extraAllowedKeys = []) : array + { + $callOptionFields = array_keys((new CallOptions([]))->toArray()); + $keys = array_merge($callOptionFields, $extraAllowedKeys); + + $optionalArgs = $this->pluckArray($keys, $input); + + return [$input, $optionalArgs]; + } +} diff --git a/lib/Google/vendor/google/cloud-core/src/DetectProjectIdTrait.php b/lib/Google/vendor/google/cloud-core/src/DetectProjectIdTrait.php new file mode 100644 index 000000000..8cd853076 --- /dev/null +++ b/lib/Google/vendor/google/cloud-core/src/DetectProjectIdTrait.php @@ -0,0 +1,104 @@ + null, + 'projectId' => null, + 'projectIdRequired' => false, + 'hasEmulator' => false, + 'credentials' => null, + ]; + + if ($config['projectId']) { + return $config['projectId']; + } + + if ($config['hasEmulator']) { + return 'emulator-project'; + } + + if ($config['credentials'] + && $config['credentials'] instanceof ProjectIdProviderInterface + && $projectId = $config['credentials']->getProjectId()) { + return $projectId; + } + + if (getenv('GOOGLE_CLOUD_PROJECT')) { + return getenv('GOOGLE_CLOUD_PROJECT'); + } + + if (getenv('GCLOUD_PROJECT')) { + return getenv('GCLOUD_PROJECT'); + } + + $this->throwExceptionIfProjectIdRequired($config); + + return ''; + } + + /** + * Throws an exception if project id is required. + * @param array $config + * @throws GoogleException + */ + private function throwExceptionIfProjectIdRequired(array $config) + { + if ($config['projectIdRequired']) { + throw new GoogleException( + 'No project ID was provided, ' . + 'and we were unable to detect a default project ID.' + ); + } + } +} diff --git a/lib/Google/vendor/google/cloud-core/src/EmulatorTrait.php b/lib/Google/vendor/google/cloud-core/src/EmulatorTrait.php index 5d6929ded..634265f72 100644 --- a/lib/Google/vendor/google/cloud-core/src/EmulatorTrait.php +++ b/lib/Google/vendor/google/cloud-core/src/EmulatorTrait.php @@ -36,17 +36,21 @@ private function emulatorGapicConfig($emulatorHost) $emulatorHost = str_replace($search, '', $emulatorHost); } - return [ + $config = [ 'apiEndpoint' => $emulatorHost, - 'transportConfig' => [ + 'credentials' => new InsecureCredentialsWrapper(), + ]; + if (class_exists('Grpc\ChannelCredentials')) { + $config['transportConfig'] = [ 'grpc' => [ 'stubOpts' => [ 'credentials' => \Grpc\ChannelCredentials::createInsecure() ] ] - ], - 'credentials' => new InsecureCredentialsWrapper(), - ]; + ]; + } + + return $config; } /** * Retrieve a valid base uri for a service emulator. diff --git a/lib/Google/vendor/google/cloud-core/src/GrpcRequestWrapper.php b/lib/Google/vendor/google/cloud-core/src/GrpcRequestWrapper.php index 5a2735361..9f8d3b50b 100644 --- a/lib/Google/vendor/google/cloud-core/src/GrpcRequestWrapper.php +++ b/lib/Google/vendor/google/cloud-core/src/GrpcRequestWrapper.php @@ -20,14 +20,8 @@ use Google\Auth\HttpHandler\HttpHandlerFactory; use Google\Cloud\Core\Exception; use Google\ApiCore\ApiException; -use Google\ApiCore\OperationResponse; -use Google\ApiCore\PagedListResponse; use Google\ApiCore\Serializer; -use Google\ApiCore\ServerStream; -use Google\Protobuf\Internal\Message; -use Google\Rpc\BadRequest; use Google\Rpc\Code; -use Google\Rpc\RetryInfo; /** * The GrpcRequestWrapper is responsible for delivering gRPC requests. @@ -35,6 +29,7 @@ class GrpcRequestWrapper { use RequestWrapperTrait; + use RequestProcessorTrait; /** * @var callable A handler used to deliver Psr7 requests specifically for @@ -63,14 +58,6 @@ class GrpcRequestWrapper Code::DATA_LOSS ]; - /** - * @var array Map of error metadata types to RPC wrappers. - */ - private $metadataTypes = [ - 'google.rpc.retryinfo-bin' => RetryInfo::class, - 'google.rpc.badrequest-bin' => BadRequest::class - ]; - /** * @param array $config [optional] { * Configuration options. Please see @@ -154,112 +141,4 @@ public function send(callable $request, array $args, array $options = []) throw $ex; } } - - /** - * Serializes a gRPC response. - * - * @param mixed $response - * @return \Generator|OperationResponse|array|null - */ - private function handleResponse($response) - { - if ($response instanceof PagedListResponse) { - $response = $response->getPage()->getResponseObject(); - } - - if ($response instanceof Message) { - return $this->serializer->encodeMessage($response); - } - - if ($response instanceof OperationResponse) { - return $response; - } - - if ($response instanceof ServerStream) { - return $this->handleStream($response); - } - - return null; - } - - /** - * Handles a streaming response. - * - * @param ServerStream $response - * @return \Generator|array|null - * @throws Exception\ServiceException - */ - private function handleStream($response) - { - try { - foreach ($response->readAll() as $count => $result) { - $res = $this->serializer->encodeMessage($result); - yield $res; - } - } catch (\Exception $ex) { - throw $this->convertToGoogleException($ex); - } - } - - /** - * Convert a ApiCore exception to a Google Exception. - * - * @param \Exception $ex - * @return Exception\ServiceException - */ - private function convertToGoogleException($ex) - { - switch ($ex->getCode()) { - case Code::INVALID_ARGUMENT: - $exception = Exception\BadRequestException::class; - break; - - case Code::NOT_FOUND: - case Code::UNIMPLEMENTED: - $exception = Exception\NotFoundException::class; - break; - - case Code::ALREADY_EXISTS: - $exception = Exception\ConflictException::class; - break; - - case Code::FAILED_PRECONDITION: - $exception = Exception\FailedPreconditionException::class; - break; - - case Code::UNKNOWN: - $exception = Exception\ServerException::class; - break; - - case Code::INTERNAL: - $exception = Exception\ServerException::class; - break; - - case Code::ABORTED: - $exception = Exception\AbortedException::class; - break; - - case Code::DEADLINE_EXCEEDED: - $exception = Exception\DeadlineExceededException::class; - break; - - default: - $exception = Exception\ServiceException::class; - break; - } - - $metadata = []; - if ($ex->getMetadata()) { - foreach ($ex->getMetadata() as $type => $binaryValue) { - if (!isset($this->metadataTypes[$type])) { - continue; - } - $metadataElement = new $this->metadataTypes[$type]; - $metadataElement->mergeFromString($binaryValue[0]); - $metadata[] = $this->serializer->encodeMessage($metadataElement); - } - } - - return new $exception($ex->getMessage(), $ex->getCode(), $ex, $metadata); - } } diff --git a/lib/Google/vendor/google/cloud-core/src/GrpcTrait.php b/lib/Google/vendor/google/cloud-core/src/GrpcTrait.php index 48d42f67c..bab9d6d32 100644 --- a/lib/Google/vendor/google/cloud-core/src/GrpcTrait.php +++ b/lib/Google/vendor/google/cloud-core/src/GrpcTrait.php @@ -17,22 +17,21 @@ namespace Google\Cloud\Core; +use Google\Auth\GetUniverseDomainInterface; use Google\ApiCore\CredentialsWrapper; -use Google\Cloud\Core\ArrayTrait; -use Google\Cloud\Core\Duration; use Google\Cloud\Core\Exception\NotFoundException; use Google\Cloud\Core\Exception\ServiceException; use Google\Cloud\Core\GrpcRequestWrapper; use Google\Protobuf\NullValue; +use Google\Cloud\Core\Duration; /** * Provides shared functionality for gRPC service implementations. */ trait GrpcTrait { - use ArrayTrait; - use TimeTrait; use WhitelistTrait; + use ArrayTrait; /** * @var GrpcRequestWrapper Wrapper used to handle sending requests to the @@ -94,10 +93,14 @@ public function send(callable $request, array $args, $whitelisted = false) * * @param string $version * @param callable|null $authHttpHandler + * @param string|null $universeDomain * @return array */ - private function getGaxConfig($version, callable $authHttpHandler = null) - { + private function getGaxConfig( + $version, + callable $authHttpHandler = null, + string $universeDomain = null + ) { $config = [ 'libName' => 'gccl', 'libVersion' => $version, @@ -110,7 +113,12 @@ private function getGaxConfig($version, callable $authHttpHandler = null) if (class_exists(CredentialsWrapper::class)) { $config['credentials'] = new CredentialsWrapper( $this->requestWrapper->getCredentialsFetcher(), - $authHttpHandler + $authHttpHandler, + // If the universe domain hasn't been explicitly set, check the the environment variable, + // otherwise assume GDU ("googleapis.com"). + $universeDomain + ?: getenv('GOOGLE_CLOUD_UNIVERSE_DOMAIN') + ?: GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN ); } else { $config += [ @@ -123,6 +131,8 @@ private function getGaxConfig($version, callable $authHttpHandler = null) return $config; } + use TimeTrait; + /** * Format a struct for the API. * @@ -214,7 +224,7 @@ private function formatListForApi(array $list) /** * Format a value for the API. * - * @param array $value + * @param mixed $value * @return array */ private function formatValueForApi($value) @@ -279,7 +289,7 @@ private function formatTimestampForApi($value) /** * Format a duration for the API. * - * @param string|Duration $value + * @param string|mixed $value * @return array */ private function formatDurationForApi($value) diff --git a/lib/Google/vendor/google/cloud-core/src/Iam/Iam.php b/lib/Google/vendor/google/cloud-core/src/Iam/Iam.php index 1f8c08d53..3d530d8a3 100644 --- a/lib/Google/vendor/google/cloud-core/src/Iam/Iam.php +++ b/lib/Google/vendor/google/cloud-core/src/Iam/Iam.php @@ -32,12 +32,12 @@ * // In this example, we'll use PubSub topics to demonstrate * // how IAM policies are managed. * - * use Google\Cloud\PubSub\PubSubClient; + * use Google\Cloud\Spanner\SpannerClient; * - * $pubsub = new PubSubClient(); - * $topic = $pubsub->topic('my-new-topic'); + * $spanner = new SpannerClient(); + * $instance = $spanner->instance('my-new-instance'); * - * $iam = $topic->iam(); + * $iam = $instance->iam(); * ``` */ class Iam diff --git a/lib/Google/vendor/google/cloud-core/src/Iam/IamManager.php b/lib/Google/vendor/google/cloud-core/src/Iam/IamManager.php new file mode 100644 index 000000000..a9e373fe7 --- /dev/null +++ b/lib/Google/vendor/google/cloud-core/src/Iam/IamManager.php @@ -0,0 +1,232 @@ +topic('my-new-topic'); + * + * $iam = $topic->iam(); + * ``` + * + * @internal + */ +class IamManager +{ + use ArrayTrait; + + private RequestHandler $requestHandler; + private Serializer $serializer; + private string $clientClass; + private string $resource; + private ?array $policy; + + /** + * @param RequestHandler $requestHandler + * @param Serializer $serializer The serializer instance to encode/decode messages. + * @param string $clientClass The client class that will be passed on to the + * sendRequest method of the $requestHandler. + * @param string $resource + * @access private + */ + public function __construct( + RequestHandler $requestHandler, + Serializer $serializer, + string $clientClass, + string $resource + ) { + $this->requestHandler = $requestHandler; + $this->serializer = $serializer; + $this->clientClass = $clientClass; + $this->resource = $resource; + $this->policy = null; + } + + /** + * Get the existing IAM policy for this resource. + * + * If a policy has already been retrieved from the API, it will be returned. + * To fetch a fresh copy of the policy, use + * {@see IamManager::reload()}. + * + * Example: + * ``` + * $policy = $iam->policy(); + * ``` + * + * @param array $options Configuration Options + * @param int $options['requestedPolicyVersion'] Specify the policy version to + * request from the server. Please see + * [policy versioning](https://cloud.google.com/iam/docs/policies#versions) + * for more information. + * @return array An array of policy data + */ + public function policy(array $options = []) + { + if (!$this->policy) { + $this->reload($options); + } + + return $this->policy; + } + + /** + * Set the IAM policy for this resource. + * + * Bindings with invalid roles, or non-existent members will raise a server + * error. + * + * Example: + * ``` + * $policy = [ + * 'bindings' => [[ + * 'role' => 'roles/editor', + * 'members' => ['user:test@example.com'], + * ]] + * ]; + * $policy = $iam->setPolicy($policy); + * ``` + * ``` + * $oldPolicy = $iam->policy(); + * $oldPolicy['bindings'][0]['members'] = 'user:test@example.com'; + * + * $policy = $iam->setPolicy($oldPolicy); + * ``` + * + * @param array|PolicyBuilder $policy The new policy, as an array or an + * instance of {@see PolicyBuilder}. + * @param array $options Configuration Options + * @return array An array of policy data + * @throws InvalidArgumentException If the given policy is not an array or PolicyBuilder. + */ + public function setPolicy($policy, array $options = []) + { + if ($policy instanceof PolicyBuilder) { + $policy = $policy->result(); + } + + if (!is_array($policy)) { + throw new InvalidArgumentException('Given policy data must be an array or an instance of PolicyBuilder.'); + } + + $policy = $this->serializer->decodeMessage( + new Policy, + $policy + ); + + $updateMask = $options['updateMask'] ?? []; + + $data = ['resource' => $this->resource, 'policy' => $policy, 'updateMask' => $updateMask]; + $request = $this->serializer->decodeMessage(new SetIamPolicyRequest(), $data); + + $this->policy = $this->requestHandler->sendRequest( + $this->clientClass, + 'setIamPolicy', + $request, + $options + ); + + return $this->policy; + } + + /** + * Test if the current user has the given permissions on this resource. + * + * Invalid permissions will raise a BadRequestException. + * + * Example: + * ``` + * $allowedPermissions = $iam->testPermissions([ + * 'pubsub.topics.publish', + * 'pubsub.topics.attachSubscription' + * ]); + * ``` + * + * @param array $permissions A list of permissions to test + * @param array $options Configuration Options + * @return array A subset of $permissions, with only those allowed included. + */ + public function testPermissions(array $permissions, array $options = []) + { + $data = ['resource' => $this->resource, 'permissions' => $permissions]; + $request = $this->serializer->decodeMessage(new TestIamPermissionsRequest(), $data); + $res = $this->requestHandler->sendRequest( + $this->clientClass, + 'testIamPermissions', + $request, + $options + ); + + return isset($res['permissions']) ? $res['permissions'] : []; + } + + /** + * Refresh the IAM policy for this resource. + * + * Example: + * ``` + * $policy = $iam->reload(); + * ``` + * + * @param array $options Configuration Options + * @return array An array of policy data + */ + public function reload(array $options = []) + { + $policyOptions = $this->pluck('policyOptions', $options, false) ?: []; + $policyOptions = $this->serializer->decodeMessage(new GetPolicyOptions(), $policyOptions); + $data = ['resource' => $this->resource, 'options' => $policyOptions]; + $request = $this->serializer->decodeMessage(new GetIamPolicyRequest(), $data); + + $this->policy = $this->requestHandler->sendRequest( + $this->clientClass, + 'getIamPolicy', + $request, + $options + ); + + return $this->policy; + } +} diff --git a/lib/Google/vendor/google/cloud-core/src/InsecureCredentialsWrapper.php b/lib/Google/vendor/google/cloud-core/src/InsecureCredentialsWrapper.php index ba56d62fa..1a19c563b 100644 --- a/lib/Google/vendor/google/cloud-core/src/InsecureCredentialsWrapper.php +++ b/lib/Google/vendor/google/cloud-core/src/InsecureCredentialsWrapper.php @@ -18,19 +18,17 @@ namespace Google\Cloud\Core; -use Google\ApiCore\CredentialsWrapper; +use Google\ApiCore\InsecureCredentialsWrapper as ApiCoreInsecureCredentialsWrapper; /** * For connect to emulator. + * + * This class is deprecated. Use Google\ApiCore\InsecureCredentialsWrapper instead. + * @deprecated */ -class InsecureCredentialsWrapper extends CredentialsWrapper +class InsecureCredentialsWrapper extends ApiCoreInsecureCredentialsWrapper { public function __construct() { } - - public function getAuthorizationHeaderCallback($audience = null) - { - return null; - } } diff --git a/lib/Google/vendor/google/cloud-core/src/Report/CloudRunMetadataProvider.php b/lib/Google/vendor/google/cloud-core/src/Report/CloudRunMetadataProvider.php index aa09d3d24..5b7d77192 100644 --- a/lib/Google/vendor/google/cloud-core/src/Report/CloudRunMetadataProvider.php +++ b/lib/Google/vendor/google/cloud-core/src/Report/CloudRunMetadataProvider.php @@ -39,6 +39,11 @@ class CloudRunMetadataProvider implements MetadataProviderInterface */ private $revisionId; + /** + * @var string + */ + private $traceId; + public function __construct(array $env) { $this->serviceId = isset($env['K_SERVICE']) @@ -47,6 +52,9 @@ public function __construct(array $env) $this->revisionId = isset($env['K_REVISION']) ? $env['K_REVISION'] : 'unknown-revision'; + $this->traceId = isset($env['HTTP_X_CLOUD_TRACE_CONTEXT']) + ? substr($env['HTTP_X_CLOUD_TRACE_CONTEXT'], 0, 32) + : null; $this->metadata = new Metadata(); } @@ -87,11 +95,13 @@ public function versionId() } /** - * not implemented - * @TODO + * Return the labels. We need to evaluate $_SERVER for each request. + * @return array */ public function labels() { - return []; + return !empty($this->traceId) + ? ['run.googleapis.com/trace_id' => $this->traceId ] + : []; } } diff --git a/lib/Google/vendor/google/cloud-core/src/RequestHandler.php b/lib/Google/vendor/google/cloud-core/src/RequestHandler.php new file mode 100644 index 000000000..6e11b4d61 --- /dev/null +++ b/lib/Google/vendor/google/cloud-core/src/RequestHandler.php @@ -0,0 +1,142 @@ +serializer = $serializer; + $clientConfig['serializer'] = $serializer; + + // Adds some defaults + // gccl needs to be present for handwritten clients + $clientConfig += [ + 'libName' => 'gccl', + 'emulatorHost' => null + ]; + + if ((bool) $clientConfig['emulatorHost']) { + $emulatorConfig = $this->emulatorGapicConfig($clientConfig['emulatorHost']); + $clientConfig = array_merge( + $clientConfig, + $emulatorConfig + ); + } + //@codeCoverageIgnoreEnd + + // Initialize the client classes and store them in memory + $this->clients = []; + foreach ($clientClasses as $className) { + $this->clients[$className] = new $className($clientConfig); + } + } + + /** + * Helper function that forwards the request to a client obj. + * + * @param string $clientClass The request will be forwarded to this client class. + * @param string $method This method needs to be called on the client obj. + * @param Message $request The protobuf Request instance to pass as the first argument to the $method. + * @param array $optionalArgs The optional args. + * @param bool $whitelisted This decides the behaviour when a NotFoundException is encountered. + * + * @return \Generator|OperationResponse|array|null + * + * @throws ServiceException + */ + public function sendRequest( + string $clientClass, + string $method, + Message $request, + array $optionalArgs, + bool $whitelisted = false + ) { + $clientObj = $this->getClientObject($clientClass); + + if (!$clientObj) { + return null; + } + + $allArgs = [$request]; + $allArgs[] = $optionalArgs; + + try { + $callable = [$clientObj, $method]; + $response = call_user_func_array($callable, $allArgs); + + return $this->handleResponse($response); + } catch (ApiException $ex) { + throw $this->convertToGoogleException($ex); + } catch (NotFoundException $e) { + if ($whitelisted) { + throw $this->modifyWhitelistedError($e); + } + + throw $e; + } + } + + /** + * Helper function that returns a client object stored in memory + * using the client class as key. + * @param $clientClass The client class whose object we need. + * @return mixed + */ + private function getClientObject(string $clientClass) + { + return $this->clients[$clientClass] ?? null; + } +} diff --git a/lib/Google/vendor/google/cloud-core/src/RequestProcessorTrait.php b/lib/Google/vendor/google/cloud-core/src/RequestProcessorTrait.php new file mode 100644 index 000000000..72440cd91 --- /dev/null +++ b/lib/Google/vendor/google/cloud-core/src/RequestProcessorTrait.php @@ -0,0 +1,151 @@ + RetryInfo::class, + 'google.rpc.badrequest-bin' => BadRequest::class + ]; + + /** + * Serializes a gRPC response. + * + * @param mixed $response + * @return \Generator|OperationResponse|array|null + */ + private function handleResponse($response) + { + if ($response instanceof PagedListResponse) { + $response = $response->getPage()->getResponseObject(); + } + + if ($response instanceof Message) { + return $this->serializer->encodeMessage($response); + } + + if ($response instanceof OperationResponse) { + return $response; + } + + if ($response instanceof ServerStream) { + return $this->handleStream($response); + } + + return null; + } + + /** + * Handles a streaming response. + * + * @param ServerStream $response + * @return \Generator|array|null + * @throws Exception\ServiceException + */ + private function handleStream(ServerStream $response) + { + try { + foreach ($response->readAll() as $count => $result) { + $res = $this->serializer->encodeMessage($result); + yield $res; + } + } catch (\Exception $ex) { + throw $this->convertToGoogleException($ex); + } + } + + /** + * Convert a ApiCore exception to a Google Exception. + * + * @param \Exception $ex + * @return ServiceException + */ + private function convertToGoogleException(\Exception $ex): ServiceException + { + switch ($ex->getCode()) { + case Code::INVALID_ARGUMENT: + $exception = Exception\BadRequestException::class; + break; + + case Code::NOT_FOUND: + case Code::UNIMPLEMENTED: + $exception = Exception\NotFoundException::class; + break; + + case Code::ALREADY_EXISTS: + $exception = Exception\ConflictException::class; + break; + + case Code::FAILED_PRECONDITION: + $exception = Exception\FailedPreconditionException::class; + break; + + case Code::UNKNOWN: + $exception = Exception\ServerException::class; + break; + + case Code::INTERNAL: + $exception = Exception\ServerException::class; + break; + + case Code::ABORTED: + $exception = Exception\AbortedException::class; + break; + + case Code::DEADLINE_EXCEEDED: + $exception = Exception\DeadlineExceededException::class; + break; + + default: + $exception = Exception\ServiceException::class; + break; + } + + $metadata = []; + if (method_exists($ex, 'getMetadata') && $ex->getMetadata()) { + foreach ($ex->getMetadata() as $type => $binaryValue) { + if (!isset($this->metadataTypes[$type])) { + continue; + } + $metadataElement = new $this->metadataTypes[$type]; + $metadataElement->mergeFromString($binaryValue[0]); + $metadata[] = $this->serializer->encodeMessage($metadataElement); + } + } + + return new $exception($ex->getMessage(), $ex->getCode(), $ex, $metadata); + } +} diff --git a/lib/Google/vendor/google/cloud-core/src/RequestWrapper.php b/lib/Google/vendor/google/cloud-core/src/RequestWrapper.php index 79c2f142e..eb8f76502 100644 --- a/lib/Google/vendor/google/cloud-core/src/RequestWrapper.php +++ b/lib/Google/vendor/google/cloud-core/src/RequestWrapper.php @@ -20,11 +20,13 @@ use Google\Auth\FetchAuthTokenCache; use Google\Auth\FetchAuthTokenInterface; use Google\Auth\GetQuotaProjectInterface; +use Google\Auth\GetUniverseDomainInterface; use Google\Auth\HttpHandler\Guzzle6HttpHandler; use Google\Auth\HttpHandler\HttpHandlerFactory; use Google\Auth\UpdateMetadataInterface; use Google\Cloud\Core\Exception\ServiceException; use Google\Cloud\Core\RequestWrapperTrait; +use Google\Cloud\Core\Exception\GoogleException; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Promise\PromiseInterface; use GuzzleHttp\Psr7\Utils; @@ -94,6 +96,16 @@ class RequestWrapper */ private $calcDelayFunction; + /** + * @var string The universe domain to verify against the credentials. + */ + private string $universeDomain; + + /** + * @var bool Ensure we only check the universe domain once. + */ + private bool $hasCheckedUniverse = false; + /** * @param array $config [optional] { * Configuration options. Please see @@ -125,6 +137,7 @@ class RequestWrapper * @type callable $restCalcDelayFunction Sets the conditions for * determining how long to wait between attempts to retry. Function * signature should match: `function (int $attempt) : int`. + * @type string $universeDomain The expected universe of the credentials. Defaults to "googleapis.com". * } */ public function __construct(array $config = []) @@ -140,7 +153,8 @@ public function __construct(array $config = []) 'componentVersion' => null, 'restRetryFunction' => null, 'restDelayFunction' => null, - 'restCalcDelayFunction' => null + 'restCalcDelayFunction' => null, + 'universeDomain' => GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN, ]; $this->componentVersion = $config['componentVersion']; @@ -155,6 +169,7 @@ public function __construct(array $config = []) $this->httpHandler = $config['httpHandler'] ?: HttpHandlerFactory::build(); $this->authHttpHandler = $config['authHttpHandler'] ?: $this->httpHandler; $this->asyncHttpHandler = $config['asyncHttpHandler'] ?: $this->buildDefaultAsyncHandler(); + $this->universeDomain = $config['universeDomain']; if ($this->credentialsFetcher instanceof AnonymousCredentials) { $this->shouldSignRequest = false; @@ -313,9 +328,14 @@ private function applyHeaders(RequestInterface $request, array $options = []) $quotaProject = $this->quotaProject; if ($this->accessToken) { + // if an access token is provided, check the universe domain against "googleapis.com" + $this->checkUniverseDomain(null); $request = $request->withHeader('authorization', 'Bearer ' . $this->accessToken); } else { + // if a credentials fetcher is provided, check the universe domain against the + // credential's universe domain $credentialsFetcher = $this->getCredentialsFetcher(); + $this->checkUniverseDomain($credentialsFetcher); $request = $this->addAuthHeaders($request, $credentialsFetcher); if ($credentialsFetcher instanceof GetQuotaProjectInterface) { @@ -326,6 +346,9 @@ private function applyHeaders(RequestInterface $request, array $options = []) if ($quotaProject) { $request = $request->withHeader('X-Goog-User-Project', $quotaProject); } + } else { + // If we are not signing the request, check the universe domain against "googleapis.com" + $this->checkUniverseDomain(null); } return $request; @@ -484,4 +507,36 @@ private function buildDefaultAsyncHandler() ? [$this->httpHandler, 'async'] : [HttpHandlerFactory::build(), 'async']; } + + /** + * Verify that the expected universe domain matches the universe domain from the credentials. + */ + private function checkUniverseDomain(FetchAuthTokenInterface $credentialsFetcher = null) + { + if (false === $this->hasCheckedUniverse) { + if ($this->universeDomain === '') { + throw new GoogleException('The universe domain cannot be empty.'); + } + if (is_null($credentialsFetcher)) { + if ($this->universeDomain !== GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN) { + throw new GoogleException(sprintf( + 'The accessToken option is not supported outside of the default universe domain (%s).', + GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN + )); + } + } else { + $credentialsUniverse = $credentialsFetcher instanceof GetUniverseDomainInterface + ? $credentialsFetcher->getUniverseDomain() + : GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN; + if ($credentialsUniverse !== $this->universeDomain) { + throw new GoogleException(sprintf( + 'The configured universe domain (%s) does not match the credential universe domain (%s)', + $this->universeDomain, + $credentialsUniverse + )); + } + } + $this->hasCheckedUniverse = true; + } + } } diff --git a/lib/Google/vendor/google/cloud-core/src/RestTrait.php b/lib/Google/vendor/google/cloud-core/src/RestTrait.php index e2fa52b62..70966a8a0 100644 --- a/lib/Google/vendor/google/cloud-core/src/RestTrait.php +++ b/lib/Google/vendor/google/cloud-core/src/RestTrait.php @@ -19,6 +19,7 @@ use Google\Cloud\Core\Exception\NotFoundException; use Google\Cloud\Core\Exception\ServiceException; +use UnexpectedValueException; /** * Provides shared functionality for REST service implementations. @@ -118,20 +119,45 @@ public function send($resource, $method, array $options = [], $whitelisted = fal * * @param string $default * @param array $config + * @param string $apiEndpointTemplate * @return string */ - private function getApiEndpoint($default, array $config) + private function getApiEndpoint($default, array $config, string $apiEndpointTemplate = null) { - $res = $config['apiEndpoint'] ?? $default; + // If the $default parameter is provided, or the user has set an "apiEndoint" config option, + // fall back to the previous behavior. + if ($res = $config['apiEndpoint'] ?? $default) { + if (substr($res, -1) !== '/') { + $res = $res . '/'; + } + + if (strpos($res, '//') === false) { + $res = 'https://' . $res; + } + + return $res; + } - if (substr($res, -1) !== '/') { - $res = $res . '/'; + // One of the $default or the $template must always be set + if (!$apiEndpointTemplate) { + throw new UnexpectedValueException( + 'An API endpoint template must be provided if no "apiEndpoint" or default endpoint is set.' + ); } - if (strpos($res, '//') === false) { - $res = 'https://' . $res; + if (!isset($config['universeDomain'])) { + throw new UnexpectedValueException( + 'The "universeDomain" config value must be set to use the default API endpoint template.' + ); } - return $res; + $apiEndpoint = str_replace( + 'UNIVERSE_DOMAIN', + $config['universeDomain'], + $apiEndpointTemplate + ); + + // Preserve the behavior of guaranteeing a trailing "/" + return $apiEndpoint . (substr($apiEndpoint, -1) !== '/' ? '/' : ''); } } diff --git a/lib/Google/vendor/google/cloud-core/src/ServiceBuilder.php b/lib/Google/vendor/google/cloud-core/src/ServiceBuilder.php index b174df812..9a5ac3f4f 100644 --- a/lib/Google/vendor/google/cloud-core/src/ServiceBuilder.php +++ b/lib/Google/vendor/google/cloud-core/src/ServiceBuilder.php @@ -225,7 +225,7 @@ public function language(array $config = []) * * Example: * ``` - * $pubsub = $cloud->pubsub(); + * $pubsub = $cloud->pubsub(['projectId' => 'my-project']); * ``` * * @param array $config [optional] { diff --git a/lib/Google/vendor/google/cloud-core/src/Testing/TestHelpers.php b/lib/Google/vendor/google/cloud-core/src/Testing/TestHelpers.php index 2e832559b..e2050d635 100644 --- a/lib/Google/vendor/google/cloud-core/src/Testing/TestHelpers.php +++ b/lib/Google/vendor/google/cloud-core/src/Testing/TestHelpers.php @@ -113,7 +113,8 @@ public static function snippetBootstrap() '/vendor/', '/dev/', new RegexFileFilter('/\w{0,}\/vendor\//'), - new RegexFileFilter('/\w{0,}\/V\d{1,}\w{0,}\//') + new RegexFileFilter('/\w{0,}\/V\d{1,}\w{0,}\//'), + 'LongRunning/', // LongRunning doesn't match the GAPIC regex, but should still be excluded ]); $coverage = new Coverage($scanner); $coverage->buildListToCover(); diff --git a/lib/Google/vendor/google/cloud-core/src/Upload/ResumableUploader.php b/lib/Google/vendor/google/cloud-core/src/Upload/ResumableUploader.php index 6e61546fe..220a2a165 100644 --- a/lib/Google/vendor/google/cloud-core/src/Upload/ResumableUploader.php +++ b/lib/Google/vendor/google/cloud-core/src/Upload/ResumableUploader.php @@ -264,7 +264,7 @@ protected function getStatusResponse() $request = new Request( 'PUT', $this->resumeUri, - ['Content-Range' => 'bytes */*'] + ['Content-Range' => 'bytes */' . $this->data->getSize()] ); return $this->requestWrapper->send($request, $this->requestOptions); @@ -274,12 +274,13 @@ protected function getStatusResponse() * Gets the starting range for the upload. * * @param string $rangeHeader - * @return int|null + * @return int */ protected function getRangeStart($rangeHeader) { if (!$rangeHeader) { - return null; + // assume no bytes are uploaded if no range header is present + return 0; } return (int) explode('-', $rangeHeader)[1] + 1; diff --git a/lib/Google/vendor/google/cloud-core/unit-bootstrap.php b/lib/Google/vendor/google/cloud-core/unit-bootstrap.php index 4fc30215b..864cd9436 100644 --- a/lib/Google/vendor/google/cloud-core/unit-bootstrap.php +++ b/lib/Google/vendor/google/cloud-core/unit-bootstrap.php @@ -3,8 +3,15 @@ use Google\ApiCore\Testing\MessageAwareArrayComparator; use Google\ApiCore\Testing\ProtobufMessageComparator; use Google\ApiCore\Testing\ProtobufGPBEmptyComparator; +use DG\BypassFinals; date_default_timezone_set('UTC'); \SebastianBergmann\Comparator\Factory::getInstance()->register(new MessageAwareArrayComparator()); \SebastianBergmann\Comparator\Factory::getInstance()->register(new ProtobufMessageComparator()); \SebastianBergmann\Comparator\Factory::getInstance()->register(new ProtobufGPBEmptyComparator()); + +// Make sure that while testing we bypass the `final` keyword for the GAPIC client. +// Only run this if the individual component has the helper package installed +if (class_exists(BypassFinals::class)) { + BypassFinals::enable(); +} diff --git a/lib/Google/vendor/google/cloud-storage/.repo-metadata.json b/lib/Google/vendor/google/cloud-storage/.repo-metadata.json deleted file mode 100644 index cec1634b2..000000000 --- a/lib/Google/vendor/google/cloud-storage/.repo-metadata.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "language": "php", - "distribution_name": "google/cloud-storage", - "release_level": "stable", - "client_documentation": "https://cloud.google.com/php/docs/reference/cloud-storage/latest", - "library_type": "GAPIC_MANUAL", - "api_shortname": "storage" -} diff --git a/lib/Google/vendor/google/cloud-storage/README.md b/lib/Google/vendor/google/cloud-storage/README.md index ae9d9805e..9837283d0 100644 --- a/lib/Google/vendor/google/cloud-storage/README.md +++ b/lib/Google/vendor/google/cloud-storage/README.md @@ -17,18 +17,12 @@ scenarios including serving website content, storing data for archival and disas To begin, install the preferred dependency manager for PHP, [Composer](https://getcomposer.org/). -Now to install just this component: +Now install this component: ```sh $ composer require google/cloud-storage ``` -Or to install the entire suite of components at once: - -```sh -$ composer require google/cloud -``` - ### Authentication Please see our [Authentication guide](https://github.com/googleapis/google-cloud-php/blob/main/AUTHENTICATION.md) for more information diff --git a/lib/Google/vendor/google/cloud-storage/VERSION b/lib/Google/vendor/google/cloud-storage/VERSION index 39fc130ef..e640847f9 100644 --- a/lib/Google/vendor/google/cloud-storage/VERSION +++ b/lib/Google/vendor/google/cloud-storage/VERSION @@ -1 +1 @@ -1.36.0 +1.42.1 diff --git a/lib/Google/vendor/google/cloud-storage/composer.json b/lib/Google/vendor/google/cloud-storage/composer.json index a5d1195db..4c9900893 100644 --- a/lib/Google/vendor/google/cloud-storage/composer.json +++ b/lib/Google/vendor/google/cloud-storage/composer.json @@ -4,18 +4,19 @@ "license": "Apache-2.0", "minimum-stability": "stable", "require": { - "php": ">=7.4", - "google/cloud-core": "^1.52.7", + "php": "^8.0", + "google/cloud-core": "^1.55", "ramsey/uuid": "^4.2.3" }, "require-dev": { "phpunit/phpunit": "^9.0", "phpspec/prophecy-phpunit": "^2.0", "squizlabs/php_codesniffer": "2.*", - "phpdocumentor/reflection": "^5.0", + "phpdocumentor/reflection": "^5.3.3", + "phpdocumentor/reflection-docblock": "^5.3", "erusev/parsedown": "^1.6", "phpseclib/phpseclib": "^2.0||^3.0", - "google/cloud-pubsub": "^1.0" + "google/cloud-pubsub": "^2.0" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for creating signed Cloud Storage URLs. Please require version ^2.", diff --git a/lib/Google/vendor/google/cloud-storage/src/Bucket.php b/lib/Google/vendor/google/cloud-storage/src/Bucket.php index cc215b1db..5fcd08696 100644 --- a/lib/Google/vendor/google/cloud-storage/src/Bucket.php +++ b/lib/Google/vendor/google/cloud-storage/src/Bucket.php @@ -246,10 +246,8 @@ public function exists(array $options = []) * are `true`, `false`, `md5` and `crc32`. If true, either md5 or * crc32c will be chosen based on your platform. If false, no * validation hash will be sent. Choose either `md5` or `crc32` to - * force a hash method regardless of performance implications. In - * PHP versions earlier than 7.4, performance will be very - * adversely impacted by using crc32c unless you install the - * `crc32c` PHP extension. **Defaults to** `true`. + * force a hash method regardless of performance implications. + * **Defaults to** `true`. * @type int $chunkSize If provided the upload will be done in chunks. * The size must be in multiples of 262144 bytes. With chunking * you have increased reliability at the risk of higher overhead. @@ -365,10 +363,8 @@ public function upload($data, array $options = []) * are `true`, `false`, `md5` and `crc32`. If true, either md5 or * crc32c will be chosen based on your platform. If false, no * validation hash will be sent. Choose either `md5` or `crc32` to - * force a hash method regardless of performance implications. In - * PHP versions earlier than 7.4, performance will be very - * adversely impacted by using crc32c unless you install the - * `crc32c` PHP extension. **Defaults to** `true`.ß + * force a hash method regardless of performance implications. + * **Defaults to** `true`. * @type string $predefinedAcl Predefined ACL to apply to the object. * Acceptable values include, `"authenticatedRead"`, * `"bucketOwnerFullControl"`, `"bucketOwnerRead"`, `"private"`, @@ -618,6 +614,48 @@ public function object($name, array $options = []) ); } + /** + * Restores an object. + * + * Example: + * ``` + * $object = $bucket->restore('file.txt'); + * ``` + * + * @param string $name The name of the object to restore. + * @param string $generation Request a specific generation of the object. + * @param array $options [optional] { + * Configuration Options. + * + * @type string $ifGenerationMatch Makes the operation conditional on whether + * the object's current generation matches the given value. + * @type string $ifGenerationNotMatch Makes the operation conditional on whether + * the object's current generation matches the given value. + * @type string $ifMetagenerationMatch If set, only restores + * if its metageneration matches this value. + * @type string $ifMetagenerationNotMatch If set, only restores + * if its metageneration does not match this value. + * } + * @return StorageObject + */ + public function restore($name, $generation, array $options = []) + { + $res = $this->connection->restoreObject([ + 'bucket' => $this->identity['bucket'], + 'generation' => $generation, + 'object' => $name, + ] + $options); + return new StorageObject( + $this->connection, + $name, + $this->identity['bucket'], + $res['generation'], // restored object will have a new generation + $res + array_filter([ + 'requesterProjectId' => $this->identity['userProject'] + ]) + ); + } + /** * Fetches all objects in the bucket. * @@ -645,6 +683,9 @@ public function object($name, array $options = []) * from the prefix, contain delimiter will have their name, * truncated after the delimiter, returned in prefixes. Duplicate * prefixes are omitted. + * @type bool $includeFoldersAsPrefixes If true, will also include folders + * and managed folders (besides objects) in the returned prefixes. + * Only applicable if delimiter is set to '/'. * @type int $maxResults Maximum number of results to return per * request. **Defaults to** `1000`. * @type int $resultLimit Limit the number of results returned in total. diff --git a/lib/Google/vendor/google/cloud-storage/src/Connection/ConnectionInterface.php b/lib/Google/vendor/google/cloud-storage/src/Connection/ConnectionInterface.php index 71df234e5..ea429f5bc 100644 --- a/lib/Google/vendor/google/cloud-storage/src/Connection/ConnectionInterface.php +++ b/lib/Google/vendor/google/cloud-storage/src/Connection/ConnectionInterface.php @@ -95,6 +95,11 @@ public function patchBucket(array $args = []); */ public function deleteObject(array $args = []); + /** + * @param array $args + */ + public function restoreObject(array $args = []); + /** * @param array $args */ diff --git a/lib/Google/vendor/google/cloud-storage/src/Connection/Rest.php b/lib/Google/vendor/google/cloud-storage/src/Connection/Rest.php index 2b37bb283..3e9ba793b 100644 --- a/lib/Google/vendor/google/cloud-storage/src/Connection/Rest.php +++ b/lib/Google/vendor/google/cloud-storage/src/Connection/Rest.php @@ -17,6 +17,7 @@ namespace Google\Cloud\Storage\Connection; +use Google\Auth\GetUniverseDomainInterface; use Google\Cloud\Core\RequestBuilder; use Google\Cloud\Core\RequestWrapper; use Google\Cloud\Core\RestTrait; @@ -64,8 +65,13 @@ class Rest implements ConnectionInterface */ const BASE_URI = 'https://storage.googleapis.com/storage/v1/'; + /** + * @deprecated + */ const DEFAULT_API_ENDPOINT = 'https://storage.googleapis.com'; + const DEFAULT_API_ENDPOINT_TEMPLATE = 'https://storage.UNIVERSE_DOMAIN'; + /** * @deprecated */ @@ -104,13 +110,17 @@ public function __construct(array $config = []) $config += [ 'serviceDefinitionPath' => __DIR__ . '/ServiceDefinition/storage-v1.json', 'componentVersion' => StorageClient::VERSION, - 'apiEndpoint' => self::DEFAULT_API_ENDPOINT, + 'apiEndpoint' => null, + // If the user has not supplied a universe domain, use the environment variable if set. + // Otherwise, use the default ("googleapis.com"). + 'universeDomain' => getenv('GOOGLE_CLOUD_UNIVERSE_DOMAIN') + ?: GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN, // Cloud Storage needs to provide a default scope because the Storage // API does not accept JWTs with "audience" 'scopes' => StorageClient::FULL_CONTROL_SCOPE, ]; - $this->apiEndpoint = $this->getApiEndpoint(self::DEFAULT_API_ENDPOINT, $config); + $this->apiEndpoint = $this->getApiEndpoint(null, $config, self::DEFAULT_API_ENDPOINT_TEMPLATE); $this->setRequestWrapper(new RequestWrapper($config)); $this->setRequestBuilder(new RequestBuilder( @@ -218,6 +228,14 @@ public function deleteObject(array $args = []) return $this->send('objects', 'delete', $args); } + /** + * @param array $args + */ + public function restoreObject(array $args = []) + { + return $this->send('objects', 'restore', $args); + } + /** * @param array $args */ @@ -288,6 +306,7 @@ public function downloadObject(array $args = []) $transcodedObj = true; } }; + $attempt = null; $requestOptions['restRetryListener'] = function ( \Exception $e, $retryAttempt, @@ -295,7 +314,8 @@ public function downloadObject(array $args = []) ) use ( $resultStream, $requestedBytes, - $invocationId + $invocationId, + &$attempt, ) { // if the exception has a response for us to use if ($e instanceof RequestException && $e->hasResponse()) { @@ -313,6 +333,9 @@ public function downloadObject(array $args = []) // modify the range headers to fetch the remaining data $arguments[1]['headers']['Range'] = sprintf('bytes=%s-%s', $startByte, $endByte); $arguments[0] = $this->modifyRequestForRetry($arguments[0], $retryAttempt, $invocationId); + + // Copy the final result to the end of the stream + $attempt = $retryAttempt; } }; @@ -321,6 +344,13 @@ public function downloadObject(array $args = []) $requestOptions )->getBody(); + // If no retry attempt was made, then we can return the stream as is. + // This is important in the case where downloadObject is called to open + // the file but not to read from it yet. + if ($attempt === null) { + return $fetchedStream; + } + // If our object is a transcoded object, then Range headers are not honoured. // That means even if we had a partial download available, the final obj // that was fetched will contain the complete object. So, we don't need to copy @@ -604,14 +634,22 @@ private function buildDownloadObjectParams(array $args) 'restDelayFunction' => null ]); + $queryOptions = [ + 'generation' => $args['generation'], + 'alt' => 'media', + 'userProject' => $args['userProject'], + ]; + if (isset($args['softDeleted'])) { + // alt param cannot be specified with softDeleted param. See: + // https://cloud.google.com/storage/docs/json_api/v1/objects/get + unset($args['alt']); + $queryOptions['softDeleted'] = $args['softDeleted']; + } + $uri = $this->expandUri($this->apiEndpoint . self::DOWNLOAD_PATH, [ 'bucket' => $args['bucket'], 'object' => $args['object'], - 'query' => [ - 'generation' => $args['generation'], - 'alt' => 'media', - 'userProject' => $args['userProject'] - ] + 'query' => $queryOptions, ]); return [ diff --git a/lib/Google/vendor/google/cloud-storage/src/Connection/ServiceDefinition/storage-v1.json b/lib/Google/vendor/google/cloud-storage/src/Connection/ServiceDefinition/storage-v1.json index 25303d3bf..76ce2ce9d 100644 --- a/lib/Google/vendor/google/cloud-storage/src/Connection/ServiceDefinition/storage-v1.json +++ b/lib/Google/vendor/google/cloud-storage/src/Connection/ServiceDefinition/storage-v1.json @@ -1,5391 +1,5725 @@ { - "kind": "discovery#restDescription", - "version": "v1", - "id": "storage:v1", - "rootUrl": "https://storage.googleapis.com/", - "mtlsRootUrl": "https://storage.mtls.googleapis.com/", - "baseUrl": "https://storage.googleapis.com/storage/v1/", - "basePath": "/storage/v1/", - "servicePath": "storage/v1/", - "batchPath": "batch/storage/v1", - "discoveryVersion": "v1", - "name": "storage", - "title": "Cloud Storage JSON API", - "description": "Stores and retrieves potentially large, immutable data objects.", - "ownerDomain": "google.com", - "ownerName": "Google", - "icons": { - "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", - "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" - }, - "documentationLink": "https://developers.google.com/storage/docs/json_api/", - "labels": [ - "labs" - ], - "protocol": "rest", - "parameters": { - "alt": { - "type": "string", - "description": "Data format for the response.", - "default": "json", - "enum": [ - "json" - ], - "enumDescriptions": [ - "Responses with Content-Type of application/json" - ], - "location": "query" - }, - "fields": { - "type": "string", - "description": "Selector specifying which fields to include in a partial response.", - "location": "query" - }, - "key": { - "type": "string", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "location": "query" - }, - "oauth_token": { - "type": "string", - "description": "OAuth 2.0 token for the current user.", - "location": "query" - }, - "prettyPrint": { - "type": "boolean", - "description": "Returns response with indentations and line breaks.", - "default": "true", - "location": "query" - }, - "quotaUser": { - "type": "string", - "description": "An opaque string that represents a user for quota purposes. Must not exceed 40 characters.", - "location": "query" - }, - "userIp": { - "type": "string", - "description": "Deprecated. Please use quotaUser instead.", - "location": "query" - }, - "uploadType": { - "type": "string", - "description": "Upload protocol for media (e.g. \"media\", \"multipart\", \"resumable\").", - "location": "query" - } - }, - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/cloud-platform": { - "description": "View and manage your data across Google Cloud Platform services" - }, - "https://www.googleapis.com/auth/cloud-platform.read-only": { - "description": "View your data across Google Cloud Platform services" - }, - "https://www.googleapis.com/auth/devstorage.full_control": { - "description": "Manage your data and permissions in Google Cloud Storage" - }, - "https://www.googleapis.com/auth/devstorage.read_only": { - "description": "View your data in Google Cloud Storage" - }, - "https://www.googleapis.com/auth/devstorage.read_write": { - "description": "Manage your data in Google Cloud Storage" - } - } - } - }, - "schemas": { - "Bucket": { - "id": "Bucket", - "type": "object", - "description": "A bucket.", - "properties": { - "acl": { - "type": "array", - "description": "Access controls on the bucket.", - "items": { - "$ref": "BucketAccessControl" - }, - "annotations": { - "required": [ - "storage.buckets.update" - ] - } - }, - "billing": { - "type": "object", - "description": "The bucket's billing configuration.", - "properties": { - "requesterPays": { - "type": "boolean", - "description": "When set to true, Requester Pays is enabled for this bucket." - } - } - }, - "cors": { - "type": "array", - "description": "The bucket's Cross-Origin Resource Sharing (CORS) configuration.", - "items": { - "type": "object", - "properties": { - "maxAgeSeconds": { - "type": "integer", - "description": "The value, in seconds, to return in the Access-Control-Max-Age header used in preflight responses.", - "format": "int32" - }, - "method": { - "type": "array", - "description": "The list of HTTP methods on which to include CORS response headers, (GET, OPTIONS, POST, etc) Note: \"*\" is permitted in the list of methods, and means \"any method\".", - "items": { - "type": "string" + "kind": "discovery#restDescription", + "version": "v1", + "id": "storage:v1", + "rootUrl": "https://storage.googleapis.com/", + "mtlsRootUrl": "https://storage.mtls.googleapis.com/", + "baseUrl": "https://storage.googleapis.com/storage/v1/", + "basePath": "/storage/v1/", + "servicePath": "storage/v1/", + "batchPath": "batch/storage/v1", + "discoveryVersion": "v1", + "name": "storage", + "title": "Cloud Storage JSON API", + "description": "Stores and retrieves potentially large, immutable data objects.", + "ownerDomain": "google.com", + "ownerName": "Google", + "icons": { + "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", + "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" + }, + "documentationLink": "https://developers.google.com/storage/docs/json_api/", + "labels": [ + "labs" + ], + "endpoints": [ + { + "endpointUrl": "https://storage.me-central2.rep.googleapis.com/", + "location": "me-central2", + "description": "Regional Endpoint" } - }, - "origin": { - "type": "array", - "description": "The list of Origins eligible to receive CORS response headers. Note: \"*\" is permitted in the list of origins, and means \"any Origin\".", - "items": { - "type": "string" + ], + "protocol": "rest", + "parameters": { + "alt": { + "type": "string", + "description": "Data format for the response.", + "default": "json", + "enum": [ + "json" + ], + "enumDescriptions": [ + "Responses with Content-Type of application/json" + ], + "location": "query" + }, + "fields": { + "type": "string", + "description": "Selector specifying which fields to include in a partial response.", + "location": "query" + }, + "key": { + "type": "string", + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "location": "query" + }, + "oauth_token": { + "type": "string", + "description": "OAuth 2.0 token for the current user.", + "location": "query" + }, + "prettyPrint": { + "type": "boolean", + "description": "Returns response with indentations and line breaks.", + "default": "true", + "location": "query" + }, + "quotaUser": { + "type": "string", + "description": "An opaque string that represents a user for quota purposes. Must not exceed 40 characters.", + "location": "query" + }, + "userIp": { + "type": "string", + "description": "Deprecated. Please use quotaUser instead.", + "location": "query" + }, + "uploadType": { + "type": "string", + "description": "Upload protocol for media (e.g. \"media\", \"multipart\", \"resumable\").", + "location": "query" } - }, - "responseHeader": { - "type": "array", - "description": "The list of HTTP headers other than the simple response headers to give permission for the user-agent to share across domains.", - "items": { - "type": "string" + }, + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/cloud-platform": { + "description": "View and manage your data across Google Cloud Platform services" + }, + "https://www.googleapis.com/auth/cloud-platform.read-only": { + "description": "View your data across Google Cloud Platform services" + }, + "https://www.googleapis.com/auth/devstorage.full_control": { + "description": "Manage your data and permissions in Google Cloud Storage" + }, + "https://www.googleapis.com/auth/devstorage.read_only": { + "description": "View your data in Google Cloud Storage" + }, + "https://www.googleapis.com/auth/devstorage.read_write": { + "description": "Manage your data in Google Cloud Storage" + } + } } - } - } - } - }, - "customPlacementConfig": { - "type": "object", - "description": "The bucket's custom placement configuration for Custom Dual Regions.", - "properties": { - "dataLocations": { - "type": "array", - "description": "The list of regional locations in which data is placed.", - "items": { - "type": "string" - } - } - } - }, - "defaultEventBasedHold": { - "type": "boolean", - "description": "The default value for event-based hold on newly created objects in this bucket. Event-based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false. Objects under event-based hold cannot be deleted, overwritten or archived until the hold is removed." - }, - "defaultObjectAcl": { - "type": "array", - "description": "Default access controls to apply to new objects when no ACL is provided.", - "items": { - "$ref": "ObjectAccessControl" - } - }, - "encryption": { - "type": "object", - "description": "Encryption configuration for a bucket.", - "properties": { - "defaultKmsKeyName": { - "type": "string", - "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified." - } - } }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the bucket." + "schemas": { + "Bucket": { + "id": "Bucket", + "type": "object", + "description": "A bucket.", + "properties": { + "acl": { + "type": "array", + "description": "Access controls on the bucket.", + "items": { + "$ref": "BucketAccessControl" + }, + "annotations": { + "required": [ + "storage.buckets.update" + ] + } + }, + "billing": { + "type": "object", + "description": "The bucket's billing configuration.", + "properties": { + "requesterPays": { + "type": "boolean", + "description": "When set to true, Requester Pays is enabled for this bucket." + } + } + }, + "cors": { + "type": "array", + "description": "The bucket's Cross-Origin Resource Sharing (CORS) configuration.", + "items": { + "type": "object", + "properties": { + "maxAgeSeconds": { + "type": "integer", + "description": "The value, in seconds, to return in the Access-Control-Max-Age header used in preflight responses.", + "format": "int32" + }, + "method": { + "type": "array", + "description": "The list of HTTP methods on which to include CORS response headers, (GET, OPTIONS, POST, etc) Note: \"*\" is permitted in the list of methods, and means \"any method\".", + "items": { + "type": "string" + } + }, + "origin": { + "type": "array", + "description": "The list of Origins eligible to receive CORS response headers. Note: \"*\" is permitted in the list of origins, and means \"any Origin\".", + "items": { + "type": "string" + } + }, + "responseHeader": { + "type": "array", + "description": "The list of HTTP headers other than the simple response headers to give permission for the user-agent to share across domains.", + "items": { + "type": "string" + } + } + } + } + }, + "customPlacementConfig": { + "type": "object", + "description": "The bucket's custom placement configuration for Custom Dual Regions.", + "properties": { + "dataLocations": { + "type": "array", + "description": "The list of regional locations in which data is placed.", + "items": { + "type": "string" + } + } + } + }, + "defaultEventBasedHold": { + "type": "boolean", + "description": "The default value for event-based hold on newly created objects in this bucket. Event-based hold is a way to retain objects indefinitely until an event occurs, signified by the hold's release. After being released, such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false. Objects under event-based hold cannot be deleted, overwritten or archived until the hold is removed." + }, + "defaultObjectAcl": { + "type": "array", + "description": "Default access controls to apply to new objects when no ACL is provided.", + "items": { + "$ref": "ObjectAccessControl" + } + }, + "encryption": { + "type": "object", + "description": "Encryption configuration for a bucket.", + "properties": { + "defaultKmsKeyName": { + "type": "string", + "description": "A Cloud KMS key that will be used to encrypt objects inserted into this bucket, if no encryption method is specified." + } + } + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for the bucket." + }, + "hierarchicalNamespace": { + "type": "object", + "description": "The bucket's hierarchical namespace configuration.", + "properties": { + "enabled": { + "type": "boolean", + "description": "When set to true, hierarchical namespace is enabled for this bucket." + } + } }, "iamConfiguration": { - "type": "object", - "description": "The bucket's IAM configuration.", - "properties": { - "bucketPolicyOnly": { - "type": "object", - "description": "The bucket's uniform bucket-level access configuration. The feature was formerly known as Bucket Policy Only. For backward compatibility, this field will be populated with identical information as the uniformBucketLevelAccess field. We recommend using the uniformBucketLevelAccess field to enable and disable the feature.", - "properties": { - "enabled": { - "type": "boolean", - "description": "If set, access is controlled only by bucket-level or above IAM policies." - }, - "lockedTime": { - "type": "string", - "description": "The deadline for changing iamConfiguration.bucketPolicyOnly.enabled from true to false in RFC 3339 format. iamConfiguration.bucketPolicyOnly.enabled may be changed from true to false until the locked time, after which the field is immutable.", - "format": "date-time" - } - } - }, - "uniformBucketLevelAccess": { - "type": "object", - "description": "The bucket's uniform bucket-level access configuration.", - "properties": { - "enabled": { - "type": "boolean", - "description": "If set, access is controlled only by bucket-level or above IAM policies." - }, - "lockedTime": { - "type": "string", - "description": "The deadline for changing iamConfiguration.uniformBucketLevelAccess.enabled from true to false in RFC 3339 format. iamConfiguration.uniformBucketLevelAccess.enabled may be changed from true to false until the locked time, after which the field is immutable.", - "format": "date-time" + "type": "object", + "description": "The bucket's IAM configuration.", + "properties": { + "bucketPolicyOnly": { + "type": "object", + "description": "The bucket's uniform bucket-level access configuration. The feature was formerly known as Bucket Policy Only. For backward compatibility, this field will be populated with identical information as the uniformBucketLevelAccess field. We recommend using the uniformBucketLevelAccess field to enable and disable the feature.", + "properties": { + "enabled": { + "type": "boolean", + "description": "If set, access is controlled only by bucket-level or above IAM policies." + }, + "lockedTime": { + "type": "string", + "description": "The deadline for changing iamConfiguration.bucketPolicyOnly.enabled from true to false in RFC 3339 format. iamConfiguration.bucketPolicyOnly.enabled may be changed from true to false until the locked time, after which the field is immutable.", + "format": "date-time" + } + } + }, + "uniformBucketLevelAccess": { + "type": "object", + "description": "The bucket's uniform bucket-level access configuration.", + "properties": { + "enabled": { + "type": "boolean", + "description": "If set, access is controlled only by bucket-level or above IAM policies." + }, + "lockedTime": { + "type": "string", + "description": "The deadline for changing iamConfiguration.uniformBucketLevelAccess.enabled from true to false in RFC 3339 format. iamConfiguration.uniformBucketLevelAccess.enabled may be changed from true to false until the locked time, after which the field is immutable.", + "format": "date-time" + } + } + }, + "publicAccessPrevention": { + "type": "string", + "description": "The bucket's Public Access Prevention configuration. Currently, 'inherited' and 'enforced' are supported." + } } - } - }, - "publicAccessPrevention": { - "type": "string", - "description": "The bucket's Public Access Prevention configuration. Currently, 'inherited' and 'enforced' are supported." - } - } }, "id": { - "type": "string", - "description": "The ID of the bucket. For buckets, the id and name properties are the same." + "type": "string", + "description": "The ID of the bucket. For buckets, the id and name properties are the same." }, "kind": { - "type": "string", - "description": "The kind of item this is. For buckets, this is always storage#bucket.", - "default": "storage#bucket" + "type": "string", + "description": "The kind of item this is. For buckets, this is always storage#bucket.", + "default": "storage#bucket" }, "labels": { - "type": "object", - "description": "User-provided labels, in key/value pairs.", - "additionalProperties": { - "type": "string", - "description": "An individual label entry." - } + "type": "object", + "description": "User-provided labels, in key/value pairs.", + "additionalProperties": { + "type": "string", + "description": "An individual label entry." + } }, "lifecycle": { - "type": "object", - "description": "The bucket's lifecycle configuration. See lifecycle management for more information.", - "properties": { - "rule": { - "type": "array", - "description": "A lifecycle management rule, which is made of an action to take and the condition(s) under which the action will be taken.", - "items": { "type": "object", + "description": "The bucket's lifecycle configuration. See lifecycle management for more information.", "properties": { - "action": { - "type": "object", - "description": "The action to take.", - "properties": { - "storageClass": { - "type": "string", - "description": "Target storage class. Required iff the type of the action is SetStorageClass." - }, - "type": { - "type": "string", - "description": "Type of the action. Currently, only Delete, SetStorageClass, and AbortIncompleteMultipartUpload are supported." - } - } - }, - "condition": { - "type": "object", - "description": "The condition(s) under which the action will be taken.", - "properties": { - "age": { - "type": "integer", - "description": "Age of an object (in days). This condition is satisfied when an object reaches the specified age.", - "format": "int32" - }, - "createdBefore": { - "type": "string", - "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when an object is created before midnight of the specified date in UTC.", - "format": "date" - }, - "customTimeBefore": { - "type": "string", - "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when the custom time on an object is before this date in UTC.", - "format": "date" - }, - "daysSinceCustomTime": { - "type": "integer", - "description": "Number of days elapsed since the user-specified timestamp set on an object. The condition is satisfied if the days elapsed is at least this number. If no custom timestamp is specified on an object, the condition does not apply.", - "format": "int32" - }, - "daysSinceNoncurrentTime": { - "type": "integer", - "description": "Number of days elapsed since the noncurrent timestamp of an object. The condition is satisfied if the days elapsed is at least this number. This condition is relevant only for versioned objects. The value of the field must be a nonnegative integer. If it's zero, the object version will become eligible for Lifecycle action as soon as it becomes noncurrent.", - "format": "int32" - }, - "isLive": { - "type": "boolean", - "description": "Relevant only for versioned objects. If the value is true, this condition matches live objects; if the value is false, it matches archived objects." - }, - "matchesPattern": { - "type": "string", - "description": "A regular expression that satisfies the RE2 syntax. This condition is satisfied when the name of the object matches the RE2 pattern. Note: This feature is currently in the \"Early Access\" launch stage and is only available to a whitelisted set of users; that means that this feature may be changed in backward-incompatible ways and that it is not guaranteed to be released." - }, - "matchesPrefix": { - "type": "array", - "description": "List of object name prefixes. This condition will be satisfied when at least one of the prefixes exactly matches the beginning of the object name.", - "items": { - "type": "string" - } - }, - "matchesSuffix": { - "type": "array", - "description": "List of object name suffixes. This condition will be satisfied when at least one of the suffixes exactly matches the end of the object name.", - "items": { - "type": "string" - } - }, - "matchesStorageClass": { - "type": "array", - "description": "Objects having any of the storage classes specified by this condition will be matched. Values include MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, ARCHIVE, STANDARD, and DURABLE_REDUCED_AVAILABILITY.", - "items": { - "type": "string" + "rule": { + "type": "array", + "description": "A lifecycle management rule, which is made of an action to take and the condition(s) under which the action will be taken.", + "items": { + "type": "object", + "properties": { + "action": { + "type": "object", + "description": "The action to take.", + "properties": { + "storageClass": { + "type": "string", + "description": "Target storage class. Required iff the type of the action is SetStorageClass." + }, + "type": { + "type": "string", + "description": "Type of the action. Currently, only Delete, SetStorageClass, and AbortIncompleteMultipartUpload are supported." + } + } + }, + "condition": { + "type": "object", + "description": "The condition(s) under which the action will be taken.", + "properties": { + "age": { + "type": "integer", + "description": "Age of an object (in days). This condition is satisfied when an object reaches the specified age.", + "format": "int32" + }, + "createdBefore": { + "type": "string", + "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when an object is created before midnight of the specified date in UTC.", + "format": "date" + }, + "customTimeBefore": { + "type": "string", + "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when the custom time on an object is before this date in UTC.", + "format": "date" + }, + "daysSinceCustomTime": { + "type": "integer", + "description": "Number of days elapsed since the user-specified timestamp set on an object. The condition is satisfied if the days elapsed is at least this number. If no custom timestamp is specified on an object, the condition does not apply.", + "format": "int32" + }, + "daysSinceNoncurrentTime": { + "type": "integer", + "description": "Number of days elapsed since the noncurrent timestamp of an object. The condition is satisfied if the days elapsed is at least this number. This condition is relevant only for versioned objects. The value of the field must be a nonnegative integer. If it's zero, the object version will become eligible for Lifecycle action as soon as it becomes noncurrent.", + "format": "int32" + }, + "isLive": { + "type": "boolean", + "description": "Relevant only for versioned objects. If the value is true, this condition matches live objects; if the value is false, it matches archived objects." + }, + "matchesPattern": { + "type": "string", + "description": "A regular expression that satisfies the RE2 syntax. This condition is satisfied when the name of the object matches the RE2 pattern. Note: This feature is currently in the \"Early Access\" launch stage and is only available to a whitelisted set of users; that means that this feature may be changed in backward-incompatible ways and that it is not guaranteed to be released." + }, + "matchesPrefix": { + "type": "array", + "description": "List of object name prefixes. This condition will be satisfied when at least one of the prefixes exactly matches the beginning of the object name.", + "items": { + "type": "string" + } + }, + "matchesSuffix": { + "type": "array", + "description": "List of object name suffixes. This condition will be satisfied when at least one of the suffixes exactly matches the end of the object name.", + "items": { + "type": "string" + } + }, + "matchesStorageClass": { + "type": "array", + "description": "Objects having any of the storage classes specified by this condition will be matched. Values include MULTI_REGIONAL, REGIONAL, NEARLINE, COLDLINE, ARCHIVE, STANDARD, and DURABLE_REDUCED_AVAILABILITY.", + "items": { + "type": "string" + } + }, + "noncurrentTimeBefore": { + "type": "string", + "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when the noncurrent time on an object is before this date in UTC. This condition is relevant only for versioned objects.", + "format": "date" + }, + "numNewerVersions": { + "type": "integer", + "description": "Relevant only for versioned objects. If the value is N, this condition is satisfied when there are at least N versions (including the live version) newer than this version of the object.", + "format": "int32" + } + } + } + } + } } - }, - "noncurrentTimeBefore": { - "type": "string", - "description": "A date in RFC 3339 format with only the date part (for instance, \"2013-01-15\"). This condition is satisfied when the noncurrent time on an object is before this date in UTC. This condition is relevant only for versioned objects.", - "format": "date" - }, - "numNewerVersions": { - "type": "integer", - "description": "Relevant only for versioned objects. If the value is N, this condition is satisfied when there are at least N versions (including the live version) newer than this version of the object.", - "format": "int32" - } - } - } } - } - } - } }, "autoclass": { - "type": "object", - "description": "The bucket's Autoclass configuration.", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether or not Autoclass is enabled on this bucket" - }, - "toggleTime": { - "type": "string", - "description": "A date and time in RFC 3339 format representing the instant at which \"enabled\" was last toggled.", - "format": "date-time" - }, - "terminalStorageClass": { - "type": "string", - "description": "The storage class that objects in the bucket eventually transition to if they are not read for a certain length of time. Valid values are NEARLINE and ARCHIVE." - }, - "terminalStorageClassUpdateTime": { - "type": "string", - "description": "A date and time in RFC 3339 format representing the time of the most recent update to \"terminalStorageClass\".", - "format": "date-time" - } - } + "type": "object", + "description": "The bucket's Autoclass configuration.", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not Autoclass is enabled on this bucket" + }, + "toggleTime": { + "type": "string", + "description": "A date and time in RFC 3339 format representing the instant at which \"enabled\" was last toggled.", + "format": "date-time" + }, + "terminalStorageClass": { + "type": "string", + "description": "The storage class that objects in the bucket eventually transition to if they are not read for a certain length of time. Valid values are NEARLINE and ARCHIVE." + }, + "terminalStorageClassUpdateTime": { + "type": "string", + "description": "A date and time in RFC 3339 format representing the time of the most recent update to \"terminalStorageClass\".", + "format": "date-time" + } + } }, "location": { - "type": "string", - "description": "The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. See the developer's guide for the authoritative list." + "type": "string", + "description": "The location of the bucket. Object data for objects in the bucket resides in physical storage within this region. Defaults to US. See the developer's guide for the authoritative list." }, "locationType": { - "type": "string", - "description": "The type of the bucket location." + "type": "string", + "description": "The type of the bucket location." }, "logging": { - "type": "object", - "description": "The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current bucket's logs.", - "properties": { - "logBucket": { - "type": "string", - "description": "The destination bucket where the current bucket's logs should be placed." - }, - "logObjectPrefix": { - "type": "string", - "description": "A prefix for log object names." - } - } + "type": "object", + "description": "The bucket's logging configuration, which defines the destination bucket and optional name prefix for the current bucket's logs.", + "properties": { + "logBucket": { + "type": "string", + "description": "The destination bucket where the current bucket's logs should be placed." + }, + "logObjectPrefix": { + "type": "string", + "description": "A prefix for log object names." + } + } }, "metageneration": { - "type": "string", - "description": "The metadata generation of this bucket.", - "format": "int64" + "type": "string", + "description": "The metadata generation of this bucket.", + "format": "int64" }, "name": { - "type": "string", - "description": "The name of the bucket.", - "annotations": { - "required": [ - "storage.buckets.insert" - ] - } + "type": "string", + "description": "The name of the bucket.", + "annotations": { + "required": [ + "storage.buckets.insert" + ] + } }, "owner": { - "type": "object", - "description": "The owner of the bucket. This is always the project team's owner group.", - "properties": { - "entity": { - "type": "string", - "description": "The entity, in the form project-owner-projectId." - }, - "entityId": { - "type": "string", - "description": "The ID for the entity." - } - } + "type": "object", + "description": "The owner of the bucket. This is always the project team's owner group.", + "properties": { + "entity": { + "type": "string", + "description": "The entity, in the form project-owner-projectId." + }, + "entityId": { + "type": "string", + "description": "The ID for the entity." + } + } }, "projectNumber": { - "type": "string", - "description": "The project number of the project the bucket belongs to.", - "format": "uint64" + "type": "string", + "description": "The project number of the project the bucket belongs to.", + "format": "uint64" }, "retentionPolicy": { - "type": "object", - "description": "The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the retention period will result in a PERMISSION_DENIED error. An unlocked retention policy can be modified or removed from the bucket via a storage.buckets.update operation. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error.", - "properties": { - "effectiveTime": { - "type": "string", - "description": "Server-determined value that indicates the time from which policy was enforced and effective. This value is in RFC 3339 format.", - "format": "date-time" - }, - "isLocked": { - "type": "boolean", - "description": "Once locked, an object retention policy cannot be modified." - }, - "retentionPeriod": { - "type": "string", - "description": "The duration in seconds that objects need to be retained. Retention duration must be greater than zero and less than 100 years. Note that enforcement of retention periods less than a day is not guaranteed. Such periods should only be used for testing purposes.", - "format": "int64" - } - } + "type": "object", + "description": "The bucket's retention policy. The retention policy enforces a minimum retention time for all objects contained in the bucket, based on their creation time. Any attempt to overwrite or delete objects younger than the retention period will result in a PERMISSION_DENIED error. An unlocked retention policy can be modified or removed from the bucket via a storage.buckets.update operation. A locked retention policy cannot be removed or shortened in duration for the lifetime of the bucket. Attempting to remove or decrease period of a locked retention policy will result in a PERMISSION_DENIED error.", + "properties": { + "effectiveTime": { + "type": "string", + "description": "Server-determined value that indicates the time from which policy was enforced and effective. This value is in RFC 3339 format.", + "format": "date-time" + }, + "isLocked": { + "type": "boolean", + "description": "Once locked, an object retention policy cannot be modified." + }, + "retentionPeriod": { + "type": "string", + "description": "The duration in seconds that objects need to be retained. Retention duration must be greater than zero and less than 100 years. Note that enforcement of retention periods less than a day is not guaranteed. Such periods should only be used for testing purposes.", + "format": "int64" + } + } }, "objectRetention": { - "type": "object", - "description": "The bucket's object retention config.", - "properties": { - "mode": { - "type": "string", - "description": "The bucket's object retention mode. Can be Enabled." - } - } + "type": "object", + "description": "The bucket's object retention config.", + "properties": { + "mode": { + "type": "string", + "description": "The bucket's object retention mode. Can be Enabled." + } + } }, "rpo": { - "type": "string", - "description": "The Recovery Point Objective (RPO) of this bucket. Set to ASYNC_TURBO to turn on Turbo Replication on a bucket." + "type": "string", + "description": "The Recovery Point Objective (RPO) of this bucket. Set to ASYNC_TURBO to turn on Turbo Replication on a bucket." }, "selfLink": { - "type": "string", - "description": "The URI of this bucket." + "type": "string", + "description": "The URI of this bucket." }, "softDeletePolicy": { - "type": "object", - "description": "The bucket's soft delete policy, which defines the period of time that soft-deleted objects will be retained, and cannot be permanently deleted.", - "properties": { - "retentionDurationSeconds": { - "type": "string", - "description": "The duration in seconds that soft-deleted objects in the bucket will be retained and cannot be permanently deleted.", - "format": "int64" - }, - "effectiveTime": { - "type": "string", - "description": "Server-determined value that indicates the time from which the policy, or one with a greater retention, was effective. This value is in RFC 3339 format.", - "format": "date-time" - } - } + "type": "object", + "description": "The bucket's soft delete policy, which defines the period of time that soft-deleted objects will be retained, and cannot be permanently deleted.", + "properties": { + "retentionDurationSeconds": { + "type": "string", + "description": "The duration in seconds that soft-deleted objects in the bucket will be retained and cannot be permanently deleted.", + "format": "int64" + }, + "effectiveTime": { + "type": "string", + "description": "Server-determined value that indicates the time from which the policy, or one with a greater retention, was effective. This value is in RFC 3339 format.", + "format": "date-time" + } + } }, "storageClass": { - "type": "string", - "description": "The bucket's default storage class, used whenever no storageClass is specified for a newly-created object. This defines how objects in the bucket are stored and determines the SLA and the cost of storage. Values include MULTI_REGIONAL, REGIONAL, STANDARD, NEARLINE, COLDLINE, ARCHIVE, and DURABLE_REDUCED_AVAILABILITY. If this value is not specified when the bucket is created, it will default to STANDARD. For more information, see storage classes." + "type": "string", + "description": "The bucket's default storage class, used whenever no storageClass is specified for a newly-created object. This defines how objects in the bucket are stored and determines the SLA and the cost of storage. Values include MULTI_REGIONAL, REGIONAL, STANDARD, NEARLINE, COLDLINE, ARCHIVE, and DURABLE_REDUCED_AVAILABILITY. If this value is not specified when the bucket is created, it will default to STANDARD. For more information, see storage classes." }, "timeCreated": { - "type": "string", - "description": "The creation time of the bucket in RFC 3339 format.", - "format": "date-time" + "type": "string", + "description": "The creation time of the bucket in RFC 3339 format.", + "format": "date-time" }, "updated": { - "type": "string", - "description": "The modification time of the bucket in RFC 3339 format.", - "format": "date-time" + "type": "string", + "description": "The modification time of the bucket in RFC 3339 format.", + "format": "date-time" }, "versioning": { - "type": "object", - "description": "The bucket's versioning configuration.", - "properties": { - "enabled": { - "type": "boolean", - "description": "While set to true, versioning is fully enabled for this bucket." - } - } + "type": "object", + "description": "The bucket's versioning configuration.", + "properties": { + "enabled": { + "type": "boolean", + "description": "While set to true, versioning is fully enabled for this bucket." + } + } }, "website": { - "type": "object", - "description": "The bucket's website configuration, controlling how the service behaves when accessing bucket contents as a web site. See the Static Website Examples for more information.", - "properties": { - "mainPageSuffix": { - "type": "string", - "description": "If the requested object path is missing, the service will ensure the path has a trailing '/', append this suffix, and attempt to retrieve the resulting object. This allows the creation of index.html objects to represent directory pages." - }, - "notFoundPage": { - "type": "string", - "description": "If the requested object path is missing, and any mainPageSuffix object is missing, if applicable, the service will return the named object from this bucket as the content for a 404 Not Found result." - } - } + "type": "object", + "description": "The bucket's website configuration, controlling how the service behaves when accessing bucket contents as a web site. See the Static Website Examples for more information.", + "properties": { + "mainPageSuffix": { + "type": "string", + "description": "If the requested object path is missing, the service will ensure the path has a trailing '/', append this suffix, and attempt to retrieve the resulting object. This allows the creation of index.html objects to represent directory pages." + }, + "notFoundPage": { + "type": "string", + "description": "If the requested object path is missing, and any mainPageSuffix object is missing, if applicable, the service will return the named object from this bucket as the content for a 404 Not Found result." + } + } }, "satisfiesPZS": { - "type": "boolean", - "description": "Reserved for future use." + "type": "boolean", + "description": "Reserved for future use." } - } - }, - "AnywhereCache": { - "id": "AnywhereCache", - "type": "object", - "description": "An Anywhere Cache instance.", - "properties": { +} +}, +"AnywhereCache": { +"id": "AnywhereCache", +"type": "object", +"description": "An Anywhere Cache instance.", +"properties": { "kind": { - "type": "string", - "description": "The kind of item this is. For Anywhere Cache, this is always storage#anywhereCache.", - "default": "storage#anywhereCache" + "type": "string", + "description": "The kind of item this is. For Anywhere Cache, this is always storage#anywhereCache.", + "default": "storage#anywhereCache" }, "id": { - "type": "string", - "description": "The ID of the resource, including the project number, bucket name and anywhere cache ID." + "type": "string", + "description": "The ID of the resource, including the project number, bucket name and anywhere cache ID." }, "selfLink": { - "type": "string", - "description": "The link to this cache instance." + "type": "string", + "description": "The link to this cache instance." }, "bucket": { - "type": "string", - "description": "The name of the bucket containing this cache instance." + "type": "string", + "description": "The name of the bucket containing this cache instance." }, "anywhereCacheId": { - "type": "string", - "description": "The ID of the Anywhere cache instance." + "type": "string", + "description": "The ID of the Anywhere cache instance." + }, + "zone": { + "type": "string", + "description": "The zone in which the cache instance is running. For example, us-central1-a." }, "state": { - "type": "string", - "description": "The current state of the cache instance." + "type": "string", + "description": "The current state of the cache instance." }, "createTime": { - "type": "string", - "description": "The creation time of the cache instance in RFC 3339 format.", - "format": "date-time" + "type": "string", + "description": "The creation time of the cache instance in RFC 3339 format.", + "format": "date-time" }, "updateTime": { - "type": "string", - "description": "The modification time of the cache instance metadata in RFC 3339 format.", - "format": "date-time" + "type": "string", + "description": "The modification time of the cache instance metadata in RFC 3339 format.", + "format": "date-time" }, "ttl": { - "type": "string", - "description": "The TTL of all cache entries in whole seconds. e.g., \"7200s\". ", - "format": "google-duration" + "type": "string", + "description": "The TTL of all cache entries in whole seconds. e.g., \"7200s\". ", + "format": "google-duration" }, "admissionPolicy": { - "type": "string", - "description": "The cache-level entry admission policy." + "type": "string", + "description": "The cache-level entry admission policy." }, "pendingUpdate": { - "type": "boolean", - "description": "True if the cache instance has an active Update long-running operation." + "type": "boolean", + "description": "True if the cache instance has an active Update long-running operation." } - } - }, - "AnywhereCaches": { - "id": "AnywhereCaches", - "type": "object", - "description": "A list of Anywhere Caches.", - "properties": { +} +}, +"AnywhereCaches": { +"id": "AnywhereCaches", +"type": "object", +"description": "A list of Anywhere Caches.", +"properties": { "kind": { - "type": "string", - "description": "The kind of item this is. For lists of Anywhere Caches, this is always storage#anywhereCaches.", - "default": "storage#anywhereCaches" + "type": "string", + "description": "The kind of item this is. For lists of Anywhere Caches, this is always storage#anywhereCaches.", + "default": "storage#anywhereCaches" }, "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." }, "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "AnywhereCache" - } + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "AnywhereCache" + } } - } - }, - "BucketAccessControl": { - "id": "BucketAccessControl", - "type": "object", - "description": "An access-control entry.", - "properties": { +} +}, +"BucketAccessControl": { +"id": "BucketAccessControl", +"type": "object", +"description": "An access-control entry.", +"properties": { "bucket": { - "type": "string", - "description": "The name of the bucket." + "type": "string", + "description": "The name of the bucket." }, "domain": { - "type": "string", - "description": "The domain associated with the entity, if any." + "type": "string", + "description": "The domain associated with the entity, if any." }, "email": { - "type": "string", - "description": "The email address associated with the entity, if any." + "type": "string", + "description": "The email address associated with the entity, if any." }, "entity": { - "type": "string", - "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.", - "annotations": { - "required": [ - "storage.bucketAccessControls.insert" - ] - } + "type": "string", + "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.", + "annotations": { + "required": [ + "storage.bucketAccessControls.insert" + ] + } }, "entityId": { - "type": "string", - "description": "The ID for the entity, if any." + "type": "string", + "description": "The ID for the entity, if any." }, "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the access-control entry." + "type": "string", + "description": "HTTP 1.1 Entity tag for the access-control entry." }, "id": { - "type": "string", - "description": "The ID of the access-control entry." + "type": "string", + "description": "The ID of the access-control entry." }, "kind": { - "type": "string", - "description": "The kind of item this is. For bucket access control entries, this is always storage#bucketAccessControl.", - "default": "storage#bucketAccessControl" + "type": "string", + "description": "The kind of item this is. For bucket access control entries, this is always storage#bucketAccessControl.", + "default": "storage#bucketAccessControl" }, "projectTeam": { - "type": "object", - "description": "The project team associated with the entity, if any.", - "properties": { - "projectNumber": { - "type": "string", - "description": "The project number." - }, - "team": { - "type": "string", - "description": "The team." - } - } + "type": "object", + "description": "The project team associated with the entity, if any.", + "properties": { + "projectNumber": { + "type": "string", + "description": "The project number." + }, + "team": { + "type": "string", + "description": "The team." + } + } }, "role": { - "type": "string", - "description": "The access permission for the entity.", - "annotations": { - "required": [ - "storage.bucketAccessControls.insert" - ] - } + "type": "string", + "description": "The access permission for the entity.", + "annotations": { + "required": [ + "storage.bucketAccessControls.insert" + ] + } }, "selfLink": { - "type": "string", - "description": "The link to this access-control entry." + "type": "string", + "description": "The link to this access-control entry." } - } - }, - "BucketAccessControls": { - "id": "BucketAccessControls", - "type": "object", - "description": "An access-control list.", - "properties": { +} +}, +"BucketAccessControls": { +"id": "BucketAccessControls", +"type": "object", +"description": "An access-control list.", +"properties": { "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "BucketAccessControl" - } + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "BucketAccessControl" + } }, "kind": { - "type": "string", - "description": "The kind of item this is. For lists of bucket access control entries, this is always storage#bucketAccessControls.", - "default": "storage#bucketAccessControls" + "type": "string", + "description": "The kind of item this is. For lists of bucket access control entries, this is always storage#bucketAccessControls.", + "default": "storage#bucketAccessControls" } - } - }, - "Buckets": { - "id": "Buckets", - "type": "object", - "description": "A list of buckets.", - "properties": { +} +}, +"Buckets": { +"id": "Buckets", +"type": "object", +"description": "A list of buckets.", +"properties": { "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "Bucket" - } + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "Bucket" + } }, "kind": { - "type": "string", - "description": "The kind of item this is. For lists of buckets, this is always storage#buckets.", - "default": "storage#buckets" + "type": "string", + "description": "The kind of item this is. For lists of buckets, this is always storage#buckets.", + "default": "storage#buckets" }, "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." } - } - }, - "Channel": { - "id": "Channel", - "type": "object", - "description": "An notification channel used to watch for resource changes.", - "properties": { +} +}, +"Channel": { +"id": "Channel", +"type": "object", +"description": "An notification channel used to watch for resource changes.", +"properties": { "address": { - "type": "string", - "description": "The address where notifications are delivered for this channel." + "type": "string", + "description": "The address where notifications are delivered for this channel." }, "expiration": { - "type": "string", - "description": "Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.", - "format": "int64" + "type": "string", + "description": "Date and time of notification channel expiration, expressed as a Unix timestamp, in milliseconds. Optional.", + "format": "int64" }, "id": { - "type": "string", - "description": "A UUID or similar unique string that identifies this channel." + "type": "string", + "description": "A UUID or similar unique string that identifies this channel." }, "kind": { - "type": "string", - "description": "Identifies this as a notification channel used to watch for changes to a resource, which is \"api#channel\".", - "default": "api#channel" + "type": "string", + "description": "Identifies this as a notification channel used to watch for changes to a resource, which is \"api#channel\".", + "default": "api#channel" }, "params": { - "type": "object", - "description": "Additional parameters controlling delivery channel behavior. Optional.", - "additionalProperties": { - "type": "string", - "description": "Declares a new parameter by name." - } + "type": "object", + "description": "Additional parameters controlling delivery channel behavior. Optional.", + "additionalProperties": { + "type": "string", + "description": "Declares a new parameter by name." + } }, "payload": { - "type": "boolean", - "description": "A Boolean value to indicate whether payload is wanted. Optional." + "type": "boolean", + "description": "A Boolean value to indicate whether payload is wanted. Optional." }, "resourceId": { - "type": "string", - "description": "An opaque ID that identifies the resource being watched on this channel. Stable across different API versions." + "type": "string", + "description": "An opaque ID that identifies the resource being watched on this channel. Stable across different API versions." }, "resourceUri": { - "type": "string", - "description": "A version-specific identifier for the watched resource." + "type": "string", + "description": "A version-specific identifier for the watched resource." }, "token": { - "type": "string", - "description": "An arbitrary string delivered to the target address with each notification delivered over this channel. Optional." + "type": "string", + "description": "An arbitrary string delivered to the target address with each notification delivered over this channel. Optional." }, "type": { - "type": "string", - "description": "The type of delivery mechanism used for this channel." + "type": "string", + "description": "The type of delivery mechanism used for this channel." } - } - }, - "ComposeRequest": { - "id": "ComposeRequest", - "type": "object", - "description": "A Compose request.", - "properties": { +} +}, +"ComposeRequest": { +"id": "ComposeRequest", +"type": "object", +"description": "A Compose request.", +"properties": { "destination": { - "$ref": "Object", - "description": "Properties of the resulting object." + "$ref": "Object", + "description": "Properties of the resulting object." }, "kind": { - "type": "string", - "description": "The kind of item this is.", - "default": "storage#composeRequest" + "type": "string", + "description": "The kind of item this is.", + "default": "storage#composeRequest" }, "sourceObjects": { - "type": "array", - "description": "The list of source objects that will be concatenated into a single object.", - "items": { - "type": "object", - "properties": { - "generation": { - "type": "string", - "description": "The generation of this object to use as the source.", - "format": "int64" - }, - "name": { - "type": "string", - "description": "The source object's name. All source objects must reside in the same bucket.", + "type": "array", + "description": "The list of source objects that will be concatenated into a single object.", + "items": { + "type": "object", + "properties": { + "generation": { + "type": "string", + "description": "The generation of this object to use as the source.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The source object's name. All source objects must reside in the same bucket.", + "annotations": { + "required": [ + "storage.objects.compose" + ] + } + }, + "objectPreconditions": { + "type": "object", + "description": "Conditions that must be met for this operation to execute.", + "properties": { + "ifGenerationMatch": { + "type": "string", + "description": "Only perform the composition if the generation of the source object that would be used matches this value. If this value and a generation are both specified, they must be the same value or the call will fail.", + "format": "int64" + } + } + } + } + }, "annotations": { - "required": [ - "storage.objects.compose" - ] + "required": [ + "storage.objects.compose" + ] } - }, - "objectPreconditions": { + } +} +}, + "Folder": { + "id": "Folder", "type": "object", - "description": "Conditions that must be met for this operation to execute.", + "description": "A folder. Only available in buckets with hierarchical namespace enabled.", "properties": { - "ifGenerationMatch": { - "type": "string", - "description": "Only perform the composition if the generation of the source object that would be used matches this value. If this value and a generation are both specified, they must be the same value or the call will fail.", - "format": "int64" - } + "bucket": { + "type": "string", + "description": "The name of the bucket containing this folder." + }, + "id": { + "type": "string", + "description": "The ID of the folder, including the bucket name, folder name." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For folders, this is always storage#folder.", + "default": "storage#folder" + }, + "metageneration": { + "type": "string", + "description": "The version of the metadata for this folder. Used for preconditions and for detecting changes in metadata.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The name of the folder. Required if not specified by URL parameter." + }, + "selfLink": { + "type": "string", + "description": "The link to this folder." + }, + "createTime": { + "type": "string", + "description": "The creation time of the folder in RFC 3339 format.", + "format": "date-time" + }, + "updateTime": { + "type": "string", + "description": "The modification time of the folder metadata in RFC 3339 format.", + "format": "date-time" + }, + "pendingRenameInfo": { + "type": "object", + "description": "Only present if the folder is part of an ongoing rename folder operation. Contains information which can be used to query the operation status.", + "properties": { + "operationId": { + "type": "string", + "description": "The ID of the rename folder operation." + } + } + } } - } - } - }, - "annotations": { - "required": [ - "storage.objects.compose" - ] - } - } - } - }, - "Expr": { - "id": "Expr", - "type": "object", - "description": "Represents an expression text. Example: title: \"User account presence\" description: \"Determines whether the request has a user account\" expression: \"size(request.user) > 0\"", - "properties": { - "description": { - "type": "string", - "description": "An optional description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI." - }, - "expression": { - "type": "string", - "description": "Textual representation of an expression in Common Expression Language syntax. The application context of the containing message determines which well-known feature set of CEL is supported." - }, - "location": { - "type": "string", - "description": "An optional string indicating the location of the expression for error reporting, e.g. a file name and a position in the file." - }, - "title": { - "type": "string", - "description": "An optional title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression." - } - } - }, - "GoogleLongrunningOperation": { - "description": "This resource represents a long-running operation that is the result of a network API call.", - "id": "GoogleLongrunningOperation", - "properties": { - "done": { - "description": "If the value is \"false\", it means the operation is still in progress. If \"true\", the operation is completed, and either \"error\" or \"response\" is available.", - "type": "boolean" - }, - "error": { - "$ref": "GoogleRpcStatus", - "description": "The error result of the operation in case of failure or cancellation." - }, - "metadata": { - "additionalProperties": { - "description": "Properties of the object. Contains field @type with type URL.", - "type": "any" - }, - "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.", - "type": "object" }, - "name": { - "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the \"name\" should be a resource name ending with \"operations/{operationId}\".", - "type": "string" + "Folders": { + "id": "Folders", + "type": "object", + "description": "A list of folders.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "Folder" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of folders, this is always storage#folders.", + "default": "storage#folders" + }, + "nextPageToken": { + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + } + } }, - "response": { - "additionalProperties": { - "description": "Properties of the object. Contains field @type with type URL.", - "type": "any" - }, - "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as \"Delete\", the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type \"XxxResponse\", where \"Xxx\" is the original method name. For example, if the original method name is \"TakeSnapshot()\", the inferred response type is \"TakeSnapshotResponse\".", - "type": "object" - } - }, - "type": "object" - }, - "GoogleLongrunningListOperationsResponse": { - "description": "The response message for storage.buckets.operations.list.", - "id": "GoogleLongrunningListOperationsResponse", - "properties": { - "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." - }, - "operations": { - "description": "A list of operations that matches the specified filter in the request.", - "items": { - "$ref": "GoogleLongrunningOperation" - }, - "type": "array" - } - }, - "type": "object" - }, - "GoogleRpcStatus": { - "description": "The \"Status\" type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each \"Status\" message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).", - "id": "GoogleRpcStatus", - "properties": { - "code": { - "description": "The status code, which should be an enum value of google.rpc.Code.", - "format": "int32", - "type": "integer" - }, - "details": { - "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.", - "items": { - "additionalProperties": { - "description": "Properties of the object. Contains field @type with type URL.", - "type": "any" - }, - "type": "object" - }, - "type": "array" - }, - "message": { - "description": "A developer-facing error message, which should be in English.", - "type": "string" - } - }, - "type": "object" - }, - "HmacKey": { - "id": "HmacKey", - "type": "object", - "description": "JSON template to produce a JSON-style HMAC Key resource for Create responses.", - "properties": { - "kind": { - "type": "string", - "description": "The kind of item this is. For HMAC keys, this is always storage#hmacKey.", - "default": "storage#hmacKey" + "Expr": { + "id": "Expr", + "type": "object", + "description": "Represents an expression text. Example: title: \"User account presence\" description: \"Determines whether the request has a user account\" expression: \"size(request.user) > 0\"", + "properties": { + "description": { + "type": "string", + "description": "An optional description of the expression. This is a longer text which describes the expression, e.g. when hovered over it in a UI." + }, + "expression": { + "type": "string", + "description": "Textual representation of an expression in Common Expression Language syntax. The application context of the containing message determines which well-known feature set of CEL is supported." + }, + "location": { + "type": "string", + "description": "An optional string indicating the location of the expression for error reporting, e.g. a file name and a position in the file." + }, + "title": { + "type": "string", + "description": "An optional title for the expression, i.e. a short string describing its purpose. This can be used e.g. in UIs which allow to enter the expression." + } + } }, - "metadata": { - "$ref": "HmacKeyMetadata", - "description": "Key metadata." + "GoogleLongrunningOperation": { + "description": "This resource represents a long-running operation that is the result of a network API call.", + "id": "GoogleLongrunningOperation", + "properties": { + "done": { + "description": "If the value is \"false\", it means the operation is still in progress. If \"true\", the operation is completed, and either \"error\" or \"response\" is available.", + "type": "boolean" + }, + "error": { + "$ref": "GoogleRpcStatus", + "description": "The error result of the operation in case of failure or cancellation." + }, + "metadata": { + "additionalProperties": { + "description": "Properties of the object. Contains field @type with type URL.", + "type": "any" + }, + "description": "Service-specific metadata associated with the operation. It typically contains progress information and common metadata such as create time. Some services might not provide such metadata. Any method that returns a long-running operation should document the metadata type, if any.", + "type": "object" + }, + "name": { + "description": "The server-assigned name, which is only unique within the same service that originally returns it. If you use the default HTTP mapping, the \"name\" should be a resource name ending with \"operations/{operationId}\".", + "type": "string" + }, + "response": { + "additionalProperties": { + "description": "Properties of the object. Contains field @type with type URL.", + "type": "any" + }, + "description": "The normal response of the operation in case of success. If the original method returns no data on success, such as \"Delete\", the response is google.protobuf.Empty. If the original method is standard Get/Create/Update, the response should be the resource. For other methods, the response should have the type \"XxxResponse\", where \"Xxx\" is the original method name. For example, if the original method name is \"TakeSnapshot()\", the inferred response type is \"TakeSnapshotResponse\".", + "type": "object" + } + }, + "type": "object" }, - "secret": { - "type": "string", - "description": "HMAC secret key material." - } - } - }, - "HmacKeyMetadata": { - "id": "HmacKeyMetadata", - "type": "object", - "description": "JSON template to produce a JSON-style HMAC Key metadata resource.", - "properties": { - "accessId": { - "type": "string", - "description": "The ID of the HMAC Key." + "GoogleLongrunningListOperationsResponse": { + "description": "The response message for storage.buckets.operations.list.", + "id": "GoogleLongrunningListOperationsResponse", + "properties": { + "nextPageToken": { + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + }, + "operations": { + "description": "A list of operations that matches the specified filter in the request.", + "items": { + "$ref": "GoogleLongrunningOperation" + }, + "type": "array" + } + }, + "type": "object" }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the HMAC key." + "GoogleRpcStatus": { + "description": "The \"Status\" type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs. It is used by [gRPC](https://github.com/grpc). Each \"Status\" message contains three pieces of data: error code, error message, and error details. You can find out more about this error model and how to work with it in the [API Design Guide](https://cloud.google.com/apis/design/errors).", + "id": "GoogleRpcStatus", + "properties": { + "code": { + "description": "The status code, which should be an enum value of google.rpc.Code.", + "format": "int32", + "type": "integer" + }, + "details": { + "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.", + "items": { + "additionalProperties": { + "description": "Properties of the object. Contains field @type with type URL.", + "type": "any" + }, + "type": "object" + }, + "type": "array" + }, + "message": { + "description": "A developer-facing error message, which should be in English.", + "type": "string" + } + }, + "type": "object" }, - "id": { - "type": "string", - "description": "The ID of the HMAC key, including the Project ID and the Access ID." + "HmacKey": { + "id": "HmacKey", + "type": "object", + "description": "JSON template to produce a JSON-style HMAC Key resource for Create responses.", + "properties": { + "kind": { + "type": "string", + "description": "The kind of item this is. For HMAC keys, this is always storage#hmacKey.", + "default": "storage#hmacKey" + }, + "metadata": { + "$ref": "HmacKeyMetadata", + "description": "Key metadata." + }, + "secret": { + "type": "string", + "description": "HMAC secret key material." + } + } }, - "kind": { - "type": "string", - "description": "The kind of item this is. For HMAC Key metadata, this is always storage#hmacKeyMetadata.", - "default": "storage#hmacKeyMetadata" + "HmacKeyMetadata": { + "id": "HmacKeyMetadata", + "type": "object", + "description": "JSON template to produce a JSON-style HMAC Key metadata resource.", + "properties": { + "accessId": { + "type": "string", + "description": "The ID of the HMAC Key." + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for the HMAC key." + }, + "id": { + "type": "string", + "description": "The ID of the HMAC key, including the Project ID and the Access ID." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For HMAC Key metadata, this is always storage#hmacKeyMetadata.", + "default": "storage#hmacKeyMetadata" + }, + "projectId": { + "type": "string", + "description": "Project ID owning the service account to which the key authenticates." + }, + "selfLink": { + "type": "string", + "description": "The link to this resource." + }, + "serviceAccountEmail": { + "type": "string", + "description": "The email address of the key's associated service account." + }, + "state": { + "type": "string", + "description": "The state of the key. Can be one of ACTIVE, INACTIVE, or DELETED." + }, + "timeCreated": { + "type": "string", + "description": "The creation time of the HMAC key in RFC 3339 format.", + "format": "date-time" + }, + "updated": { + "type": "string", + "description": "The last modification time of the HMAC key metadata in RFC 3339 format.", + "format": "date-time" + } + } }, - "projectId": { - "type": "string", - "description": "Project ID owning the service account to which the key authenticates." + "HmacKeysMetadata": { + "id": "HmacKeysMetadata", + "type": "object", + "description": "A list of hmacKeys.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "HmacKeyMetadata" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of hmacKeys, this is always storage#hmacKeysMetadata.", + "default": "storage#hmacKeysMetadata" + }, + "nextPageToken": { + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + } + } }, - "selfLink": { - "type": "string", - "description": "The link to this resource." + "ManagedFolder": { + "id": "ManagedFolder", + "type": "object", + "description": "A managed folder.", + "properties": { + "bucket": { + "type": "string", + "description": "The name of the bucket containing this managed folder." + }, + "id": { + "type": "string", + "description": "The ID of the managed folder, including the bucket name and managed folder name." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For managed folders, this is always storage#managedFolder.", + "default": "storage#managedFolder" + }, + "metageneration": { + "type": "string", + "description": "The version of the metadata for this managed folder. Used for preconditions and for detecting changes in metadata.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The name of the managed folder. Required if not specified by URL parameter." + }, + "selfLink": { + "type": "string", + "description": "The link to this managed folder." + }, + "createTime": { + "type": "string", + "description": "The creation time of the managed folder in RFC 3339 format.", + "format": "date-time" + }, + "updateTime": { + "type": "string", + "description": "The last update time of the managed folder metadata in RFC 3339 format.", + "format": "date-time" + } + } }, - "serviceAccountEmail": { - "type": "string", - "description": "The email address of the key's associated service account." + "ManagedFolders": { + "id": "ManagedFolders", + "type": "object", + "description": "A list of managed folders.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "ManagedFolder" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of managed folders, this is always storage#managedFolders.", + "default": "storage#managedFolders" + }, + "nextPageToken": { + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + } + } }, - "state": { - "type": "string", - "description": "The state of the key. Can be one of ACTIVE, INACTIVE, or DELETED." + "Notification": { + "id": "Notification", + "type": "object", + "description": "A subscription to receive Google PubSub notifications.", + "properties": { + "custom_attributes": { + "type": "object", + "description": "An optional list of additional attributes to attach to each Cloud PubSub message published for this notification subscription.", + "additionalProperties": { + "type": "string" + } + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for this subscription notification." + }, + "event_types": { + "type": "array", + "description": "If present, only send notifications about listed event types. If empty, sent notifications for all event types.", + "items": { + "type": "string" + } + }, + "id": { + "type": "string", + "description": "The ID of the notification." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For notifications, this is always storage#notification.", + "default": "storage#notification" + }, + "object_name_prefix": { + "type": "string", + "description": "If present, only apply this notification configuration to object names that begin with this prefix." + }, + "payload_format": { + "type": "string", + "description": "The desired content of the Payload.", + "default": "JSON_API_V1", + "annotations": { + "required": [ + "storage.notifications.insert" + ] + } + }, + "selfLink": { + "type": "string", + "description": "The canonical URL of this notification." + }, + "topic": { + "type": "string", + "description": "The Cloud PubSub topic to which this subscription publishes. Formatted as: '//pubsub.googleapis.com/projects/{project-identifier}/topics/{my-topic}'", + "annotations": { + "required": [ + "storage.notifications.insert" + ] + } + } + } }, - "timeCreated": { - "type": "string", - "description": "The creation time of the HMAC key in RFC 3339 format.", - "format": "date-time" + "Notifications": { + "id": "Notifications", + "type": "object", + "description": "A list of notification subscriptions.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "Notification" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of notifications, this is always storage#notifications.", + "default": "storage#notifications" + } + } }, - "updated": { - "type": "string", - "description": "The last modification time of the HMAC key metadata in RFC 3339 format.", - "format": "date-time" - } - } - }, - "HmacKeysMetadata": { - "id": "HmacKeysMetadata", - "type": "object", - "description": "A list of hmacKeys.", - "properties": { - "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "HmacKeyMetadata" - } + "Object": { + "id": "Object", + "type": "object", + "description": "An object.", + "properties": { + "acl": { + "type": "array", + "description": "Access controls on the object.", + "items": { + "$ref": "ObjectAccessControl" + }, + "annotations": { + "required": [ + "storage.objects.update" + ] + } + }, + "bucket": { + "type": "string", + "description": "The name of the bucket containing this object." + }, + "cacheControl": { + "type": "string", + "description": "Cache-Control directive for the object data. If omitted, and the object is accessible to all anonymous users, the default will be public, max-age=3600." + }, + "componentCount": { + "type": "integer", + "description": "Number of underlying components that make up this object. Components are accumulated by compose operations.", + "format": "int32" + }, + "contentDisposition": { + "type": "string", + "description": "Content-Disposition of the object data." + }, + "contentEncoding": { + "type": "string", + "description": "Content-Encoding of the object data." + }, + "contentLanguage": { + "type": "string", + "description": "Content-Language of the object data." + }, + "contentType": { + "type": "string", + "description": "Content-Type of the object data. If an object is stored without a Content-Type, it is served as application/octet-stream." + }, + "crc32c": { + "type": "string", + "description": "CRC32c checksum, as described in RFC 4960, Appendix B; encoded using base64 in big-endian byte order. For more information about using the CRC32c checksum, see Hashes and ETags: Best Practices." + }, + "customTime": { + "type": "string", + "description": "A timestamp in RFC 3339 format specified by the user for an object.", + "format": "date-time" + }, + "customerEncryption": { + "type": "object", + "description": "Metadata of customer-supplied encryption key, if the object is encrypted by such a key.", + "properties": { + "encryptionAlgorithm": { + "type": "string", + "description": "The encryption algorithm." + }, + "keySha256": { + "type": "string", + "description": "SHA256 hash value of the encryption key." + } + } + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for the object." + }, + "eventBasedHold": { + "type": "boolean", + "description": "Whether an object is under event-based hold. Event-based hold is a way to retain objects until an event occurs, which is signified by the hold's release (i.e. this value is set to false). After being released (set to false), such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is the loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false." + }, + "generation": { + "type": "string", + "description": "The content generation of this object. Used for object versioning.", + "format": "int64" + }, + "id": { + "type": "string", + "description": "The ID of the object, including the bucket name, object name, and generation number." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For objects, this is always storage#object.", + "default": "storage#object" + }, + "kmsKeyName": { + "type": "string", + "description": "Not currently supported. Specifying the parameter causes the request to fail with status code 400 - Bad Request." + }, + "md5Hash": { + "type": "string", + "description": "MD5 hash of the data; encoded using base64. For more information about using the MD5 hash, see Hashes and ETags: Best Practices." + }, + "mediaLink": { + "type": "string", + "description": "Media download link." + }, + "metadata": { + "type": "object", + "description": "User-provided metadata, in key/value pairs.", + "additionalProperties": { + "type": "string", + "description": "An individual metadata entry." + } + }, + "metageneration": { + "type": "string", + "description": "The version of the metadata for this object at this generation. Used for preconditions and for detecting changes in metadata. A metageneration number is only meaningful in the context of a particular generation of a particular object.", + "format": "int64" + }, + "name": { + "type": "string", + "description": "The name of the object. Required if not specified by URL parameter." + }, + "owner": { + "type": "object", + "description": "The owner of the object. This will always be the uploader of the object.", + "properties": { + "entity": { + "type": "string", + "description": "The entity, in the form user-userId." + }, + "entityId": { + "type": "string", + "description": "The ID for the entity." + } + } + }, + "retentionExpirationTime": { + "type": "string", + "description": "A server-determined value that specifies the earliest time that the object's retention period expires. This value is in RFC 3339 format. Note 1: This field is not provided for objects with an active event-based hold, since retention expiration is unknown until the hold is removed. Note 2: This value can be provided even when temporary hold is set (so that the user can reason about policy without having to first unset the temporary hold).", + "format": "date-time" + }, + "retention": { + "type": "object", + "description": "A collection of object level retention parameters.", + "properties": { + "retainUntilTime": { + "type": "string", + "description": "A time in RFC 3339 format until which object retention protects this object.", + "format": "date-time" + }, + "mode": { + "type": "string", + "description": "The bucket's object retention mode, can only be Unlocked or Locked." + } + } + }, + "selfLink": { + "type": "string", + "description": "The link to this object." + }, + "size": { + "type": "string", + "description": "Content-Length of the data in bytes.", + "format": "uint64" + }, + "storageClass": { + "type": "string", + "description": "Storage class of the object." + }, + "temporaryHold": { + "type": "boolean", + "description": "Whether an object is under temporary hold. While this flag is set to true, the object is protected against deletion and overwrites. A common use case of this flag is regulatory investigations where objects need to be retained while the investigation is ongoing. Note that unlike event-based hold, temporary hold does not impact retention expiration time of an object." + }, + "timeCreated": { + "type": "string", + "description": "The creation time of the object in RFC 3339 format.", + "format": "date-time" + }, + "timeDeleted": { + "type": "string", + "description": "The time at which the object became noncurrent in RFC 3339 format. Will be returned if and only if this version of the object has been deleted.", + "format": "date-time" + }, + "softDeleteTime": { + "type": "string", + "description": "The time at which the object became soft-deleted in RFC 3339 format.", + "format": "date-time" + }, + "hardDeleteTime": { + "type": "string", + "description": "This is the time (in the future) when the soft-deleted object will no longer be restorable. It is equal to the soft delete time plus the current soft delete retention duration of the bucket.", + "format": "date-time" + }, + "timeStorageClassUpdated": { + "type": "string", + "description": "The time at which the object's storage class was last changed. When the object is initially created, it will be set to timeCreated.", + "format": "date-time" + }, + "updated": { + "type": "string", + "description": "The modification time of the object metadata in RFC 3339 format. Set initially to object creation time and then updated whenever any metadata of the object changes. This includes changes made by a requester, such as modifying custom metadata, as well as changes made by Cloud Storage on behalf of a requester, such as changing the storage class based on an Object Lifecycle Configuration.", + "format": "date-time" + } + } }, - "kind": { - "type": "string", - "description": "The kind of item this is. For lists of hmacKeys, this is always storage#hmacKeysMetadata.", - "default": "storage#hmacKeysMetadata" + "ObjectAccessControl": { + "id": "ObjectAccessControl", + "type": "object", + "description": "An access-control entry.", + "properties": { + "bucket": { + "type": "string", + "description": "The name of the bucket." + }, + "domain": { + "type": "string", + "description": "The domain associated with the entity, if any." + }, + "email": { + "type": "string", + "description": "The email address associated with the entity, if any." + }, + "entity": { + "type": "string", + "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.", + "annotations": { + "required": [ + "storage.defaultObjectAccessControls.insert", + "storage.objectAccessControls.insert" + ] + } + }, + "entityId": { + "type": "string", + "description": "The ID for the entity, if any." + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for the access-control entry." + }, + "generation": { + "type": "string", + "description": "The content generation of the object, if applied to an object.", + "format": "int64" + }, + "id": { + "type": "string", + "description": "The ID of the access-control entry." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For object access control entries, this is always storage#objectAccessControl.", + "default": "storage#objectAccessControl" + }, + "object": { + "type": "string", + "description": "The name of the object, if applied to an object." + }, + "projectTeam": { + "type": "object", + "description": "The project team associated with the entity, if any.", + "properties": { + "projectNumber": { + "type": "string", + "description": "The project number." + }, + "team": { + "type": "string", + "description": "The team." + } + } + }, + "role": { + "type": "string", + "description": "The access permission for the entity.", + "annotations": { + "required": [ + "storage.defaultObjectAccessControls.insert", + "storage.objectAccessControls.insert" + ] + } + }, + "selfLink": { + "type": "string", + "description": "The link to this access-control entry." + } + } }, - "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + "ObjectAccessControls": { + "id": "ObjectAccessControls", + "type": "object", + "description": "An access-control list.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "ObjectAccessControl" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of object access control entries, this is always storage#objectAccessControls.", + "default": "storage#objectAccessControls" + } + } + }, + "Objects": { + "id": "Objects", + "type": "object", + "description": "A list of objects.", + "properties": { + "items": { + "type": "array", + "description": "The list of items.", + "items": { + "$ref": "Object" + } + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For lists of objects, this is always storage#objects.", + "default": "storage#objects" + }, + "nextPageToken": { + "type": "string", + "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." + }, + "prefixes": { + "type": "array", + "description": "The list of prefixes of objects matching-but-not-listed up to and including the requested delimiter.", + "items": { + "type": "string" + } + } + } + }, + "Policy": { + "id": "Policy", + "type": "object", + "description": "A bucket/object/managedFolder IAM policy.", + "properties": { + "bindings": { + "type": "array", + "description": "An association between a role, which comes with a set of permissions, and members who may assume that role.", + "items": { + "type": "object", + "properties": { + "condition": { + "$ref": "Expr", + "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently." + }, + "members": { + "type": "array", + "description": "A collection of identifiers for members who may assume the provided role. Recognized identifiers are as follows: \n- allUsers \u2014 A special identifier that represents anyone on the internet; with or without a Google account. \n- allAuthenticatedUsers \u2014 A special identifier that represents anyone who is authenticated with a Google account or a service account. \n- user:emailid \u2014 An email address that represents a specific account. For example, user:alice@gmail.com or user:joe@example.com. \n- serviceAccount:emailid \u2014 An email address that represents a service account. For example, serviceAccount:my-other-app@appspot.gserviceaccount.com . \n- group:emailid \u2014 An email address that represents a Google group. For example, group:admins@example.com. \n- domain:domain \u2014 A Google Apps domain name that represents all the users of that domain. For example, domain:google.com or domain:example.com. \n- projectOwner:projectid \u2014 Owners of the given project. For example, projectOwner:my-example-project \n- projectEditor:projectid \u2014 Editors of the given project. For example, projectEditor:my-example-project \n- projectViewer:projectid \u2014 Viewers of the given project. For example, projectViewer:my-example-project", + "items": { + "type": "string" + }, + "annotations": { + "required": [ + "storage.buckets.setIamPolicy", + "storage.objects.setIamPolicy", + "storage.managedFolders.setIamPolicy" + ] + } + }, + "role": { + "type": "string", + "description": "The role to which members belong. Two types of roles are supported: new IAM roles, which grant permissions that do not map directly to those provided by ACLs, and legacy IAM roles, which do map directly to ACL permissions. All roles are of the format roles/storage.specificRole.\nThe new IAM roles are: \n- roles/storage.admin \u2014 Full control of Google Cloud Storage resources. \n- roles/storage.objectViewer \u2014 Read-Only access to Google Cloud Storage objects. \n- roles/storage.objectCreator \u2014 Access to create objects in Google Cloud Storage. \n- roles/storage.objectAdmin \u2014 Full control of Google Cloud Storage objects. The legacy IAM roles are: \n- roles/storage.legacyObjectReader \u2014 Read-only access to objects without listing. Equivalent to an ACL entry on an object with the READER role. \n- roles/storage.legacyObjectOwner \u2014 Read/write access to existing objects without listing. Equivalent to an ACL entry on an object with the OWNER role. \n- roles/storage.legacyBucketReader \u2014 Read access to buckets with object listing. Equivalent to an ACL entry on a bucket with the READER role. \n- roles/storage.legacyBucketWriter \u2014 Read access to buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the WRITER role. \n- roles/storage.legacyBucketOwner \u2014 Read and write access to existing buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the OWNER role.", + "annotations": { + "required": [ + "storage.buckets.setIamPolicy", + "storage.objects.setIamPolicy", + "storage.managedFolders.setIamPolicy" + ] + } + } + } + }, + "annotations": { + "required": [ + "storage.buckets.setIamPolicy", + "storage.objects.setIamPolicy", + "storage.managedFolders.setIamPolicy" + ] + } + }, + "etag": { + "type": "string", + "description": "HTTP 1.1 Entity tag for the policy.", + "format": "byte" + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For policies, this is always storage#policy. This field is ignored on input.", + "default": "storage#policy" + }, + "resourceId": { + "type": "string", + "description": "The ID of the resource to which this policy belongs. Will be of the form projects/_/buckets/bucket for buckets, projects/_/buckets/bucket/objects/object for objects, and projects/_/buckets/bucket/managedFolders/managedFolder. A specific generation may be specified by appending #generationNumber to the end of the object name, e.g. projects/_/buckets/my-bucket/objects/data.txt#17. The current generation can be denoted with #0. This field is ignored on input." + }, + "version": { + "type": "integer", + "description": "The IAM policy format version.", + "format": "int32" + } + } + }, + "RewriteResponse": { + "id": "RewriteResponse", + "type": "object", + "description": "A rewrite response.", + "properties": { + "done": { + "type": "boolean", + "description": "true if the copy is finished; otherwise, false if the copy is in progress. This property is always present in the response." + }, + "kind": { + "type": "string", + "description": "The kind of item this is.", + "default": "storage#rewriteResponse" + }, + "objectSize": { + "type": "string", + "description": "The total size of the object being copied in bytes. This property is always present in the response.", + "format": "int64" + }, + "resource": { + "$ref": "Object", + "description": "A resource containing the metadata for the copied-to object. This property is present in the response only when copying completes." + }, + "rewriteToken": { + "type": "string", + "description": "A token to use in subsequent requests to continue copying data. This token is present in the response only when there is more data to copy." + }, + "totalBytesRewritten": { + "type": "string", + "description": "The total bytes written so far, which can be used to provide a waiting user with a progress indicator. This property is always present in the response.", + "format": "int64" + } + } + }, + "ServiceAccount": { + "id": "ServiceAccount", + "type": "object", + "description": "A subscription to receive Google PubSub notifications.", + "properties": { + "email_address": { + "type": "string", + "description": "The ID of the notification." + }, + "kind": { + "type": "string", + "description": "The kind of item this is. For notifications, this is always storage#notification.", + "default": "storage#serviceAccount" + } + } + }, + "TestIamPermissionsResponse": { + "id": "TestIamPermissionsResponse", + "type": "object", + "description": "A storage.(buckets|objects|managedFolders).testIamPermissions response.", + "properties": { + "kind": { + "type": "string", + "description": "The kind of item this is.", + "default": "storage#testIamPermissionsResponse" + }, + "permissions": { + "type": "array", + "description": "The permissions held by the caller. Permissions are always of the format storage.resource.capability, where resource is one of buckets, objects, or managedFolders. The supported permissions are as follows: \n- storage.buckets.delete \u2014 Delete bucket. \n- storage.buckets.get \u2014 Read bucket metadata. \n- storage.buckets.getIamPolicy \u2014 Read bucket IAM policy. \n- storage.buckets.create \u2014 Create bucket. \n- storage.buckets.list \u2014 List buckets. \n- storage.buckets.setIamPolicy \u2014 Update bucket IAM policy. \n- storage.buckets.update \u2014 Update bucket metadata. \n- storage.objects.delete \u2014 Delete object. \n- storage.objects.get \u2014 Read object data and metadata. \n- storage.objects.getIamPolicy \u2014 Read object IAM policy. \n- storage.objects.create \u2014 Create object. \n- storage.objects.list \u2014 List objects. \n- storage.objects.setIamPolicy \u2014 Update object IAM policy. \n- storage.objects.update \u2014 Update object metadata. \n- storage.managedFolders.delete \u2014 Delete managed folder. \n- storage.managedFolders.get \u2014 Read managed folder metadata. \n- storage.managedFolders.getIamPolicy \u2014 Read managed folder IAM policy. \n- storage.managedFolders.create \u2014 Create managed folder. \n- storage.managedFolders.list \u2014 List managed folders. \n- storage.managedFolders.setIamPolicy \u2014 Update managed folder IAM policy.", + "items": { + "type": "string" + } + } + } + }, + "BulkRestoreObjectsRequest": { + "id": "BulkRestoreObjectsRequest", + "type": "object", + "description": "A bulk restore objects request.", + "properties": { + "allowOverwrite": { + "type": "boolean", + "description": "If false (default), the restore will not overwrite live objects with the same name at the destination. This means some deleted objects may be skipped. If true, live objects will be overwritten resulting in a noncurrent object (if versioning is enabled). If versioning is not enabled, overwriting the object will result in a soft-deleted object. In either case, if a noncurrent object already exists with the same name, a live version can be written without issue." + }, + "softDeletedAfterTime": { + "type": "string", + "description": "Restores only the objects that were soft-deleted after this time.", + "format": "date-time" + }, + "softDeletedBeforeTime": { + "type": "string", + "description": "Restores only the objects that were soft-deleted before this time.", + "format": "date-time" + }, + "matchGlobs": { + "type": "array", + "description": "Restores only the objects matching any of the specified glob(s). If this parameter is not specified, all objects will be restored within the specified time range.", + "items": { + "type": "string" + } + }, + "copySourceAcl": { + "type": "boolean", + "description": "If true, copies the source object's ACL; otherwise, uses the bucket's default object ACL. The default is false." + } + } + } +}, +"resources": { + "anywhereCaches": { + "methods": { + "insert": { + "id": "storage.anywhereCaches.insert", + "path": "b/{bucket}/anywhereCaches", + "httpMethod": "POST", + "description": "Creates an Anywhere Cache instance.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "AnywhereCache" +}, +"response": { + "$ref": "GoogleLongrunningOperation" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"update": { +"id": "storage.anywhereCaches.update", +"path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", +"httpMethod": "PATCH", +"description": "Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "anywhereCacheId": { + "type": "string", + "description": "The ID of requested Anywhere Cache instance.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket", + "anywhereCacheId" +], +"request": { + "$ref": "AnywhereCache" +}, +"response": { + "$ref": "GoogleLongrunningOperation" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"get": { +"id": "storage.anywhereCaches.get", +"path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", +"httpMethod": "GET", +"description": "Returns the metadata of an Anywhere Cache instance.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "anywhereCacheId": { + "type": "string", + "description": "The ID of requested Anywhere Cache instance.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket", + "anywhereCacheId" +], +"response": { + "$ref": "AnywhereCache" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"list": { +"id": "storage.anywhereCaches.list", + "path": "b/{bucket}/anywhereCaches", + "httpMethod": "GET", + "description": "Returns a list of Anywhere Cache instances of the bucket matching the criteria.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "pageSize": { + "type": "integer", + "description": "Maximum number of items to return in a single page of responses. Maximum 1000.", + "format": "int32", + "minimum": "0", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "AnywhereCaches" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"pause": { +"id": "storage.anywhereCaches.pause", +"path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/pause", +"httpMethod": "POST", +"description": "Pauses an Anywhere Cache instance.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "anywhereCacheId": { + "type": "string", + "description": "The ID of requested Anywhere Cache instance.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket", + "anywhereCacheId" +], +"response": { + "$ref": "AnywhereCache" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"resume": { +"id": "storage.anywhereCaches.resume", +"path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/resume", +"httpMethod": "POST", +"description": "Resumes a paused or disabled Anywhere Cache instance.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "anywhereCacheId": { + "type": "string", + "description": "The ID of requested Anywhere Cache instance.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket", + "anywhereCacheId" +], +"response": { + "$ref": "AnywhereCache" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"disable": { +"id": "storage.anywhereCaches.disable", +"path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/disable", +"httpMethod": "POST", +"description": "Disables an Anywhere Cache instance.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the parent bucket.", + "required": true, + "location": "path" + }, + "anywhereCacheId": { + "type": "string", + "description": "The ID of requested Anywhere Cache instance.", + "required": true, + "location": "path" + } +}, +"parameterOrder": [ + "bucket", + "anywhereCacheId" +], +"response": { + "$ref": "AnywhereCache" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +} +} +}, +"bucketAccessControls": { +"methods": { +"delete": { +"id": "storage.bucketAccessControls.delete", +"path": "b/{bucket}/acl/{entity}", +"httpMethod": "DELETE", +"description": "Permanently deletes the ACL entry for the specified entity on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"get": { +"id": "storage.bucketAccessControls.get", +"path": "b/{bucket}/acl/{entity}", +"httpMethod": "GET", +"description": "Returns the ACL entry for the specified entity on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"response": { + "$ref": "BucketAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"insert": { +"id": "storage.bucketAccessControls.insert", +"path": "b/{bucket}/acl", +"httpMethod": "POST", +"description": "Creates a new ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "BucketAccessControl" +}, +"response": { + "$ref": "BucketAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"list": { +"id": "storage.bucketAccessControls.list", +"path": "b/{bucket}/acl", +"httpMethod": "GET", +"description": "Retrieves ACL entries on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "BucketAccessControls" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"patch": { +"id": "storage.bucketAccessControls.patch", +"path": "b/{bucket}/acl/{entity}", +"httpMethod": "PATCH", +"description": "Patches an ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"request": { + "$ref": "BucketAccessControl" +}, +"response": { + "$ref": "BucketAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"update": { +"id": "storage.bucketAccessControls.update", +"path": "b/{bucket}/acl/{entity}", +"httpMethod": "PUT", +"description": "Updates an ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"request": { + "$ref": "BucketAccessControl" +}, +"response": { + "$ref": "BucketAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +} +} +}, +"buckets": { +"methods": { +"delete": { +"id": "storage.buckets.delete", +"path": "b/{bucket}", +"httpMethod": "DELETE", +"description": "Permanently deletes an empty bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "If set, only deletes the bucket if its metageneration matches this value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "If set, only deletes the bucket if its metageneration does not match this value.", + "format": "int64", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"get": { +"id": "storage.buckets.get", +"path": "b/{bucket}", +"httpMethod": "GET", +"description": "Returns metadata for the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit owner, acl and defaultObjectAcl properties." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "Bucket" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"getIamPolicy": { +"id": "storage.buckets.getIamPolicy", +"path": "b/{bucket}/iam", +"httpMethod": "GET", +"description": "Returns an IAM policy for the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "optionsRequestedPolicyVersion": { + "type": "integer", + "description": "The IAM policy format version to be returned. If the optionsRequestedPolicyVersion is for an older version that doesn't support part of the requested IAM policy, the request fails.", + "format": "int32", + "minimum": "1", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "Policy" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"insert": { +"id": "storage.buckets.insert", +"path": "b", +"httpMethod": "POST", +"description": "Creates a new bucket.", +"parameters": { + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this bucket.", + "enum": [ + "authenticatedRead", + "private", + "projectPrivate", + "publicRead", + "publicReadWrite" + ], + "enumDescriptions": [ + "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", + "Project team owners get OWNER access.", + "Project team members get access according to their roles.", + "Project team owners get OWNER access, and allUsers get READER access.", + "Project team owners get OWNER access, and allUsers get WRITER access." + ], + "location": "query" + }, + "predefinedDefaultObjectAcl": { + "type": "string", + "description": "Apply a predefined set of default object access controls to this bucket.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "project": { + "type": "string", + "description": "A valid API project identifier.", + "required": true, + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl, unless the bucket resource specifies acl or defaultObjectAcl properties, when it defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit owner, acl and defaultObjectAcl properties." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + }, + "enableObjectRetention": { + "type": "boolean", + "description": "When set to true, object retention is enabled for this bucket.", + "default": "false", + "location": "query" + } +}, +"parameterOrder": [ + "project" +], +"request": { + "$ref": "Bucket" +}, +"response": { + "$ref": "Bucket" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"list": { +"id": "storage.buckets.list", +"path": "b", +"httpMethod": "GET", +"description": "Retrieves a list of buckets for a given project.", +"parameters": { + "maxResults": { + "type": "integer", + "description": "Maximum number of buckets to return in a single response. The service will use this parameter or 1,000 items, whichever is smaller.", + "default": "1000", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" + }, + "prefix": { + "type": "string", + "description": "Filter results to buckets whose names begin with this prefix.", + "location": "query" + }, + "project": { + "type": "string", + "description": "A valid API project identifier.", + "required": true, + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit owner, acl and defaultObjectAcl properties." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } +}, +"parameterOrder": [ + "project" +], +"response": { + "$ref": "Buckets" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"lockRetentionPolicy": { +"id": "storage.buckets.lockRetentionPolicy", +"path": "b/{bucket}/lockRetentionPolicy", +"httpMethod": "POST", +"description": "Locks retention policy on a bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether bucket's current metageneration matches the given value.", + "required": true, + "format": "int64", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "ifMetagenerationMatch" +], +"response": { + "$ref": "Bucket" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"patch": { +"id": "storage.buckets.patch", +"path": "b/{bucket}", +"httpMethod": "PATCH", +"description": "Patches a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this bucket.", + "enum": [ + "authenticatedRead", + "private", + "projectPrivate", + "publicRead", + "publicReadWrite" + ], + "enumDescriptions": [ + "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", + "Project team owners get OWNER access.", + "Project team members get access according to their roles.", + "Project team owners get OWNER access, and allUsers get READER access.", + "Project team owners get OWNER access, and allUsers get WRITER access." + ], + "location": "query" + }, + "predefinedDefaultObjectAcl": { + "type": "string", + "description": "Apply a predefined set of default object access controls to this bucket.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit owner, acl and defaultObjectAcl properties." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Bucket" +}, +"response": { + "$ref": "Bucket" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"setIamPolicy": { +"id": "storage.buckets.setIamPolicy", +"path": "b/{bucket}/iam", +"httpMethod": "PUT", +"description": "Updates an IAM policy for the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Policy" +}, +"response": { + "$ref": "Policy" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"testIamPermissions": { +"id": "storage.buckets.testIamPermissions", +"path": "b/{bucket}/iam/testPermissions", +"httpMethod": "GET", +"description": "Tests a set of permissions on the given bucket to see which, if any, are held by the caller.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "permissions": { + "type": "string", + "description": "Permissions to test.", + "required": true, + "repeated": true, + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "permissions" +], +"response": { + "$ref": "TestIamPermissionsResponse" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"update": { +"id": "storage.buckets.update", +"path": "b/{bucket}", +"httpMethod": "PUT", +"description": "Updates a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this bucket.", + "enum": [ + "authenticatedRead", + "private", + "projectPrivate", + "publicRead", + "publicReadWrite" + ], + "enumDescriptions": [ + "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", + "Project team owners get OWNER access.", + "Project team members get access according to their roles.", + "Project team owners get OWNER access, and allUsers get READER access.", + "Project team owners get OWNER access, and allUsers get WRITER access." + ], + "location": "query" + }, + "predefinedDefaultObjectAcl": { + "type": "string", + "description": "Apply a predefined set of default object access controls to this bucket.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit owner, acl and defaultObjectAcl properties." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Bucket" +}, +"response": { + "$ref": "Bucket" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +} +} +}, +"operations": { +"methods": { +"cancel": { +"description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed.", +"path": "b/{bucket}/operations/{operationId}/cancel", +"httpMethod": "POST", +"id": "storage.buckets.operations.cancel", +"parameterOrder": [ + "bucket", + "operationId" +], +"parameters": { + "bucket": { + "description": "The parent bucket of the operation resource.", + "location": "path", + "required": true, + "type": "string" + }, + "operationId": { + "description": "The ID of the operation resource.", + "location": "path", + "required": true, + "type": "string" + } +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"get": { +"description": "Gets the latest state of a long-running operation.", +"path": "b/{bucket}/operations/{operationId}", +"httpMethod": "GET", +"id": "storage.buckets.operations.get", +"parameterOrder": [ + "bucket", + "operationId" +], +"parameters": { + "bucket": { + "description": "The parent bucket of the operation resource.", + "location": "path", + "required": true, + "type": "string" + }, + "operationId": { + "description": "The ID of the operation resource.", + "location": "path", + "required": true, + "type": "string" + } +}, +"response": { + "$ref": "GoogleLongrunningOperation" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"list": { +"description": "Lists operations that match the specified filter in the request.", +"path": "b/{bucket}/operations", +"httpMethod": "GET", +"id": "storage.buckets.operations.list", +"parameterOrder": [ + "bucket" +], +"parameters": { + "filter": { + "description": "A filter to narrow down results to a preferred subset. The filtering language is documented in more detail in [AIP-160](https://google.aip.dev/160).", + "location": "query", + "type": "string" + }, + "bucket": { + "description": "Name of the bucket in which to look for operations.", + "location": "path", + "required": true, + "type": "string" + }, + "pageSize": { + "description": "Maximum number of items to return in a single page of responses. Fewer total results may be returned than requested. The service uses this parameter or 100 items, whichever is smaller.", + "minimum": "0", + "format": "int32", + "location": "query", + "type": "integer" + }, + "pageToken": { + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query", + "type": "string" + } +}, +"response": { + "$ref": "GoogleLongrunningListOperationsResponse" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +} +} +}, +"channels": { +"methods": { +"stop": { +"id": "storage.channels.stop", +"path": "channels/stop", +"httpMethod": "POST", +"description": "Stop watching resources through this channel", +"request": { + "$ref": "Channel", + "parameterName": "resource" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +} +} +}, +"defaultObjectAccessControls": { +"methods": { +"delete": { +"id": "storage.defaultObjectAccessControls.delete", +"path": "b/{bucket}/defaultObjectAcl/{entity}", +"httpMethod": "DELETE", +"description": "Permanently deletes the default object ACL entry for the specified entity on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"get": { +"id": "storage.defaultObjectAccessControls.get", +"path": "b/{bucket}/defaultObjectAcl/{entity}", +"httpMethod": "GET", +"description": "Returns the default object ACL entry for the specified entity on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"insert": { +"id": "storage.defaultObjectAccessControls.insert", +"path": "b/{bucket}/defaultObjectAcl", +"httpMethod": "POST", +"description": "Creates a new default object ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"list": { +"id": "storage.defaultObjectAccessControls.list", +"path": "b/{bucket}/defaultObjectAcl", +"httpMethod": "GET", +"description": "Retrieves default object ACL entries on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "If present, only return default ACL listing if the bucket's current metageneration matches this value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "If present, only return default ACL listing if the bucket's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "ObjectAccessControls" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"patch": { +"id": "storage.defaultObjectAccessControls.patch", +"path": "b/{bucket}/defaultObjectAcl/{entity}", +"httpMethod": "PATCH", +"description": "Patches a default object ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"update": { +"id": "storage.defaultObjectAccessControls.update", +"path": "b/{bucket}/defaultObjectAcl/{entity}", +"httpMethod": "PUT", +"description": "Updates a default object ACL entry on the specified bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "entity" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +} +} +}, + "folders": { + "methods": { + "delete": { + "id": "storage.folders.delete", + "path": "b/{bucket}/folders/{folder}", + "httpMethod": "DELETE", + "description": "Permanently deletes a folder. Only applicable to buckets with hierarchical namespace enabled.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the folder resides.", + "required": true, + "location": "path" + }, + "folder": { + "type": "string", + "description": "Name of a folder.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "If set, only deletes the folder if its metageneration matches this value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "If set, only deletes the folder if its metageneration does not match this value.", + "format": "int64", + "location": "query" + } + }, + "parameterOrder": [ + "bucket", + "folder" + ], + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "get": { + "id": "storage.folders.get", + "path": "b/{bucket}/folders/{folder}", + "httpMethod": "GET", + "description": "Returns metadata for the specified folder. Only applicable to buckets with hierarchical namespace enabled.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the folder resides.", + "required": true, + "location": "path" + }, + "folder": { + "type": "string", + "description": "Name of a folder.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the return of the folder metadata conditional on whether the folder's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the return of the folder metadata conditional on whether the folder's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + } + }, + "parameterOrder": [ + "bucket", + "folder" + ], + "response": { + "$ref": "Folder" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "insert": { + "id": "storage.folders.insert", + "path": "b/{bucket}/folders", + "httpMethod": "POST", + "description": "Creates a new folder. Only applicable to buckets with hierarchical namespace enabled.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the folder resides.", + "required": true, + "location": "path" + }, + "recursive": { + "type": "boolean", + "description": "If true, any parent folder which doesn\u2019t exist will be created automatically.", + "location": "query" + } + }, + "parameterOrder": [ + "bucket" + ], + "request": { + "$ref": "Folder" + }, + "response": { + "$ref": "Folder" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "list": { + "id": "storage.folders.list", + "path": "b/{bucket}/folders", + "httpMethod": "GET", + "description": "Retrieves a list of folders matching the criteria. Only applicable to buckets with hierarchical namespace enabled.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which to look for folders.", + "required": true, + "location": "path" + }, + "delimiter": { + "type": "string", + "description": "Returns results in a directory-like mode. The only supported value is '/'. If set, items will only contain folders that either exactly match the prefix, or are one level below the prefix.", + "location": "query" + }, + "endOffset": { + "type": "string", + "description": "Filter results to folders whose names are lexicographically before endOffset. If startOffset is also set, the folders listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" + }, + "pageSize": { + "type": "integer", + "description": "Maximum number of items to return in a single page of responses.", + "format": "int32", + "minimum": "0", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" + }, + "prefix": { + "type": "string", + "description": "Filter results to folders whose paths begin with this prefix. If set, the value must either be an empty string or end with a '/'.", + "location": "query" + }, + "startOffset": { + "type": "string", + "description": "Filter results to folders whose names are lexicographically equal to or after startOffset. If endOffset is also set, the folders listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" + } + }, + "parameterOrder": [ + "bucket" + ], + "response": { + "$ref": "Folders" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "rename": { + "id": "storage.folders.rename", + "path": "b/{bucket}/folders/{sourceFolder}/renameTo/folders/{destinationFolder}", + "httpMethod": "POST", + "description": "Renames a source folder to a destination folder. Only applicable to buckets with hierarchical namespace enabled.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the folders are in.", + "required": true, + "location": "path" + }, + "destinationFolder": { + "type": "string", + "description": "Name of the destination folder.", + "required": true, + "location": "path" + }, + "ifSourceMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifSourceMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "sourceFolder": { + "type": "string", + "description": "Name of the source folder.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "bucket", + "sourceFolder", + "destinationFolder" + ], + "response": { + "$ref": "GoogleLongrunningOperation" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + } + } + }, + "managedFolders": { + "methods": { + "delete": { + "id": "storage.managedFolders.delete", + "path": "b/{bucket}/managedFolders/{managedFolder}", + "httpMethod": "DELETE", + "description": "Permanently deletes a managed folder.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "managedFolder": { + "type": "string", + "description": "The managed folder name/path.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "If set, only deletes the managed folder if its metageneration matches this value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "If set, only deletes the managed folder if its metageneration does not match this value.", + "format": "int64", + "location": "query" + }, + "allowNonEmpty": { + "type": "boolean", + "description": "Allows the deletion of a managed folder even if it is not empty. A managed folder is empty if there are no objects or managed folders that it applies to. Callers must have storage.managedFolders.setIamPolicy permission.", + "location": "query" + } + }, + "parameterOrder": [ + "bucket", + "managedFolder" + ], + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] +}, +"get": { + "id": "storage.managedFolders.get", + "path": "b/{bucket}/managedFolders/{managedFolder}", + "httpMethod": "GET", + "description": "Returns metadata of the specified managed folder.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "managedFolder": { + "type": "string", + "description": "The managed folder name/path.", + "required": true, + "location": "path" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the return of the managed folder metadata conditional on whether the managed folder's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the return of the managed folder metadata conditional on whether the managed folder's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + } + }, + "parameterOrder": [ + "bucket", + "managedFolder" + ], + "response": { + "$ref": "ManagedFolder" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] +}, +"getIamPolicy": { + "id": "storage.managedFolders.getIamPolicy", + "path": "b/{bucket}/managedFolders/{managedFolder}/iam", + "httpMethod": "GET", + "description": "Returns an IAM policy for the specified managed folder.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "optionsRequestedPolicyVersion": { + "type": "integer", + "description": "The IAM policy format version to be returned. If the optionsRequestedPolicyVersion is for an older version that doesn't support part of the requested IAM policy, the request fails.", + "format": "int32", + "minimum": "1", + "location": "query" + }, + "managedFolder": { + "type": "string", + "description": "The managed folder name/path.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } + }, + "parameterOrder": [ + "bucket", + "managedFolder" + ], + "response": { + "$ref": "Policy" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] +}, +"insert": { + "id": "storage.managedFolders.insert", + "path": "b/{bucket}/managedFolders", + "httpMethod": "POST", + "description": "Creates a new managed folder.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + } + }, + "parameterOrder": [ + "bucket" + ], + "request": { + "$ref": "ManagedFolder" + }, + "response": { + "$ref": "ManagedFolder" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] +}, +"list": { + "id": "storage.managedFolders.list", + "path": "b/{bucket}/managedFolders", + "httpMethod": "GET", + "description": "Lists managed folders in the given bucket.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "pageSize": { + "type": "integer", + "description": "Maximum number of items to return in a single page of responses.", + "format": "int32", + "minimum": "0", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" + }, + "prefix": { + "type": "string", + "description": "The managed folder name/path prefix to filter the output list of results.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "ManagedFolders" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"setIamPolicy": { +"id": "storage.managedFolders.setIamPolicy", +"path": "b/{bucket}/managedFolders/{managedFolder}/iam", +"httpMethod": "PUT", +"description": "Updates an IAM policy for the specified managed folder.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "managedFolder": { + "type": "string", + "description": "The managed folder name/path.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "managedFolder" +], +"request": { + "$ref": "Policy" +}, +"response": { + "$ref": "Policy" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"testIamPermissions": { +"id": "storage.managedFolders.testIamPermissions", +"path": "b/{bucket}/managedFolders/{managedFolder}/iam/testPermissions", +"httpMethod": "GET", +"description": "Tests a set of permissions on the given managed folder to see which, if any, are held by the caller.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket containing the managed folder.", + "required": true, + "location": "path" + }, + "managedFolder": { + "type": "string", + "description": "The managed folder name/path.", + "required": true, + "location": "path" + }, + "permissions": { + "type": "string", + "description": "Permissions to test.", + "required": true, + "repeated": true, + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "managedFolder", + "permissions" +], +"response": { + "$ref": "TestIamPermissionsResponse" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +} +} +}, +"notifications": { +"methods": { +"delete": { +"id": "storage.notifications.delete", +"path": "b/{bucket}/notificationConfigs/{notification}", +"httpMethod": "DELETE", +"description": "Permanently deletes a notification subscription.", +"parameters": { + "bucket": { + "type": "string", + "description": "The parent bucket of the notification.", + "required": true, + "location": "path" + }, + "notification": { + "type": "string", + "description": "ID of the notification to delete.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "notification" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"get": { +"id": "storage.notifications.get", +"path": "b/{bucket}/notificationConfigs/{notification}", +"httpMethod": "GET", +"description": "View a notification configuration.", +"parameters": { + "bucket": { + "type": "string", + "description": "The parent bucket of the notification.", + "required": true, + "location": "path" + }, + "notification": { + "type": "string", + "description": "Notification ID", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "notification" +], +"response": { + "$ref": "Notification" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"insert": { +"id": "storage.notifications.insert", +"path": "b/{bucket}/notificationConfigs", +"httpMethod": "POST", +"description": "Creates a notification subscription for a given bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "The parent bucket of the notification.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Notification" +}, +"response": { + "$ref": "Notification" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"list": { +"id": "storage.notifications.list", +"path": "b/{bucket}/notificationConfigs", +"httpMethod": "GET", +"description": "Retrieves a list of notification subscriptions for a given bucket.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a Google Cloud Storage bucket.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "Notifications" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +} +} +}, +"objectAccessControls": { +"methods": { +"delete": { +"id": "storage.objectAccessControls.delete", +"path": "b/{bucket}/o/{object}/acl/{entity}", +"httpMethod": "DELETE", +"description": "Permanently deletes the ACL entry for the specified entity on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object", + "entity" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"get": { +"id": "storage.objectAccessControls.get", +"path": "b/{bucket}/o/{object}/acl/{entity}", +"httpMethod": "GET", +"description": "Returns the ACL entry for the specified entity on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object", + "entity" +], +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"insert": { +"id": "storage.objectAccessControls.insert", +"path": "b/{bucket}/o/{object}/acl", +"httpMethod": "POST", +"description": "Creates a new ACL entry on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"list": { +"id": "storage.objectAccessControls.list", +"path": "b/{bucket}/o/{object}/acl", +"httpMethod": "GET", +"description": "Retrieves ACL entries on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"response": { + "$ref": "ObjectAccessControls" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"patch": { +"id": "storage.objectAccessControls.patch", +"path": "b/{bucket}/o/{object}/acl/{entity}", +"httpMethod": "PATCH", +"description": "Patches an ACL entry on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object", + "entity" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"update": { +"id": "storage.objectAccessControls.update", +"path": "b/{bucket}/o/{object}/acl/{entity}", +"httpMethod": "PUT", +"description": "Updates an ACL entry on the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of a bucket.", + "required": true, + "location": "path" + }, + "entity": { + "type": "string", + "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object", + "entity" +], +"request": { + "$ref": "ObjectAccessControl" +}, +"response": { + "$ref": "ObjectAccessControl" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +} +} +}, +"objects": { +"methods": { +"compose": { +"id": "storage.objects.compose", +"path": "b/{destinationBucket}/o/{destinationObject}/compose", +"httpMethod": "POST", +"description": "Concatenates a list of existing objects into a new object in the same bucket.", +"parameters": { + "destinationBucket": { + "type": "string", + "description": "Name of the bucket containing the source objects. The destination object is stored in this bucket.", + "required": true, + "location": "path" + }, + "destinationObject": { + "type": "string", + "description": "Name of the new object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "destinationPredefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to the destination object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "kmsKeyName": { + "type": "string", + "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "destinationBucket", + "destinationObject" +], +"request": { + "$ref": "ComposeRequest" +}, +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"copy": { +"id": "storage.objects.copy", +"path": "b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}", +"httpMethod": "POST", +"description": "Copies a source object to a destination object. Optionally overrides metadata.", +"parameters": { + "destinationBucket": { + "type": "string", + "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "destinationKmsKeyName": { + "type": "string", + "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", + "location": "query" + }, + "destinationObject": { + "type": "string", + "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any.", + "required": true, + "location": "path" + }, + "destinationPredefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to the destination object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" + }, + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "ifSourceGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current generation matches the given value.", + "format": "int64", + "location": "query" + }, + "ifSourceGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current generation does not match the given value.", + "format": "int64", + "location": "query" + }, + "ifSourceMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifSourceMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "sourceBucket": { + "type": "string", + "description": "Name of the bucket in which to find the source object.", + "required": true, + "location": "path" + }, + "sourceGeneration": { + "type": "string", + "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "sourceObject": { + "type": "string", + "description": "Name of the source object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "sourceBucket", + "sourceObject", + "destinationBucket", + "destinationObject" +], +"request": { + "$ref": "Object" +}, +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"delete": { +"id": "storage.objects.delete", +"path": "b/{bucket}/o/{object}", +"httpMethod": "DELETE", +"description": "Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation parameter is used.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, permanently deletes a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" + }, + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"get": { +"id": "storage.objects.get", +"path": "b/{bucket}/o/{object}", +"httpMethod": "GET", +"description": "Retrieves an object or its metadata.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" + }, + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + }, + "softDeleted": { + "type": "boolean", + "description": "If true, only soft-deleted object versions will be listed. The default is false. For more information, see Soft Delete.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +], +"supportsMediaDownload": true, +"useMediaDownloadService": true +}, +"getIamPolicy": { +"id": "storage.objects.getIamPolicy", +"path": "b/{bucket}/o/{object}/iam", +"httpMethod": "GET", +"description": "Returns an IAM policy for the specified object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" + }, + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" } - } - }, - "ManagedFolder": { - "id": "ManagedFolder", - "type": "object", - "description": "A managed folder.", - "properties": { +}, +"parameterOrder": [ + "bucket", + "object" +], +"response": { + "$ref": "Policy" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"insert": { +"id": "storage.objects.insert", +"path": "b/{bucket}/o", +"httpMethod": "POST", +"description": "Stores a new object and metadata.", +"parameters": { "bucket": { - "type": "string", - "description": "The name of the bucket containing this managed folder." + "type": "string", + "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.", + "required": true, + "location": "path" }, - "id": { - "type": "string", - "description": "The ID of the managed folder, including the bucket name and managed folder name." + "contentEncoding": { + "type": "string", + "description": "If set, sets the contentEncoding property of the final object to this value. Setting this parameter is equivalent to setting the contentEncoding metadata property. This can be useful when uploading an object with uploadType=media to indicate the encoding of the content being uploaded.", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For managed folders, this is always storage#managedFolder.", - "default": "storage#managedFolder" + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" }, - "metageneration": { - "type": "string", - "description": "The version of the metadata for this managed folder. Used for preconditions and for detecting changes in metadata.", - "format": "int64" + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" }, - "name": { - "type": "string", - "description": "The name of the managed folder. Required if not specified by URL parameter." + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" }, - "selfLink": { - "type": "string", - "description": "The link to this managed folder." + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" }, - "createTime": { - "type": "string", - "description": "The creation time of the managed folder in RFC 3339 format.", - "format": "date-time" + "kmsKeyName": { + "type": "string", + "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", + "location": "query" }, - "updateTime": { - "type": "string", - "description": "The last update time of the managed folder metadata in RFC 3339 format.", - "format": "date-time" + "name": { + "type": "string", + "description": "Name of the object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "location": "query" + }, + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" } - } - }, - "ManagedFolders": { - "id": "ManagedFolders", - "type": "object", - "description": "A list of managed folders.", - "properties": { - "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "ManagedFolder" - } +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Object" +}, +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +], +"supportsMediaUpload": true, +"mediaUpload": { + "accept": [ + "*/*" + ], + "protocols": { + "simple": { + "multipart": true, + "path": "/upload/storage/v1/b/{bucket}/o" + }, + "resumable": { + "multipart": true, + "path": "/resumable/upload/storage/v1/b/{bucket}/o" + } + } +} +}, +"list": { +"id": "storage.objects.list", +"path": "b/{bucket}/o", +"httpMethod": "GET", +"description": "Retrieves a list of objects matching the criteria.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which to look for objects.", + "required": true, + "location": "path" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For lists of managed folders, this is always storage#managedFolders.", - "default": "storage#managedFolders" + "delimiter": { + "type": "string", + "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.", + "location": "query" }, - "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." - } - } - }, - "Notification": { - "id": "Notification", - "type": "object", - "description": "A subscription to receive Google PubSub notifications.", - "properties": { - "custom_attributes": { - "type": "object", - "description": "An optional list of additional attributes to attach to each Cloud PubSub message published for this notification subscription.", - "additionalProperties": { - "type": "string" - } + "endOffset": { + "type": "string", + "description": "Filter results to objects whose names are lexicographically before endOffset. If startOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for this subscription notification." + "includeTrailingDelimiter": { + "type": "boolean", + "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.", + "location": "query" }, - "event_types": { - "type": "array", - "description": "If present, only send notifications about listed event types. If empty, sent notifications for all event types.", - "items": { - "type": "string" - } + "maxResults": { + "type": "integer", + "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.", + "default": "1000", + "format": "uint32", + "minimum": "0", + "location": "query" }, - "id": { - "type": "string", - "description": "The ID of the notification." + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For notifications, this is always storage#notification.", - "default": "storage#notification" - }, - "object_name_prefix": { - "type": "string", - "description": "If present, only apply this notification configuration to object names that begin with this prefix." - }, - "payload_format": { - "type": "string", - "description": "The desired content of the Payload.", - "default": "JSON_API_V1", - "annotations": { - "required": [ - "storage.notifications.insert" - ] - } + "prefix": { + "type": "string", + "description": "Filter results to objects whose names begin with this prefix.", + "location": "query" }, - "selfLink": { - "type": "string", - "description": "The canonical URL of this notification." - }, - "topic": { - "type": "string", - "description": "The Cloud PubSub topic to which this subscription publishes. Formatted as: '//pubsub.googleapis.com/projects/{project-identifier}/topics/{my-topic}'", - "annotations": { - "required": [ - "storage.notifications.insert" - ] - } - } - } - }, - "Notifications": { - "id": "Notifications", - "type": "object", - "description": "A list of notification subscriptions.", - "properties": { - "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "Notification" - } + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "startOffset": { + "type": "string", + "description": "Filter results to objects whose names are lexicographically equal to or after startOffset. If endOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For lists of notifications, this is always storage#notifications.", - "default": "storage#notifications" - } - } - }, - "Object": { - "id": "Object", - "type": "object", - "description": "An object.", - "properties": { - "acl": { - "type": "array", - "description": "Access controls on the object.", - "items": { - "$ref": "ObjectAccessControl" - }, - "annotations": { - "required": [ - "storage.objects.update" - ] - } + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" }, + "versions": { + "type": "boolean", + "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.", + "location": "query" + }, + "matchGlob": { + "type": "string", + "description": "Filter results to objects and prefixes that match this glob pattern.", + "location": "query" + }, + "softDeleted": { + "type": "boolean", + "description": "If true, only soft-deleted object versions will be listed. The default is false. For more information, see Soft Delete.", + "location": "query" + }, + "includeFoldersAsPrefixes": { + "type": "boolean", + "description": "Only applicable if delimiter is set to '/'. If true, will also include folders and managed folders (besides objects) in the returned prefixes.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket" +], +"response": { + "$ref": "Objects" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +], +"supportsSubscription": true +}, +"patch": { +"id": "storage.objects.patch", +"path": "b/{bucket}/o/{object}", +"httpMethod": "PATCH", +"description": "Patches an object's metadata.", +"parameters": { "bucket": { - "type": "string", - "description": "The name of the bucket containing this object." + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" }, - "cacheControl": { - "type": "string", - "description": "Cache-Control directive for the object data. If omitted, and the object is accessible to all anonymous users, the default will be public, max-age=3600." + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" }, - "componentCount": { - "type": "integer", - "description": "Number of underlying components that make up this object. Components are accumulated by compose operations.", - "format": "int32" + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" }, - "contentDisposition": { - "type": "string", - "description": "Content-Disposition of the object data." + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" }, - "contentEncoding": { - "type": "string", - "description": "Content-Encoding of the object data." - }, - "contentLanguage": { - "type": "string", - "description": "Content-Language of the object data." - }, - "contentType": { - "type": "string", - "description": "Content-Type of the object data. If an object is stored without a Content-Type, it is served as application/octet-stream." - }, - "crc32c": { - "type": "string", - "description": "CRC32c checksum, as described in RFC 4960, Appendix B; encoded using base64 in big-endian byte order. For more information about using the CRC32c checksum, see Hashes and ETags: Best Practices." - }, - "customTime": { - "type": "string", - "description": "A timestamp in RFC 3339 format specified by the user for an object.", - "format": "date-time" - }, - "customerEncryption": { - "type": "object", - "description": "Metadata of customer-supplied encryption key, if the object is encrypted by such a key.", - "properties": { - "encryptionAlgorithm": { - "type": "string", - "description": "The encryption algorithm." - }, - "keySha256": { - "type": "string", - "description": "SHA256 hash value of the encryption key." - } - } + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the object." + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" }, - "eventBasedHold": { - "type": "boolean", - "description": "Whether an object is under event-based hold. Event-based hold is a way to retain objects until an event occurs, which is signified by the hold's release (i.e. this value is set to false). After being released (set to false), such objects will be subject to bucket-level retention (if any). One sample use case of this flag is for banks to hold loan documents for at least 3 years after loan is paid in full. Here, bucket-level retention is 3 years and the event is the loan being paid in full. In this example, these objects will be held intact for any number of years until the event has occurred (event-based hold on the object is released) and then 3 more years after that. That means retention duration of the objects begins from the moment event-based hold transitioned from true to false." + "overrideUnlockedRetention": { + "type": "boolean", + "description": "Must be true to remove the retention configuration, reduce its unlocked retention period, or change its mode from unlocked to locked.", + "location": "query" }, - "generation": { - "type": "string", - "description": "The content generation of this object. Used for object versioning.", - "format": "int64" + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" }, - "id": { - "type": "string", - "description": "The ID of the object, including the bucket name, object name, and generation number." + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request, for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"request": { + "$ref": "Object" +}, +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"rewrite": { +"id": "storage.objects.rewrite", +"path": "b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}", +"httpMethod": "POST", +"description": "Rewrites a source object to a destination object. Optionally overrides metadata.", +"parameters": { + "destinationBucket": { + "type": "string", + "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.", + "required": true, + "location": "path" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For objects, this is always storage#object.", - "default": "storage#object" + "destinationKmsKeyName": { + "type": "string", + "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", + "location": "query" }, - "kmsKeyName": { - "type": "string", - "description": "Not currently supported. Specifying the parameter causes the request to fail with status code 400 - Bad Request." + "destinationObject": { + "type": "string", + "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" }, - "md5Hash": { - "type": "string", - "description": "MD5 hash of the data; encoded using base64. For more information about using the MD5 hash, see Hashes and ETags: Best Practices." + "destinationPredefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to the destination object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" }, - "mediaLink": { - "type": "string", - "description": "Media download link." + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" }, - "metadata": { - "type": "object", - "description": "User-provided metadata, in key/value pairs.", - "additionalProperties": { - "type": "string", - "description": "An individual metadata entry." - } + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.", + "format": "int64", + "location": "query" }, - "metageneration": { - "type": "string", - "description": "The version of the metadata for this object at this generation. Used for preconditions and for detecting changes in metadata. A metageneration number is only meaningful in the context of a particular generation of a particular object.", - "format": "int64" + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" }, - "name": { - "type": "string", - "description": "The name of the object. Required if not specified by URL parameter." + "ifSourceGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current generation matches the given value.", + "format": "int64", + "location": "query" }, - "owner": { - "type": "object", - "description": "The owner of the object. This will always be the uploader of the object.", - "properties": { - "entity": { - "type": "string", - "description": "The entity, in the form user-userId." - }, - "entityId": { - "type": "string", - "description": "The ID for the entity." - } - } - }, - "retentionExpirationTime": { - "type": "string", - "description": "A server-determined value that specifies the earliest time that the object's retention period expires. This value is in RFC 3339 format. Note 1: This field is not provided for objects with an active event-based hold, since retention expiration is unknown until the hold is removed. Note 2: This value can be provided even when temporary hold is set (so that the user can reason about policy without having to first unset the temporary hold).", - "format": "date-time" - }, - "retention": { - "type": "object", - "description": "A collection of object level retention parameters.", - "properties": { - "retainUntilTime": { - "type": "string", - "description": "A time in RFC 3339 format until which object retention protects this object.", - "format": "date-time" - }, - "mode": { - "type": "string", - "description": "The bucket's object retention mode, can only be Unlocked or Locked." - } - } + "ifSourceGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current generation does not match the given value.", + "format": "int64", + "location": "query" }, - "selfLink": { - "type": "string", - "description": "The link to this object." + "ifSourceMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.", + "format": "int64", + "location": "query" }, - "size": { - "type": "string", - "description": "Content-Length of the data in bytes.", - "format": "uint64" + "ifSourceMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" }, - "storageClass": { - "type": "string", - "description": "Storage class of the object." + "maxBytesRewrittenPerCall": { + "type": "string", + "description": "The maximum number of bytes that will be rewritten per rewrite request. Most callers shouldn't need to specify this parameter - it is primarily in place to support testing. If specified the value must be an integral multiple of 1 MiB (1048576). Also, this only applies to requests where the source and destination span locations and/or storage classes. Finally, this value must not change across rewrite calls else you'll get an error that the rewriteToken is invalid.", + "format": "int64", + "location": "query" }, - "temporaryHold": { - "type": "boolean", - "description": "Whether an object is under temporary hold. While this flag is set to true, the object is protected against deletion and overwrites. A common use case of this flag is regulatory investigations where objects need to be retained while the investigation is ongoing. Note that unlike event-based hold, temporary hold does not impact retention expiration time of an object." + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" }, - "timeCreated": { - "type": "string", - "description": "The creation time of the object in RFC 3339 format.", - "format": "date-time" - }, - "timeDeleted": { - "type": "string", - "description": "The time at which the object became noncurrent in RFC 3339 format. Will be returned if and only if this version of the object has been deleted.", - "format": "date-time" - }, - "softDeleteTime": { - "type": "string", - "description": "The time at which the object became soft-deleted in RFC 3339 format.", - "format": "date-time" - }, - "hardDeleteTime": { - "type": "string", - "description": "This is the time (in the future) when the soft-deleted object will no longer be restorable. It is equal to the soft delete time plus the current soft delete retention duration of the bucket.", - "format": "date-time" - }, - "timeStorageClassUpdated": { - "type": "string", - "description": "The time at which the object's storage class was last changed. When the object is initially created, it will be set to timeCreated.", - "format": "date-time" + "rewriteToken": { + "type": "string", + "description": "Include this field (from the previous rewrite response) on each rewrite request after the first one, until the rewrite response 'done' flag is true. Calls that provide a rewriteToken can omit all other request fields, but if included those fields must match the values provided in the first rewrite request.", + "location": "query" }, - "updated": { - "type": "string", - "description": "The modification time of the object metadata in RFC 3339 format. Set initially to object creation time and then updated whenever any metadata of the object changes. This includes changes made by a requester, such as modifying custom metadata, as well as changes made by Cloud Storage on behalf of a requester, such as changing the storage class based on an Object Lifecycle Configuration.", - "format": "date-time" + "sourceBucket": { + "type": "string", + "description": "Name of the bucket in which to find the source object.", + "required": true, + "location": "path" + }, + "sourceGeneration": { + "type": "string", + "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" + }, + "sourceObject": { + "type": "string", + "description": "Name of the source object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" } - } - }, - "ObjectAccessControl": { - "id": "ObjectAccessControl", - "type": "object", - "description": "An access-control entry.", - "properties": { +}, +"parameterOrder": [ + "sourceBucket", + "sourceObject", + "destinationBucket", + "destinationObject" +], +"request": { + "$ref": "Object" +}, +"response": { + "$ref": "RewriteResponse" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"setIamPolicy": { +"id": "storage.objects.setIamPolicy", +"path": "b/{bucket}/o/{object}/iam", +"httpMethod": "PUT", +"description": "Updates an IAM policy for the specified object.", +"parameters": { "bucket": { - "type": "string", - "description": "The name of the bucket." + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" }, - "domain": { - "type": "string", - "description": "The domain associated with the entity, if any." + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" }, - "email": { - "type": "string", - "description": "The email address associated with the entity, if any." + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" }, - "entity": { - "type": "string", - "description": "The entity holding the permission, in one of the following forms: \n- user-userId \n- user-email \n- group-groupId \n- group-email \n- domain-domain \n- project-team-projectId \n- allUsers \n- allAuthenticatedUsers Examples: \n- The user liz@example.com would be user-liz@example.com. \n- The group example@googlegroups.com would be group-example@googlegroups.com. \n- To refer to all members of the Google Apps for Business domain example.com, the entity would be domain-example.com.", - "annotations": { - "required": [ - "storage.defaultObjectAccessControls.insert", - "storage.objectAccessControls.insert" - ] - } + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object" +], +"request": { + "$ref": "Policy" +}, +"response": { + "$ref": "Policy" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"testIamPermissions": { +"id": "storage.objects.testIamPermissions", +"path": "b/{bucket}/o/{object}/iam/testPermissions", +"httpMethod": "GET", +"description": "Tests a set of permissions on the given object to see which, if any, are held by the caller.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" }, - "entityId": { - "type": "string", - "description": "The ID for the entity, if any." + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the access-control entry." + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" }, - "generation": { - "type": "string", - "description": "The content generation of the object, if applied to an object.", - "format": "int64" + "permissions": { + "type": "string", + "description": "Permissions to test.", + "required": true, + "repeated": true, + "location": "query" }, - "id": { - "type": "string", - "description": "The ID of the access-control entry." + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" + } +}, +"parameterOrder": [ + "bucket", + "object", + "permissions" +], +"response": { + "$ref": "TestIamPermissionsResponse" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +] +}, +"update": { +"id": "storage.objects.update", +"path": "b/{bucket}/o/{object}", +"httpMethod": "PUT", +"description": "Updates an object's metadata.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For object access control entries, this is always storage#objectAccessControl.", - "default": "storage#objectAccessControl" + "generation": { + "type": "string", + "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", + "format": "int64", + "location": "query" }, - "object": { - "type": "string", - "description": "The name of the object, if applied to an object." + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" }, - "projectTeam": { - "type": "object", - "description": "The project team associated with the entity, if any.", - "properties": { - "projectNumber": { - "type": "string", - "description": "The project number." - }, - "team": { - "type": "string", - "description": "The team." - } - } + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" }, - "role": { - "type": "string", - "description": "The access permission for the entity.", - "annotations": { - "required": [ - "storage.defaultObjectAccessControls.insert", - "storage.objectAccessControls.insert" - ] - } + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", + "format": "int64", + "location": "query" }, - "selfLink": { - "type": "string", - "description": "The link to this access-control entry." - } - } - }, - "ObjectAccessControls": { - "id": "ObjectAccessControls", - "type": "object", - "description": "An access-control list.", - "properties": { - "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "ObjectAccessControl" - } + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", + "format": "int64", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For lists of object access control entries, this is always storage#objectAccessControls.", - "default": "storage#objectAccessControls" - } - } - }, - "Objects": { - "id": "Objects", - "type": "object", - "description": "A list of objects.", - "properties": { - "items": { - "type": "array", - "description": "The list of items.", - "items": { - "$ref": "Object" - } + "overrideUnlockedRetention": { + "type": "boolean", + "description": "Must be true to remove the retention configuration, reduce its unlocked retention period, or change its mode from unlocked to locked.", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For lists of objects, this is always storage#objects.", - "default": "storage#objects" + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", + "required": true, + "location": "path" }, - "nextPageToken": { - "type": "string", - "description": "The continuation token, used to page through large result sets. Provide this value in a subsequent request to return the next page of results." - }, - "prefixes": { - "type": "array", - "description": "The list of prefixes of objects matching-but-not-listed up to and including the requested delimiter.", - "items": { - "type": "string" - } + "predefinedAcl": { + "type": "string", + "description": "Apply a predefined set of access controls to this object.", + "enum": [ + "authenticatedRead", + "bucketOwnerFullControl", + "bucketOwnerRead", + "private", + "projectPrivate", + "publicRead" + ], + "enumDescriptions": [ + "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", + "Object owner gets OWNER access, and project team owners get OWNER access.", + "Object owner gets OWNER access, and project team owners get READER access.", + "Object owner gets OWNER access.", + "Object owner gets OWNER access, and project team members get access according to their roles.", + "Object owner gets OWNER access, and allUsers get READER access." + ], + "location": "query" + }, + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" } - } - }, - "Policy": { - "id": "Policy", - "type": "object", - "description": "A bucket/object/managedFolder IAM policy.", - "properties": { - "bindings": { - "type": "array", - "description": "An association between a role, which comes with a set of permissions, and members who may assume that role.", - "items": { - "type": "object", - "properties": { - "condition": { - "$ref": "Expr", - "description": "The condition that is associated with this binding. NOTE: an unsatisfied condition will not allow user access via current binding. Different bindings, including their conditions, are examined independently." - }, - "members": { - "type": "array", - "description": "A collection of identifiers for members who may assume the provided role. Recognized identifiers are as follows: \n- allUsers \u2014 A special identifier that represents anyone on the internet; with or without a Google account. \n- allAuthenticatedUsers \u2014 A special identifier that represents anyone who is authenticated with a Google account or a service account. \n- user:emailid \u2014 An email address that represents a specific account. For example, user:alice@gmail.com or user:joe@example.com. \n- serviceAccount:emailid \u2014 An email address that represents a service account. For example, serviceAccount:my-other-app@appspot.gserviceaccount.com . \n- group:emailid \u2014 An email address that represents a Google group. For example, group:admins@example.com. \n- domain:domain \u2014 A Google Apps domain name that represents all the users of that domain. For example, domain:google.com or domain:example.com. \n- projectOwner:projectid \u2014 Owners of the given project. For example, projectOwner:my-example-project \n- projectEditor:projectid \u2014 Editors of the given project. For example, projectEditor:my-example-project \n- projectViewer:projectid \u2014 Viewers of the given project. For example, projectViewer:my-example-project", - "items": { - "type": "string" - }, - "annotations": { - "required": [ - "storage.buckets.setIamPolicy", - "storage.objects.setIamPolicy", - "storage.managedFolders.setIamPolicy" - ] - } - }, - "role": { +}, +"parameterOrder": [ + "bucket", + "object" +], +"request": { + "$ref": "Object" +}, +"response": { + "$ref": "Object" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" +] +}, +"watchAll": { +"id": "storage.objects.watchAll", +"path": "b/{bucket}/o/watch", +"httpMethod": "POST", +"description": "Watch for changes on all objects in a bucket.", +"parameters": { + "bucket": { "type": "string", - "description": "The role to which members belong. Two types of roles are supported: new IAM roles, which grant permissions that do not map directly to those provided by ACLs, and legacy IAM roles, which do map directly to ACL permissions. All roles are of the format roles/storage.specificRole.\nThe new IAM roles are: \n- roles/storage.admin \u2014 Full control of Google Cloud Storage resources. \n- roles/storage.objectViewer \u2014 Read-Only access to Google Cloud Storage objects. \n- roles/storage.objectCreator \u2014 Access to create objects in Google Cloud Storage. \n- roles/storage.objectAdmin \u2014 Full control of Google Cloud Storage objects. The legacy IAM roles are: \n- roles/storage.legacyObjectReader \u2014 Read-only access to objects without listing. Equivalent to an ACL entry on an object with the READER role. \n- roles/storage.legacyObjectOwner \u2014 Read/write access to existing objects without listing. Equivalent to an ACL entry on an object with the OWNER role. \n- roles/storage.legacyBucketReader \u2014 Read access to buckets with object listing. Equivalent to an ACL entry on a bucket with the READER role. \n- roles/storage.legacyBucketWriter \u2014 Read access to buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the WRITER role. \n- roles/storage.legacyBucketOwner \u2014 Read and write access to existing buckets with object listing/creation/deletion. Equivalent to an ACL entry on a bucket with the OWNER role.", - "annotations": { - "required": [ - "storage.buckets.setIamPolicy", - "storage.objects.setIamPolicy", - "storage.managedFolders.setIamPolicy" - ] - } - } - } - }, - "annotations": { - "required": [ - "storage.buckets.setIamPolicy", - "storage.objects.setIamPolicy", - "storage.managedFolders.setIamPolicy" - ] - } + "description": "Name of the bucket in which to look for objects.", + "required": true, + "location": "path" }, - "etag": { - "type": "string", - "description": "HTTP 1.1 Entity tag for the policy.", - "format": "byte" + "delimiter": { + "type": "string", + "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For policies, this is always storage#policy. This field is ignored on input.", - "default": "storage#policy" + "endOffset": { + "type": "string", + "description": "Filter results to objects whose names are lexicographically before endOffset. If startOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" }, - "resourceId": { - "type": "string", - "description": "The ID of the resource to which this policy belongs. Will be of the form projects/_/buckets/bucket for buckets, projects/_/buckets/bucket/objects/object for objects, and projects/_/buckets/bucket/managedFolders/managedFolder. A specific generation may be specified by appending #generationNumber to the end of the object name, e.g. projects/_/buckets/my-bucket/objects/data.txt#17. The current generation can be denoted with #0. This field is ignored on input." + "includeTrailingDelimiter": { + "type": "boolean", + "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.", + "location": "query" }, - "version": { - "type": "integer", - "description": "The IAM policy format version.", - "format": "int32" - } - } - }, - "RewriteResponse": { - "id": "RewriteResponse", - "type": "object", - "description": "A rewrite response.", - "properties": { - "done": { - "type": "boolean", - "description": "true if the copy is finished; otherwise, false if the copy is in progress. This property is always present in the response." + "maxResults": { + "type": "integer", + "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.", + "default": "1000", + "format": "uint32", + "minimum": "0", + "location": "query" }, - "kind": { - "type": "string", - "description": "The kind of item this is.", - "default": "storage#rewriteResponse" + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" }, - "objectSize": { - "type": "string", - "description": "The total size of the object being copied in bytes. This property is always present in the response.", - "format": "int64" + "prefix": { + "type": "string", + "description": "Filter results to objects whose names begin with this prefix.", + "location": "query" }, - "resource": { - "$ref": "Object", - "description": "A resource containing the metadata for the copied-to object. This property is present in the response only when copying completes." + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to noAcl.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "startOffset": { + "type": "string", + "description": "Filter results to objects whose names are lexicographically equal to or after startOffset. If endOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", + "location": "query" }, - "rewriteToken": { - "type": "string", - "description": "A token to use in subsequent requests to continue copying data. This token is present in the response only when there is more data to copy." + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" }, - "totalBytesRewritten": { - "type": "string", - "description": "The total bytes written so far, which can be used to provide a waiting user with a progress indicator. This property is always present in the response.", - "format": "int64" + "versions": { + "type": "boolean", + "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.", + "location": "query" } - } - }, - "ServiceAccount": { - "id": "ServiceAccount", - "type": "object", - "description": "A subscription to receive Google PubSub notifications.", - "properties": { - "email_address": { - "type": "string", - "description": "The ID of the notification." +}, +"parameterOrder": [ + "bucket" +], +"request": { + "$ref": "Channel", + "parameterName": "resource" +}, +"response": { + "$ref": "Channel" +}, +"scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" +], +"supportsSubscription": true +}, +"restore": { +"id": "storage.objects.restore", +"path": "b/{bucket}/o/{object}/restore", +"httpMethod": "POST", +"description": "Restores a soft-deleted object.", +"parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" }, - "kind": { - "type": "string", - "description": "The kind of item this is. For notifications, this is always storage#notification.", - "default": "storage#serviceAccount" - } - } - }, - "TestIamPermissionsResponse": { - "id": "TestIamPermissionsResponse", - "type": "object", - "description": "A storage.(buckets|objects|managedFolders).testIamPermissions response.", - "properties": { - "kind": { - "type": "string", - "description": "The kind of item this is.", - "default": "storage#testIamPermissionsResponse" + "generation": { + "type": "string", + "description": "Selects a specific revision of this object.", + "required": true, + "format": "int64", + "location": "query" }, - "permissions": { - "type": "array", - "description": "The permissions held by the caller. Permissions are always of the format storage.resource.capability, where resource is one of buckets, objects, or managedFolders. The supported permissions are as follows: \n- storage.buckets.delete \u2014 Delete bucket. \n- storage.buckets.get \u2014 Read bucket metadata. \n- storage.buckets.getIamPolicy \u2014 Read bucket IAM policy. \n- storage.buckets.create \u2014 Create bucket. \n- storage.buckets.list \u2014 List buckets. \n- storage.buckets.setIamPolicy \u2014 Update bucket IAM policy. \n- storage.buckets.update \u2014 Update bucket metadata. \n- storage.objects.delete \u2014 Delete object. \n- storage.objects.get \u2014 Read object data and metadata. \n- storage.objects.getIamPolicy \u2014 Read object IAM policy. \n- storage.objects.create \u2014 Create object. \n- storage.objects.list \u2014 List objects. \n- storage.objects.setIamPolicy \u2014 Update object IAM policy. \n- storage.objects.update \u2014 Update object metadata. \n- storage.managedFolders.delete \u2014 Delete managed folder. \n- storage.managedFolders.get \u2014 Read managed folder metadata. \n- storage.managedFolders.getIamPolicy \u2014 Read managed folder IAM policy. \n- storage.managedFolders.create \u2014 Create managed folder. \n- storage.managedFolders.list \u2014 List managed folders. \n- storage.managedFolders.setIamPolicy \u2014 Update managed folder IAM policy.", - "items": { - "type": "string" - } - } - } - }, - "BulkRestoreObjectsRequest": { - "id": "BulkRestoreObjectsRequest", - "type": "object", - "description": "A bulk restore objects request.", - "properties": { - "allowOverwrite": { - "type": "boolean", - "description": "If false (default), the restore will not overwrite live objects with the same name at the destination. This means some deleted objects may be skipped. If true, live objects will be overwritten resulting in a noncurrent object (if versioning is enabled). If versioning is not enabled, overwriting the object will result in a soft-deleted object. In either case, if a noncurrent object already exists with the same name, a live version can be written without issue." - }, - "softDeletedAfterTime": { - "type": "string", - "description": "Restores only the objects that were soft-deleted after this time.", - "format": "date-time" - }, - "softDeletedBeforeTime": { - "type": "string", - "description": "Restores only the objects that were soft-deleted before this time.", - "format": "date-time" - }, - "matchGlobs": { - "type": "array", - "description": "Restores only the objects matching any of the specified glob(s). If this parameter is not specified, all objects will be restored within the specified time range.", - "items": { - "type": "string" - } + "object": { + "type": "string", + "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.", + "required": true, + "location": "path" + }, + "ifGenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's one live generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", + "format": "int64", + "location": "query" + }, + "ifGenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether none of the object's live generations match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationMatch": { + "type": "string", + "description": "Makes the operation conditional on whether the object's one live metageneration matches the given value.", + "format": "int64", + "location": "query" + }, + "ifMetagenerationNotMatch": { + "type": "string", + "description": "Makes the operation conditional on whether none of the object's live metagenerations match the given value.", + "format": "int64", + "location": "query" }, "copySourceAcl": { - "type": "boolean", - "description": "If true, copies the source object's ACL; otherwise, uses the bucket's default object ACL. The default is false." - } - } - } - }, - "resources": { - "anywhereCache": { - "methods": { - "insert": { - "id": "storage.anywhereCaches.insert", - "path": "b/{bucket}/anywhereCaches", - "httpMethod": "POST", - "description": "Creates an Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "AnywhereCache" - }, - "response": { - "$ref": "GoogleLongrunningOperation" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "update": { - "id": "storage.anywhereCaches.update", - "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", - "httpMethod": "PATCH", - "description": "Updates the config(ttl and admissionPolicy) of an Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "anywhereCacheId": { - "type": "string", - "description": "The ID of requested Anywhere Cache instance.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket", - "anywhereCacheId" - ], - "request": { - "$ref": "AnywhereCache" - }, - "response": { - "$ref": "GoogleLongrunningOperation" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.anywhereCaches.get", - "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}", - "httpMethod": "GET", - "description": "Returns the metadata of an Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "anywhereCacheId": { - "type": "string", - "description": "The ID of requested Anywhere Cache instance.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket", - "anywhereCacheId" - ], - "response": { - "$ref": "AnywhereCache" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "list": { - "id": "storage.anywhereCaches.list", - "path": "b/{bucket}/anywhereCache", - "httpMethod": "GET", - "description": "Returns a list of Anywhere Cache instances of the bucket matching the criteria.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "pageSize": { - "type": "integer", - "description": "Maximum number of items return in a single page of responses. Maximum 1000.", - "format": "int32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "AnywhereCaches" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "pause": { - "id": "storage.anywhereCaches.pause", - "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/pause", - "httpMethod": "POST", - "description": "Pauses an Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "anywhereCacheId": { - "type": "string", - "description": "The ID of requested Anywhere Cache instance.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket", - "anywhereCacheId" - ], - "response": { - "$ref": "AnywhereCache" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "resume": { - "id": "storage.anywhereCaches.resume", - "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/resume", - "httpMethod": "POST", - "description": "Resumes a paused or disabled Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "anywhereCacheId": { - "type": "string", - "description": "The ID of requested Anywhere Cache instance.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket", - "anywhereCacheId" - ], - "response": { - "$ref": "AnywhereCache" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "disable": { - "id": "storage.anywhereCaches.disable", - "path": "b/{bucket}/anywhereCaches/{anywhereCacheId}/disable", - "httpMethod": "POST", - "description": "Disables an Anywhere Cache instance.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the partent bucket", - "required": true, - "location": "path" - }, - "anywhereCacheId": { - "type": "string", - "description": "The ID of requested Anywhere Cache instance.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket", - "anywhereCacheId" - ], - "response": { - "$ref": "AnywhereCache" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } - }, - "bucketAccessControls": { - "methods": { - "delete": { - "id": "storage.bucketAccessControls.delete", - "path": "b/{bucket}/acl/{entity}", - "httpMethod": "DELETE", - "description": "Permanently deletes the ACL entry for the specified entity on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "get": { - "id": "storage.bucketAccessControls.get", - "path": "b/{bucket}/acl/{entity}", - "httpMethod": "GET", - "description": "Returns the ACL entry for the specified entity on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "response": { - "$ref": "BucketAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "insert": { - "id": "storage.bucketAccessControls.insert", - "path": "b/{bucket}/acl", - "httpMethod": "POST", - "description": "Creates a new ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "BucketAccessControl" - }, - "response": { - "$ref": "BucketAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "list": { - "id": "storage.bucketAccessControls.list", - "path": "b/{bucket}/acl", - "httpMethod": "GET", - "description": "Retrieves ACL entries on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "BucketAccessControls" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "patch": { - "id": "storage.bucketAccessControls.patch", - "path": "b/{bucket}/acl/{entity}", - "httpMethod": "PATCH", - "description": "Patches an ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "request": { - "$ref": "BucketAccessControl" - }, - "response": { - "$ref": "BucketAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "update": { - "id": "storage.bucketAccessControls.update", - "path": "b/{bucket}/acl/{entity}", - "httpMethod": "PUT", - "description": "Updates an ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "request": { - "$ref": "BucketAccessControl" - }, - "response": { - "$ref": "BucketAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - } - } - }, - "buckets": { - "methods": { - "delete": { - "id": "storage.buckets.delete", - "path": "b/{bucket}", - "httpMethod": "DELETE", - "description": "Permanently deletes an empty bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "If set, only deletes the bucket if its metageneration matches this value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "If set, only deletes the bucket if its metageneration does not match this value.", - "format": "int64", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.buckets.get", - "path": "b/{bucket}", - "httpMethod": "GET", - "description": "Returns metadata for the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit owner, acl and defaultObjectAcl properties." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "Bucket" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "getIamPolicy": { - "id": "storage.buckets.getIamPolicy", - "path": "b/{bucket}/iam", - "httpMethod": "GET", - "description": "Returns an IAM policy for the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "optionsRequestedPolicyVersion": { - "type": "integer", - "description": "The IAM policy format version to be returned. If the optionsRequestedPolicyVersion is for an older version that doesn't support part of the requested IAM policy, the request fails.", - "format": "int32", - "minimum": "1", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "insert": { - "id": "storage.buckets.insert", - "path": "b", - "httpMethod": "POST", - "description": "Creates a new bucket.", - "parameters": { - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this bucket.", - "enum": [ - "authenticatedRead", - "private", - "projectPrivate", - "publicRead", - "publicReadWrite" - ], - "enumDescriptions": [ - "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", - "Project team owners get OWNER access.", - "Project team members get access according to their roles.", - "Project team owners get OWNER access, and allUsers get READER access.", - "Project team owners get OWNER access, and allUsers get WRITER access." - ], - "location": "query" - }, - "predefinedDefaultObjectAcl": { - "type": "string", - "description": "Apply a predefined set of default object access controls to this bucket.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "project": { - "type": "string", - "description": "A valid API project identifier.", - "required": true, - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl, unless the bucket resource specifies acl or defaultObjectAcl properties, when it defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit owner, acl and defaultObjectAcl properties." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - }, - "enableObjectRetention": { - "type": "boolean", - "description": "When set to true, object retention is enabled for this bucket.", - "default": "false", - "location": "query" - } - }, - "parameterOrder": [ - "project" - ], - "request": { - "$ref": "Bucket" - }, - "response": { - "$ref": "Bucket" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "list": { - "id": "storage.buckets.list", - "path": "b", - "httpMethod": "GET", - "description": "Retrieves a list of buckets for a given project.", - "parameters": { - "maxResults": { - "type": "integer", - "description": "Maximum number of buckets to return in a single response. The service will use this parameter or 1,000 items, whichever is smaller.", - "default": "1000", - "format": "uint32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - }, - "prefix": { - "type": "string", - "description": "Filter results to buckets whose names begin with this prefix.", - "location": "query" - }, - "project": { - "type": "string", - "description": "A valid API project identifier.", - "required": true, - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit owner, acl and defaultObjectAcl properties." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - } - }, - "parameterOrder": [ - "project" - ], - "response": { - "$ref": "Buckets" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "lockRetentionPolicy": { - "id": "storage.buckets.lockRetentionPolicy", - "path": "b/{bucket}/lockRetentionPolicy", - "httpMethod": "POST", - "description": "Locks retention policy on a bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether bucket's current metageneration matches the given value.", - "required": true, - "format": "int64", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "ifMetagenerationMatch" - ], - "response": { - "$ref": "Bucket" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "patch": { - "id": "storage.buckets.patch", - "path": "b/{bucket}", - "httpMethod": "PATCH", - "description": "Patches a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this bucket.", - "enum": [ - "authenticatedRead", - "private", - "projectPrivate", - "publicRead", - "publicReadWrite" - ], - "enumDescriptions": [ - "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", - "Project team owners get OWNER access.", - "Project team members get access according to their roles.", - "Project team owners get OWNER access, and allUsers get READER access.", - "Project team owners get OWNER access, and allUsers get WRITER access." - ], - "location": "query" - }, - "predefinedDefaultObjectAcl": { - "type": "string", - "description": "Apply a predefined set of default object access controls to this bucket.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit owner, acl and defaultObjectAcl properties." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Bucket" - }, - "response": { - "$ref": "Bucket" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "setIamPolicy": { - "id": "storage.buckets.setIamPolicy", - "path": "b/{bucket}/iam", - "httpMethod": "PUT", - "description": "Updates an IAM policy for the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Policy" - }, - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "testIamPermissions": { - "id": "storage.buckets.testIamPermissions", - "path": "b/{bucket}/iam/testPermissions", - "httpMethod": "GET", - "description": "Tests a set of permissions on the given bucket to see which, if any, are held by the caller.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "permissions": { - "type": "string", - "description": "Permissions to test.", - "required": true, - "repeated": true, - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "permissions" - ], - "response": { - "$ref": "TestIamPermissionsResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "update": { - "id": "storage.buckets.update", - "path": "b/{bucket}", - "httpMethod": "PUT", - "description": "Updates a bucket. Changes to the bucket will be readable immediately after writing, but configuration changes may take time to propagate.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the return of the bucket metadata conditional on whether the bucket's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this bucket.", - "enum": [ - "authenticatedRead", - "private", - "projectPrivate", - "publicRead", - "publicReadWrite" - ], - "enumDescriptions": [ - "Project team owners get OWNER access, and allAuthenticatedUsers get READER access.", - "Project team owners get OWNER access.", - "Project team members get access according to their roles.", - "Project team owners get OWNER access, and allUsers get READER access.", - "Project team owners get OWNER access, and allUsers get WRITER access." - ], - "location": "query" - }, - "predefinedDefaultObjectAcl": { - "type": "string", - "description": "Apply a predefined set of default object access controls to this bucket.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit owner, acl and defaultObjectAcl properties." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Bucket" - }, - "response": { - "$ref": "Bucket" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - } - } - }, - "operations": { - "methods": { - "cancel": { - "description": "Starts asynchronous cancellation on a long-running operation. The server makes a best effort to cancel the operation, but success is not guaranteed.", - "path": "b/{bucket}/operations/{operationId}/cancel", - "httpMethod": "POST", - "id": "storage.buckets.operations.cancel", - "parameterOrder": [ - "bucket", - "operationId" - ], - "parameters": { - "bucket": { - "description": "The parent bucket of the operation resource.", - "location": "path", - "required": true, - "type": "string" - }, - "operationId": { - "description": "The ID of the operation resource.", - "location": "path", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "description": "Gets the latest state of a long-running operation.", - "path": "b/{bucket}/operations/{operationId}", - "httpMethod": "GET", - "id": "storage.buckets.operations.get", - "parameterOrder": [ - "bucket", - "operationId" - ], - "parameters": { - "bucket": { - "description": "The parent bucket of the operation resource.", - "location": "path", - "required": true, - "type": "string" - }, - "operationId": { - "description": "The ID of the operation resource.", - "location": "path", - "required": true, - "type": "string" - } - }, - "response": { - "$ref": "GoogleLongrunningOperation" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "list": { - "description": "Lists operations that match the specified filter in the request.", - "path": "b/{bucket}/operations", - "httpMethod": "GET", - "id": "storage.buckets.operations.list", - "parameterOrder": [ - "bucket" - ], - "parameters": { - "filter": { - "description": "A filter to narrow down results to a preferred subset. The filtering language is documented in more detail in [AIP-160](https://google.aip.dev/160).", - "location": "query", - "type": "string" - }, - "bucket": { - "description": "Name of the bucket in which to look for operations.", - "location": "path", - "required": true, - "type": "string" - }, - "pageSize": { - "description": "Maximum number of items to return in a single page of responses. Fewer total results may be returned than requested. The service uses this parameter or 100 items, whichever is smaller.", - "minimum": "0", - "format": "int32", - "location": "query", - "type": "integer" - }, - "pageToken": { - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query", - "type": "string" - } - }, - "response": { - "$ref": "GoogleLongrunningListOperationsResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } - }, - "channels": { - "methods": { - "stop": { - "id": "storage.channels.stop", - "path": "channels/stop", - "httpMethod": "POST", - "description": "Stop watching resources through this channel", - "request": { - "$ref": "Channel", - "parameterName": "resource" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } - }, - "defaultObjectAccessControls": { - "methods": { - "delete": { - "id": "storage.defaultObjectAccessControls.delete", - "path": "b/{bucket}/defaultObjectAcl/{entity}", - "httpMethod": "DELETE", - "description": "Permanently deletes the default object ACL entry for the specified entity on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "get": { - "id": "storage.defaultObjectAccessControls.get", - "path": "b/{bucket}/defaultObjectAcl/{entity}", - "httpMethod": "GET", - "description": "Returns the default object ACL entry for the specified entity on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "insert": { - "id": "storage.defaultObjectAccessControls.insert", - "path": "b/{bucket}/defaultObjectAcl", - "httpMethod": "POST", - "description": "Creates a new default object ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "list": { - "id": "storage.defaultObjectAccessControls.list", - "path": "b/{bucket}/defaultObjectAcl", - "httpMethod": "GET", - "description": "Retrieves default object ACL entries on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "If present, only return default ACL listing if the bucket's current metageneration matches this value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "If present, only return default ACL listing if the bucket's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "ObjectAccessControls" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "patch": { - "id": "storage.defaultObjectAccessControls.patch", - "path": "b/{bucket}/defaultObjectAcl/{entity}", - "httpMethod": "PATCH", - "description": "Patches a default object ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "update": { - "id": "storage.defaultObjectAccessControls.update", - "path": "b/{bucket}/defaultObjectAcl/{entity}", - "httpMethod": "PUT", - "description": "Updates a default object ACL entry on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "entity" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - } - } - }, - "managedFolders": { - "methods": { - "delete": { - "id": "storage.managedFolders.delete", - "path": "b/{bucket}/managedFolders/{managedFolder}", - "httpMethod": "DELETE", - "description": "Permanently deletes a managed folder.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "managedFolder": { - "type": "string", - "description": "The managed folder name/path.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "If set, only deletes the managed folder if its metageneration matches this value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "If set, only deletes the managed folder if its metageneration does not match this value.", - "format": "int64", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "managedFolder" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.managedFolders.get", - "path": "b/{bucket}/managedFolders/{managedFolder}", - "httpMethod": "GET", - "description": "Returns metadata of the specified managed folder.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "managedFolder": { - "type": "string", - "description": "The managed folder name/path.", - "required": true, - "location": "path" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the return of the managed folder metadata conditional on whether the managed folder's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the return of the managed folder metadata conditional on whether the managed folder's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "managedFolder" - ], - "response": { - "$ref": "ManagedFolder" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "getIamPolicy": { - "id": "storage.managedFolders.getIamPolicy", - "path": "b/{bucket}/managedFolders/{managedFolder}/iam", - "httpMethod": "GET", - "description": "Returns an IAM policy for the specified managed folder.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "optionsRequestedPolicyVersion": { - "type": "integer", - "description": "The IAM policy format version to be returned. If the optionsRequestedPolicyVersion is for an older version that doesn't support part of the requested IAM policy, the request fails.", - "format": "int32", - "minimum": "1", - "location": "query" - }, - "managedFolder": { - "type": "string", - "description": "The managed folder name/path.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "managedFolder" - ], - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "insert": { - "id": "storage.managedFolders.insert", - "path": "b/{bucket}/managedFolders", - "httpMethod": "POST", - "description": "Creates a new managed folder.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "ManagedFolder" - }, - "response": { - "$ref": "ManagedFolder" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "list": { - "id": "storage.managedFolders.list", - "path": "b/{bucket}/managedFolders", - "httpMethod": "GET", - "description": "Lists managed folders in the given bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "pageSize": { - "type": "integer", - "description": "Maximum number of items return in a single page of responses.", - "format": "int32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - }, - "prefix": { - "type": "string", - "description": "The managed folder name/path prefix to filter the output list of results.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "ManagedFolders" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "setIamPolicy": { - "id": "storage.managedFolders.setIamPolicy", - "path": "b/{bucket}/managedFolders/{managedFolder}/iam", - "httpMethod": "PUT", - "description": "Updates an IAM policy for the specified managed folder.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "managedFolder": { - "type": "string", - "description": "The managed folder name/path.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "managedFolder" - ], - "request": { - "$ref": "Policy" - }, - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "testIamPermissions": { - "id": "storage.managedFolders.testIamPermissions", - "path": "b/{bucket}/managedFolders/{managedFolder}/iam/testPermissions", - "httpMethod": "GET", - "description": "Tests a set of permissions on the given managed folder to see which, if any, are held by the caller.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket containing the managed folder.", - "required": true, - "location": "path" - }, - "managedFolder": { - "type": "string", - "description": "The managed folder name/path.", - "required": true, - "location": "path" - }, - "permissions": { - "type": "string", - "description": "Permissions to test.", - "required": true, - "repeated": true, - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "managedFolder", - "permissions" - ], - "response": { - "$ref": "TestIamPermissionsResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } - }, - "notifications": { - "methods": { - "delete": { - "id": "storage.notifications.delete", - "path": "b/{bucket}/notificationConfigs/{notification}", - "httpMethod": "DELETE", - "description": "Permanently deletes a notification subscription.", - "parameters": { - "bucket": { - "type": "string", - "description": "The parent bucket of the notification.", - "required": true, - "location": "path" - }, - "notification": { - "type": "string", - "description": "ID of the notification to delete.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "notification" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.notifications.get", - "path": "b/{bucket}/notificationConfigs/{notification}", - "httpMethod": "GET", - "description": "View a notification configuration.", - "parameters": { - "bucket": { - "type": "string", - "description": "The parent bucket of the notification.", - "required": true, - "location": "path" - }, - "notification": { - "type": "string", - "description": "Notification ID", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "notification" - ], - "response": { - "$ref": "Notification" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "insert": { - "id": "storage.notifications.insert", - "path": "b/{bucket}/notificationConfigs", - "httpMethod": "POST", - "description": "Creates a notification subscription for a given bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "The parent bucket of the notification.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Notification" - }, - "response": { - "$ref": "Notification" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "list": { - "id": "storage.notifications.list", - "path": "b/{bucket}/notificationConfigs", - "httpMethod": "GET", - "description": "Retrieves a list of notification subscriptions for a given bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a Google Cloud Storage bucket.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "Notifications" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } - }, - "objectAccessControls": { - "methods": { - "delete": { - "id": "storage.objectAccessControls.delete", - "path": "b/{bucket}/o/{object}/acl/{entity}", - "httpMethod": "DELETE", - "description": "Permanently deletes the ACL entry for the specified entity on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object", - "entity" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "get": { - "id": "storage.objectAccessControls.get", - "path": "b/{bucket}/o/{object}/acl/{entity}", - "httpMethod": "GET", - "description": "Returns the ACL entry for the specified entity on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object", - "entity" - ], - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "insert": { - "id": "storage.objectAccessControls.insert", - "path": "b/{bucket}/o/{object}/acl", - "httpMethod": "POST", - "description": "Creates a new ACL entry on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "list": { - "id": "storage.objectAccessControls.list", - "path": "b/{bucket}/o/{object}/acl", - "httpMethod": "GET", - "description": "Retrieves ACL entries on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "response": { - "$ref": "ObjectAccessControls" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "patch": { - "id": "storage.objectAccessControls.patch", - "path": "b/{bucket}/o/{object}/acl/{entity}", - "httpMethod": "PATCH", - "description": "Patches an ACL entry on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object", - "entity" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "update": { - "id": "storage.objectAccessControls.update", - "path": "b/{bucket}/o/{object}/acl/{entity}", - "httpMethod": "PUT", - "description": "Updates an ACL entry on the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of a bucket.", - "required": true, - "location": "path" - }, - "entity": { - "type": "string", - "description": "The entity holding the permission. Can be user-userId, user-emailAddress, group-groupId, group-emailAddress, allUsers, or allAuthenticatedUsers.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object", - "entity" - ], - "request": { - "$ref": "ObjectAccessControl" - }, - "response": { - "$ref": "ObjectAccessControl" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - } - } - }, - "objects": { - "methods": { - "compose": { - "id": "storage.objects.compose", - "path": "b/{destinationBucket}/o/{destinationObject}/compose", - "httpMethod": "POST", - "description": "Concatenates a list of existing objects into a new object in the same bucket.", - "parameters": { - "destinationBucket": { - "type": "string", - "description": "Name of the bucket containing the source objects. The destination object is stored in this bucket.", - "required": true, - "location": "path" - }, - "destinationObject": { - "type": "string", - "description": "Name of the new object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "destinationPredefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to the destination object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "kmsKeyName": { - "type": "string", - "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "destinationBucket", - "destinationObject" - ], - "request": { - "$ref": "ComposeRequest" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "copy": { - "id": "storage.objects.copy", - "path": "b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}", - "httpMethod": "POST", - "description": "Copies a source object to a destination object. Optionally overrides metadata.", - "parameters": { - "destinationBucket": { - "type": "string", - "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "destinationKmsKeyName": { - "type": "string", - "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", - "location": "query" - }, - "destinationObject": { - "type": "string", - "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any.", - "required": true, - "location": "path" - }, - "destinationPredefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to the destination object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current generation matches the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current generation does not match the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "sourceBucket": { - "type": "string", - "description": "Name of the bucket in which to find the source object.", - "required": true, - "location": "path" - }, - "sourceGeneration": { - "type": "string", - "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "sourceObject": { - "type": "string", - "description": "Name of the source object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "sourceBucket", - "sourceObject", - "destinationBucket", - "destinationObject" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "delete": { - "id": "storage.objects.delete", - "path": "b/{bucket}/o/{object}", - "httpMethod": "DELETE", - "description": "Deletes an object and its metadata. Deletions are permanent if versioning is not enabled for the bucket, or if the generation parameter is used.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, permanently deletes a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.objects.get", - "path": "b/{bucket}/o/{object}", - "httpMethod": "GET", - "description": "Retrieves an object or its metadata.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - }, - "softDeleted": { - "type": "boolean", - "description": "If true, only soft-deleted object versions will be listed. The default is false. For more information, see Soft Delete.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ], - "supportsMediaDownload": true, - "useMediaDownloadService": true - }, - "getIamPolicy": { - "id": "storage.objects.getIamPolicy", - "path": "b/{bucket}/o/{object}/iam", - "httpMethod": "GET", - "description": "Returns an IAM policy for the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "insert": { - "id": "storage.objects.insert", - "path": "b/{bucket}/o", - "httpMethod": "POST", - "description": "Stores a new object and metadata.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.", - "required": true, - "location": "path" - }, - "contentEncoding": { - "type": "string", - "description": "If set, sets the contentEncoding property of the final object to this value. Setting this parameter is equivalent to setting the contentEncoding metadata property. This can be useful when uploading an object with uploadType=media to indicate the encoding of the content being uploaded.", - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "kmsKeyName": { - "type": "string", - "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", - "location": "query" - }, - "name": { - "type": "string", - "description": "Name of the object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "location": "query" - }, - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ], - "supportsMediaUpload": true, - "mediaUpload": { - "accept": [ - "*/*" - ], - "protocols": { - "simple": { - "multipart": true, - "path": "/upload/storage/v1/b/{bucket}/o" - }, - "resumable": { - "multipart": true, - "path": "/resumable/upload/storage/v1/b/{bucket}/o" - } - } - } - }, - "list": { - "id": "storage.objects.list", - "path": "b/{bucket}/o", - "httpMethod": "GET", - "description": "Retrieves a list of objects matching the criteria.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which to look for objects.", - "required": true, - "location": "path" - }, - "delimiter": { - "type": "string", - "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.", - "location": "query" - }, - "endOffset": { - "type": "string", - "description": "Filter results to objects whose names are lexicographically before endOffset. If startOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", - "location": "query" - }, - "includeTrailingDelimiter": { - "type": "boolean", - "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.", - "location": "query" - }, - "maxResults": { - "type": "integer", - "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.", - "default": "1000", - "format": "uint32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - }, - "prefix": { - "type": "string", - "description": "Filter results to objects whose names begin with this prefix.", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "startOffset": { - "type": "string", - "description": "Filter results to objects whose names are lexicographically equal to or after startOffset. If endOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - }, - "versions": { - "type": "boolean", - "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.", - "location": "query" - }, - "matchGlob": { - "type": "string", - "description": "Filter results to objects and prefixes that match this glob pattern.", - "location": "query" - }, - "softDeleted": { - "type": "boolean", - "description": "If true, only soft-deleted object versions will be listed. The default is false. For more information, see Soft Delete.", - "location": "query" - }, - "includeFoldersAsPrefixes": { - "type": "boolean", - "description": "Only applicable if delimiter is set to '/'. If true, will also include folders and managed folders (besides objects) in the returned prefixes.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "response": { - "$ref": "Objects" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ], - "supportsSubscription": true - }, - "patch": { - "id": "storage.objects.patch", - "path": "b/{bucket}/o/{object}", - "httpMethod": "PATCH", - "description": "Patches an object's metadata.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "overrideUnlockedRetention": { - "type": "boolean", - "description": "Must be true to remove the retention configuration, reduce its unlocked retention period, or change its mode from unlocked to locked.", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request, for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "rewrite": { - "id": "storage.objects.rewrite", - "path": "b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}", - "httpMethod": "POST", - "description": "Rewrites a source object to a destination object. Optionally overrides metadata.", - "parameters": { - "destinationBucket": { - "type": "string", - "description": "Name of the bucket in which to store the new object. Overrides the provided object metadata's bucket value, if any.", - "required": true, - "location": "path" - }, - "destinationKmsKeyName": { - "type": "string", - "description": "Resource name of the Cloud KMS key, of the form projects/my-project/locations/global/keyRings/my-kr/cryptoKeys/my-key, that will be used to encrypt the object. Overrides the object metadata's kms_key_name value, if any.", - "location": "query" - }, - "destinationObject": { - "type": "string", - "description": "Name of the new object. Required when the object metadata is not otherwise provided. Overrides the object metadata's name value, if any. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "destinationPredefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to the destination object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the destination object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current generation matches the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current generation does not match the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifSourceMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the source object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "maxBytesRewrittenPerCall": { - "type": "string", - "description": "The maximum number of bytes that will be rewritten per rewrite request. Most callers shouldn't need to specify this parameter - it is primarily in place to support testing. If specified the value must be an integral multiple of 1 MiB (1048576). Also, this only applies to requests where the source and destination span locations and/or storage classes. Finally, this value must not change across rewrite calls else you'll get an error that the rewriteToken is invalid.", - "format": "int64", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl, unless the object resource specifies the acl property, when it defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "rewriteToken": { - "type": "string", - "description": "Include this field (from the previous rewrite response) on each rewrite request after the first one, until the rewrite response 'done' flag is true. Calls that provide a rewriteToken can omit all other request fields, but if included those fields must match the values provided in the first rewrite request.", - "location": "query" - }, - "sourceBucket": { - "type": "string", - "description": "Name of the bucket in which to find the source object.", - "required": true, - "location": "path" - }, - "sourceGeneration": { - "type": "string", - "description": "If present, selects a specific revision of the source object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "sourceObject": { - "type": "string", - "description": "Name of the source object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "sourceBucket", - "sourceObject", - "destinationBucket", - "destinationObject" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "RewriteResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "setIamPolicy": { - "id": "storage.objects.setIamPolicy", - "path": "b/{bucket}/o/{object}/iam", - "httpMethod": "PUT", - "description": "Updates an IAM policy for the specified object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "request": { - "$ref": "Policy" - }, - "response": { - "$ref": "Policy" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "testIamPermissions": { - "id": "storage.objects.testIamPermissions", - "path": "b/{bucket}/o/{object}/iam/testPermissions", - "httpMethod": "GET", - "description": "Tests a set of permissions on the given object to see which, if any, are held by the caller.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "permissions": { - "type": "string", - "description": "Permissions to test.", - "required": true, - "repeated": true, - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object", - "permissions" - ], - "response": { - "$ref": "TestIamPermissionsResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "update": { - "id": "storage.objects.update", - "path": "b/{bucket}/o/{object}", - "httpMethod": "PUT", - "description": "Updates an object's metadata.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "If present, selects a specific revision of this object (as opposed to the latest version, the default).", - "format": "int64", - "location": "query" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current generation does not match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's current metageneration does not match the given value.", - "format": "int64", - "location": "query" - }, - "overrideUnlockedRetention": { - "type": "boolean", - "description": "Must be true to remove the retention configuration, reduce its unlocked retention period, or change its mode from unlocked to locked.", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see [Encoding URI Path Parts](https://cloud.google.com/storage/docs/request-endpoints#encoding).", - "required": true, - "location": "path" - }, - "predefinedAcl": { - "type": "string", - "description": "Apply a predefined set of access controls to this object.", - "enum": [ - "authenticatedRead", - "bucketOwnerFullControl", - "bucketOwnerRead", - "private", - "projectPrivate", - "publicRead" - ], - "enumDescriptions": [ - "Object owner gets OWNER access, and allAuthenticatedUsers get READER access.", - "Object owner gets OWNER access, and project team owners get OWNER access.", - "Object owner gets OWNER access, and project team owners get READER access.", - "Object owner gets OWNER access.", - "Object owner gets OWNER access, and project team members get access according to their roles.", - "Object owner gets OWNER access, and allUsers get READER access." - ], - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "watchAll": { - "id": "storage.objects.watchAll", - "path": "b/{bucket}/o/watch", - "httpMethod": "POST", - "description": "Watch for changes on all objects in a bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which to look for objects.", - "required": true, - "location": "path" - }, - "delimiter": { - "type": "string", - "description": "Returns results in a directory-like mode. items will contain only objects whose names, aside from the prefix, do not contain delimiter. Objects whose names, aside from the prefix, contain delimiter will have their name, truncated after the delimiter, returned in prefixes. Duplicate prefixes are omitted.", - "location": "query" - }, - "endOffset": { - "type": "string", - "description": "Filter results to objects whose names are lexicographically before endOffset. If startOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", - "location": "query" - }, - "includeTrailingDelimiter": { - "type": "boolean", - "description": "If true, objects that end in exactly one instance of delimiter will have their metadata included in items in addition to prefixes.", - "location": "query" - }, - "maxResults": { - "type": "integer", - "description": "Maximum number of items plus prefixes to return in a single page of responses. As duplicate prefixes are omitted, fewer total results may be returned than requested. The service will use this parameter or 1,000 items, whichever is smaller.", - "default": "1000", - "format": "uint32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - }, - "prefix": { - "type": "string", - "description": "Filter results to objects whose names begin with this prefix.", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to noAcl.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "startOffset": { - "type": "string", - "description": "Filter results to objects whose names are lexicographically equal to or after startOffset. If endOffset is also set, the objects listed will have names between startOffset (inclusive) and endOffset (exclusive).", - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - }, - "versions": { - "type": "boolean", - "description": "If true, lists all versions of an object as distinct results. The default is false. For more information, see Object Versioning.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "Channel", - "parameterName": "resource" - }, - "response": { - "$ref": "Channel" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ], - "supportsSubscription": true - }, - "restore": { - "id": "storage.objects.restore", - "path": "b/{bucket}/o/{object}/restore", - "httpMethod": "POST", - "description": "Restores a soft-deleted object.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - }, - "generation": { - "type": "string", - "description": "Selects a specific revision of this object.", - "required": true, - "format": "int64", - "location": "query" - }, - "object": { - "type": "string", - "description": "Name of the object. For information about how to URL encode object names to be path safe, see Encoding URI Path Parts.", - "required": true, - "location": "path" - }, - "ifGenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's one live generation matches the given value. Setting to 0 makes the operation succeed only if there are no live versions of the object.", - "format": "int64", - "location": "query" - }, - "ifGenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether none of the object's live generations match the given value. If no live object exists, the precondition fails. Setting to 0 makes the operation succeed only if there is a live version of the object.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationMatch": { - "type": "string", - "description": "Makes the operation conditional on whether the object's one live metageneration matches the given value.", - "format": "int64", - "location": "query" - }, - "ifMetagenerationNotMatch": { - "type": "string", - "description": "Makes the operation conditional on whether none of the object's live metagenerations match the given value.", - "format": "int64", - "location": "query" - }, - "copySourceAcl": { - "type": "boolean", - "description": "If true, copies the source object's ACL; otherwise, uses the bucket's default object ACL. The default is false.", - "location": "query" - }, - "projection": { - "type": "string", - "description": "Set of properties to return. Defaults to full.", - "enum": [ - "full", - "noAcl" - ], - "enumDescriptions": [ - "Include all properties.", - "Omit the owner, acl property." - ], - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request. Required for Requester Pays buckets.", - "location": "query" - } - }, - "parameterOrder": [ - "bucket", - "object" - ], - "request": { - "$ref": "Object" - }, - "response": { - "$ref": "Object" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] + "type": "boolean", + "description": "If true, copies the source object's ACL; otherwise, uses the bucket's default object ACL. The default is false.", + "location": "query" }, - "bulkRestore": { - "id": "storage.objects.bulkRestore", - "path": "b/{bucket}/o/bulkRestore", - "httpMethod": "POST", - "description": "Initiates a long-running bulk restore operation on the specified bucket.", - "parameters": { - "bucket": { - "type": "string", - "description": "Name of the bucket in which the object resides.", - "required": true, - "location": "path" - } - }, - "parameterOrder": [ - "bucket" - ], - "request": { - "$ref": "BulkRestoreObjectsRequest" - }, - "response": { - "$ref": "GoogleLongrunningOperation" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] + "projection": { + "type": "string", + "description": "Set of properties to return. Defaults to full.", + "enum": [ + "full", + "noAcl" + ], + "enumDescriptions": [ + "Include all properties.", + "Omit the owner, acl property." + ], + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request. Required for Requester Pays buckets.", + "location": "query" } - } - }, - "projects": { - "resources": { - "hmacKeys": { - "methods": { - "create": { - "id": "storage.projects.hmacKeys.create", - "path": "projects/{projectId}/hmacKeys", - "httpMethod": "POST", - "description": "Creates a new HMAC key for the specified service account.", - "parameters": { - "projectId": { - "type": "string", - "description": "Project ID owning the service account.", - "required": true, - "location": "path" - }, - "serviceAccountEmail": { - "type": "string", - "description": "Email address of the service account.", - "required": true, - "location": "query" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - } - }, - "parameterOrder": [ - "projectId", - "serviceAccountEmail" - ], - "response": { - "$ref": "HmacKey" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - }, - "delete": { - "id": "storage.projects.hmacKeys.delete", - "path": "projects/{projectId}/hmacKeys/{accessId}", - "httpMethod": "DELETE", - "description": "Deletes an HMAC key.", - "parameters": { - "accessId": { - "type": "string", - "description": "Name of the HMAC key to be deleted.", - "required": true, - "location": "path" - }, - "projectId": { - "type": "string", - "description": "Project ID owning the requested key", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - } - }, - "parameterOrder": [ - "projectId", - "accessId" - ], - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - }, - "get": { - "id": "storage.projects.hmacKeys.get", - "path": "projects/{projectId}/hmacKeys/{accessId}", - "httpMethod": "GET", - "description": "Retrieves an HMAC key's metadata", - "parameters": { - "accessId": { - "type": "string", - "description": "Name of the HMAC key.", - "required": true, - "location": "path" - }, - "projectId": { - "type": "string", - "description": "Project ID owning the service account of the requested key.", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - } - }, - "parameterOrder": [ - "projectId", - "accessId" - ], - "response": { - "$ref": "HmacKeyMetadata" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only" - ] - }, - "list": { - "id": "storage.projects.hmacKeys.list", - "path": "projects/{projectId}/hmacKeys", - "httpMethod": "GET", - "description": "Retrieves a list of HMAC keys matching the criteria.", - "parameters": { - "maxResults": { - "type": "integer", - "description": "Maximum number of items to return in a single page of responses. The service uses this parameter or 250 items, whichever is smaller. The max number of items per page will also be limited by the number of distinct service accounts in the response. If the number of service accounts in a single response is too high, the page will truncated and a next page token will be returned.", - "default": "250", - "format": "uint32", - "minimum": "0", - "location": "query" - }, - "pageToken": { - "type": "string", - "description": "A previously-returned page token representing part of the larger set of results to view.", - "location": "query" - }, - "projectId": { - "type": "string", - "description": "Name of the project in which to look for HMAC keys.", - "required": true, - "location": "path" - }, - "serviceAccountEmail": { - "type": "string", - "description": "If present, only keys for the given service account are returned.", - "location": "query" +}, +"parameterOrder": [ + "bucket", + "object", + "generation" + ], + "response": { + "$ref": "Object" }, - "showDeletedKeys": { - "type": "boolean", - "description": "Whether or not to show keys in the DELETED state.", - "location": "query" + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" + ] + }, + "bulkRestore": { + "id": "storage.objects.bulkRestore", + "path": "b/{bucket}/o/bulkRestore", + "httpMethod": "POST", + "description": "Initiates a long-running bulk restore operation on the specified bucket.", + "parameters": { + "bucket": { + "type": "string", + "description": "Name of the bucket in which the object resides.", + "required": true, + "location": "path" + } }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" - } - }, - "parameterOrder": [ - "projectId" - ], - "response": { - "$ref": "HmacKeysMetadata" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only" - ] - }, - "update": { - "id": "storage.projects.hmacKeys.update", - "path": "projects/{projectId}/hmacKeys/{accessId}", - "httpMethod": "PUT", - "description": "Updates the state of an HMAC key. See the HMAC Key resource descriptor for valid states.", - "parameters": { - "accessId": { - "type": "string", - "description": "Name of the HMAC key being updated.", - "required": true, - "location": "path" + "parameterOrder": [ + "bucket" + ], + "request": { + "$ref": "BulkRestoreObjectsRequest" }, - "projectId": { - "type": "string", - "description": "Project ID owning the service account of the updated key.", - "required": true, - "location": "path" + "response": { + "$ref": "GoogleLongrunningOperation" }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + } +} +}, +"projects": { +"resources": { + "hmacKeys": { + "methods": { + "create": { + "id": "storage.projects.hmacKeys.create", + "path": "projects/{projectId}/hmacKeys", + "httpMethod": "POST", + "description": "Creates a new HMAC key for the specified service account.", + "parameters": { + "projectId": { + "type": "string", + "description": "Project ID owning the service account.", + "required": true, + "location": "path" + }, + "serviceAccountEmail": { + "type": "string", + "description": "Email address of the service account.", + "required": true, + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId", + "serviceAccountEmail" + ], + "response": { + "$ref": "HmacKey" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" + ] + }, + "delete": { + "id": "storage.projects.hmacKeys.delete", + "path": "projects/{projectId}/hmacKeys/{accessId}", + "httpMethod": "DELETE", + "description": "Deletes an HMAC key.", + "parameters": { + "accessId": { + "type": "string", + "description": "Name of the HMAC key to be deleted.", + "required": true, + "location": "path" + }, + "projectId": { + "type": "string", + "description": "Project ID owning the requested key", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId", + "accessId" + ], + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + }, + "get": { + "id": "storage.projects.hmacKeys.get", + "path": "projects/{projectId}/hmacKeys/{accessId}", + "httpMethod": "GET", + "description": "Retrieves an HMAC key's metadata", + "parameters": { + "accessId": { + "type": "string", + "description": "Name of the HMAC key.", + "required": true, + "location": "path" + }, + "projectId": { + "type": "string", + "description": "Project ID owning the service account of the requested key.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId", + "accessId" + ], + "response": { + "$ref": "HmacKeyMetadata" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only" + ] + }, + "list": { + "id": "storage.projects.hmacKeys.list", + "path": "projects/{projectId}/hmacKeys", + "httpMethod": "GET", + "description": "Retrieves a list of HMAC keys matching the criteria.", + "parameters": { + "maxResults": { + "type": "integer", + "description": "Maximum number of items to return in a single page of responses. The service uses this parameter or 250 items, whichever is smaller. The max number of items per page will also be limited by the number of distinct service accounts in the response. If the number of service accounts in a single response is too high, the page will truncated and a next page token will be returned.", + "default": "250", + "format": "uint32", + "minimum": "0", + "location": "query" + }, + "pageToken": { + "type": "string", + "description": "A previously-returned page token representing part of the larger set of results to view.", + "location": "query" + }, + "projectId": { + "type": "string", + "description": "Name of the project in which to look for HMAC keys.", + "required": true, + "location": "path" + }, + "serviceAccountEmail": { + "type": "string", + "description": "If present, only keys for the given service account are returned.", + "location": "query" + }, + "showDeletedKeys": { + "type": "boolean", + "description": "Whether or not to show keys in the DELETED state.", + "location": "query" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId" + ], + "response": { + "$ref": "HmacKeysMetadata" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only" + ] + }, + "update": { + "id": "storage.projects.hmacKeys.update", + "path": "projects/{projectId}/hmacKeys/{accessId}", + "httpMethod": "PUT", + "description": "Updates the state of an HMAC key. See the HMAC Key resource descriptor for valid states.", + "parameters": { + "accessId": { + "type": "string", + "description": "Name of the HMAC key being updated.", + "required": true, + "location": "path" + }, + "projectId": { + "type": "string", + "description": "Project ID owning the service account of the updated key.", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId", + "accessId" + ], + "request": { + "$ref": "HmacKeyMetadata" + }, + "response": { + "$ref": "HmacKeyMetadata" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/devstorage.full_control" + ] + } } - }, - "parameterOrder": [ - "projectId", - "accessId" - ], - "request": { - "$ref": "HmacKeyMetadata" - }, - "response": { - "$ref": "HmacKeyMetadata" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/devstorage.full_control" - ] - } - } }, "serviceAccount": { - "methods": { - "get": { - "id": "storage.projects.serviceAccount.get", - "path": "projects/{projectId}/serviceAccount", - "httpMethod": "GET", - "description": "Get the email address of this project's Google Cloud Storage service account.", - "parameters": { - "projectId": { - "type": "string", - "description": "Project ID", - "required": true, - "location": "path" - }, - "userProject": { - "type": "string", - "description": "The project to be billed for this request.", - "location": "query" + "methods": { + "get": { + "id": "storage.projects.serviceAccount.get", + "path": "projects/{projectId}/serviceAccount", + "httpMethod": "GET", + "description": "Get the email address of this project's Google Cloud Storage service account.", + "parameters": { + "projectId": { + "type": "string", + "description": "Project ID", + "required": true, + "location": "path" + }, + "userProject": { + "type": "string", + "description": "The project to be billed for this request.", + "location": "query" + } + }, + "parameterOrder": [ + "projectId" + ], + "response": { + "$ref": "ServiceAccount" + }, + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/cloud-platform.read-only", + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/devstorage.read_only", + "https://www.googleapis.com/auth/devstorage.read_write" + ] + } } - }, - "parameterOrder": [ - "projectId" - ], - "response": { - "$ref": "ServiceAccount" - }, - "scopes": [ - "https://www.googleapis.com/auth/cloud-platform", - "https://www.googleapis.com/auth/cloud-platform.read-only", - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/devstorage.read_only", - "https://www.googleapis.com/auth/devstorage.read_write" - ] - } - } } - } - } - }, - "revision": "20231028", - "etag": "\"39383633393336373936373236333033393737\"" +} +} +}, + "revision": "20240501", + "etag": "\"3135313638313632393935373531333737363832\"" } diff --git a/lib/Google/vendor/google/cloud-storage/src/Lifecycle.php b/lib/Google/vendor/google/cloud-storage/src/Lifecycle.php index 88a9966a3..dc391dfb0 100644 --- a/lib/Google/vendor/google/cloud-storage/src/Lifecycle.php +++ b/lib/Google/vendor/google/cloud-storage/src/Lifecycle.php @@ -139,6 +139,79 @@ public function addDeleteRule(array $condition) return $this; } + /** + * Adds a AbortIncompleteMultipartUpload lifecycle rule to Object Lifecycle. + * + * Example: + * ``` + * $lifecycle->addAbortIncompleteMultipartUploadRule([ + * 'age' => 50, + * 'isLive' => true + * ]); + * ``` + * + * @param array $condition { + * The condition(s) where the rule will apply. + * + * @type int $age Age of an object (in days). This condition is + * satisfied when an object reaches the specified age. + * @type \DateTimeInterface|string $createdBefore This condition is + * satisfied when an object is created before midnight of the + * specified date in UTC. If a string is given, it must be a date + * in RFC 3339 format with only the date part (for instance, + * "2013-01-15"). + * @type \DateTimeInterface|string $customTimeBefore This condition is + * satisfied when the custom time on an object is before this date + * in UTC. If a string is given, it must be a date in RFC 3339 + * format with only the date part (for instance, "2013-01-15"). + * @type int $daysSinceCustomTime Number of days elapsed since the + * user-specified timestamp set on an object. The condition is + * satisfied if the days elapsed is at least this number. If no + * custom timestamp is specified on an object, the condition does + * not apply. + * @type int $daysSinceNoncurrentTime Number of days elapsed since the + * noncurrent timestamp of an object. The condition is satisfied + * if the days elapsed is at least this number. This condition is + * relevant only for versioned objects. The value of the field + * must be a nonnegative integer. If it's zero, the object version + * will become eligible for Lifecycle action as soon as it becomes + * noncurrent. + * @type bool $isLive Relevant only for versioned objects. If the value + * is `true`, this condition matches live objects; if the value is + * `false`, it matches archived objects. + * @type string[] $matchesStorageClass Objects having any of the storage + * classes specified by this condition will be matched. Values + * include `"MULTI_REGIONAL"`, `"REGIONAL"`, `"NEARLINE"`, + * `"ARCHIVE"`, `"COLDLINE"`, `"STANDARD"`, and + * `"DURABLE_REDUCED_AVAILABILITY"`. + * @type \DateTimeInterface|string $noncurrentTimeBefore This condition + * is satisfied when the noncurrent time on an object is before + * this timestamp. This condition is relevant only for versioned + * objects. If a string is given, it must be a date in RFC 3339 + * format with only the date part (for instance, "2013-01-15"). + * @type int $numNewerVersions Relevant only for versioned objects. If + * the value is N, this condition is satisfied when there are at + * least N versions (including the live version) newer than this + * version of the object. + * @type string[] $matchesPrefix Objects having names which start with + * values specified by this condition will be matched. + * @type string[] $matchesSuffix Objects having names which end with + * values specified by this condition will be matched. + * } + * @return Lifecycle + */ + public function addAbortIncompleteMultipartUploadRule(array $condition) + { + $this->lifecycle['rule'][] = [ + 'action' => [ + 'type' => 'AbortIncompleteMultipartUpload' + ], + 'condition' => $this->formatCondition($condition) + ]; + + return $this; + } + /** * Adds an Object Lifecycle Set Storage Class Rule. * diff --git a/lib/Google/vendor/google/cloud-storage/src/StorageClient.php b/lib/Google/vendor/google/cloud-storage/src/StorageClient.php index d79ef9f03..ce588ef54 100644 --- a/lib/Google/vendor/google/cloud-storage/src/StorageClient.php +++ b/lib/Google/vendor/google/cloud-storage/src/StorageClient.php @@ -47,7 +47,7 @@ class StorageClient use ArrayTrait; use ClientTrait; - const VERSION = '1.36.0'; + const VERSION = '1.42.1'; const FULL_CONTROL_SCOPE = 'https://www.googleapis.com/auth/devstorage.full_control'; const READ_ONLY_SCOPE = 'https://www.googleapis.com/auth/devstorage.read_only'; @@ -292,6 +292,8 @@ function (array $bucket) use ($userProject) { * set in conjunction. For more information, see * [Bucket Locations](https://cloud.google.com/storage/docs/locations). * **Defaults to** `"US"`. + * @type array $hierarchicalNamespace The hierarchical namespace configuration + * on this bucket. * @type array $customPlacementConfig The bucket's dual regions. For more * information, see * [Bucket Locations](https://cloud.google.com/storage/docs/locations). diff --git a/lib/Google/vendor/google/cloud-storage/src/StreamWrapper.php b/lib/Google/vendor/google/cloud-storage/src/StreamWrapper.php index 67a8cee37..93d2eab0a 100644 --- a/lib/Google/vendor/google/cloud-storage/src/StreamWrapper.php +++ b/lib/Google/vendor/google/cloud-storage/src/StreamWrapper.php @@ -120,15 +120,46 @@ public function __destruct() } /** - * Starting PHP 7.4, this is called when include/require is used on a stream. - * Absence of this method presents a warning. - * https://www.php.net/manual/en/migration74.incompatible.php + * This is called when include/require is used on a stream. */ public function stream_set_option() { return false; } + /** + * This is called when touch is used on a stream. See: + * https://www.php.net/manual/en/streamwrapper.stream-metadata.php + */ + public function stream_metadata($path, $option, $value) + { + if ($option == STREAM_META_TOUCH) { + $this->openPath($path); + return $this->touch(); + } + + return false; + } + + /** + * Creates an empty file if it does not exist. + * @return bool Returns true if file exists or has been created, false otherwise. + */ + private function touch() + { + $object = $this->bucket->object($this->file); + try { + if (!$object->exists()) { + $this->bucket->upload('', [ + 'name' => $this->file + ]); + } + return true; + } catch (NotFoundException $e) { + } + return false; + } + /** * Register a StreamWrapper for reading and writing to Google Storage * @@ -188,7 +219,7 @@ public static function getClient($protocol = null) */ public function stream_open($path, $mode, $flags, &$openedPath) { - $client = $this->openPath($path); + $this->openPath($path); // strip off 'b' or 't' from the mode $mode = rtrim($mode, 'bt'); diff --git a/lib/Google/vendor/google/common-protos/CHANGELOG.md b/lib/Google/vendor/google/common-protos/CHANGELOG.md new file mode 100644 index 000000000..7827d1f9a --- /dev/null +++ b/lib/Google/vendor/google/common-protos/CHANGELOG.md @@ -0,0 +1,108 @@ +# Changelog + +## [4.7.0](https://github.com/googleapis/common-protos-php/compare/v4.6.0...v4.7.0) (2024-07-25) + + +### Features + +* Add FieldInfo.referenced_types for generics ([246c334](https://github.com/googleapis/common-protos-php/commit/246c334480ce2f307fd1ed60f2712eda0d5da8b4)) + + +### Bug Fixes + +* Un-deprecate Endpoint.aliases field ([246c334](https://github.com/googleapis/common-protos-php/commit/246c334480ce2f307fd1ed60f2712eda0d5da8b4)) + +## [4.6.0](https://github.com/googleapis/common-protos-php/compare/v4.5.0...v4.6.0) (2024-04-03) + + +### Features + +* Add `api_version` extension to `ServiceOptions`, for collaborative versioning ([#82](https://github.com/googleapis/common-protos-php/issues/82)) ([2ff1de8](https://github.com/googleapis/common-protos-php/commit/2ff1de8c6ffa2b125f502516cbad1315264a9b7b)) +* Add `ErrorReason.LOCATION_POLICY_VIOLATED` enum value ([2ff1de8](https://github.com/googleapis/common-protos-php/commit/2ff1de8c6ffa2b125f502516cbad1315264a9b7b)) +* Add `Publishing.rest_reference_documentation_uri` to aid client library publication ([2ff1de8](https://github.com/googleapis/common-protos-php/commit/2ff1de8c6ffa2b125f502516cbad1315264a9b7b)) + +## [4.5.0](https://github.com/googleapis/common-protos-php/compare/v4.4.0...v4.5.0) (2023-11-29) + + +### Features + +* Add auto_populated_fields to google.api.MethodSettings ([#74](https://github.com/googleapis/common-protos-php/issues/74)) ([d739417](https://github.com/googleapis/common-protos-php/commit/d7394176eb95f0e92af4e93746dba8f515ba9bc2)) + +## [4.4.0](https://github.com/googleapis/common-protos-php/compare/v4.3.0...v4.4.0) (2023-10-02) + + +### Features + +* Public google.api.FieldInfo type and extension ([#71](https://github.com/googleapis/common-protos-php/issues/71)) ([4002074](https://github.com/googleapis/common-protos-php/commit/40020744c65e7561dec08e1cd2994afcc51ec771)) + +## [4.3.0](https://github.com/googleapis/common-protos-php/compare/v4.2.0...v4.3.0) (2023-08-22) + + +### Features + +* Add new FieldBehavior value IDENTIFIER ([#67](https://github.com/googleapis/common-protos-php/issues/67)) ([6c6c21f](https://github.com/googleapis/common-protos-php/commit/6c6c21fc4a2f4711aeddad11082ed17acaf4733c)) + +## [4.2.0](https://github.com/googleapis/common-protos-php/compare/v4.1.0...v4.2.0) (2023-07-25) + + +### Features + +* Add a proto message to describe the `resource_type` and `resource_permission` for an API method ([#64](https://github.com/googleapis/common-protos-php/issues/64)) ([8a0ff5f](https://github.com/googleapis/common-protos-php/commit/8a0ff5f9ffcf3683fc4718e85e97f45a001a1925)) + +## [4.1.0](https://github.com/googleapis/common-protos-php/compare/v4.0.0...v4.1.0) (2023-05-06) + + +### Features + +* Add ConfigServiceV2.CreateBucketAsync method for creating Log Buckets asynchronously ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add ConfigServiceV2.CreateLink method for creating linked datasets for Log Analytics Buckets ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add ConfigServiceV2.DeleteLink method for deleting linked datasets ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add ConfigServiceV2.GetLink methods for describing linked datasets ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add ConfigServiceV2.ListLinks method for listing linked datasets ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add ConfigServiceV2.UpdateBucketAsync method for creating Log Buckets asynchronously ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add LogBucket.analytics_enabled field that specifies whether Log Bucket's Analytics features are enabled ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Add LogBucket.index_configs field that contains a list of Log Bucket's indexed fields and related configuration data ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) +* Log Analytics features of the Cloud Logging API ([#60](https://github.com/googleapis/common-protos-php/issues/60)) ([b18d554](https://github.com/googleapis/common-protos-php/commit/b18d55421cbe1e55d62b5d149e56be23db8c4286)) + +## [4.0.0](https://github.com/googleapis/common-protos-php/compare/v3.2.0...v4.0.0) (2023-05-01) + + +### ⚠ BREAKING CHANGES + +* remove files unknown to owlbot ([#59](https://github.com/googleapis/common-protos-php/issues/59)) +* add owlbot automated updates ([#54](https://github.com/googleapis/common-protos-php/issues/54)) + +### Features + +* Add owlbot automated updates ([#54](https://github.com/googleapis/common-protos-php/issues/54)) ([6d9134d](https://github.com/googleapis/common-protos-php/commit/6d9134d2f927e9c4aa3165e823477e25ef8ff38f)) +* Regenerate all common protos from new owlbot config ([#58](https://github.com/googleapis/common-protos-php/issues/58)) ([5dac653](https://github.com/googleapis/common-protos-php/commit/5dac653bdd60c4dbaec45e73e0ec487e5aeac9b1)) + + +### Miscellaneous Chores + +* Remove files unknown to owlbot ([#59](https://github.com/googleapis/common-protos-php/issues/59)) ([f541342](https://github.com/googleapis/common-protos-php/commit/f54134263a142e278c56f5e03e5a3d8c6f72aac3)) + +## [3.2.0](https://github.com/googleapis/common-protos-php/compare/v3.1.0...v3.2.0) (2023-01-12) + + +### Features + +* Refresh types ([#49](https://github.com/googleapis/common-protos-php/issues/49)) ([bd71fc0](https://github.com/googleapis/common-protos-php/commit/bd71fc05cbca1ccd94b71a42c227f0d69c688f07)) + +## [3.1.0](https://github.com/googleapis/common-protos-php/compare/v3.0.0...v3.1.0) (2022-10-05) + + +### Features + +* Make autoloader more efficient ([#45](https://github.com/googleapis/common-protos-php/issues/45)) ([cdff58a](https://github.com/googleapis/common-protos-php/commit/cdff58a3ff6c42e461f18f14c0bbd8e171456924)) + +## [3.0.0](https://github.com/googleapis/common-protos-php/compare/2.1.0...v3.0.0) (2022-07-29) + + +### ⚠ BREAKING CHANGES + +* remove longrunning classes from common protos (#41) + +### Miscellaneous Chores + +* remove longrunning classes from common protos ([#41](https://github.com/googleapis/common-protos-php/issues/41)) ([e88dd1d](https://github.com/googleapis/common-protos-php/commit/e88dd1d5dfef93358dc0bd7f3d62d09bbfd750b6)) diff --git a/lib/Google/vendor/google/common-protos/CODE_OF_CONDUCT.md b/lib/Google/vendor/google/common-protos/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..46b2a08ea --- /dev/null +++ b/lib/Google/vendor/google/common-protos/CODE_OF_CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, +and in the interest of fostering an open and welcoming community, +we pledge to respect all people who contribute through reporting issues, +posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project +a harassment-free experience for everyone, +regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, +such as physical or electronic +addresses, without explicit permission +* Other unethical or unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. +By adopting this Code of Conduct, +project maintainers commit themselves to fairly and consistently +applying these principles to every aspect of managing this project. +Project maintainers who do not follow or enforce the Code of Conduct +may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue +or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) diff --git a/lib/Google/vendor/google/common-protos/CONTRIBUTING.md b/lib/Google/vendor/google/common-protos/CONTRIBUTING.md new file mode 100644 index 000000000..23c9455dd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/CONTRIBUTING.md @@ -0,0 +1,45 @@ +## Contributing + +We are pleased that you are interested in contributing to our work. + +### Generated Protocol Buffer Classes + +The classes in this repository are generated by the protocol buffer +compiler, as known as protoc. As such, we can not accept contributions +directly to these generated classes. Instead, changes should be +suggested upstream in the [API Common Protos][api-common-protos] +repository. + + +### Documentation + +We want for both protocol buffers and the types that we have provided here +to be understandable to everyone, including to those who may be unfamiliar +with the ecosystem or concepts. + +That means we want our documentation to be better, and welcome anyone +willing to help with this. For documentation in the generated classes, please +open a pull request against the [API Common Protos][api-common-protos] +repository. + +Any improvements to READMEs or other non-generated documentation or +development scripts in this repository would be greatly appreciated - please +open a pull request. + + +## Contributor License Agreement + +Before we can accept your pull requests, you will need to sign a Contributor +License Agreement (CLA): + + - **If you are an individual writing original source code** and **you own the + intellectual property**, then you need to sign an [individual CLA][]. + - **If you work for a company that wants to allow you to contribute your + work**, then you need to sign a [corporate CLA][]. + +You can sign these electronically (just scroll to the bottom). After that, +we'll be able to accept your pull requests. + + [individual CLA]: https://developers.google.com/open-source/cla/individual + [corporate CLA]: https://developers.google.com/open-source/cla/corporate + [api-common-protos]: https://github.com/googleapis/api-common-protos \ No newline at end of file diff --git a/lib/Google/vendor/google/common-protos/LICENSE b/lib/Google/vendor/google/common-protos/LICENSE new file mode 100644 index 000000000..261eeb9e9 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/LICENSE @@ -0,0 +1,201 @@ + 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/lib/Google/vendor/google/common-protos/README.md b/lib/Google/vendor/google/common-protos/README.md new file mode 100644 index 000000000..29c350242 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/README.md @@ -0,0 +1,46 @@ +## Common Protos PHP + +[![release level](https://img.shields.io/badge/release%20level-general%20availability%20%28GA%29-brightgreen.svg?style=flat)](https://cloud.google.com/terms/launch-stages) + +![Build Status](https://github.com/googleapis/common-protos-php/actions/workflows/tests.yml/badge.svg) + +- [Documentation](https://googleapis.github.io/common-protos-php) + +This repository is a home for the [protocol buffer][protobuf] types which are +common dependencies throughout the Google API ecosystem, generated for PHP. +The protobuf definitions for these generated PHP classes are provided by the +[Common Components AIP][common-components-aip] repository. + +## Using these generated classes + +These classes are made available under an Apache license (see `LICENSE`) and +you are free to depend on them within your applications. They are +considered stable and will not change in backwards-incompaible ways. + +They are distributed as the [google/common-protos][packagist-common-protos] +composer package, available on [Packagist][packagist]. + +In order to depend on these classes, add the following line to your +composer.json file in the `requires` section: + +``` + "google/common-protos": "^2.0" +``` + +Or else use composer from the command line: + +```bash +composer require google/common-protos +``` + +## License + +These classes are licensed using the Apache 2.0 software license, a +permissive, copyfree license. You are free to use them in your applications +provided the license terms are honored. + + [api-style]: https://cloud.google.com/apis/design/ + [protobuf]: https://developers.google.com/protocol-buffers/ + [common-components-aip]: https://google.aip.dev/213 + [packagist-common-protos]: https://packagist.org/packages/google/common-protos/ + [packagist]: https://packagist.org/ diff --git a/lib/Google/vendor/google/common-protos/SECURITY.md b/lib/Google/vendor/google/common-protos/SECURITY.md new file mode 100644 index 000000000..8b58ae9c0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +To report a security issue, please use [g.co/vulnz](https://g.co/vulnz). + +The Google Security Team will respond within 5 working days of your report on g.co/vulnz. + +We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue. diff --git a/lib/Google/vendor/google/common-protos/composer.json b/lib/Google/vendor/google/common-protos/composer.json new file mode 100644 index 000000000..f181977f6 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/composer.json @@ -0,0 +1,30 @@ +{ + "name": "google/common-protos", + "type": "library", + "description": "Google API Common Protos for PHP", + "keywords": ["google"], + "homepage": "https://github.com/googleapis/common-protos-php", + "license": "Apache-2.0", + "require": { + "php": "^8.0", + "google/protobuf": "^v3.25.3||^4.26.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "autoload": { + "psr-4": { + "Google\\Api\\": "src/Api", + "Google\\Cloud\\": "src/Cloud", + "Google\\Iam\\": "src/Iam", + "Google\\Rpc\\": "src/Rpc", + "Google\\Type\\": "src/Type", + "GPBMetadata\\Google\\Api\\": "metadata/Api", + "GPBMetadata\\Google\\Cloud\\": "metadata/Cloud", + "GPBMetadata\\Google\\Iam\\": "metadata/Iam", + "GPBMetadata\\Google\\Logging\\": "metadata/Logging", + "GPBMetadata\\Google\\Rpc\\": "metadata/Rpc", + "GPBMetadata\\Google\\Type\\": "metadata/Type" + } + } +} diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Annotations.php b/lib/Google/vendor/google/common-protos/metadata/Api/Annotations.php new file mode 100644 index 000000000..7bec22e34 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Annotations.php @@ -0,0 +1,29 @@ +internalAddGeneratedFile( + ' + +google/api/annotations.proto +google.api google/protobuf/descriptor.protoBn +com.google.apiBAnnotationsProtoPZAgoogle.golang.org/genproto/googleapis/api/annotations;annotationsGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Auth.php b/lib/Google/vendor/google/common-protos/metadata/Api/Auth.php new file mode 100644 index 0000000000000000000000000000000000000000..7240db844379d53f2ab9cb2d404d9cd92e44809b GIT binary patch literal 1303 zcmZ`(T~8B16tzGry+uA&jcbf%tR$2OZNw*wXiC6}QQHunOk*?M-nIk7%rY}e1;Y=~ zN8kLH-rX&=fcB-`+jGx7=gi!F{Wctg@Ql?_q2Ug@taHZP09k0X(}9+(6ZLv%SfGzX zA<>i>+i9@RjRUs3vv=^6TCI*ufK}Glx-YT9Ls8+88qJA z|IFKiv|OfRC`y=*Lq$a?Qj%JE>yR~(MC(tp=~7|iN%=3jd=W-Uq#C{jPeGNrt?23gHXmp?_1g^kCPjE$IKA5S7-@R)>K zkAcsn)Wh~rxPgvbJ22RdEph2*iD1@y0dr=e!@r#feKbjXjkWj{3Ll2`8>?EYX;!0zm?;j|5T{ri3c~%)nec z^D-O{sN5a-pNE{Vme^BrqMkh*9@%zeL`vcHsU-vNncGTwc%x|h}`5hHOrh}J3|HS zl^?=S;1}XJT~?SX@{;7AMIjz0qY-fI zMVB!RfmbkYbaAKa;AW%kJW*5;CESA=4x%Usp-N&}9TM*Xm|xM0AjHTeh?sbQTXy{; zNa7Po1}%*rSTQ|9$P0-OxSsLQ4}{edC&Q3>SV$t(YmW+-GAbzv>35~`7>`IOKymM4 zM+x&JjTlY|UFJdg0B38a*u6MX=Q_qW3heZ#>X?HzlfW4X2MrJ&r?HHAaAeA`oHemMuG zw0-n*1)1|)H&B+TsCw+aM5|M4jb~_?Cm{&4fEUXfhYu>Zu*wwEQ~BNBOK4-}-zcFq z0U>zG6GbhQ*NuB$q5sohL|fVvvoMwpCh+oD}r;2H@4B{mv7P~iBCb*-&|Gv^|OUE z?o&aAA*h@jn`n`YXU;LISgq7U(Zw2y&=~p zy^N~+OpR2NNj}**N00vlF*eZR1x%)PtHNE8Fad4${KD0WZwkAB?)_^BMh|VvIdh$! z)#-n*oOZY4e(Ln?=1Kds-E5Q=jQgl`((UvetK+yj`=zu{+m>xNI}JCZck^7a zUP4=`iNMr+>N3?C+EN$Aj3xEWX%p$g+lBMywBLd#BrK>zJg5f1w5ioBr5aY~TSNfA tq8@k=8`0qCufJc#rIuy4hbx-+YCj*0=h?i?jOX0Z)W~cKuhBI^e*n+djT`^~ literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Billing.php b/lib/Google/vendor/google/common-protos/metadata/Api/Billing.php new file mode 100644 index 000000000..818aac14f --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Billing.php @@ -0,0 +1,33 @@ +internalAddGeneratedFile( + ' + +google/api/billing.proto +google.api" +BillingE +consumer_destinations ( 2&.google.api.Billing.BillingDestinationA +BillingDestination +monitored_resource (  +metrics ( Bn +com.google.apiB BillingProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Client.php b/lib/Google/vendor/google/common-protos/metadata/Api/Client.php new file mode 100644 index 0000000000000000000000000000000000000000..8ff39b070e33c055c936c2c8184adba0882c3a88 GIT binary patch literal 3578 zcmbVPUvm;y6fYr(<`4<4CLy$SR%$hBB`r={ht#$N5Vs;QfOhI+X6Le8maEI&o!z@? z?D*7g(!O;1T{`^`{TO}e*}K3l2~j7!u(S8~JO9tQXTSTw89DHoTBkO3iJ$|uf24{L zRUMZLZg5NO`@L4Gs@0a-Z1vPyRqI_vs>glTpe5Dh+_dN(aoC<=F=~r~ zlmTFqG4&i`P_^DZcuWNu5J3*>5`I{A*gk+^5zkXAk_Nwmia*EiTg*^BK?MF?W1h}z zCK$2U8?^GiIwY1yk$Mt4^ld{hZmR*IWgB$&rW(o&u-6=pUfoxx2DAf5(aA&27Sy$g zby%gI;W9^Xw~f$J$)sWyp5V>y&57DT92=^;p^c@|2_x^T!u4rfyQ;cW_^!P#?G6OI zojn~c4$onOphKgsASNx9BA+4=i-AxD-$shVq#}_o)@rH;o~v48^kt!biGT3 zV7BQgS3q$omL$c@>H}_gy6>`VLQU+h9V}%NN(t6c8)Bu~UUo@M?xu^^3Xyq*u+SQ; z?-KV2(>(>}|4YK=+~G{?2Aq3IT@M2ps#5O2x+N2%WBN^sY7(esJFX^{I3*WY?FrrX z$JAwpPVvFZCXsYr*@Fwu$xEVp6Bo0a_&Qb0#%2A4fSEC<+i;u+za{Z=x+{(ohhvvV z@a>cE_9%kig$?IOjJO>!vXYUD8`PGNnGW>9<^vj0c24@xM8J%IS_WL$R78~ANi9_g znUPS7>-Uc$%Eu?QbPzBj+=i6NBlss0z7_YQ&Zpq~pGkmrFm}8VR+@qqjw!}r5b=Xr zN)_kgfCCL7QyI!8#(}=lndkXb7A8fNYswB>#8SoF+rd1;&;~U-lt){T#+K2&5qGgX za8_nb`TjDjn@o)SzHX5|wX!4m_6lqn7)JgI=e0gL7nEQvF|=(>L20N+$CA_?Y!mi6 z`&{z&VV%1svDq7`Kl=jTri-7)BQaO_tr%F@hl~|AOB9N+48_$`1^)Rog&L2VjdGdH;T`Ysr-)s(R_|I--p-#KTD84Hlj0d-lG;ZaKW3j z-gkJHbKBHi-?nk`%ey>PydF>Byo^Ev;hhkzdQVjIDXfEx3Nn z#%itG)0&G+M04s|@8Oe!3@Ddiqg}2%D%WfJ<8l-KI+@D{4AOWdOcRG!`9UgF+z!4h z+KFf7$>wQt3wPN9Uc-APwPl9)!XqSk^23SPHfAJP5WM}^^Y2T`^>SP5uS(M08?&wa Wi|_*@_C0dyw}?cB-wbczEx`Ymy=zYZ literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/ConfigChange.php b/lib/Google/vendor/google/common-protos/metadata/Api/ConfigChange.php new file mode 100644 index 0000000000000000000000000000000000000000..b0444eb417b735b750018d3555644018b6fd034e GIT binary patch literal 960 zcmaJ=ZEq4m5SG#w8JcR(L`jThY@3w&0!jS_Rs$SGKD1nvnrKMKayJ~C9J}Y;UQIRp z4!`>k{DUJOUrvj?MR8XC(aa;b^Flzu=B7V?HG#f+u}!fX@leUg(V@+z zPij4@)KWWMl}*#}8P*KPX7d)wQ&dqx`Ra%fsU#AujCYz~xjtpgUcKcj9&OKCmp#*a zsI3E2*b)3L!qfjRzyjm1>jmxqEWl2F%+@_9Q9uh4s#?H8t!(WCKK*E)a_^RBo{adiuewaST=4{T?y{U@+( zPSyjcc&p*-{TU9=hXA>ZkKs}Gefy%{n~Xj?y~*XpN2k{voDF*R{X13}w%WF>j|Hm& zr4POH;U|6Buy)|?`Or2|#m-mQ)zZ!p>FnhPlL^8peCe)Q@@1ekU6+yH@JVFKZWxyy sYn&6m8B5E&1atYdvDt4sgXwk#dwsNC;Y*{8oRI!0qAb$rWeH1wKh;(wMF0Q* literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Consumer.php b/lib/Google/vendor/google/common-protos/metadata/Api/Consumer.php new file mode 100644 index 0000000000000000000000000000000000000000..a62c598fa434499de18ff4c07974b10cbe843909 GIT binary patch literal 909 zcmZ`%U2hUW6qSNad#M#yAMkC8O}b4Kl4^Va(Ud~TCdd*?UkphzEO(bN%gkhU)&vdD z{uzIyvmdOO+I^Y1JLjBx?#G8uaw*{z86rnTH7>|}P4p6pR6+|+gk&E3J}Tmgm1H5R zCLw*7jNK_2^quL6p++KB9=1s!L=a+&O4jlOkK&a9rz!xPt}v3+Lo%H7KBJ}!s_AT) z5@wf@bpX7OMiIHniSQGM`D8o~nMWc`wK+~%bjLW;jE3xoaoQz54I?z<`&d8bo@RoR zgy3=y?Q@c8CfHLcOl4iNwJ=GFHHFR`u2FFs&iWX6ib*Zh#6a8a0Cmx#R9nk>N^qG6t~pbn~yB_ak*F&X|GND?E;w4&fr%WUOw1& z3$mxC8A+oH&rFry(9`CSs5HaKvH{G5@~B=SWxIOuqWPEA%(3gn?-Cqr1M3JX$wUpI zWFJ~BsOYuC`ksl7FHZhPFLb5`Xg!DOB5$vmP`#X}G)8c=)lWfBp?W*MnGCL+YiH1} zJ+cnru``~&e^)D62T0s8xDPI5rErW2N_GyILlT z7L(G~L0)DcLdt`tP(dp|E|b?*_GH=?rRyA_`p!HwTkW%;^G`J2PZ@8|iov|j=Do8X O53WXv%(h?y8-PEyAsIga literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Context.php b/lib/Google/vendor/google/common-protos/metadata/Api/Context.php new file mode 100644 index 000000000..74ffd87ad --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Context.php @@ -0,0 +1,36 @@ +internalAddGeneratedFile( + ' + +google/api/context.proto +google.api"1 +Context& +rules ( 2.google.api.ContextRule" + ContextRule +selector (  + requested (  +provided ( " +allowed_request_extensions ( # +allowed_response_extensions ( Bn +com.google.apiB ContextProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Control.php b/lib/Google/vendor/google/common-protos/metadata/Api/Control.php new file mode 100644 index 000000000..ead6700ef --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Control.php @@ -0,0 +1,32 @@ +internalAddGeneratedFile( + ' + +google/api/control.proto +google.api"Q +Control + environment ( 1 +method_policies ( 2.google.api.MethodPolicyBn +com.google.apiB ControlProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Distribution.php b/lib/Google/vendor/google/common-protos/metadata/Api/Distribution.php new file mode 100644 index 0000000000000000000000000000000000000000..052aa6c2bdea4fe341900215c1dae8685ddf5287 GIT binary patch literal 1699 zcma)6?QYXb5GAAybWAHSAVrogcMAwoi8@l?S4u$*?F|(l$-U|?6e-%+>tuzqYj)RA zKz$i_1|H_V4YO;<4Jxh3A7|}3XU@)?nWxXQSqAq=p9!X@VKJF}CT7M+rlgUPOvxlq z5~fHb=NV6#3JKXCkhg;)a;5WFcc{FO3%-9SXygpy_Cz=}7U+NHxUJ zZgYs3VRIFm#^%9_wnc{fw74-;3kwqW@syTa`2`^dWq|3V&VLaUY7$AsQn1y9{++ zzyi0;LQG+gyZ<-f+H&Llby$sLE=;pVYOT6|4OZriisofJ)qDa?ozKTI8S4)@RV*II z>?22WNYSjjh;3L^R7_cO1&?0mPIxLNT+S2zXQTXQurbM__sooCW?6Kz;cySm#r0hH zposQw!+ME#qIL5MsiW#Au*QzrJWHw4O~6-PXY*XfgEBJMgw;Zo2lY7@t^zgR9_VpV zfZ#_R)_+ydhmDjAM%B0wq8-fZY@eI&7kv2IfnQ$o|Am|EIFo`2J75)?Exgz1{2|-H zDFafzg6l|$6UR38POzxXVr;@{hW#z@s4+B}&9PA$RakS~Is?E} z(fa@!xV;yja2$I#mPf#?m0|7Oi*iJ!GR2t)rJA;3g literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Documentation.php b/lib/Google/vendor/google/common-protos/metadata/Api/Documentation.php new file mode 100644 index 000000000..2c80046e4 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Documentation.php @@ -0,0 +1,43 @@ +internalAddGeneratedFile( + ' + +google/api/documentation.proto +google.api" + Documentation +summary (  +pages ( 2.google.api.Page, +rules ( 2.google.api.DocumentationRule +documentation_root_url (  +service_root_url (  +overview ( "[ +DocumentationRule +selector (  + description (  +deprecation_description ( "I +Page +name (  +content ( " +subpages ( 2.google.api.PageBt +com.google.apiBDocumentationProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Endpoint.php b/lib/Google/vendor/google/common-protos/metadata/Api/Endpoint.php new file mode 100644 index 000000000..a51aa072e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Endpoint.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +google/api/endpoint.proto +google.api"M +Endpoint +name (  +aliases (  +targete (  + +allow_cors (Bo +com.google.apiB EndpointProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/ErrorReason.php b/lib/Google/vendor/google/common-protos/metadata/Api/ErrorReason.php new file mode 100644 index 0000000000000000000000000000000000000000..22bd2d622dd00cd4f3ef0782aeeba92025359246 GIT binary patch literal 1600 zcmaJ>+iu%N5N*;lmrau}YbUv7{q$yPekCC&Ch4?m=tAH!slgN zs5ptsIGV+O0O1odiDrd{{F||pc``2JG$AHIBx8N}iYzcq?8_{L22V)M!ZSTXzayTM zI!~h6$kD|(kFzq(JqT^Lr@CyEGM2+vS7i-cJRye*j_vjhk|(6h=X$w1A-OK+d2(Fw zHUO8+zlz!0ckvYudU4T|?ZOlen?RFxfd0OZcK%m>j27+|Oy~7q_t3*7k?}TKXTC3d zJdR;g_pIRbIYTwv&NAJ8nkkM_RsNLzReh9bjm zm)o4Vf%Oz`pl1*yLN`z{Fe21-aW$7^;7(j8_mukSJgmti1 z4d+I=y8RmY8Qw(CB``M1*+QK1>#A#pP$k;c@Kt9B^B!>5TF0XUwBMkHlJ*$viVS>i zS3_u&-!QY0Lm9Av@~BS-EC8XGnQ!79v?2W7zvKfcYYYE?cE5JNXVd|hx{Gboe7($Y z3t{k*!^^OC@Kf}tXM0PN-8FhN%kuT2>~%8q7;bCp`h9k+rN>#FB=6R5_LYB{&Z1=6 zO7rQ_R43JGJzBWnWfwP&@A2{_{(SpR4_?ao-74+JgXW05S=^?jQ}&-{tcqM*tV?u> F&_57y$fW=P literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/FieldBehavior.php b/lib/Google/vendor/google/common-protos/metadata/Api/FieldBehavior.php new file mode 100644 index 0000000000000000000000000000000000000000..b8a8d26ac9e55a43cb66622e35b0a3ceae022c49 GIT binary patch literal 915 zcmah{-Hww$7`40Wx{hu|5^wfG$GFLMjnWJ6TB`w}m4pIz!DLMnGKGOo!p@LkFj3PR zAH|38`5d5&-E559FhA#f-#K%>x9^K}0balvrkEpv6S(>Y#TvtcGr?k(!&Q~0n8TP| z6(q-8gV6M#>jlsI*UEXPAskYP%2o=TY6sFRA5d~zBF+eb5aP#eF+_n zGAz2+s!s;z+qQK%lEOi&aWuLmasmaf@NRbqITjVC<3@K~VAHJ{Wv}0ntqwg&y0%l9 z#GnJ#v@`H?A3Xa{1S)6&n#}0rISfxbI!fz+mbDNnxqN#2~6C< z6_Gf=5-%q?W!X2!X$oUabrchQN1(nWTgB9eRAQ-qM>JJssiZij-;~%Mgg8!# zV&BJx8S^FO3^ZZNd}5tIQBz}&60XekV5h;=ewEjy!z2+5$IBr}eL)k+g{z>QPDErm zC4FO^Y}@K`Gz6>A*y-F8*#jvuvfmv*5SaT0GTRPHkHw-|zbdFvuE0D+^^l7-mWLInSk1H7_Mc*Q z3A4vJ#ym%cASx?F%{uVpT|&~s1E^Y$&tB~F=IUX#!?ix6`j-A2nd9l~sz3J@*I(Sx zCui)8hQYx15G8GzCesf}pweCtrmfVi1c@lOgn|+ZX%El{^@Jit&hBJm*xHuuMFi9X zf2F^YBjepAL@M3O+T%AfZ{EzjdZT9=_Spa>8tyP=lR0xUWZEdFB9*d9Hl3njk-E|% zMbl#J^n!i7xMc56&o7^nt5unau)`9ik`&uqi}uVp-O3{XNPdM@^9b2s*#Cfz$K3JJ zAP0|nT66)Tlv~Tr$O(P|qfcj(R7A`=?&x{v+Q1W&~eVtB%)Jhe!Ux3SYqMouWn zyu*czFg#*KOpiU#iYhu`f71_rkyPO5Tskz8r=wG}krCP{GbCuIlb~Bj<1OJ)nbwCB zQx+B+JDpo3Pna_qE@x-Vpv#Qx=DdA?>%}Q&_WZRddGz9Vk@h{w9xj01?GSFNu=`)V zn^2fr)P}uFsCrSG`>!}Po`O#&c`uED#o!vi{=}~ zWBjhUv?OY1|DhN@Q9 z1=aGt1GSj^9R_Qq6|=ZBx_6Fkjw~kh8minternalAddGeneratedFile( + ' + +google/api/httpbody.proto +google.api"X +HttpBody + content_type (  +data ( ( + +extensions ( 2.google.protobuf.AnyBh +com.google.apiB HttpBodyProtoPZ;google.golang.org/genproto/googleapis/api/httpbody;httpbodyGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Label.php b/lib/Google/vendor/google/common-protos/metadata/Api/Label.php new file mode 100644 index 0000000000000000000000000000000000000000..62f887293115791085165116fe6c860c9a781ecb GIT binary patch literal 812 zcmZ`%U279T6m`>D%q`Tgg5>d9D@~zppniafQ4*pdP?Mm+2ML79=4LxMof&3lg(&$a zKKbkq^wF8!m;|f)vdi6b?mhRM`|`EE((n*_B*`#KbDS;FUJ+`etcsPuS+-b^!B|~u zF33cP-60N!V|>%?j~_T{sxlK(0~4hZL3O5iU9cI6C~pBE*)^q_#e}_4=N(x#XO>NR zIeOC8ya^BsmZo^=S?~?eJvy5S9%E{mb*~eiPPyckGr_+)jV)X-k&`_>s>+WWA{=Xd$ zp{PeLiR149+|7O6t`#1_-e+1?0}N{A@CCpZCNi4ZrKW1h)s8M6McWS1U+n0kM~@vi zya$K#wOP*Z>Ynd+d=BL;0^s1o_p(s)k7X2mdbSplD8XbBDU;L_lKElPi(hWZbbE76;cw_y5d0|Z_u8ZW>>$TJIo-H- TUWBrf;eYeXkwsK1SONS7B7FJ* literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/LaunchStage.php b/lib/Google/vendor/google/common-protos/metadata/Api/LaunchStage.php new file mode 100644 index 0000000000000000000000000000000000000000..3f19c3ce1315d0fbd6aabec2b30fcc007d3ea926 GIT binary patch literal 811 zcmaJfgc5G5fkbfA^-i33Q3sMHkE%k^@zwXya_0mE2uxy*>cS zKj1fT;Fq$tLx@y?CCk>%dvD&%+mD}5dzCV3qsj13z$XggG6~(;C648uVCd17lH7w$dLJ2^!d!8mNF0QHH%Yj z`46#c>%#~oF(-^=$m^F_YUbGUMA-p5_{T+%&ur(N`_gbNSv>FaG}Iz7N(UC&YDL`a zH9N&%V6uZoXZ)}`qUI*kvR(Mj1-ARY!r9d)vGYMzt9{#Rn?ijL z%xM?!vkI^OyM7nSa>J(c?necl9W2>>1uq9=HtO9hCR5_k#cVVQXwSd)Y2SI|zJSx& z$R7p+I;5kiJvw$z;Uu`FCC7QGkMj;#AxdI3k1KhB#ICDb%`jN}R{; zF;qR`)Z8a!cW`DeSL3h2u5;k7$Rw!TUG3_TikXZWN=MCz%i?Y|%aR=} m&2L}ZzQ3w9j|BemxBz^(*zfCo8N)$p|4ghvmf>t+3-B8_n)H?c literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Log.php b/lib/Google/vendor/google/common-protos/metadata/Api/Log.php new file mode 100644 index 000000000..6fe86a67c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Log.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +google/api/log.proto +google.api"u + LogDescriptor +name ( + +labels ( 2.google.api.LabelDescriptor + description (  + display_name ( Bj +com.google.apiBLogProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Logging.php b/lib/Google/vendor/google/common-protos/metadata/Api/Logging.php new file mode 100644 index 000000000..179277d6d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Logging.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +google/api/logging.proto +google.api" +LoggingE +producer_destinations ( 2&.google.api.Logging.LoggingDestinationE +consumer_destinations ( 2&.google.api.Logging.LoggingDestination> +LoggingDestination +monitored_resource (  +logs ( Bn +com.google.apiB LoggingProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Metric.php b/lib/Google/vendor/google/common-protos/metadata/Api/Metric.php new file mode 100644 index 0000000000000000000000000000000000000000..7a348b03f163229785d3f9abe8d7ffc1b33920af GIT binary patch literal 1808 zcma)7>u%yk6fT6Y;XoqGT{SMNuBPd#VYM4*)2qm)6$CG`mH=uX(pE^;U=NP9#&+#- zC0gZKD)kBaRDF(~8FR7NB`SaL%$&=2zVn@#S3ie$A$&o)%x4kh%qG(X;dhLLQNRN$ z@W?co%~(XNU>>?2i|T}Q2Bbe25xrxKK1bI$NFs|hi4z2l#~L(r8*|1Z*Q(1H06v|w zIHVRM-C_HhacWaeCtYbiX@%|ufaTFRCU}N!@Fx)bg~`-&EfRCe@$Z=%o38J2mwN6W zi1L!ms24MIecyJL_!f5qp9qJ6Z?W2QlExIa&%yw!x+E(ALs2LeIWc_BBAX7fFemxMCDqTSeQE^?LVQ|| zBbwhSDOI8Q!inr%wLe+Uq0x3E6hiTR-jH$$J)L`{V|m7r981gT2XF3hKlXRp+^^{ zEccPz?ZN?Kmcyn2?v&5Jdobm80l1dV>KRnB4bdtX?CAVB8>}ZACiSKg(B=Um4kBio z5lgQJS$V7-BGskpKRM8LX8U?8o9Nx{Z0)?3Q@?`4n9f6wnIVhZz{ZY>az9-mTxq7h z61Liait9Tp=BCY%HrddJ98LxRDPq~rCvbeNkA5+(%r{2AV~+bbL;cElZRj24Beewk z-PX9PD>?Dm(R-tol2?xauEy8nUTb9B>dM~9Z&2FwxC)=#wt8dT9K9XtTj36%&>jqW zX*8oh`uz8U6z{b4zHPT*1BsRxnMaF{Qf)<};KNSt|CF6Q!~_&Zf3bcfMF0Q* literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/MonitoredResource.php b/lib/Google/vendor/google/common-protos/metadata/Api/MonitoredResource.php new file mode 100644 index 000000000..f8c023964 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/MonitoredResource.php @@ -0,0 +1,50 @@ +internalAddGeneratedFile( + ' + +#google/api/monitored_resource.proto +google.apigoogle/api/launch_stage.protogoogle/protobuf/struct.proto" +MonitoredResourceDescriptor +name (  +type (  + display_name (  + description ( + +labels ( 2.google.api.LabelDescriptor- + launch_stage (2.google.api.LaunchStage" +MonitoredResource +type ( 9 +labels ( 2).google.api.MonitoredResource.LabelsEntry- + LabelsEntry +key (  +value ( :8" +MonitoredResourceMetadata. + system_labels ( 2.google.protobuf.StructJ + user_labels ( 25.google.api.MonitoredResourceMetadata.UserLabelsEntry1 +UserLabelsEntry +key (  +value ( :8By +com.google.apiBMonitoredResourceProtoPZCgoogle.golang.org/genproto/googleapis/api/monitoredres;monitoredresGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Monitoring.php b/lib/Google/vendor/google/common-protos/metadata/Api/Monitoring.php new file mode 100644 index 000000000..2b13194a2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Monitoring.php @@ -0,0 +1,35 @@ +internalAddGeneratedFile( + ' + +google/api/monitoring.proto +google.api" + +MonitoringK +producer_destinations ( 2,.google.api.Monitoring.MonitoringDestinationK +consumer_destinations ( 2,.google.api.Monitoring.MonitoringDestinationD +MonitoringDestination +monitored_resource (  +metrics ( Bq +com.google.apiBMonitoringProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Policy.php b/lib/Google/vendor/google/common-protos/metadata/Api/Policy.php new file mode 100644 index 000000000..9d3ce0f48 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Policy.php @@ -0,0 +1,35 @@ +internalAddGeneratedFile( + ' + +google/api/policy.proto +google.api google/protobuf/descriptor.proto"S + FieldPolicy +selector (  +resource_permission (  + resource_type ( "S + MethodPolicy +selector ( 1 +request_policies ( 2.google.api.FieldPolicyBp +com.google.apiB PolicyProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Quota.php b/lib/Google/vendor/google/common-protos/metadata/Api/Quota.php new file mode 100644 index 000000000..422638385 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Quota.php @@ -0,0 +1,55 @@ +internalAddGeneratedFile( + ' + +google/api/quota.proto +google.api"] +Quota& +limits ( 2.google.api.QuotaLimit, + metric_rules ( 2.google.api.MetricRule" + +MetricRule +selector ( = + metric_costs ( 2\'.google.api.MetricRule.MetricCostsEntry2 +MetricCostsEntry +key (  +value (:8" + +QuotaLimit +name (  + description (  + default_limit ( + max_limit ( + free_tier ( +duration (  +metric (  +unit ( 2 +values + ( 2".google.api.QuotaLimit.ValuesEntry + display_name ( - + ValuesEntry +key (  +value (:8Bl +com.google.apiB +QuotaProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Resource.php b/lib/Google/vendor/google/common-protos/metadata/Api/Resource.php new file mode 100644 index 0000000000000000000000000000000000000000..b6021bed6c8b5af97bba3821de64213629bc0567 GIT binary patch literal 1135 zcmah|QE$^Q5T;$Xfd!=tATlH*Qzq6)kV=~nsAHgPO}j{4Tcs&dp;F|gZfePMBFA|s zXn%%(#|zIq;y7(qm?rwt==^=(-Fz(mT6NtGK00O#zx~tkta~_1g~d@kYkZ>cC6}71+MZhRoR=5WLbwfo#ts<(*9Zw zOlkYzX9?`y>bnNACqs_p*=js$BC^%`H19B*QuS96Xebk>Kh954s6d!EWKOkB^f9mzA~;WF>dBC&NH-D23rwLIHLNd z5~_f^F=0VM5!bg=4%dxF)voop`s&B#0$_od}8^dx<|FK)T>(2?DdTIp4 z)Phq6%JLZ38b5uol2LoyFMKhVb_XFvEHFYI)C0`a=internalAddGeneratedFile( + ' + +google/api/routing.proto +google.api google/protobuf/descriptor.proto"G + RoutingRule8 +routing_parameters ( 2.google.api.RoutingParameter"8 +RoutingParameter +field (  + path_template ( Bj +com.google.apiB RoutingProtoPZAgoogle.golang.org/genproto/googleapis/api/annotations;annotationsGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Service.php b/lib/Google/vendor/google/common-protos/metadata/Api/Service.php new file mode 100644 index 000000000..109365a38 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Service.php @@ -0,0 +1,80 @@ +internalAddGeneratedFile( + ' + +google/api/service.proto +google.apigoogle/api/backend.protogoogle/api/billing.protogoogle/api/client.protogoogle/api/context.protogoogle/api/control.protogoogle/api/documentation.protogoogle/api/endpoint.protogoogle/api/http.protogoogle/api/log.protogoogle/api/logging.protogoogle/api/metric.proto#google/api/monitored_resource.protogoogle/api/monitoring.protogoogle/api/quota.protogoogle/api/source_info.proto!google/api/system_parameter.protogoogle/api/usage.protogoogle/protobuf/api.protogoogle/protobuf/type.protogoogle/protobuf/wrappers.proto" +Service +name (  +title (  +producer_project_id (  + +id! ( " +apis ( 2.google.protobuf.Api$ +types ( 2.google.protobuf.Type$ +enums ( 2.google.protobuf.Enum0 + documentation ( 2.google.api.Documentation$ +backend ( 2.google.api.Backend +http ( 2.google.api.Http +quota + ( 2.google.api.Quota2 +authentication ( 2.google.api.Authentication$ +context ( 2.google.api.Context +usage ( 2.google.api.Usage\' + endpoints ( 2.google.api.Endpoint$ +control ( 2.google.api.Control\' +logs ( 2.google.api.LogDescriptor- +metrics ( 2.google.api.MetricDescriptorD +monitored_resources ( 2\'.google.api.MonitoredResourceDescriptor$ +billing ( 2.google.api.Billing$ +logging ( 2.google.api.Logging* + +monitoring ( 2.google.api.Monitoring7 +system_parameters ( 2.google.api.SystemParameters+ + source_info% ( 2.google.api.SourceInfo* + +publishing- ( 2.google.api.Publishing4 +config_version ( 2.google.protobuf.UInt32ValueBn +com.google.apiB ServiceProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/SourceInfo.php b/lib/Google/vendor/google/common-protos/metadata/Api/SourceInfo.php new file mode 100644 index 000000000..9e3a180e4 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/SourceInfo.php @@ -0,0 +1,32 @@ +internalAddGeneratedFile( + ' + +google/api/source_info.proto +google.api"8 + +SourceInfo* + source_files ( 2.google.protobuf.AnyBq +com.google.apiBSourceInfoProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/SystemParameter.php b/lib/Google/vendor/google/common-protos/metadata/Api/SystemParameter.php new file mode 100644 index 000000000..d341405aa --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/SystemParameter.php @@ -0,0 +1,38 @@ +internalAddGeneratedFile( + ' + +!google/api/system_parameter.proto +google.api"B +SystemParameters. +rules ( 2.google.api.SystemParameterRule"X +SystemParameterRule +selector ( / + +parameters ( 2.google.api.SystemParameter"Q +SystemParameter +name (  + http_header (  +url_query_parameter ( Bv +com.google.apiBSystemParameterProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Usage.php b/lib/Google/vendor/google/common-protos/metadata/Api/Usage.php new file mode 100644 index 000000000..3d7a644cd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Usage.php @@ -0,0 +1,37 @@ +internalAddGeneratedFile( + ' + +google/api/usage.proto +google.api"j +Usage + requirements ( $ +rules ( 2.google.api.UsageRule% +producer_notification_channel ( "] + UsageRule +selector (  +allow_unregistered_calls ( +skip_service_control (Bl +com.google.apiB +UsageProtoPZEgoogle.golang.org/genproto/googleapis/api/serviceconfig;serviceconfigGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Api/Visibility.php b/lib/Google/vendor/google/common-protos/metadata/Api/Visibility.php new file mode 100644 index 000000000..e1cc138c7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Api/Visibility.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +google/api/visibility.proto +google.api google/protobuf/descriptor.proto"7 + +Visibility) +rules ( 2.google.api.VisibilityRule"7 +VisibilityRule +selector (  + restriction ( Bn +com.google.apiBVisibilityProtoPZ?google.golang.org/genproto/googleapis/api/visibility;visibilityGAPIbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Cloud/ExtendedOperations.php b/lib/Google/vendor/google/common-protos/metadata/Cloud/ExtendedOperations.php new file mode 100644 index 0000000000000000000000000000000000000000..08219cbcbcb69d82b9b2ba9961a36ff66c78a095 GIT binary patch literal 862 zcma))(T>tU6oy?S8=bhO_D18?F>YMeC|r0~L<6)-xPTI1Zwv_;ribn%-I>YEG;uY& zj4$G=Ic=dK5)*qhZU6Jnf6jM4e^qyiyoC`8)YM`En+LFW2ue#Unap65Z?~v{$$P~! z)NOz;hH1QnC>$@}xKbl?%`kve$~40c%VeH(@ViBkV6v8~@a0mNc4U^>MkKHqsBnAcZq8g@{@pjRKCeL17n>vgG+AKTyV>2#(%gLda$LL zL1%NS-R6Q7aiA!O1;f@gRGx+QQc2fx4-Ro=#T48GR%2mN3!1G$G)!}4rJgxy5Tt19 z*%e<}*ZXS=JHCZhl`#lTLiWJw9FK1Y&}eflx@GRdU{{~YWFNoqeU5&T)YslPF0EQv zlwFbE4f5{)fcVcUUAqML`hc;7o{3oP2?N1`_%qQf0vFtBz7hc1EPDnJL$Mf|t4kPce|AJgp?~`b;=#L_=Id~wR zTe$Xdvcb#KZ7A`~&b|%z!c=Bdq;09wPKu&zp;P^$ikrVyQ!3Lvtf@QyYBWdv*?4na ZmVLUa2l}DnbcFSvNK0i!Z%1~7`~l>L6}12W literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Cloud/Location/Locations.php b/lib/Google/vendor/google/common-protos/metadata/Cloud/Location/Locations.php new file mode 100644 index 000000000..ad572c239 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Cloud/Location/Locations.php @@ -0,0 +1,53 @@ +internalAddGeneratedFile( + ' + +%google/cloud/location/locations.protogoogle.cloud.locationgoogle/protobuf/any.protogoogle/api/client.proto"[ +ListLocationsRequest +name (  +filter (  + page_size ( + +page_token ( "d +ListLocationsResponse2 + locations ( 2.google.cloud.location.Location +next_page_token ( "" +GetLocationRequest +name ( " +Location +name (  + location_id (  + display_name ( ; +labels ( 2+.google.cloud.location.Location.LabelsEntry& +metadata ( 2.google.protobuf.Any- + LabelsEntry +key (  +value ( :82 + Locations + ListLocations+.google.cloud.location.ListLocationsRequest,.google.cloud.location.ListLocationsResponse"?9/v1/{name=locations}Z!/v1/{name=projects/*}/locations + GetLocation).google.cloud.location.GetLocationRequest.google.cloud.location.Location"C=/v1/{name=locations/*}Z#!/v1/{name=projects/*/locations/*}HAcloud.googleapis.comA.https://www.googleapis.com/auth/cloud-platformBo +com.google.cloud.locationBLocationsProtoPZ=google.golang.org/genproto/googleapis/cloud/location;locationbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Iam/V1/IamPolicy.php b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/IamPolicy.php new file mode 100644 index 000000000..02fa586e7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/IamPolicy.php @@ -0,0 +1,53 @@ +internalAddGeneratedFile( + ' + +google/iam/v1/iam_policy.proto google.iam.v1google/api/client.protogoogle/api/field_behavior.protogoogle/api/resource.protogoogle/iam/v1/options.protogoogle/iam/v1/policy.proto google/protobuf/field_mask.proto" +SetIamPolicyRequest +resource ( B AA +** +policy ( 2.google.iam.v1.PolicyBA/ + update_mask ( 2.google.protobuf.FieldMask"d +GetIamPolicyRequest +resource ( B AA +*0 +options ( 2.google.iam.v1.GetPolicyOptions"R +TestIamPermissionsRequest +resource ( B AA +* + permissions ( BA"1 +TestIamPermissionsResponse + permissions ( 2 + IAMPolicyt + SetIamPolicy".google.iam.v1.SetIamPolicyRequest.google.iam.v1.Policy")#"/v1/{resource=**}:setIamPolicy:*t + GetIamPolicy".google.iam.v1.GetIamPolicyRequest.google.iam.v1.Policy")#"/v1/{resource=**}:getIamPolicy:* +TestIamPermissions(.google.iam.v1.TestIamPermissionsRequest).google.iam.v1.TestIamPermissionsResponse"/)"$/v1/{resource=**}:testIamPermissions:*Aiam-meta-api.googleapis.comB +com.google.iam.v1BIamPolicyProtoPZ)cloud.google.com/go/iam/apiv1/iampb;iampbGoogle.Cloud.Iam.V1Google\\Cloud\\Iam\\V1bproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Logging/AuditData.php b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Logging/AuditData.php new file mode 100644 index 000000000..3dcb651db --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Logging/AuditData.php @@ -0,0 +1,30 @@ +internalAddGeneratedFile( + ' + +&google/iam/v1/logging/audit_data.protogoogle.iam.v1.logging"= + AuditData0 + policy_delta ( 2.google.iam.v1.PolicyDeltaB +com.google.iam.v1.loggingBAuditDataProtoPZ9cloud.google.com/go/iam/apiv1/logging/loggingpb;loggingpbGoogle.Cloud.Iam.V1.Loggingbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Options.php b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Options.php new file mode 100644 index 000000000..630ae5b65 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Options.php @@ -0,0 +1,29 @@ +internalAddGeneratedFile( + ' + +google/iam/v1/options.proto google.iam.v1"4 +GetPolicyOptions +requested_policy_version (B} +com.google.iam.v1B OptionsProtoPZ)cloud.google.com/go/iam/apiv1/iampb;iampbGoogle.Cloud.Iam.V1Google\\Cloud\\Iam\\V1bproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Policy.php b/lib/Google/vendor/google/common-protos/metadata/Iam/V1/Policy.php new file mode 100644 index 0000000000000000000000000000000000000000..ed5ae8178e3ce96fe8fda137efadc1b714c283ad GIT binary patch literal 1757 zcmbVNU2o$=6va(RH#coJ^`a$OgcwX=QwdxpD?XHNL2jL`ENzphWV?VYMUFGcj^ubO zds1zIN<8pCc;^rB#2?@n@yMN-I8D5i2l9}_<8#kF=ickz|xc5sU*7_-87@_kx*!**pRWqae#jUq!-CK=6~yN614m z5eWR*XW5X&Ot2tgKcd!SG6|xLV(6RL$vh4P<1vu|y*Q+e1EM)4c0b|h?U>{m`qD01 z^}SfoG!7!)rCFG=MDVna&~|%D#j;59q;arFE9uyTG_=Nc`wfxDM5J@Nnw^l8ig_9z zDczFbX8F(mmkJH86Y6(fCuzHV>*h9CnfdH%wvg_O$4jNpuxE`Wx6JeyeyhNvyPIY1 z=zBIc(!Oe1zZy{1Eiv!I))h@NENa~#M&oU>0ry5M9VXAGb3tKrC-bi^wm4=EGHKVf;>Z)%b zXT{uy3MN4wsZ$15TYGsLfrYeXA+7JAx|$4GGMZkoFsJ9c&hSO|+kWTNd**fA+FRx>fa9Kf-Qh*YachRWcAbGUe0kvwI<*aR2P*1X-7Zw`k1s*|ppinjhV zV0(?O1?50J$BV*Q1%_3y?I@(295o;t*!&8bF6+{%VJOVU=3VpgIg}S{55aU!2VSpR zDDD=N99LEqpnTCe?_FX=rT$vcl=(%$!zTp~#em$$%1~-6@524UI4nHXRt8L3s#yO| z|H;p=hns#~-^pSq)Q;>MKOBS+pO144!Vjlht^FWjxcTv^NJdBM`)|YeedB>%^Y*EV v@^GtMHvh^`eP12>>Lq}0fl*n#F`hhL?yOJs_FP%EcP?6m)NAnuZUFuP&9ek- literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Logging/Type/HttpRequest.php b/lib/Google/vendor/google/common-protos/metadata/Logging/Type/HttpRequest.php new file mode 100644 index 000000000..3c51368ee --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Logging/Type/HttpRequest.php @@ -0,0 +1,46 @@ +internalAddGeneratedFile( + ' + +&google/logging/type/http_request.protogoogle.logging.type" + HttpRequest +request_method (  + request_url (  + request_size ( +status ( + response_size ( + +user_agent (  + remote_ip (  + server_ip (  +referer ( * +latency ( 2.google.protobuf.Duration + cache_lookup ( + cache_hit (* +"cache_validated_with_origin_server + ( +cache_fill_bytes ( +protocol ( B +com.google.logging.typeBHttpRequestProtoPZ8google.golang.org/genproto/googleapis/logging/type;ltypeGoogle.Cloud.Logging.TypeGoogle\\Cloud\\Logging\\TypeGoogle::Cloud::Logging::Typebproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Logging/Type/LogSeverity.php b/lib/Google/vendor/google/common-protos/metadata/Logging/Type/LogSeverity.php new file mode 100644 index 0000000000000000000000000000000000000000..6acaa6953afd9c7c064b5952b940a1f6b109bc51 GIT binary patch literal 948 zcma)4-HOvd7`4Ca&Z>lXA%YhpE^b#ez3@g-tMn%gfo@Y`7f}MsG?``xvY9ZM2vvIH z6NpbBUW$+4tsp*u&)~HW;LIc&Dyv{_lFWC`_nrC9dHggzO~D;#;{-FraR`@d$WJj$ z8RayfFGawwhaON(cHFg%a1vR5N3$O_zN~0KeV;V&yiMo89s-Ke# zzru|0wV_%9kf1Z1r6|DAo)3>OMIi*@Gvf)G-LdYV1V#(y4%wb^zWtz}^2dM896(jM6wm8h7t)4eV{LUEc#c zV{0-vo-VXY`YvdVt>Lk)h2pd6%qFh(ttKFC5esKzX`k!*6|nPs;LV(wt-WjL0JJR6 zb3N@>L%#|xk32`<22<@vQl?)CBekL67XukeuPyov;$;>lMmZa6NhLKJb4;mLe9;}wpJ z+cM2~)xp@XF|&P44by)qsdX{0V&20^Q6w4fR%P6ciz)9k3IKU@%j+_VIUYLw5f{-k z647|rfX8kbp8>>KRM%LSB=`YUS$6oJ|$#X2KIe%Ck(H_Ssefqx-_|D&1_P5j^o4hzHUrz52k|K-p zq*GK$H{p2``0nB;D${!T6wcIp_|aN*9euLipiWPg7y5RQlLxW-Z=@RJB0YC-2k;xt Cy$~`0 literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AttributeContext.php b/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AttributeContext.php new file mode 100644 index 000000000..d7402e286 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AttributeContext.php @@ -0,0 +1,109 @@ +internalAddGeneratedFile( + ' + +*google/rpc/context/attribute_context.protogoogle.rpc.contextgoogle/protobuf/duration.protogoogle/protobuf/struct.protogoogle/protobuf/timestamp.proto" +AttributeContext9 +origin ( 2).google.rpc.context.AttributeContext.Peer9 +source ( 2).google.rpc.context.AttributeContext.Peer> + destination ( 2).google.rpc.context.AttributeContext.Peer= +request ( 2,.google.rpc.context.AttributeContext.Request? +response ( 2-.google.rpc.context.AttributeContext.Response? +resource ( 2-.google.rpc.context.AttributeContext.Resource5 +api ( 2(.google.rpc.context.AttributeContext.Api( + +extensions ( 2.google.protobuf.Any +Peer + +ip (  +port (E +labels ( 25.google.rpc.context.AttributeContext.Peer.LabelsEntry + principal (  + region_code ( - + LabelsEntry +key (  +value ( :8L +Api +service (  + operation (  +protocol (  +version (  +Auth + principal (  + audiences (  + presenter ( \' +claims ( 2.google.protobuf.Struct + access_levels (  +Request + +id (  +method ( J +headers ( 29.google.rpc.context.AttributeContext.Request.HeadersEntry +path (  +host (  +scheme (  +query ( ( +time ( 2.google.protobuf.Timestamp +size + ( +protocol (  +reason ( 7 +auth ( 2).google.rpc.context.AttributeContext.Auth. + HeadersEntry +key (  +value ( :8 +Response +code ( +size (K +headers ( 2:.google.rpc.context.AttributeContext.Response.HeadersEntry( +time ( 2.google.protobuf.Timestamp2 +backend_latency ( 2.google.protobuf.Duration. + HeadersEntry +key (  +value ( :8 +Resource +service (  +name (  +type ( I +labels ( 29.google.rpc.context.AttributeContext.Resource.LabelsEntry +uid ( S + annotations ( 2>.google.rpc.context.AttributeContext.Resource.AnnotationsEntry + display_name ( / + create_time ( 2.google.protobuf.Timestamp/ + update_time ( 2.google.protobuf.Timestamp/ + delete_time + ( 2.google.protobuf.Timestamp +etag (  +location ( - + LabelsEntry +key (  +value ( :82 +AnnotationsEntry +key (  +value ( :8B +com.google.rpc.contextBAttributeContextProtoPZUgoogle.golang.org/genproto/googleapis/rpc/context/attribute_context;attribute_contextbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AuditContext.php b/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AuditContext.php new file mode 100644 index 000000000..40b9c0642 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Rpc/Context/AuditContext.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +&google/rpc/context/audit_context.protogoogle.rpc.context" + AuditContext + audit_log ( 1 +scrubbed_request ( 2.google.protobuf.Struct2 +scrubbed_response ( 2.google.protobuf.Struct$ +scrubbed_response_item_count ( +target_resource ( Bk +com.google.rpc.contextBAuditContextProtoPZ9google.golang.org/genproto/googleapis/rpc/context;contextbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Rpc/ErrorDetails.php b/lib/Google/vendor/google/common-protos/metadata/Rpc/ErrorDetails.php new file mode 100644 index 000000000..37c002f18 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Rpc/ErrorDetails.php @@ -0,0 +1,77 @@ +internalAddGeneratedFile( + ' + +google/rpc/error_details.proto +google.rpc" + ErrorInfo +reason (  +domain ( 5 +metadata ( 2#.google.rpc.ErrorInfo.MetadataEntry/ + MetadataEntry +key (  +value ( :8"; + RetryInfo. + retry_delay ( 2.google.protobuf.Duration"2 + DebugInfo + stack_entries (  +detail ( "y + QuotaFailure6 + +violations ( 2".google.rpc.QuotaFailure.Violation1 + Violation +subject (  + description ( " +PreconditionFailure= + +violations ( 2).google.rpc.PreconditionFailure.Violation? + Violation +type (  +subject (  + description ( " + +BadRequest? +field_violations ( 2%.google.rpc.BadRequest.FieldViolation4 +FieldViolation +field (  + description ( "7 + RequestInfo + +request_id (  + serving_data ( "` + ResourceInfo + resource_type (  + resource_name (  +owner (  + description ( "V +Help$ +links ( 2.google.rpc.Help.Link( +Link + description (  +url ( "3 +LocalizedMessage +locale (  +message ( Bl +com.google.rpcBErrorDetailsProtoPZ?google.golang.org/genproto/googleapis/rpc/errdetails;errdetailsRPCbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Rpc/Status.php b/lib/Google/vendor/google/common-protos/metadata/Rpc/Status.php new file mode 100644 index 000000000..8560f427c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Rpc/Status.php @@ -0,0 +1,33 @@ +internalAddGeneratedFile( + ' + +google/rpc/status.proto +google.rpc"N +Status +code ( +message ( % +details ( 2.google.protobuf.AnyBa +com.google.rpcB StatusProtoPZ7google.golang.org/genproto/googleapis/rpc/status;statusRPCbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/CalendarPeriod.php b/lib/Google/vendor/google/common-protos/metadata/Type/CalendarPeriod.php new file mode 100644 index 0000000000000000000000000000000000000000..2f1368e67728caba6ad1a452b4e8a303f8638b9d GIT binary patch literal 840 zcmah{(QeZ)6lLwUGEYDh9(mwSOj?Jaec&ynptMQbh^+}B6B?>ixrv)u%52MVBnGPZ z7k+^sBu=`j)r81P?Btwt&%Niq|0r$*dIe*`h{TE{u($(tLqJHbc+4|c6w4)%5c69> zGa@?xjt^5m0@v}PlaiYALdL{`l=CzrU3Di&H^v!Z36^s~B;`q`QbUO0TapVL6Bq}B zOQLXs6`qYN;w&nOJ%r*6=Q#}50zt(`KM|CVC>9xwAy-(HuTz@ODWi(wjQ%K%_hE^% zTuVH}E(;bb${A>a&tlR(hgwr(PX#X#hIDjNuYaMZyR$Z5q8CH^!ks#HI1k*=^PTzC^h@9ly^-fS#v`+Z znvQ*K?3s_z{#V!iWHiht=xF4J(bOAHBBN;@p@U0*8cmFS^BA>0U)f>ghQ@&=Ozex1 zai~w%t{ob!!FTkm+^x=*r@`}GM^zlb-nYpblkyC+w8LfEO$n=3t6TrVg66vmSnpr& lejn@W??!VR1&hOq`tEEq#5Z*|TT%Wq#tK;{wn8g}{sK?l1Hb?P literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Color.php b/lib/Google/vendor/google/common-protos/metadata/Type/Color.php new file mode 100644 index 000000000..cae1566cc --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Color.php @@ -0,0 +1,34 @@ +internalAddGeneratedFile( + ' + +google/type/color.proto google.type"] +Color +red ( +green ( +blue (* +alpha ( 2.google.protobuf.FloatValueB` +com.google.typeB +ColorProtoPZ6google.golang.org/genproto/googleapis/type/color;colorGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Date.php b/lib/Google/vendor/google/common-protos/metadata/Type/Date.php new file mode 100644 index 000000000..8d754f8c3 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Date.php @@ -0,0 +1,31 @@ +internalAddGeneratedFile( + ' + +google/type/date.proto google.type"0 +Date +year ( +month ( +day (B] +com.google.typeB DateProtoPZ4google.golang.org/genproto/googleapis/type/date;dateGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Datetime.php b/lib/Google/vendor/google/common-protos/metadata/Type/Datetime.php new file mode 100644 index 0000000000000000000000000000000000000000..bb5feded27f0ec26041ba6db17ec4640d9d3ffc6 GIT binary patch literal 1004 zcmZ`&O>fgc5UrbjBonGik&q0hrBrH)z>&($X+T7Qv142eO&m-Uzt)R3K?NYQX$d|dwP{)FE&t`EirH~0GuvST#;#&EH5Gk;D5FY|(WVl905QM3m}e{^N>gn5TOpOcN4)NS=Lq(f zg6oC9>yB+`#B}91s@TGehw}H_@fZ%5j29Y}zh7M_j0BIBe^3>0%7yX|-LVHy=;%%) zi9+o+&0YKAMX({}X3KaMR9(5+>AZoKox8hx!O?HI{O47^6%tqhwq8)%;7CV8hj$!>Br7~@I5?ezC$7UV2VTVUmbDUKZ@Ah&-G8Gx+X&_|UOOZRu xy)r~|rvBZQzS#=5Hh(oy-qh#rw0`y0_&pZOz`3bLTS4=~%-W;4czfgc5G5(3bjwHO3x{3?QK>0{|4AZ}BZ zplkuyE=*h>9DD4))YMGmGQbYRLc|HS)h5MuNH-$-hWNEr)FFh^Tg*}#AdI}hH7XiX zMVF(3vh+2jOGuE=ECc(FN`4T~Pnxe27C@$`(yud?tr%yD(S&{1YI_jTBs1*$xlzso z#RLaKaCv~u3n*)v+_O~Z>3VP{!ZQQwVV7gBP;#0qZOj76QYECPQ#+j)RkbGbr+Kk! zYs#?*nx)20=bp$OD4FAacL0ehm%Ll(HU+lTSE20f72E0Phhf!rs4Zw#iH3Gge%HzA ze|B#jmte~n^ZI9v9O(_a(L$SJost)J|MSWnt`?5-X*HkBJmjY zlbUr*4*j_^GeO;YN{$weJt@Nj>j`=6f1FPX@S$N1r(=`&$RM-6KcAYYVUXFpsCPJE zinternalAddGeneratedFile( + ' + +google/type/decimal.proto google.type" +Decimal +value ( Bf +com.google.typeB DecimalProtoPZ:google.golang.org/genproto/googleapis/type/decimal;decimalGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Expr.php b/lib/Google/vendor/google/common-protos/metadata/Type/Expr.php new file mode 100644 index 000000000..db6f33b05 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Expr.php @@ -0,0 +1,33 @@ +internalAddGeneratedFile( + ' + +google/type/expr.proto google.type"P +Expr + +expression (  +title (  + description (  +location ( BZ +com.google.typeB ExprProtoPZ4google.golang.org/genproto/googleapis/type/expr;exprGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Fraction.php b/lib/Google/vendor/google/common-protos/metadata/Type/Fraction.php new file mode 100644 index 000000000..4c34bf80f --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Fraction.php @@ -0,0 +1,30 @@ +internalAddGeneratedFile( + ' + +google/type/fraction.proto google.type"2 +Fraction + numerator ( + denominator (Bf +com.google.typeB FractionProtoPZinternalAddGeneratedFile( + ' + +google/type/interval.proto google.type"h +Interval. + +start_time ( 2.google.protobuf.Timestamp, +end_time ( 2.google.protobuf.TimestampBi +com.google.typeB IntervalProtoPZinternalAddGeneratedFile( + ' + +google/type/latlng.proto google.type"- +LatLng +latitude ( + longitude (Bc +com.google.typeB LatLngProtoPZ8google.golang.org/genproto/googleapis/type/latlng;latlngGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/LocalizedText.php b/lib/Google/vendor/google/common-protos/metadata/Type/LocalizedText.php new file mode 100644 index 000000000..ab6434325 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/LocalizedText.php @@ -0,0 +1,30 @@ +internalAddGeneratedFile( + ' + + google/type/localized_text.proto google.type"4 + LocalizedText +text (  + language_code ( Bz +com.google.typeBLocalizedTextProtoPZHgoogle.golang.org/genproto/googleapis/type/localized_text;localized_textGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Money.php b/lib/Google/vendor/google/common-protos/metadata/Type/Money.php new file mode 100644 index 000000000..01395b889 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Money.php @@ -0,0 +1,32 @@ +internalAddGeneratedFile( + ' + +google/type/money.proto google.type"< +Money + currency_code (  +units ( +nanos (B` +com.google.typeB +MoneyProtoPZ6google.golang.org/genproto/googleapis/type/money;moneyGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Month.php b/lib/Google/vendor/google/common-protos/metadata/Type/Month.php new file mode 100644 index 0000000000000000000000000000000000000000..e0c5124fc866aa5ccc1ecc02362e5ddfff4814f5 GIT binary patch literal 834 zcmZ`%-Hy^g6c*U!=di}w#CSW#O_ntZ7baeSXbKdT&C)hdOfZ&cq0;N`@1{G0o^GxO~JcsRBP#xt`Hm0Qc1ThoP6FfX7w zw0l$S70p^kwWj?WqohpBn~v{{GqVDviM24!%_^MT&K=t*=hofAsF(m{Yd)IKe4}bU zhuX~ce0$Qfr$$W`a{Iok98iTE_gfySD{o-;bMK<}172hY*F5Q>2f78lEwAwX(;*b{ z2(z%sMc4`n(+AheLpY|%$uV~HN&YUDM!vTyYv9ML<3!)*i#plslRMSOe0_V^1N;Mw CjXNJiHT%~`; zSAUWJ#7Ac)H3W+0B_Z?O=6vVnYqe2uAEzWpGeZfkF41fVm6k@vGQ(A|UX#XHZWYf+ zhlrCIUd-nBZgM`qXQ{a?bW8(GrA#yGn@dG~wUL6BqS&r1!%G1OwxwLLm~a}6Kayby zGi)*Sti{~2h5&KK@*E?_zVKxD4rm`$tTG;BZkVyJ6P_=*;D)n|f3uNCxMo@I_=nha zA!5U&Ku4H~n0jYeYC7zRlJ<%t{2L>3x3)K4oC`x*uxv4*Jl0$psUr&=3{o=HtlXd8 z+1}R4@iq3!jDx{J$PpS{P~9C-lPR2GFjJxpN!Z^!WL+eP!JMgI?>ymCg%*d?U44#xkL9!~ShQISy+= zVNE3ba?Gd@axwvkC@{5;f4-XZC!r{!H>q#bRMmm Zp852&8uf#+!CK+}EZZZ?UU#qq_ygup6FmR` literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/PostalAddress.php b/lib/Google/vendor/google/common-protos/metadata/Type/PostalAddress.php new file mode 100644 index 000000000..46425c7d9 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/PostalAddress.php @@ -0,0 +1,41 @@ +internalAddGeneratedFile( + ' + + google/type/postal_address.proto google.type" + PostalAddress +revision ( + region_code (  + language_code (  + postal_code (  + sorting_code (  +administrative_area (  +locality (  + sublocality (  + address_lines (  + +recipients + (  + organization ( Bx +com.google.typeBPostalAddressProtoPZFgoogle.golang.org/genproto/googleapis/type/postaladdress;postaladdressGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Quaternion.php b/lib/Google/vendor/google/common-protos/metadata/Type/Quaternion.php new file mode 100644 index 000000000..117de8e60 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Quaternion.php @@ -0,0 +1,33 @@ +internalAddGeneratedFile( + ' + +google/type/quaternion.proto google.type"8 + +Quaternion +x ( +y ( +z ( +w (Bo +com.google.typeBQuaternionProtoPZ@google.golang.org/genproto/googleapis/type/quaternion;quaternionGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/metadata/Type/Timeofday.php b/lib/Google/vendor/google/common-protos/metadata/Type/Timeofday.php new file mode 100644 index 000000000..ae198be1b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/metadata/Type/Timeofday.php @@ -0,0 +1,32 @@ +internalAddGeneratedFile( + ' + +google/type/timeofday.proto google.type"K + TimeOfDay +hours ( +minutes ( +seconds ( +nanos (Bl +com.google.typeBTimeOfDayProtoPZ>google.golang.org/genproto/googleapis/type/timeofday;timeofdayGTPbproto3' + , true); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/common-protos/renovate.json b/lib/Google/vendor/google/common-protos/renovate.json new file mode 100644 index 000000000..6d8121323 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/renovate.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "config:base", + ":preserveSemverRanges", + ":disableDependencyDashboard" + ] +} diff --git a/lib/Google/vendor/google/common-protos/src/Api/Advice.php b/lib/Google/vendor/google/common-protos/src/Api/Advice.php new file mode 100644 index 000000000..e4a537828 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Advice.php @@ -0,0 +1,72 @@ +google.api.Advice + */ +class Advice extends \Google\Protobuf\Internal\Message +{ + /** + * Useful description for why this advice was applied and what actions should + * be taken to mitigate any implied risks. + * + * Generated from protobuf field string description = 2; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $description + * Useful description for why this advice was applied and what actions should + * be taken to mitigate any implied risks. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\ConfigChange::initOnce(); + parent::__construct($data); + } + + /** + * Useful description for why this advice was applied and what actions should + * be taken to mitigate any implied risks. + * + * Generated from protobuf field string description = 2; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Useful description for why this advice was applied and what actions should + * be taken to mitigate any implied risks. + * + * Generated from protobuf field string description = 2; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/AuthProvider.php b/lib/Google/vendor/google/common-protos/src/Api/AuthProvider.php new file mode 100644 index 000000000..3640d3a6f --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/AuthProvider.php @@ -0,0 +1,419 @@ +google.api.AuthProvider + */ +class AuthProvider extends \Google\Protobuf\Internal\Message +{ + /** + * The unique identifier of the auth provider. It will be referred to by + * `AuthRequirement.provider_id`. + * Example: "bookstore_auth". + * + * Generated from protobuf field string id = 1; + */ + protected $id = ''; + /** + * Identifies the principal that issued the JWT. See + * https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1 + * Usually a URL or an email address. + * Example: https://securetoken.google.com + * Example: 1234567-compute@developer.gserviceaccount.com + * + * Generated from protobuf field string issuer = 2; + */ + protected $issuer = ''; + /** + * URL of the provider's public key set to validate signature of the JWT. See + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + * Optional if the key set document: + * - can be retrieved from + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + * of the issuer. + * - can be inferred from the email domain of the issuer (e.g. a Google + * service account). + * Example: https://www.googleapis.com/oauth2/v1/certs + * + * Generated from protobuf field string jwks_uri = 3; + */ + protected $jwks_uri = ''; + /** + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, JWTs with audiences: + * - "https://[service.name]/[google.protobuf.Api.name]" + * - "https://[service.name]/" + * will be accepted. + * For example, if no audiences are in the setting, LibraryService API will + * accept JWTs with the following audiences: + * - + * https://library-example.googleapis.com/google.example.library.v1.LibraryService + * - https://library-example.googleapis.com/ + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 4; + */ + protected $audiences = ''; + /** + * Redirect URL if JWT token is required but not present or is expired. + * Implement authorizationUrl of securityDefinitions in OpenAPI spec. + * + * Generated from protobuf field string authorization_url = 5; + */ + protected $authorization_url = ''; + /** + * Defines the locations to extract the JWT. For now it is only used by the + * Cloud Endpoints to store the OpenAPI extension [x-google-jwt-locations] + * (https://cloud.google.com/endpoints/docs/openapi/openapi-extensions#x-google-jwt-locations) + * JWT locations can be one of HTTP headers, URL query parameters or + * cookies. The rule is that the first match wins. + * If not specified, default to use following 3 locations: + * 1) Authorization: Bearer + * 2) x-goog-iap-jwt-assertion + * 3) access_token query parameter + * Default locations can be specified as followings: + * jwt_locations: + * - header: Authorization + * value_prefix: "Bearer " + * - header: x-goog-iap-jwt-assertion + * - query: access_token + * + * Generated from protobuf field repeated .google.api.JwtLocation jwt_locations = 6; + */ + private $jwt_locations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $id + * The unique identifier of the auth provider. It will be referred to by + * `AuthRequirement.provider_id`. + * Example: "bookstore_auth". + * @type string $issuer + * Identifies the principal that issued the JWT. See + * https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1 + * Usually a URL or an email address. + * Example: https://securetoken.google.com + * Example: 1234567-compute@developer.gserviceaccount.com + * @type string $jwks_uri + * URL of the provider's public key set to validate signature of the JWT. See + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + * Optional if the key set document: + * - can be retrieved from + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + * of the issuer. + * - can be inferred from the email domain of the issuer (e.g. a Google + * service account). + * Example: https://www.googleapis.com/oauth2/v1/certs + * @type string $audiences + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, JWTs with audiences: + * - "https://[service.name]/[google.protobuf.Api.name]" + * - "https://[service.name]/" + * will be accepted. + * For example, if no audiences are in the setting, LibraryService API will + * accept JWTs with the following audiences: + * - + * https://library-example.googleapis.com/google.example.library.v1.LibraryService + * - https://library-example.googleapis.com/ + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * @type string $authorization_url + * Redirect URL if JWT token is required but not present or is expired. + * Implement authorizationUrl of securityDefinitions in OpenAPI spec. + * @type array<\Google\Api\JwtLocation>|\Google\Protobuf\Internal\RepeatedField $jwt_locations + * Defines the locations to extract the JWT. For now it is only used by the + * Cloud Endpoints to store the OpenAPI extension [x-google-jwt-locations] + * (https://cloud.google.com/endpoints/docs/openapi/openapi-extensions#x-google-jwt-locations) + * JWT locations can be one of HTTP headers, URL query parameters or + * cookies. The rule is that the first match wins. + * If not specified, default to use following 3 locations: + * 1) Authorization: Bearer + * 2) x-goog-iap-jwt-assertion + * 3) access_token query parameter + * Default locations can be specified as followings: + * jwt_locations: + * - header: Authorization + * value_prefix: "Bearer " + * - header: x-goog-iap-jwt-assertion + * - query: access_token + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * The unique identifier of the auth provider. It will be referred to by + * `AuthRequirement.provider_id`. + * Example: "bookstore_auth". + * + * Generated from protobuf field string id = 1; + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * The unique identifier of the auth provider. It will be referred to by + * `AuthRequirement.provider_id`. + * Example: "bookstore_auth". + * + * Generated from protobuf field string id = 1; + * @param string $var + * @return $this + */ + public function setId($var) + { + GPBUtil::checkString($var, True); + $this->id = $var; + + return $this; + } + + /** + * Identifies the principal that issued the JWT. See + * https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1 + * Usually a URL or an email address. + * Example: https://securetoken.google.com + * Example: 1234567-compute@developer.gserviceaccount.com + * + * Generated from protobuf field string issuer = 2; + * @return string + */ + public function getIssuer() + { + return $this->issuer; + } + + /** + * Identifies the principal that issued the JWT. See + * https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.1 + * Usually a URL or an email address. + * Example: https://securetoken.google.com + * Example: 1234567-compute@developer.gserviceaccount.com + * + * Generated from protobuf field string issuer = 2; + * @param string $var + * @return $this + */ + public function setIssuer($var) + { + GPBUtil::checkString($var, True); + $this->issuer = $var; + + return $this; + } + + /** + * URL of the provider's public key set to validate signature of the JWT. See + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + * Optional if the key set document: + * - can be retrieved from + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + * of the issuer. + * - can be inferred from the email domain of the issuer (e.g. a Google + * service account). + * Example: https://www.googleapis.com/oauth2/v1/certs + * + * Generated from protobuf field string jwks_uri = 3; + * @return string + */ + public function getJwksUri() + { + return $this->jwks_uri; + } + + /** + * URL of the provider's public key set to validate signature of the JWT. See + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata). + * Optional if the key set document: + * - can be retrieved from + * [OpenID + * Discovery](https://openid.net/specs/openid-connect-discovery-1_0.html) + * of the issuer. + * - can be inferred from the email domain of the issuer (e.g. a Google + * service account). + * Example: https://www.googleapis.com/oauth2/v1/certs + * + * Generated from protobuf field string jwks_uri = 3; + * @param string $var + * @return $this + */ + public function setJwksUri($var) + { + GPBUtil::checkString($var, True); + $this->jwks_uri = $var; + + return $this; + } + + /** + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, JWTs with audiences: + * - "https://[service.name]/[google.protobuf.Api.name]" + * - "https://[service.name]/" + * will be accepted. + * For example, if no audiences are in the setting, LibraryService API will + * accept JWTs with the following audiences: + * - + * https://library-example.googleapis.com/google.example.library.v1.LibraryService + * - https://library-example.googleapis.com/ + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 4; + * @return string + */ + public function getAudiences() + { + return $this->audiences; + } + + /** + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, JWTs with audiences: + * - "https://[service.name]/[google.protobuf.Api.name]" + * - "https://[service.name]/" + * will be accepted. + * For example, if no audiences are in the setting, LibraryService API will + * accept JWTs with the following audiences: + * - + * https://library-example.googleapis.com/google.example.library.v1.LibraryService + * - https://library-example.googleapis.com/ + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 4; + * @param string $var + * @return $this + */ + public function setAudiences($var) + { + GPBUtil::checkString($var, True); + $this->audiences = $var; + + return $this; + } + + /** + * Redirect URL if JWT token is required but not present or is expired. + * Implement authorizationUrl of securityDefinitions in OpenAPI spec. + * + * Generated from protobuf field string authorization_url = 5; + * @return string + */ + public function getAuthorizationUrl() + { + return $this->authorization_url; + } + + /** + * Redirect URL if JWT token is required but not present or is expired. + * Implement authorizationUrl of securityDefinitions in OpenAPI spec. + * + * Generated from protobuf field string authorization_url = 5; + * @param string $var + * @return $this + */ + public function setAuthorizationUrl($var) + { + GPBUtil::checkString($var, True); + $this->authorization_url = $var; + + return $this; + } + + /** + * Defines the locations to extract the JWT. For now it is only used by the + * Cloud Endpoints to store the OpenAPI extension [x-google-jwt-locations] + * (https://cloud.google.com/endpoints/docs/openapi/openapi-extensions#x-google-jwt-locations) + * JWT locations can be one of HTTP headers, URL query parameters or + * cookies. The rule is that the first match wins. + * If not specified, default to use following 3 locations: + * 1) Authorization: Bearer + * 2) x-goog-iap-jwt-assertion + * 3) access_token query parameter + * Default locations can be specified as followings: + * jwt_locations: + * - header: Authorization + * value_prefix: "Bearer " + * - header: x-goog-iap-jwt-assertion + * - query: access_token + * + * Generated from protobuf field repeated .google.api.JwtLocation jwt_locations = 6; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getJwtLocations() + { + return $this->jwt_locations; + } + + /** + * Defines the locations to extract the JWT. For now it is only used by the + * Cloud Endpoints to store the OpenAPI extension [x-google-jwt-locations] + * (https://cloud.google.com/endpoints/docs/openapi/openapi-extensions#x-google-jwt-locations) + * JWT locations can be one of HTTP headers, URL query parameters or + * cookies. The rule is that the first match wins. + * If not specified, default to use following 3 locations: + * 1) Authorization: Bearer + * 2) x-goog-iap-jwt-assertion + * 3) access_token query parameter + * Default locations can be specified as followings: + * jwt_locations: + * - header: Authorization + * value_prefix: "Bearer " + * - header: x-goog-iap-jwt-assertion + * - query: access_token + * + * Generated from protobuf field repeated .google.api.JwtLocation jwt_locations = 6; + * @param array<\Google\Api\JwtLocation>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setJwtLocations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\JwtLocation::class); + $this->jwt_locations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/AuthRequirement.php b/lib/Google/vendor/google/common-protos/src/Api/AuthRequirement.php new file mode 100644 index 000000000..287f2a744 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/AuthRequirement.php @@ -0,0 +1,159 @@ +google.api.AuthRequirement + */ +class AuthRequirement extends \Google\Protobuf\Internal\Message +{ + /** + * [id][google.api.AuthProvider.id] from authentication provider. + * Example: + * provider_id: bookstore_auth + * + * Generated from protobuf field string provider_id = 1; + */ + protected $provider_id = ''; + /** + * NOTE: This will be deprecated soon, once AuthProvider.audiences is + * implemented and accepted in all the runtime components. + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, only JWTs with audience + * "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" + * will be accepted. For example, if no audiences are in the setting, + * LibraryService API will only accept JWTs with the following audience + * "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 2; + */ + protected $audiences = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $provider_id + * [id][google.api.AuthProvider.id] from authentication provider. + * Example: + * provider_id: bookstore_auth + * @type string $audiences + * NOTE: This will be deprecated soon, once AuthProvider.audiences is + * implemented and accepted in all the runtime components. + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, only JWTs with audience + * "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" + * will be accepted. For example, if no audiences are in the setting, + * LibraryService API will only accept JWTs with the following audience + * "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * [id][google.api.AuthProvider.id] from authentication provider. + * Example: + * provider_id: bookstore_auth + * + * Generated from protobuf field string provider_id = 1; + * @return string + */ + public function getProviderId() + { + return $this->provider_id; + } + + /** + * [id][google.api.AuthProvider.id] from authentication provider. + * Example: + * provider_id: bookstore_auth + * + * Generated from protobuf field string provider_id = 1; + * @param string $var + * @return $this + */ + public function setProviderId($var) + { + GPBUtil::checkString($var, True); + $this->provider_id = $var; + + return $this; + } + + /** + * NOTE: This will be deprecated soon, once AuthProvider.audiences is + * implemented and accepted in all the runtime components. + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, only JWTs with audience + * "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" + * will be accepted. For example, if no audiences are in the setting, + * LibraryService API will only accept JWTs with the following audience + * "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 2; + * @return string + */ + public function getAudiences() + { + return $this->audiences; + } + + /** + * NOTE: This will be deprecated soon, once AuthProvider.audiences is + * implemented and accepted in all the runtime components. + * The list of JWT + * [audiences](https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-32#section-4.1.3). + * that are allowed to access. A JWT containing any of these audiences will + * be accepted. When this setting is absent, only JWTs with audience + * "https://[Service_name][google.api.Service.name]/[API_name][google.protobuf.Api.name]" + * will be accepted. For example, if no audiences are in the setting, + * LibraryService API will only accept JWTs with the following audience + * "https://library-example.googleapis.com/google.example.library.v1.LibraryService". + * Example: + * audiences: bookstore_android.apps.googleusercontent.com, + * bookstore_web.apps.googleusercontent.com + * + * Generated from protobuf field string audiences = 2; + * @param string $var + * @return $this + */ + public function setAudiences($var) + { + GPBUtil::checkString($var, True); + $this->audiences = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Authentication.php b/lib/Google/vendor/google/common-protos/src/Api/Authentication.php new file mode 100644 index 000000000..9ee3ba6e2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Authentication.php @@ -0,0 +1,120 @@ +google.api.Authentication + */ +class Authentication extends \Google\Protobuf\Internal\Message +{ + /** + * A list of authentication rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.AuthenticationRule rules = 3; + */ + private $rules; + /** + * Defines a set of authentication providers that a service supports. + * + * Generated from protobuf field repeated .google.api.AuthProvider providers = 4; + */ + private $providers; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\AuthenticationRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of authentication rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * @type array<\Google\Api\AuthProvider>|\Google\Protobuf\Internal\RepeatedField $providers + * Defines a set of authentication providers that a service supports. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * A list of authentication rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.AuthenticationRule rules = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of authentication rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.AuthenticationRule rules = 3; + * @param array<\Google\Api\AuthenticationRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\AuthenticationRule::class); + $this->rules = $arr; + + return $this; + } + + /** + * Defines a set of authentication providers that a service supports. + * + * Generated from protobuf field repeated .google.api.AuthProvider providers = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getProviders() + { + return $this->providers; + } + + /** + * Defines a set of authentication providers that a service supports. + * + * Generated from protobuf field repeated .google.api.AuthProvider providers = 4; + * @param array<\Google\Api\AuthProvider>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setProviders($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\AuthProvider::class); + $this->providers = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/AuthenticationRule.php b/lib/Google/vendor/google/common-protos/src/Api/AuthenticationRule.php new file mode 100644 index 000000000..760681186 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/AuthenticationRule.php @@ -0,0 +1,197 @@ +google.api.AuthenticationRule + */ +class AuthenticationRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * The requirements for OAuth credentials. + * + * Generated from protobuf field .google.api.OAuthRequirements oauth = 2; + */ + protected $oauth = null; + /** + * If true, the service accepts API keys without any other credential. + * This flag only applies to HTTP and gRPC requests. + * + * Generated from protobuf field bool allow_without_credential = 5; + */ + protected $allow_without_credential = false; + /** + * Requirements for additional authentication providers. + * + * Generated from protobuf field repeated .google.api.AuthRequirement requirements = 7; + */ + private $requirements; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type \Google\Api\OAuthRequirements $oauth + * The requirements for OAuth credentials. + * @type bool $allow_without_credential + * If true, the service accepts API keys without any other credential. + * This flag only applies to HTTP and gRPC requests. + * @type array<\Google\Api\AuthRequirement>|\Google\Protobuf\Internal\RepeatedField $requirements + * Requirements for additional authentication providers. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * The requirements for OAuth credentials. + * + * Generated from protobuf field .google.api.OAuthRequirements oauth = 2; + * @return \Google\Api\OAuthRequirements|null + */ + public function getOauth() + { + return $this->oauth; + } + + public function hasOauth() + { + return isset($this->oauth); + } + + public function clearOauth() + { + unset($this->oauth); + } + + /** + * The requirements for OAuth credentials. + * + * Generated from protobuf field .google.api.OAuthRequirements oauth = 2; + * @param \Google\Api\OAuthRequirements $var + * @return $this + */ + public function setOauth($var) + { + GPBUtil::checkMessage($var, \Google\Api\OAuthRequirements::class); + $this->oauth = $var; + + return $this; + } + + /** + * If true, the service accepts API keys without any other credential. + * This flag only applies to HTTP and gRPC requests. + * + * Generated from protobuf field bool allow_without_credential = 5; + * @return bool + */ + public function getAllowWithoutCredential() + { + return $this->allow_without_credential; + } + + /** + * If true, the service accepts API keys without any other credential. + * This flag only applies to HTTP and gRPC requests. + * + * Generated from protobuf field bool allow_without_credential = 5; + * @param bool $var + * @return $this + */ + public function setAllowWithoutCredential($var) + { + GPBUtil::checkBool($var); + $this->allow_without_credential = $var; + + return $this; + } + + /** + * Requirements for additional authentication providers. + * + * Generated from protobuf field repeated .google.api.AuthRequirement requirements = 7; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRequirements() + { + return $this->requirements; + } + + /** + * Requirements for additional authentication providers. + * + * Generated from protobuf field repeated .google.api.AuthRequirement requirements = 7; + * @param array<\Google\Api\AuthRequirement>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRequirements($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\AuthRequirement::class); + $this->requirements = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Backend.php b/lib/Google/vendor/google/common-protos/src/Api/Backend.php new file mode 100644 index 000000000..28b6a07fe --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Backend.php @@ -0,0 +1,71 @@ +google.api.Backend + */ +class Backend extends \Google\Protobuf\Internal\Message +{ + /** + * A list of API backend rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.BackendRule rules = 1; + */ + private $rules; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\BackendRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of API backend rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Backend::initOnce(); + parent::__construct($data); + } + + /** + * A list of API backend rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.BackendRule rules = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of API backend rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.BackendRule rules = 1; + * @param array<\Google\Api\BackendRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\BackendRule::class); + $this->rules = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/BackendRule.php b/lib/Google/vendor/google/common-protos/src/Api/BackendRule.php new file mode 100644 index 000000000..37745f1c6 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/BackendRule.php @@ -0,0 +1,525 @@ +google.api.BackendRule + */ +class BackendRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * The address of the API backend. + * The scheme is used to determine the backend protocol and security. + * The following schemes are accepted: + * SCHEME PROTOCOL SECURITY + * http:// HTTP None + * https:// HTTP TLS + * grpc:// gRPC None + * grpcs:// gRPC TLS + * It is recommended to explicitly include a scheme. Leaving out the scheme + * may cause constrasting behaviors across platforms. + * If the port is unspecified, the default is: + * - 80 for schemes without TLS + * - 443 for schemes with TLS + * For HTTP backends, use [protocol][google.api.BackendRule.protocol] + * to specify the protocol version. + * + * Generated from protobuf field string address = 2; + */ + protected $address = ''; + /** + * The number of seconds to wait for a response from a request. The default + * varies based on the request protocol and deployment environment. + * + * Generated from protobuf field double deadline = 3; + */ + protected $deadline = 0.0; + /** + * Deprecated, do not use. + * + * Generated from protobuf field double min_deadline = 4 [deprecated = true]; + * @deprecated + */ + protected $min_deadline = 0.0; + /** + * The number of seconds to wait for the completion of a long running + * operation. The default is no deadline. + * + * Generated from protobuf field double operation_deadline = 5; + */ + protected $operation_deadline = 0.0; + /** + * Generated from protobuf field .google.api.BackendRule.PathTranslation path_translation = 6; + */ + protected $path_translation = 0; + /** + * The protocol used for sending a request to the backend. + * The supported values are "http/1.1" and "h2". + * The default value is inferred from the scheme in the + * [address][google.api.BackendRule.address] field: + * SCHEME PROTOCOL + * http:// http/1.1 + * https:// http/1.1 + * grpc:// h2 + * grpcs:// h2 + * For secure HTTP backends (https://) that support HTTP/2, set this field + * to "h2" for improved performance. + * Configuring this field to non-default values is only supported for secure + * HTTP backends. This field will be ignored for all other backends. + * See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for more details on the supported values. + * + * Generated from protobuf field string protocol = 9; + */ + protected $protocol = ''; + /** + * The map between request protocol and the backend address. + * + * Generated from protobuf field map overrides_by_request_protocol = 10; + */ + private $overrides_by_request_protocol; + protected $authentication; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type string $address + * The address of the API backend. + * The scheme is used to determine the backend protocol and security. + * The following schemes are accepted: + * SCHEME PROTOCOL SECURITY + * http:// HTTP None + * https:// HTTP TLS + * grpc:// gRPC None + * grpcs:// gRPC TLS + * It is recommended to explicitly include a scheme. Leaving out the scheme + * may cause constrasting behaviors across platforms. + * If the port is unspecified, the default is: + * - 80 for schemes without TLS + * - 443 for schemes with TLS + * For HTTP backends, use [protocol][google.api.BackendRule.protocol] + * to specify the protocol version. + * @type float $deadline + * The number of seconds to wait for a response from a request. The default + * varies based on the request protocol and deployment environment. + * @type float $min_deadline + * Deprecated, do not use. + * @type float $operation_deadline + * The number of seconds to wait for the completion of a long running + * operation. The default is no deadline. + * @type int $path_translation + * @type string $jwt_audience + * The JWT audience is used when generating a JWT ID token for the backend. + * This ID token will be added in the HTTP "authorization" header, and sent + * to the backend. + * @type bool $disable_auth + * When disable_auth is true, a JWT ID token won't be generated and the + * original "Authorization" HTTP header will be preserved. If the header is + * used to carry the original token and is expected by the backend, this + * field must be set to true to preserve the header. + * @type string $protocol + * The protocol used for sending a request to the backend. + * The supported values are "http/1.1" and "h2". + * The default value is inferred from the scheme in the + * [address][google.api.BackendRule.address] field: + * SCHEME PROTOCOL + * http:// http/1.1 + * https:// http/1.1 + * grpc:// h2 + * grpcs:// h2 + * For secure HTTP backends (https://) that support HTTP/2, set this field + * to "h2" for improved performance. + * Configuring this field to non-default values is only supported for secure + * HTTP backends. This field will be ignored for all other backends. + * See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for more details on the supported values. + * @type array|\Google\Protobuf\Internal\MapField $overrides_by_request_protocol + * The map between request protocol and the backend address. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Backend::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * The address of the API backend. + * The scheme is used to determine the backend protocol and security. + * The following schemes are accepted: + * SCHEME PROTOCOL SECURITY + * http:// HTTP None + * https:// HTTP TLS + * grpc:// gRPC None + * grpcs:// gRPC TLS + * It is recommended to explicitly include a scheme. Leaving out the scheme + * may cause constrasting behaviors across platforms. + * If the port is unspecified, the default is: + * - 80 for schemes without TLS + * - 443 for schemes with TLS + * For HTTP backends, use [protocol][google.api.BackendRule.protocol] + * to specify the protocol version. + * + * Generated from protobuf field string address = 2; + * @return string + */ + public function getAddress() + { + return $this->address; + } + + /** + * The address of the API backend. + * The scheme is used to determine the backend protocol and security. + * The following schemes are accepted: + * SCHEME PROTOCOL SECURITY + * http:// HTTP None + * https:// HTTP TLS + * grpc:// gRPC None + * grpcs:// gRPC TLS + * It is recommended to explicitly include a scheme. Leaving out the scheme + * may cause constrasting behaviors across platforms. + * If the port is unspecified, the default is: + * - 80 for schemes without TLS + * - 443 for schemes with TLS + * For HTTP backends, use [protocol][google.api.BackendRule.protocol] + * to specify the protocol version. + * + * Generated from protobuf field string address = 2; + * @param string $var + * @return $this + */ + public function setAddress($var) + { + GPBUtil::checkString($var, True); + $this->address = $var; + + return $this; + } + + /** + * The number of seconds to wait for a response from a request. The default + * varies based on the request protocol and deployment environment. + * + * Generated from protobuf field double deadline = 3; + * @return float + */ + public function getDeadline() + { + return $this->deadline; + } + + /** + * The number of seconds to wait for a response from a request. The default + * varies based on the request protocol and deployment environment. + * + * Generated from protobuf field double deadline = 3; + * @param float $var + * @return $this + */ + public function setDeadline($var) + { + GPBUtil::checkDouble($var); + $this->deadline = $var; + + return $this; + } + + /** + * Deprecated, do not use. + * + * Generated from protobuf field double min_deadline = 4 [deprecated = true]; + * @return float + * @deprecated + */ + public function getMinDeadline() + { + @trigger_error('min_deadline is deprecated.', E_USER_DEPRECATED); + return $this->min_deadline; + } + + /** + * Deprecated, do not use. + * + * Generated from protobuf field double min_deadline = 4 [deprecated = true]; + * @param float $var + * @return $this + * @deprecated + */ + public function setMinDeadline($var) + { + @trigger_error('min_deadline is deprecated.', E_USER_DEPRECATED); + GPBUtil::checkDouble($var); + $this->min_deadline = $var; + + return $this; + } + + /** + * The number of seconds to wait for the completion of a long running + * operation. The default is no deadline. + * + * Generated from protobuf field double operation_deadline = 5; + * @return float + */ + public function getOperationDeadline() + { + return $this->operation_deadline; + } + + /** + * The number of seconds to wait for the completion of a long running + * operation. The default is no deadline. + * + * Generated from protobuf field double operation_deadline = 5; + * @param float $var + * @return $this + */ + public function setOperationDeadline($var) + { + GPBUtil::checkDouble($var); + $this->operation_deadline = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.api.BackendRule.PathTranslation path_translation = 6; + * @return int + */ + public function getPathTranslation() + { + return $this->path_translation; + } + + /** + * Generated from protobuf field .google.api.BackendRule.PathTranslation path_translation = 6; + * @param int $var + * @return $this + */ + public function setPathTranslation($var) + { + GPBUtil::checkEnum($var, \Google\Api\BackendRule\PathTranslation::class); + $this->path_translation = $var; + + return $this; + } + + /** + * The JWT audience is used when generating a JWT ID token for the backend. + * This ID token will be added in the HTTP "authorization" header, and sent + * to the backend. + * + * Generated from protobuf field string jwt_audience = 7; + * @return string + */ + public function getJwtAudience() + { + return $this->readOneof(7); + } + + public function hasJwtAudience() + { + return $this->hasOneof(7); + } + + /** + * The JWT audience is used when generating a JWT ID token for the backend. + * This ID token will be added in the HTTP "authorization" header, and sent + * to the backend. + * + * Generated from protobuf field string jwt_audience = 7; + * @param string $var + * @return $this + */ + public function setJwtAudience($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(7, $var); + + return $this; + } + + /** + * When disable_auth is true, a JWT ID token won't be generated and the + * original "Authorization" HTTP header will be preserved. If the header is + * used to carry the original token and is expected by the backend, this + * field must be set to true to preserve the header. + * + * Generated from protobuf field bool disable_auth = 8; + * @return bool + */ + public function getDisableAuth() + { + return $this->readOneof(8); + } + + public function hasDisableAuth() + { + return $this->hasOneof(8); + } + + /** + * When disable_auth is true, a JWT ID token won't be generated and the + * original "Authorization" HTTP header will be preserved. If the header is + * used to carry the original token and is expected by the backend, this + * field must be set to true to preserve the header. + * + * Generated from protobuf field bool disable_auth = 8; + * @param bool $var + * @return $this + */ + public function setDisableAuth($var) + { + GPBUtil::checkBool($var); + $this->writeOneof(8, $var); + + return $this; + } + + /** + * The protocol used for sending a request to the backend. + * The supported values are "http/1.1" and "h2". + * The default value is inferred from the scheme in the + * [address][google.api.BackendRule.address] field: + * SCHEME PROTOCOL + * http:// http/1.1 + * https:// http/1.1 + * grpc:// h2 + * grpcs:// h2 + * For secure HTTP backends (https://) that support HTTP/2, set this field + * to "h2" for improved performance. + * Configuring this field to non-default values is only supported for secure + * HTTP backends. This field will be ignored for all other backends. + * See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for more details on the supported values. + * + * Generated from protobuf field string protocol = 9; + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * The protocol used for sending a request to the backend. + * The supported values are "http/1.1" and "h2". + * The default value is inferred from the scheme in the + * [address][google.api.BackendRule.address] field: + * SCHEME PROTOCOL + * http:// http/1.1 + * https:// http/1.1 + * grpc:// h2 + * grpcs:// h2 + * For secure HTTP backends (https://) that support HTTP/2, set this field + * to "h2" for improved performance. + * Configuring this field to non-default values is only supported for secure + * HTTP backends. This field will be ignored for all other backends. + * See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for more details on the supported values. + * + * Generated from protobuf field string protocol = 9; + * @param string $var + * @return $this + */ + public function setProtocol($var) + { + GPBUtil::checkString($var, True); + $this->protocol = $var; + + return $this; + } + + /** + * The map between request protocol and the backend address. + * + * Generated from protobuf field map overrides_by_request_protocol = 10; + * @return \Google\Protobuf\Internal\MapField + */ + public function getOverridesByRequestProtocol() + { + return $this->overrides_by_request_protocol; + } + + /** + * The map between request protocol and the backend address. + * + * Generated from protobuf field map overrides_by_request_protocol = 10; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setOverridesByRequestProtocol($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\BackendRule::class); + $this->overrides_by_request_protocol = $arr; + + return $this; + } + + /** + * @return string + */ + public function getAuthentication() + { + return $this->whichOneof("authentication"); + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/BackendRule/PathTranslation.php b/lib/Google/vendor/google/common-protos/src/Api/BackendRule/PathTranslation.php new file mode 100644 index 000000000..d076295cd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/BackendRule/PathTranslation.php @@ -0,0 +1,93 @@ +google.api.BackendRule.PathTranslation + */ +class PathTranslation +{ + /** + * Generated from protobuf enum PATH_TRANSLATION_UNSPECIFIED = 0; + */ + const PATH_TRANSLATION_UNSPECIFIED = 0; + /** + * Use the backend address as-is, with no modification to the path. If the + * URL pattern contains variables, the variable names and values will be + * appended to the query string. If a query string parameter and a URL + * pattern variable have the same name, this may result in duplicate keys in + * the query string. + * # Examples + * Given the following operation config: + * Method path: /api/company/{cid}/user/{uid} + * Backend address: https://example.cloudfunctions.net/getUser + * Requests to the following request paths will call the backend at the + * translated path: + * Request path: /api/company/widgetworks/user/johndoe + * Translated: + * https://example.cloudfunctions.net/getUser?cid=widgetworks&uid=johndoe + * Request path: /api/company/widgetworks/user/johndoe?timezone=EST + * Translated: + * https://example.cloudfunctions.net/getUser?timezone=EST&cid=widgetworks&uid=johndoe + * + * Generated from protobuf enum CONSTANT_ADDRESS = 1; + */ + const CONSTANT_ADDRESS = 1; + /** + * The request path will be appended to the backend address. + * # Examples + * Given the following operation config: + * Method path: /api/company/{cid}/user/{uid} + * Backend address: https://example.appspot.com + * Requests to the following request paths will call the backend at the + * translated path: + * Request path: /api/company/widgetworks/user/johndoe + * Translated: + * https://example.appspot.com/api/company/widgetworks/user/johndoe + * Request path: /api/company/widgetworks/user/johndoe?timezone=EST + * Translated: + * https://example.appspot.com/api/company/widgetworks/user/johndoe?timezone=EST + * + * Generated from protobuf enum APPEND_PATH_TO_ADDRESS = 2; + */ + const APPEND_PATH_TO_ADDRESS = 2; + + private static $valueToName = [ + self::PATH_TRANSLATION_UNSPECIFIED => 'PATH_TRANSLATION_UNSPECIFIED', + self::CONSTANT_ADDRESS => 'CONSTANT_ADDRESS', + self::APPEND_PATH_TO_ADDRESS => 'APPEND_PATH_TO_ADDRESS', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Billing.php b/lib/Google/vendor/google/common-protos/src/Api/Billing.php new file mode 100644 index 000000000..241d2f013 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Billing.php @@ -0,0 +1,107 @@ +google.api.Billing + */ +class Billing extends \Google\Protobuf\Internal\Message +{ + /** + * Billing configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations per service, each one must have + * a different monitored resource type. A metric can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Billing.BillingDestination consumer_destinations = 8; + */ + private $consumer_destinations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\Billing\BillingDestination>|\Google\Protobuf\Internal\RepeatedField $consumer_destinations + * Billing configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations per service, each one must have + * a different monitored resource type. A metric can be used in at most + * one consumer destination. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Billing::initOnce(); + parent::__construct($data); + } + + /** + * Billing configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations per service, each one must have + * a different monitored resource type. A metric can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Billing.BillingDestination consumer_destinations = 8; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getConsumerDestinations() + { + return $this->consumer_destinations; + } + + /** + * Billing configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations per service, each one must have + * a different monitored resource type. A metric can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Billing.BillingDestination consumer_destinations = 8; + * @param array<\Google\Api\Billing\BillingDestination>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setConsumerDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Billing\BillingDestination::class); + $this->consumer_destinations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Billing/BillingDestination.php b/lib/Google/vendor/google/common-protos/src/Api/Billing/BillingDestination.php new file mode 100644 index 000000000..39be6ddc5 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Billing/BillingDestination.php @@ -0,0 +1,119 @@ +google.api.Billing.BillingDestination + */ +class BillingDestination extends \Google\Protobuf\Internal\Message +{ + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + */ + protected $monitored_resource = ''; + /** + * Names of the metrics to report to this billing destination. + * Each name must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + */ + private $metrics; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $monitored_resource + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * @type array|\Google\Protobuf\Internal\RepeatedField $metrics + * Names of the metrics to report to this billing destination. + * Each name must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Billing::initOnce(); + parent::__construct($data); + } + + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + * @return string + */ + public function getMonitoredResource() + { + return $this->monitored_resource; + } + + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + * @param string $var + * @return $this + */ + public function setMonitoredResource($var) + { + GPBUtil::checkString($var, True); + $this->monitored_resource = $var; + + return $this; + } + + /** + * Names of the metrics to report to this billing destination. + * Each name must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMetrics() + { + return $this->metrics; + } + + /** + * Names of the metrics to report to this billing destination. + * Each name must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMetrics($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->metrics = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ChangeType.php b/lib/Google/vendor/google/common-protos/src/Api/ChangeType.php new file mode 100644 index 000000000..e39ab1bd2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ChangeType.php @@ -0,0 +1,72 @@ +google.api.ChangeType + */ +class ChangeType +{ + /** + * No value was provided. + * + * Generated from protobuf enum CHANGE_TYPE_UNSPECIFIED = 0; + */ + const CHANGE_TYPE_UNSPECIFIED = 0; + /** + * The changed object exists in the 'new' service configuration, but not + * in the 'old' service configuration. + * + * Generated from protobuf enum ADDED = 1; + */ + const ADDED = 1; + /** + * The changed object exists in the 'old' service configuration, but not + * in the 'new' service configuration. + * + * Generated from protobuf enum REMOVED = 2; + */ + const REMOVED = 2; + /** + * The changed object exists in both service configurations, but its value + * is different. + * + * Generated from protobuf enum MODIFIED = 3; + */ + const MODIFIED = 3; + + private static $valueToName = [ + self::CHANGE_TYPE_UNSPECIFIED => 'CHANGE_TYPE_UNSPECIFIED', + self::ADDED => 'ADDED', + self::REMOVED => 'REMOVED', + self::MODIFIED => 'MODIFIED', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryDestination.php b/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryDestination.php new file mode 100644 index 000000000..81aee7774 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryDestination.php @@ -0,0 +1,63 @@ +google.api.ClientLibraryDestination + */ +class ClientLibraryDestination +{ + /** + * Client libraries will neither be generated nor published to package + * managers. + * + * Generated from protobuf enum CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0; + */ + const CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0; + /** + * Generate the client library in a repo under github.com/googleapis, + * but don't publish it to package managers. + * + * Generated from protobuf enum GITHUB = 10; + */ + const GITHUB = 10; + /** + * Publish the library to package managers like nuget.org and npmjs.com. + * + * Generated from protobuf enum PACKAGE_MANAGER = 20; + */ + const PACKAGE_MANAGER = 20; + + private static $valueToName = [ + self::CLIENT_LIBRARY_DESTINATION_UNSPECIFIED => 'CLIENT_LIBRARY_DESTINATION_UNSPECIFIED', + self::GITHUB => 'GITHUB', + self::PACKAGE_MANAGER => 'PACKAGE_MANAGER', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryOrganization.php b/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryOrganization.php new file mode 100644 index 000000000..bbb985f6a --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ClientLibraryOrganization.php @@ -0,0 +1,97 @@ +google.api.ClientLibraryOrganization + */ +class ClientLibraryOrganization +{ + /** + * Not useful. + * + * Generated from protobuf enum CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0; + */ + const CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0; + /** + * Google Cloud Platform Org. + * + * Generated from protobuf enum CLOUD = 1; + */ + const CLOUD = 1; + /** + * Ads (Advertising) Org. + * + * Generated from protobuf enum ADS = 2; + */ + const ADS = 2; + /** + * Photos Org. + * + * Generated from protobuf enum PHOTOS = 3; + */ + const PHOTOS = 3; + /** + * Street View Org. + * + * Generated from protobuf enum STREET_VIEW = 4; + */ + const STREET_VIEW = 4; + /** + * Shopping Org. + * + * Generated from protobuf enum SHOPPING = 5; + */ + const SHOPPING = 5; + /** + * Geo Org. + * + * Generated from protobuf enum GEO = 6; + */ + const GEO = 6; + /** + * Generative AI - https://developers.generativeai.google + * + * Generated from protobuf enum GENERATIVE_AI = 7; + */ + const GENERATIVE_AI = 7; + + private static $valueToName = [ + self::CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED => 'CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED', + self::CLOUD => 'CLOUD', + self::ADS => 'ADS', + self::PHOTOS => 'PHOTOS', + self::STREET_VIEW => 'STREET_VIEW', + self::SHOPPING => 'SHOPPING', + self::GEO => 'GEO', + self::GENERATIVE_AI => 'GENERATIVE_AI', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ClientLibrarySettings.php b/lib/Google/vendor/google/common-protos/src/Api/ClientLibrarySettings.php new file mode 100644 index 000000000..d67588e01 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ClientLibrarySettings.php @@ -0,0 +1,499 @@ +google.api.ClientLibrarySettings + */ +class ClientLibrarySettings extends \Google\Protobuf\Internal\Message +{ + /** + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + * + * Generated from protobuf field string version = 1; + */ + protected $version = ''; + /** + * Launch stage of this version of the API. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 2; + */ + protected $launch_stage = 0; + /** + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + * + * Generated from protobuf field bool rest_numeric_enums = 3; + */ + protected $rest_numeric_enums = false; + /** + * Settings for legacy Java features, supported in the Service YAML. + * + * Generated from protobuf field .google.api.JavaSettings java_settings = 21; + */ + protected $java_settings = null; + /** + * Settings for C++ client libraries. + * + * Generated from protobuf field .google.api.CppSettings cpp_settings = 22; + */ + protected $cpp_settings = null; + /** + * Settings for PHP client libraries. + * + * Generated from protobuf field .google.api.PhpSettings php_settings = 23; + */ + protected $php_settings = null; + /** + * Settings for Python client libraries. + * + * Generated from protobuf field .google.api.PythonSettings python_settings = 24; + */ + protected $python_settings = null; + /** + * Settings for Node client libraries. + * + * Generated from protobuf field .google.api.NodeSettings node_settings = 25; + */ + protected $node_settings = null; + /** + * Settings for .NET client libraries. + * + * Generated from protobuf field .google.api.DotnetSettings dotnet_settings = 26; + */ + protected $dotnet_settings = null; + /** + * Settings for Ruby client libraries. + * + * Generated from protobuf field .google.api.RubySettings ruby_settings = 27; + */ + protected $ruby_settings = null; + /** + * Settings for Go client libraries. + * + * Generated from protobuf field .google.api.GoSettings go_settings = 28; + */ + protected $go_settings = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $version + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + * @type int $launch_stage + * Launch stage of this version of the API. + * @type bool $rest_numeric_enums + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + * @type \Google\Api\JavaSettings $java_settings + * Settings for legacy Java features, supported in the Service YAML. + * @type \Google\Api\CppSettings $cpp_settings + * Settings for C++ client libraries. + * @type \Google\Api\PhpSettings $php_settings + * Settings for PHP client libraries. + * @type \Google\Api\PythonSettings $python_settings + * Settings for Python client libraries. + * @type \Google\Api\NodeSettings $node_settings + * Settings for Node client libraries. + * @type \Google\Api\DotnetSettings $dotnet_settings + * Settings for .NET client libraries. + * @type \Google\Api\RubySettings $ruby_settings + * Settings for Ruby client libraries. + * @type \Google\Api\GoSettings $go_settings + * Settings for Go client libraries. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + * + * Generated from protobuf field string version = 1; + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + * + * Generated from protobuf field string version = 1; + * @param string $var + * @return $this + */ + public function setVersion($var) + { + GPBUtil::checkString($var, True); + $this->version = $var; + + return $this; + } + + /** + * Launch stage of this version of the API. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 2; + * @return int + */ + public function getLaunchStage() + { + return $this->launch_stage; + } + + /** + * Launch stage of this version of the API. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 2; + * @param int $var + * @return $this + */ + public function setLaunchStage($var) + { + GPBUtil::checkEnum($var, \Google\Api\LaunchStage::class); + $this->launch_stage = $var; + + return $this; + } + + /** + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + * + * Generated from protobuf field bool rest_numeric_enums = 3; + * @return bool + */ + public function getRestNumericEnums() + { + return $this->rest_numeric_enums; + } + + /** + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + * + * Generated from protobuf field bool rest_numeric_enums = 3; + * @param bool $var + * @return $this + */ + public function setRestNumericEnums($var) + { + GPBUtil::checkBool($var); + $this->rest_numeric_enums = $var; + + return $this; + } + + /** + * Settings for legacy Java features, supported in the Service YAML. + * + * Generated from protobuf field .google.api.JavaSettings java_settings = 21; + * @return \Google\Api\JavaSettings|null + */ + public function getJavaSettings() + { + return $this->java_settings; + } + + public function hasJavaSettings() + { + return isset($this->java_settings); + } + + public function clearJavaSettings() + { + unset($this->java_settings); + } + + /** + * Settings for legacy Java features, supported in the Service YAML. + * + * Generated from protobuf field .google.api.JavaSettings java_settings = 21; + * @param \Google\Api\JavaSettings $var + * @return $this + */ + public function setJavaSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\JavaSettings::class); + $this->java_settings = $var; + + return $this; + } + + /** + * Settings for C++ client libraries. + * + * Generated from protobuf field .google.api.CppSettings cpp_settings = 22; + * @return \Google\Api\CppSettings|null + */ + public function getCppSettings() + { + return $this->cpp_settings; + } + + public function hasCppSettings() + { + return isset($this->cpp_settings); + } + + public function clearCppSettings() + { + unset($this->cpp_settings); + } + + /** + * Settings for C++ client libraries. + * + * Generated from protobuf field .google.api.CppSettings cpp_settings = 22; + * @param \Google\Api\CppSettings $var + * @return $this + */ + public function setCppSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\CppSettings::class); + $this->cpp_settings = $var; + + return $this; + } + + /** + * Settings for PHP client libraries. + * + * Generated from protobuf field .google.api.PhpSettings php_settings = 23; + * @return \Google\Api\PhpSettings|null + */ + public function getPhpSettings() + { + return $this->php_settings; + } + + public function hasPhpSettings() + { + return isset($this->php_settings); + } + + public function clearPhpSettings() + { + unset($this->php_settings); + } + + /** + * Settings for PHP client libraries. + * + * Generated from protobuf field .google.api.PhpSettings php_settings = 23; + * @param \Google\Api\PhpSettings $var + * @return $this + */ + public function setPhpSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\PhpSettings::class); + $this->php_settings = $var; + + return $this; + } + + /** + * Settings for Python client libraries. + * + * Generated from protobuf field .google.api.PythonSettings python_settings = 24; + * @return \Google\Api\PythonSettings|null + */ + public function getPythonSettings() + { + return $this->python_settings; + } + + public function hasPythonSettings() + { + return isset($this->python_settings); + } + + public function clearPythonSettings() + { + unset($this->python_settings); + } + + /** + * Settings for Python client libraries. + * + * Generated from protobuf field .google.api.PythonSettings python_settings = 24; + * @param \Google\Api\PythonSettings $var + * @return $this + */ + public function setPythonSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\PythonSettings::class); + $this->python_settings = $var; + + return $this; + } + + /** + * Settings for Node client libraries. + * + * Generated from protobuf field .google.api.NodeSettings node_settings = 25; + * @return \Google\Api\NodeSettings|null + */ + public function getNodeSettings() + { + return $this->node_settings; + } + + public function hasNodeSettings() + { + return isset($this->node_settings); + } + + public function clearNodeSettings() + { + unset($this->node_settings); + } + + /** + * Settings for Node client libraries. + * + * Generated from protobuf field .google.api.NodeSettings node_settings = 25; + * @param \Google\Api\NodeSettings $var + * @return $this + */ + public function setNodeSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\NodeSettings::class); + $this->node_settings = $var; + + return $this; + } + + /** + * Settings for .NET client libraries. + * + * Generated from protobuf field .google.api.DotnetSettings dotnet_settings = 26; + * @return \Google\Api\DotnetSettings|null + */ + public function getDotnetSettings() + { + return $this->dotnet_settings; + } + + public function hasDotnetSettings() + { + return isset($this->dotnet_settings); + } + + public function clearDotnetSettings() + { + unset($this->dotnet_settings); + } + + /** + * Settings for .NET client libraries. + * + * Generated from protobuf field .google.api.DotnetSettings dotnet_settings = 26; + * @param \Google\Api\DotnetSettings $var + * @return $this + */ + public function setDotnetSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\DotnetSettings::class); + $this->dotnet_settings = $var; + + return $this; + } + + /** + * Settings for Ruby client libraries. + * + * Generated from protobuf field .google.api.RubySettings ruby_settings = 27; + * @return \Google\Api\RubySettings|null + */ + public function getRubySettings() + { + return $this->ruby_settings; + } + + public function hasRubySettings() + { + return isset($this->ruby_settings); + } + + public function clearRubySettings() + { + unset($this->ruby_settings); + } + + /** + * Settings for Ruby client libraries. + * + * Generated from protobuf field .google.api.RubySettings ruby_settings = 27; + * @param \Google\Api\RubySettings $var + * @return $this + */ + public function setRubySettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\RubySettings::class); + $this->ruby_settings = $var; + + return $this; + } + + /** + * Settings for Go client libraries. + * + * Generated from protobuf field .google.api.GoSettings go_settings = 28; + * @return \Google\Api\GoSettings|null + */ + public function getGoSettings() + { + return $this->go_settings; + } + + public function hasGoSettings() + { + return isset($this->go_settings); + } + + public function clearGoSettings() + { + unset($this->go_settings); + } + + /** + * Settings for Go client libraries. + * + * Generated from protobuf field .google.api.GoSettings go_settings = 28; + * @param \Google\Api\GoSettings $var + * @return $this + */ + public function setGoSettings($var) + { + GPBUtil::checkMessage($var, \Google\Api\GoSettings::class); + $this->go_settings = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/CommonLanguageSettings.php b/lib/Google/vendor/google/common-protos/src/Api/CommonLanguageSettings.php new file mode 100644 index 000000000..f5b09853b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/CommonLanguageSettings.php @@ -0,0 +1,110 @@ +google.api.CommonLanguageSettings + */ +class CommonLanguageSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * + * Generated from protobuf field string reference_docs_uri = 1 [deprecated = true]; + * @deprecated + */ + protected $reference_docs_uri = ''; + /** + * The destination where API teams want this client library to be published. + * + * Generated from protobuf field repeated .google.api.ClientLibraryDestination destinations = 2; + */ + private $destinations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $reference_docs_uri + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * @type array|\Google\Protobuf\Internal\RepeatedField $destinations + * The destination where API teams want this client library to be published. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * + * Generated from protobuf field string reference_docs_uri = 1 [deprecated = true]; + * @return string + * @deprecated + */ + public function getReferenceDocsUri() + { + @trigger_error('reference_docs_uri is deprecated.', E_USER_DEPRECATED); + return $this->reference_docs_uri; + } + + /** + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * + * Generated from protobuf field string reference_docs_uri = 1 [deprecated = true]; + * @param string $var + * @return $this + * @deprecated + */ + public function setReferenceDocsUri($var) + { + @trigger_error('reference_docs_uri is deprecated.', E_USER_DEPRECATED); + GPBUtil::checkString($var, True); + $this->reference_docs_uri = $var; + + return $this; + } + + /** + * The destination where API teams want this client library to be published. + * + * Generated from protobuf field repeated .google.api.ClientLibraryDestination destinations = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getDestinations() + { + return $this->destinations; + } + + /** + * The destination where API teams want this client library to be published. + * + * Generated from protobuf field repeated .google.api.ClientLibraryDestination destinations = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::ENUM, \Google\Api\ClientLibraryDestination::class); + $this->destinations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ConfigChange.php b/lib/Google/vendor/google/common-protos/src/Api/ConfigChange.php new file mode 100644 index 000000000..8c4fcd5e6 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ConfigChange.php @@ -0,0 +1,251 @@ +google.api.ConfigChange + */ +class ConfigChange extends \Google\Protobuf\Internal\Message +{ + /** + * Object hierarchy path to the change, with levels separated by a '.' + * character. For repeated fields, an applicable unique identifier field is + * used for the index (usually selector, name, or id). For maps, the term + * 'key' is used. If the field has no unique identifier, the numeric index + * is used. + * Examples: + * - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction + * - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value + * - logging.producer_destinations[0] + * + * Generated from protobuf field string element = 1; + */ + protected $element = ''; + /** + * Value of the changed object in the old Service configuration, + * in JSON format. This field will not be populated if ChangeType == ADDED. + * + * Generated from protobuf field string old_value = 2; + */ + protected $old_value = ''; + /** + * Value of the changed object in the new Service configuration, + * in JSON format. This field will not be populated if ChangeType == REMOVED. + * + * Generated from protobuf field string new_value = 3; + */ + protected $new_value = ''; + /** + * The type for this change, either ADDED, REMOVED, or MODIFIED. + * + * Generated from protobuf field .google.api.ChangeType change_type = 4; + */ + protected $change_type = 0; + /** + * Collection of advice provided for this change, useful for determining the + * possible impact of this change. + * + * Generated from protobuf field repeated .google.api.Advice advices = 5; + */ + private $advices; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $element + * Object hierarchy path to the change, with levels separated by a '.' + * character. For repeated fields, an applicable unique identifier field is + * used for the index (usually selector, name, or id). For maps, the term + * 'key' is used. If the field has no unique identifier, the numeric index + * is used. + * Examples: + * - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction + * - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value + * - logging.producer_destinations[0] + * @type string $old_value + * Value of the changed object in the old Service configuration, + * in JSON format. This field will not be populated if ChangeType == ADDED. + * @type string $new_value + * Value of the changed object in the new Service configuration, + * in JSON format. This field will not be populated if ChangeType == REMOVED. + * @type int $change_type + * The type for this change, either ADDED, REMOVED, or MODIFIED. + * @type array<\Google\Api\Advice>|\Google\Protobuf\Internal\RepeatedField $advices + * Collection of advice provided for this change, useful for determining the + * possible impact of this change. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\ConfigChange::initOnce(); + parent::__construct($data); + } + + /** + * Object hierarchy path to the change, with levels separated by a '.' + * character. For repeated fields, an applicable unique identifier field is + * used for the index (usually selector, name, or id). For maps, the term + * 'key' is used. If the field has no unique identifier, the numeric index + * is used. + * Examples: + * - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction + * - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value + * - logging.producer_destinations[0] + * + * Generated from protobuf field string element = 1; + * @return string + */ + public function getElement() + { + return $this->element; + } + + /** + * Object hierarchy path to the change, with levels separated by a '.' + * character. For repeated fields, an applicable unique identifier field is + * used for the index (usually selector, name, or id). For maps, the term + * 'key' is used. If the field has no unique identifier, the numeric index + * is used. + * Examples: + * - visibility.rules[selector=="google.LibraryService.ListBooks"].restriction + * - quota.metric_rules[selector=="google"].metric_costs[key=="reads"].value + * - logging.producer_destinations[0] + * + * Generated from protobuf field string element = 1; + * @param string $var + * @return $this + */ + public function setElement($var) + { + GPBUtil::checkString($var, True); + $this->element = $var; + + return $this; + } + + /** + * Value of the changed object in the old Service configuration, + * in JSON format. This field will not be populated if ChangeType == ADDED. + * + * Generated from protobuf field string old_value = 2; + * @return string + */ + public function getOldValue() + { + return $this->old_value; + } + + /** + * Value of the changed object in the old Service configuration, + * in JSON format. This field will not be populated if ChangeType == ADDED. + * + * Generated from protobuf field string old_value = 2; + * @param string $var + * @return $this + */ + public function setOldValue($var) + { + GPBUtil::checkString($var, True); + $this->old_value = $var; + + return $this; + } + + /** + * Value of the changed object in the new Service configuration, + * in JSON format. This field will not be populated if ChangeType == REMOVED. + * + * Generated from protobuf field string new_value = 3; + * @return string + */ + public function getNewValue() + { + return $this->new_value; + } + + /** + * Value of the changed object in the new Service configuration, + * in JSON format. This field will not be populated if ChangeType == REMOVED. + * + * Generated from protobuf field string new_value = 3; + * @param string $var + * @return $this + */ + public function setNewValue($var) + { + GPBUtil::checkString($var, True); + $this->new_value = $var; + + return $this; + } + + /** + * The type for this change, either ADDED, REMOVED, or MODIFIED. + * + * Generated from protobuf field .google.api.ChangeType change_type = 4; + * @return int + */ + public function getChangeType() + { + return $this->change_type; + } + + /** + * The type for this change, either ADDED, REMOVED, or MODIFIED. + * + * Generated from protobuf field .google.api.ChangeType change_type = 4; + * @param int $var + * @return $this + */ + public function setChangeType($var) + { + GPBUtil::checkEnum($var, \Google\Api\ChangeType::class); + $this->change_type = $var; + + return $this; + } + + /** + * Collection of advice provided for this change, useful for determining the + * possible impact of this change. + * + * Generated from protobuf field repeated .google.api.Advice advices = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAdvices() + { + return $this->advices; + } + + /** + * Collection of advice provided for this change, useful for determining the + * possible impact of this change. + * + * Generated from protobuf field repeated .google.api.Advice advices = 5; + * @param array<\Google\Api\Advice>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAdvices($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Advice::class); + $this->advices = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Context.php b/lib/Google/vendor/google/common-protos/src/Api/Context.php new file mode 100644 index 000000000..b353115ea --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Context.php @@ -0,0 +1,98 @@ +-bin” and + * “x-goog-ext--jspb” format. For example, list any service + * specific protobuf types that can appear in grpc metadata as follows in your + * yaml file: + * Example: + * context: + * rules: + * - selector: "google.example.library.v1.LibraryService.CreateBook" + * allowed_request_extensions: + * - google.foo.v1.NewExtension + * allowed_response_extensions: + * - google.foo.v1.NewExtension + * You can also specify extension ID instead of fully qualified extension name + * here. + * + * Generated from protobuf message google.api.Context + */ +class Context extends \Google\Protobuf\Internal\Message +{ + /** + * A list of RPC context rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.ContextRule rules = 1; + */ + private $rules; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\ContextRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of RPC context rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Context::initOnce(); + parent::__construct($data); + } + + /** + * A list of RPC context rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.ContextRule rules = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of RPC context rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.ContextRule rules = 1; + * @param array<\Google\Api\ContextRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\ContextRule::class); + $this->rules = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ContextRule.php b/lib/Google/vendor/google/common-protos/src/Api/ContextRule.php new file mode 100644 index 000000000..f455b1e61 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ContextRule.php @@ -0,0 +1,228 @@ +google.api.ContextRule + */ +class ContextRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * A list of full type names of requested contexts, only the requested context + * will be made available to the backend. + * + * Generated from protobuf field repeated string requested = 2; + */ + private $requested; + /** + * A list of full type names of provided contexts. It is used to support + * propagating HTTP headers and ETags from the response extension. + * + * Generated from protobuf field repeated string provided = 3; + */ + private $provided; + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from client to backend. + * + * Generated from protobuf field repeated string allowed_request_extensions = 4; + */ + private $allowed_request_extensions; + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from backend to client. + * + * Generated from protobuf field repeated string allowed_response_extensions = 5; + */ + private $allowed_response_extensions; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type array|\Google\Protobuf\Internal\RepeatedField $requested + * A list of full type names of requested contexts, only the requested context + * will be made available to the backend. + * @type array|\Google\Protobuf\Internal\RepeatedField $provided + * A list of full type names of provided contexts. It is used to support + * propagating HTTP headers and ETags from the response extension. + * @type array|\Google\Protobuf\Internal\RepeatedField $allowed_request_extensions + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from client to backend. + * @type array|\Google\Protobuf\Internal\RepeatedField $allowed_response_extensions + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from backend to client. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Context::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * A list of full type names of requested contexts, only the requested context + * will be made available to the backend. + * + * Generated from protobuf field repeated string requested = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRequested() + { + return $this->requested; + } + + /** + * A list of full type names of requested contexts, only the requested context + * will be made available to the backend. + * + * Generated from protobuf field repeated string requested = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRequested($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->requested = $arr; + + return $this; + } + + /** + * A list of full type names of provided contexts. It is used to support + * propagating HTTP headers and ETags from the response extension. + * + * Generated from protobuf field repeated string provided = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getProvided() + { + return $this->provided; + } + + /** + * A list of full type names of provided contexts. It is used to support + * propagating HTTP headers and ETags from the response extension. + * + * Generated from protobuf field repeated string provided = 3; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setProvided($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->provided = $arr; + + return $this; + } + + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from client to backend. + * + * Generated from protobuf field repeated string allowed_request_extensions = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAllowedRequestExtensions() + { + return $this->allowed_request_extensions; + } + + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from client to backend. + * + * Generated from protobuf field repeated string allowed_request_extensions = 4; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAllowedRequestExtensions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->allowed_request_extensions = $arr; + + return $this; + } + + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from backend to client. + * + * Generated from protobuf field repeated string allowed_response_extensions = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAllowedResponseExtensions() + { + return $this->allowed_response_extensions; + } + + /** + * A list of full type names or extension IDs of extensions allowed in grpc + * side channel from backend to client. + * + * Generated from protobuf field repeated string allowed_response_extensions = 5; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAllowedResponseExtensions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->allowed_response_extensions = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Control.php b/lib/Google/vendor/google/common-protos/src/Api/Control.php new file mode 100644 index 000000000..5b9bdf128 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Control.php @@ -0,0 +1,112 @@ +google.api.Control + */ +class Control extends \Google\Protobuf\Internal\Message +{ + /** + * The service controller environment to use. If empty, no control plane + * feature (like quota and billing) will be enabled. The recommended value for + * most services is servicecontrol.googleapis.com + * + * Generated from protobuf field string environment = 1; + */ + protected $environment = ''; + /** + * Defines policies applying to the API methods of the service. + * + * Generated from protobuf field repeated .google.api.MethodPolicy method_policies = 4; + */ + private $method_policies; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $environment + * The service controller environment to use. If empty, no control plane + * feature (like quota and billing) will be enabled. The recommended value for + * most services is servicecontrol.googleapis.com + * @type array<\Google\Api\MethodPolicy>|\Google\Protobuf\Internal\RepeatedField $method_policies + * Defines policies applying to the API methods of the service. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Control::initOnce(); + parent::__construct($data); + } + + /** + * The service controller environment to use. If empty, no control plane + * feature (like quota and billing) will be enabled. The recommended value for + * most services is servicecontrol.googleapis.com + * + * Generated from protobuf field string environment = 1; + * @return string + */ + public function getEnvironment() + { + return $this->environment; + } + + /** + * The service controller environment to use. If empty, no control plane + * feature (like quota and billing) will be enabled. The recommended value for + * most services is servicecontrol.googleapis.com + * + * Generated from protobuf field string environment = 1; + * @param string $var + * @return $this + */ + public function setEnvironment($var) + { + GPBUtil::checkString($var, True); + $this->environment = $var; + + return $this; + } + + /** + * Defines policies applying to the API methods of the service. + * + * Generated from protobuf field repeated .google.api.MethodPolicy method_policies = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMethodPolicies() + { + return $this->method_policies; + } + + /** + * Defines policies applying to the API methods of the service. + * + * Generated from protobuf field repeated .google.api.MethodPolicy method_policies = 4; + * @param array<\Google\Api\MethodPolicy>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMethodPolicies($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\MethodPolicy::class); + $this->method_policies = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/CppSettings.php b/lib/Google/vendor/google/common-protos/src/Api/CppSettings.php new file mode 100644 index 000000000..d814b5c3c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/CppSettings.php @@ -0,0 +1,77 @@ +google.api.CppSettings + */ +class CppSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/CustomHttpPattern.php b/lib/Google/vendor/google/common-protos/src/Api/CustomHttpPattern.php new file mode 100644 index 000000000..e9370320d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/CustomHttpPattern.php @@ -0,0 +1,101 @@ +google.api.CustomHttpPattern + */ +class CustomHttpPattern extends \Google\Protobuf\Internal\Message +{ + /** + * The name of this custom HTTP verb. + * + * Generated from protobuf field string kind = 1; + */ + protected $kind = ''; + /** + * The path matched by this custom verb. + * + * Generated from protobuf field string path = 2; + */ + protected $path = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $kind + * The name of this custom HTTP verb. + * @type string $path + * The path matched by this custom verb. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Http::initOnce(); + parent::__construct($data); + } + + /** + * The name of this custom HTTP verb. + * + * Generated from protobuf field string kind = 1; + * @return string + */ + public function getKind() + { + return $this->kind; + } + + /** + * The name of this custom HTTP verb. + * + * Generated from protobuf field string kind = 1; + * @param string $var + * @return $this + */ + public function setKind($var) + { + GPBUtil::checkString($var, True); + $this->kind = $var; + + return $this; + } + + /** + * The path matched by this custom verb. + * + * Generated from protobuf field string path = 2; + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * The path matched by this custom verb. + * + * Generated from protobuf field string path = 2; + * @param string $var + * @return $this + */ + public function setPath($var) + { + GPBUtil::checkString($var, True); + $this->path = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution.php new file mode 100644 index 000000000..e81aae5cb --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution.php @@ -0,0 +1,390 @@ +google.api.Distribution + */ +class Distribution extends \Google\Protobuf\Internal\Message +{ + /** + * The number of values in the population. Must be non-negative. This value + * must equal the sum of the values in `bucket_counts` if a histogram is + * provided. + * + * Generated from protobuf field int64 count = 1; + */ + protected $count = 0; + /** + * The arithmetic mean of the values in the population. If `count` is zero + * then this field must be zero. + * + * Generated from protobuf field double mean = 2; + */ + protected $mean = 0.0; + /** + * The sum of squared deviations from the mean of the values in the + * population. For values x_i this is: + * Sum[i=1..n]((x_i - mean)^2) + * Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition + * describes Welford's method for accumulating this sum in one pass. + * If `count` is zero then this field must be zero. + * + * Generated from protobuf field double sum_of_squared_deviation = 3; + */ + protected $sum_of_squared_deviation = 0.0; + /** + * If specified, contains the range of the population values. The field + * must not be present if the `count` is zero. + * + * Generated from protobuf field .google.api.Distribution.Range range = 4; + */ + protected $range = null; + /** + * Defines the histogram bucket boundaries. If the distribution does not + * contain a histogram, then omit this field. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions bucket_options = 6; + */ + protected $bucket_options = null; + /** + * The number of values in each bucket of the histogram, as described in + * `bucket_options`. If the distribution does not have a histogram, then omit + * this field. If there is a histogram, then the sum of the values in + * `bucket_counts` must equal the value in the `count` field of the + * distribution. + * If present, `bucket_counts` should contain N values, where N is the number + * of buckets specified in `bucket_options`. If you supply fewer than N + * values, the remaining values are assumed to be 0. + * The order of the values in `bucket_counts` follows the bucket numbering + * schemes described for the three bucket types. The first value must be the + * count for the underflow bucket (number 0). The next N-2 values are the + * counts for the finite buckets (number 1 through N-2). The N'th value in + * `bucket_counts` is the count for the overflow bucket (number N-1). + * + * Generated from protobuf field repeated int64 bucket_counts = 7; + */ + private $bucket_counts; + /** + * Must be in increasing order of `value` field. + * + * Generated from protobuf field repeated .google.api.Distribution.Exemplar exemplars = 10; + */ + private $exemplars; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $count + * The number of values in the population. Must be non-negative. This value + * must equal the sum of the values in `bucket_counts` if a histogram is + * provided. + * @type float $mean + * The arithmetic mean of the values in the population. If `count` is zero + * then this field must be zero. + * @type float $sum_of_squared_deviation + * The sum of squared deviations from the mean of the values in the + * population. For values x_i this is: + * Sum[i=1..n]((x_i - mean)^2) + * Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition + * describes Welford's method for accumulating this sum in one pass. + * If `count` is zero then this field must be zero. + * @type \Google\Api\Distribution\Range $range + * If specified, contains the range of the population values. The field + * must not be present if the `count` is zero. + * @type \Google\Api\Distribution\BucketOptions $bucket_options + * Defines the histogram bucket boundaries. If the distribution does not + * contain a histogram, then omit this field. + * @type array|array|\Google\Protobuf\Internal\RepeatedField $bucket_counts + * The number of values in each bucket of the histogram, as described in + * `bucket_options`. If the distribution does not have a histogram, then omit + * this field. If there is a histogram, then the sum of the values in + * `bucket_counts` must equal the value in the `count` field of the + * distribution. + * If present, `bucket_counts` should contain N values, where N is the number + * of buckets specified in `bucket_options`. If you supply fewer than N + * values, the remaining values are assumed to be 0. + * The order of the values in `bucket_counts` follows the bucket numbering + * schemes described for the three bucket types. The first value must be the + * count for the underflow bucket (number 0). The next N-2 values are the + * counts for the finite buckets (number 1 through N-2). The N'th value in + * `bucket_counts` is the count for the overflow bucket (number N-1). + * @type array<\Google\Api\Distribution\Exemplar>|\Google\Protobuf\Internal\RepeatedField $exemplars + * Must be in increasing order of `value` field. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * The number of values in the population. Must be non-negative. This value + * must equal the sum of the values in `bucket_counts` if a histogram is + * provided. + * + * Generated from protobuf field int64 count = 1; + * @return int|string + */ + public function getCount() + { + return $this->count; + } + + /** + * The number of values in the population. Must be non-negative. This value + * must equal the sum of the values in `bucket_counts` if a histogram is + * provided. + * + * Generated from protobuf field int64 count = 1; + * @param int|string $var + * @return $this + */ + public function setCount($var) + { + GPBUtil::checkInt64($var); + $this->count = $var; + + return $this; + } + + /** + * The arithmetic mean of the values in the population. If `count` is zero + * then this field must be zero. + * + * Generated from protobuf field double mean = 2; + * @return float + */ + public function getMean() + { + return $this->mean; + } + + /** + * The arithmetic mean of the values in the population. If `count` is zero + * then this field must be zero. + * + * Generated from protobuf field double mean = 2; + * @param float $var + * @return $this + */ + public function setMean($var) + { + GPBUtil::checkDouble($var); + $this->mean = $var; + + return $this; + } + + /** + * The sum of squared deviations from the mean of the values in the + * population. For values x_i this is: + * Sum[i=1..n]((x_i - mean)^2) + * Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition + * describes Welford's method for accumulating this sum in one pass. + * If `count` is zero then this field must be zero. + * + * Generated from protobuf field double sum_of_squared_deviation = 3; + * @return float + */ + public function getSumOfSquaredDeviation() + { + return $this->sum_of_squared_deviation; + } + + /** + * The sum of squared deviations from the mean of the values in the + * population. For values x_i this is: + * Sum[i=1..n]((x_i - mean)^2) + * Knuth, "The Art of Computer Programming", Vol. 2, page 232, 3rd edition + * describes Welford's method for accumulating this sum in one pass. + * If `count` is zero then this field must be zero. + * + * Generated from protobuf field double sum_of_squared_deviation = 3; + * @param float $var + * @return $this + */ + public function setSumOfSquaredDeviation($var) + { + GPBUtil::checkDouble($var); + $this->sum_of_squared_deviation = $var; + + return $this; + } + + /** + * If specified, contains the range of the population values. The field + * must not be present if the `count` is zero. + * + * Generated from protobuf field .google.api.Distribution.Range range = 4; + * @return \Google\Api\Distribution\Range|null + */ + public function getRange() + { + return $this->range; + } + + public function hasRange() + { + return isset($this->range); + } + + public function clearRange() + { + unset($this->range); + } + + /** + * If specified, contains the range of the population values. The field + * must not be present if the `count` is zero. + * + * Generated from protobuf field .google.api.Distribution.Range range = 4; + * @param \Google\Api\Distribution\Range $var + * @return $this + */ + public function setRange($var) + { + GPBUtil::checkMessage($var, \Google\Api\Distribution\Range::class); + $this->range = $var; + + return $this; + } + + /** + * Defines the histogram bucket boundaries. If the distribution does not + * contain a histogram, then omit this field. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions bucket_options = 6; + * @return \Google\Api\Distribution\BucketOptions|null + */ + public function getBucketOptions() + { + return $this->bucket_options; + } + + public function hasBucketOptions() + { + return isset($this->bucket_options); + } + + public function clearBucketOptions() + { + unset($this->bucket_options); + } + + /** + * Defines the histogram bucket boundaries. If the distribution does not + * contain a histogram, then omit this field. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions bucket_options = 6; + * @param \Google\Api\Distribution\BucketOptions $var + * @return $this + */ + public function setBucketOptions($var) + { + GPBUtil::checkMessage($var, \Google\Api\Distribution\BucketOptions::class); + $this->bucket_options = $var; + + return $this; + } + + /** + * The number of values in each bucket of the histogram, as described in + * `bucket_options`. If the distribution does not have a histogram, then omit + * this field. If there is a histogram, then the sum of the values in + * `bucket_counts` must equal the value in the `count` field of the + * distribution. + * If present, `bucket_counts` should contain N values, where N is the number + * of buckets specified in `bucket_options`. If you supply fewer than N + * values, the remaining values are assumed to be 0. + * The order of the values in `bucket_counts` follows the bucket numbering + * schemes described for the three bucket types. The first value must be the + * count for the underflow bucket (number 0). The next N-2 values are the + * counts for the finite buckets (number 1 through N-2). The N'th value in + * `bucket_counts` is the count for the overflow bucket (number N-1). + * + * Generated from protobuf field repeated int64 bucket_counts = 7; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getBucketCounts() + { + return $this->bucket_counts; + } + + /** + * The number of values in each bucket of the histogram, as described in + * `bucket_options`. If the distribution does not have a histogram, then omit + * this field. If there is a histogram, then the sum of the values in + * `bucket_counts` must equal the value in the `count` field of the + * distribution. + * If present, `bucket_counts` should contain N values, where N is the number + * of buckets specified in `bucket_options`. If you supply fewer than N + * values, the remaining values are assumed to be 0. + * The order of the values in `bucket_counts` follows the bucket numbering + * schemes described for the three bucket types. The first value must be the + * count for the underflow bucket (number 0). The next N-2 values are the + * counts for the finite buckets (number 1 through N-2). The N'th value in + * `bucket_counts` is the count for the overflow bucket (number N-1). + * + * Generated from protobuf field repeated int64 bucket_counts = 7; + * @param array|array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setBucketCounts($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::INT64); + $this->bucket_counts = $arr; + + return $this; + } + + /** + * Must be in increasing order of `value` field. + * + * Generated from protobuf field repeated .google.api.Distribution.Exemplar exemplars = 10; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getExemplars() + { + return $this->exemplars; + } + + /** + * Must be in increasing order of `value` field. + * + * Generated from protobuf field repeated .google.api.Distribution.Exemplar exemplars = 10; + * @param array<\Google\Api\Distribution\Exemplar>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setExemplars($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Distribution\Exemplar::class); + $this->exemplars = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions.php new file mode 100644 index 000000000..22aa21fe4 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions.php @@ -0,0 +1,155 @@ + 0) is the + * same as the upper bound of bucket i - 1. The buckets span the whole range + * of finite values: lower bound of the underflow bucket is -infinity and the + * upper bound of the overflow bucket is +infinity. The finite buckets are + * so-called because both bounds are finite. + * + * Generated from protobuf message google.api.Distribution.BucketOptions + */ +class BucketOptions extends \Google\Protobuf\Internal\Message +{ + protected $options; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\Distribution\BucketOptions\Linear $linear_buckets + * The linear bucket. + * @type \Google\Api\Distribution\BucketOptions\Exponential $exponential_buckets + * The exponential buckets. + * @type \Google\Api\Distribution\BucketOptions\Explicit $explicit_buckets + * The explicit buckets. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * The linear bucket. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Linear linear_buckets = 1; + * @return \Google\Api\Distribution\BucketOptions\Linear|null + */ + public function getLinearBuckets() + { + return $this->readOneof(1); + } + + public function hasLinearBuckets() + { + return $this->hasOneof(1); + } + + /** + * The linear bucket. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Linear linear_buckets = 1; + * @param \Google\Api\Distribution\BucketOptions\Linear $var + * @return $this + */ + public function setLinearBuckets($var) + { + GPBUtil::checkMessage($var, \Google\Api\Distribution\BucketOptions\Linear::class); + $this->writeOneof(1, $var); + + return $this; + } + + /** + * The exponential buckets. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Exponential exponential_buckets = 2; + * @return \Google\Api\Distribution\BucketOptions\Exponential|null + */ + public function getExponentialBuckets() + { + return $this->readOneof(2); + } + + public function hasExponentialBuckets() + { + return $this->hasOneof(2); + } + + /** + * The exponential buckets. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Exponential exponential_buckets = 2; + * @param \Google\Api\Distribution\BucketOptions\Exponential $var + * @return $this + */ + public function setExponentialBuckets($var) + { + GPBUtil::checkMessage($var, \Google\Api\Distribution\BucketOptions\Exponential::class); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * The explicit buckets. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Explicit explicit_buckets = 3; + * @return \Google\Api\Distribution\BucketOptions\Explicit|null + */ + public function getExplicitBuckets() + { + return $this->readOneof(3); + } + + public function hasExplicitBuckets() + { + return $this->hasOneof(3); + } + + /** + * The explicit buckets. + * + * Generated from protobuf field .google.api.Distribution.BucketOptions.Explicit explicit_buckets = 3; + * @param \Google\Api\Distribution\BucketOptions\Explicit $var + * @return $this + */ + public function setExplicitBuckets($var) + { + GPBUtil::checkMessage($var, \Google\Api\Distribution\BucketOptions\Explicit::class); + $this->writeOneof(3, $var); + + return $this; + } + + /** + * @return string + */ + public function getOptions() + { + return $this->whichOneof("options"); + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Explicit.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Explicit.php new file mode 100644 index 000000000..e39aaaef7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Explicit.php @@ -0,0 +1,75 @@ +google.api.Distribution.BucketOptions.Explicit + */ +class Explicit extends \Google\Protobuf\Internal\Message +{ + /** + * The values must be monotonically increasing. + * + * Generated from protobuf field repeated double bounds = 1; + */ + private $bounds; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\RepeatedField $bounds + * The values must be monotonically increasing. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * The values must be monotonically increasing. + * + * Generated from protobuf field repeated double bounds = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getBounds() + { + return $this->bounds; + } + + /** + * The values must be monotonically increasing. + * + * Generated from protobuf field repeated double bounds = 1; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setBounds($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::DOUBLE); + $this->bounds = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Exponential.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Exponential.php new file mode 100644 index 000000000..b71758113 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Exponential.php @@ -0,0 +1,142 @@ +google.api.Distribution.BucketOptions.Exponential + */ +class Exponential extends \Google\Protobuf\Internal\Message +{ + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + */ + protected $num_finite_buckets = 0; + /** + * Must be greater than 1. + * + * Generated from protobuf field double growth_factor = 2; + */ + protected $growth_factor = 0.0; + /** + * Must be greater than 0. + * + * Generated from protobuf field double scale = 3; + */ + protected $scale = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $num_finite_buckets + * Must be greater than 0. + * @type float $growth_factor + * Must be greater than 1. + * @type float $scale + * Must be greater than 0. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + * @return int + */ + public function getNumFiniteBuckets() + { + return $this->num_finite_buckets; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + * @param int $var + * @return $this + */ + public function setNumFiniteBuckets($var) + { + GPBUtil::checkInt32($var); + $this->num_finite_buckets = $var; + + return $this; + } + + /** + * Must be greater than 1. + * + * Generated from protobuf field double growth_factor = 2; + * @return float + */ + public function getGrowthFactor() + { + return $this->growth_factor; + } + + /** + * Must be greater than 1. + * + * Generated from protobuf field double growth_factor = 2; + * @param float $var + * @return $this + */ + public function setGrowthFactor($var) + { + GPBUtil::checkDouble($var); + $this->growth_factor = $var; + + return $this; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field double scale = 3; + * @return float + */ + public function getScale() + { + return $this->scale; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field double scale = 3; + * @param float $var + * @return $this + */ + public function setScale($var) + { + GPBUtil::checkDouble($var); + $this->scale = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Linear.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Linear.php new file mode 100644 index 000000000..8ed9bc9cf --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/BucketOptions/Linear.php @@ -0,0 +1,142 @@ +google.api.Distribution.BucketOptions.Linear + */ +class Linear extends \Google\Protobuf\Internal\Message +{ + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + */ + protected $num_finite_buckets = 0; + /** + * Must be greater than 0. + * + * Generated from protobuf field double width = 2; + */ + protected $width = 0.0; + /** + * Lower bound of the first bucket. + * + * Generated from protobuf field double offset = 3; + */ + protected $offset = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $num_finite_buckets + * Must be greater than 0. + * @type float $width + * Must be greater than 0. + * @type float $offset + * Lower bound of the first bucket. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + * @return int + */ + public function getNumFiniteBuckets() + { + return $this->num_finite_buckets; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field int32 num_finite_buckets = 1; + * @param int $var + * @return $this + */ + public function setNumFiniteBuckets($var) + { + GPBUtil::checkInt32($var); + $this->num_finite_buckets = $var; + + return $this; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field double width = 2; + * @return float + */ + public function getWidth() + { + return $this->width; + } + + /** + * Must be greater than 0. + * + * Generated from protobuf field double width = 2; + * @param float $var + * @return $this + */ + public function setWidth($var) + { + GPBUtil::checkDouble($var); + $this->width = $var; + + return $this; + } + + /** + * Lower bound of the first bucket. + * + * Generated from protobuf field double offset = 3; + * @return float + */ + public function getOffset() + { + return $this->offset; + } + + /** + * Lower bound of the first bucket. + * + * Generated from protobuf field double offset = 3; + * @param float $var + * @return $this + */ + public function setOffset($var) + { + GPBUtil::checkDouble($var); + $this->offset = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/Exemplar.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/Exemplar.php new file mode 100644 index 000000000..5e7654a73 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/Exemplar.php @@ -0,0 +1,178 @@ +google.api.Distribution.Exemplar + */ +class Exemplar extends \Google\Protobuf\Internal\Message +{ + /** + * Value of the exemplar point. This value determines to which bucket the + * exemplar belongs. + * + * Generated from protobuf field double value = 1; + */ + protected $value = 0.0; + /** + * The observation (sampling) time of the above value. + * + * Generated from protobuf field .google.protobuf.Timestamp timestamp = 2; + */ + protected $timestamp = null; + /** + * Contextual information about the example value. Examples are: + * Trace: type.googleapis.com/google.monitoring.v3.SpanContext + * Literal string: type.googleapis.com/google.protobuf.StringValue + * Labels dropped during aggregation: + * type.googleapis.com/google.monitoring.v3.DroppedLabels + * There may be only a single attachment of any given message type in a + * single exemplar, and this is enforced by the system. + * + * Generated from protobuf field repeated .google.protobuf.Any attachments = 3; + */ + private $attachments; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $value + * Value of the exemplar point. This value determines to which bucket the + * exemplar belongs. + * @type \Google\Protobuf\Timestamp $timestamp + * The observation (sampling) time of the above value. + * @type array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $attachments + * Contextual information about the example value. Examples are: + * Trace: type.googleapis.com/google.monitoring.v3.SpanContext + * Literal string: type.googleapis.com/google.protobuf.StringValue + * Labels dropped during aggregation: + * type.googleapis.com/google.monitoring.v3.DroppedLabels + * There may be only a single attachment of any given message type in a + * single exemplar, and this is enforced by the system. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * Value of the exemplar point. This value determines to which bucket the + * exemplar belongs. + * + * Generated from protobuf field double value = 1; + * @return float + */ + public function getValue() + { + return $this->value; + } + + /** + * Value of the exemplar point. This value determines to which bucket the + * exemplar belongs. + * + * Generated from protobuf field double value = 1; + * @param float $var + * @return $this + */ + public function setValue($var) + { + GPBUtil::checkDouble($var); + $this->value = $var; + + return $this; + } + + /** + * The observation (sampling) time of the above value. + * + * Generated from protobuf field .google.protobuf.Timestamp timestamp = 2; + * @return \Google\Protobuf\Timestamp|null + */ + public function getTimestamp() + { + return $this->timestamp; + } + + public function hasTimestamp() + { + return isset($this->timestamp); + } + + public function clearTimestamp() + { + unset($this->timestamp); + } + + /** + * The observation (sampling) time of the above value. + * + * Generated from protobuf field .google.protobuf.Timestamp timestamp = 2; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setTimestamp($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->timestamp = $var; + + return $this; + } + + /** + * Contextual information about the example value. Examples are: + * Trace: type.googleapis.com/google.monitoring.v3.SpanContext + * Literal string: type.googleapis.com/google.protobuf.StringValue + * Labels dropped during aggregation: + * type.googleapis.com/google.monitoring.v3.DroppedLabels + * There may be only a single attachment of any given message type in a + * single exemplar, and this is enforced by the system. + * + * Generated from protobuf field repeated .google.protobuf.Any attachments = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAttachments() + { + return $this->attachments; + } + + /** + * Contextual information about the example value. Examples are: + * Trace: type.googleapis.com/google.monitoring.v3.SpanContext + * Literal string: type.googleapis.com/google.protobuf.StringValue + * Labels dropped during aggregation: + * type.googleapis.com/google.monitoring.v3.DroppedLabels + * There may be only a single attachment of any given message type in a + * single exemplar, and this is enforced by the system. + * + * Generated from protobuf field repeated .google.protobuf.Any attachments = 3; + * @param array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAttachments($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Any::class); + $this->attachments = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Distribution/Range.php b/lib/Google/vendor/google/common-protos/src/Api/Distribution/Range.php new file mode 100644 index 000000000..8ace8a8b4 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Distribution/Range.php @@ -0,0 +1,102 @@ +google.api.Distribution.Range + */ +class Range extends \Google\Protobuf\Internal\Message +{ + /** + * The minimum of the population values. + * + * Generated from protobuf field double min = 1; + */ + protected $min = 0.0; + /** + * The maximum of the population values. + * + * Generated from protobuf field double max = 2; + */ + protected $max = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $min + * The minimum of the population values. + * @type float $max + * The maximum of the population values. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Distribution::initOnce(); + parent::__construct($data); + } + + /** + * The minimum of the population values. + * + * Generated from protobuf field double min = 1; + * @return float + */ + public function getMin() + { + return $this->min; + } + + /** + * The minimum of the population values. + * + * Generated from protobuf field double min = 1; + * @param float $var + * @return $this + */ + public function setMin($var) + { + GPBUtil::checkDouble($var); + $this->min = $var; + + return $this; + } + + /** + * The maximum of the population values. + * + * Generated from protobuf field double max = 2; + * @return float + */ + public function getMax() + { + return $this->max; + } + + /** + * The maximum of the population values. + * + * Generated from protobuf field double max = 2; + * @param float $var + * @return $this + */ + public function setMax($var) + { + GPBUtil::checkDouble($var); + $this->max = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Documentation.php b/lib/Google/vendor/google/common-protos/src/Api/Documentation.php new file mode 100644 index 000000000..aced421cf --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Documentation.php @@ -0,0 +1,362 @@ +documentation: + * summary: > + * The Google Calendar API gives access + * to most calendar features. + * pages: + * - name: Overview + * content: (== include google/foo/overview.md ==) + * - name: Tutorial + * content: (== include google/foo/tutorial.md ==) + * subpages: + * - name: Java + * content: (== include google/foo/tutorial_java.md ==) + * rules: + * - selector: google.calendar.Calendar.Get + * description: > + * ... + * - selector: google.calendar.Calendar.Put + * description: > + * ... + * + * Documentation is provided in markdown syntax. In addition to + * standard markdown features, definition lists, tables and fenced + * code blocks are supported. Section headers can be provided and are + * interpreted relative to the section nesting of the context where + * a documentation fragment is embedded. + * Documentation from the IDL is merged with documentation defined + * via the config at normalization time, where documentation provided + * by config rules overrides IDL provided. + * A number of constructs specific to the API platform are supported + * in documentation text. + * In order to reference a proto element, the following + * notation can be used: + *
[fully.qualified.proto.name][]
+ * To override the display text used for the link, this can be used: + *
[display text][fully.qualified.proto.name]
+ * Text can be excluded from doc using the following notation: + *
(-- internal comment --)
+ * A few directives are available in documentation. Note that + * directives must appear on a single line to be properly + * identified. The `include` directive includes a markdown file from + * an external source: + *
(== include path/to/file ==)
+ * The `resource_for` directive marks a message to be the resource of + * a collection in REST view. If it is not specified, tools attempt + * to infer the resource from the operations in a collection: + *
(== resource_for v1.shelves.books ==)
+ * The directive `suppress_warning` does not directly affect documentation + * and is documented together with service config validation. + * + * Generated from protobuf message google.api.Documentation + */ +class Documentation extends \Google\Protobuf\Internal\Message +{ + /** + * A short description of what the service does. The summary must be plain + * text. It becomes the overview of the service displayed in Google Cloud + * Console. + * NOTE: This field is equivalent to the standard field `description`. + * + * Generated from protobuf field string summary = 1; + */ + protected $summary = ''; + /** + * The top level pages for the documentation set. + * + * Generated from protobuf field repeated .google.api.Page pages = 5; + */ + private $pages; + /** + * A list of documentation rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.DocumentationRule rules = 3; + */ + private $rules; + /** + * The URL to the root of documentation. + * + * Generated from protobuf field string documentation_root_url = 4; + */ + protected $documentation_root_url = ''; + /** + * Specifies the service root url if the default one (the service name + * from the yaml file) is not suitable. This can be seen in any fully + * specified service urls as well as sections that show a base that other + * urls are relative to. + * + * Generated from protobuf field string service_root_url = 6; + */ + protected $service_root_url = ''; + /** + * Declares a single overview page. For example: + *
documentation:
+     *   summary: ...
+     *   overview: (== include overview.md ==)
+     * 
+ * This is a shortcut for the following declaration (using pages style): + *
documentation:
+     *   summary: ...
+     *   pages:
+     *   - name: Overview
+     *     content: (== include overview.md ==)
+     * 
+ * Note: you cannot specify both `overview` field and `pages` field. + * + * Generated from protobuf field string overview = 2; + */ + protected $overview = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $summary + * A short description of what the service does. The summary must be plain + * text. It becomes the overview of the service displayed in Google Cloud + * Console. + * NOTE: This field is equivalent to the standard field `description`. + * @type array<\Google\Api\Page>|\Google\Protobuf\Internal\RepeatedField $pages + * The top level pages for the documentation set. + * @type array<\Google\Api\DocumentationRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of documentation rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * @type string $documentation_root_url + * The URL to the root of documentation. + * @type string $service_root_url + * Specifies the service root url if the default one (the service name + * from the yaml file) is not suitable. This can be seen in any fully + * specified service urls as well as sections that show a base that other + * urls are relative to. + * @type string $overview + * Declares a single overview page. For example: + *
documentation:
+     *             summary: ...
+     *             overview: (== include overview.md ==)
+     *           
+ * This is a shortcut for the following declaration (using pages style): + *
documentation:
+     *             summary: ...
+     *             pages:
+     *             - name: Overview
+     *               content: (== include overview.md ==)
+     *           
+ * Note: you cannot specify both `overview` field and `pages` field. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Documentation::initOnce(); + parent::__construct($data); + } + + /** + * A short description of what the service does. The summary must be plain + * text. It becomes the overview of the service displayed in Google Cloud + * Console. + * NOTE: This field is equivalent to the standard field `description`. + * + * Generated from protobuf field string summary = 1; + * @return string + */ + public function getSummary() + { + return $this->summary; + } + + /** + * A short description of what the service does. The summary must be plain + * text. It becomes the overview of the service displayed in Google Cloud + * Console. + * NOTE: This field is equivalent to the standard field `description`. + * + * Generated from protobuf field string summary = 1; + * @param string $var + * @return $this + */ + public function setSummary($var) + { + GPBUtil::checkString($var, True); + $this->summary = $var; + + return $this; + } + + /** + * The top level pages for the documentation set. + * + * Generated from protobuf field repeated .google.api.Page pages = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getPages() + { + return $this->pages; + } + + /** + * The top level pages for the documentation set. + * + * Generated from protobuf field repeated .google.api.Page pages = 5; + * @param array<\Google\Api\Page>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setPages($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Page::class); + $this->pages = $arr; + + return $this; + } + + /** + * A list of documentation rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.DocumentationRule rules = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of documentation rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.DocumentationRule rules = 3; + * @param array<\Google\Api\DocumentationRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\DocumentationRule::class); + $this->rules = $arr; + + return $this; + } + + /** + * The URL to the root of documentation. + * + * Generated from protobuf field string documentation_root_url = 4; + * @return string + */ + public function getDocumentationRootUrl() + { + return $this->documentation_root_url; + } + + /** + * The URL to the root of documentation. + * + * Generated from protobuf field string documentation_root_url = 4; + * @param string $var + * @return $this + */ + public function setDocumentationRootUrl($var) + { + GPBUtil::checkString($var, True); + $this->documentation_root_url = $var; + + return $this; + } + + /** + * Specifies the service root url if the default one (the service name + * from the yaml file) is not suitable. This can be seen in any fully + * specified service urls as well as sections that show a base that other + * urls are relative to. + * + * Generated from protobuf field string service_root_url = 6; + * @return string + */ + public function getServiceRootUrl() + { + return $this->service_root_url; + } + + /** + * Specifies the service root url if the default one (the service name + * from the yaml file) is not suitable. This can be seen in any fully + * specified service urls as well as sections that show a base that other + * urls are relative to. + * + * Generated from protobuf field string service_root_url = 6; + * @param string $var + * @return $this + */ + public function setServiceRootUrl($var) + { + GPBUtil::checkString($var, True); + $this->service_root_url = $var; + + return $this; + } + + /** + * Declares a single overview page. For example: + *
documentation:
+     *   summary: ...
+     *   overview: (== include overview.md ==)
+     * 
+ * This is a shortcut for the following declaration (using pages style): + *
documentation:
+     *   summary: ...
+     *   pages:
+     *   - name: Overview
+     *     content: (== include overview.md ==)
+     * 
+ * Note: you cannot specify both `overview` field and `pages` field. + * + * Generated from protobuf field string overview = 2; + * @return string + */ + public function getOverview() + { + return $this->overview; + } + + /** + * Declares a single overview page. For example: + *
documentation:
+     *   summary: ...
+     *   overview: (== include overview.md ==)
+     * 
+ * This is a shortcut for the following declaration (using pages style): + *
documentation:
+     *   summary: ...
+     *   pages:
+     *   - name: Overview
+     *     content: (== include overview.md ==)
+     * 
+ * Note: you cannot specify both `overview` field and `pages` field. + * + * Generated from protobuf field string overview = 2; + * @param string $var + * @return $this + */ + public function setOverview($var) + { + GPBUtil::checkString($var, True); + $this->overview = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/DocumentationRule.php b/lib/Google/vendor/google/common-protos/src/Api/DocumentationRule.php new file mode 100644 index 000000000..c904d1a38 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/DocumentationRule.php @@ -0,0 +1,171 @@ +google.api.DocumentationRule + */ +class DocumentationRule extends \Google\Protobuf\Internal\Message +{ + /** + * The selector is a comma-separated list of patterns for any element such as + * a method, a field, an enum value. Each pattern is a qualified name of the + * element which may end in "*", indicating a wildcard. Wildcards are only + * allowed at the end and for a whole component of the qualified name, + * i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A wildcard will match + * one or more components. To specify a default for all applicable elements, + * the whole pattern "*" is used. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * Description of the selected proto element (e.g. a message, a method, a + * 'service' definition, or a field). Defaults to leading & trailing comments + * taken from the proto source definition of the proto element. + * + * Generated from protobuf field string description = 2; + */ + protected $description = ''; + /** + * Deprecation description of the selected element(s). It can be provided if + * an element is marked as `deprecated`. + * + * Generated from protobuf field string deprecation_description = 3; + */ + protected $deprecation_description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * The selector is a comma-separated list of patterns for any element such as + * a method, a field, an enum value. Each pattern is a qualified name of the + * element which may end in "*", indicating a wildcard. Wildcards are only + * allowed at the end and for a whole component of the qualified name, + * i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A wildcard will match + * one or more components. To specify a default for all applicable elements, + * the whole pattern "*" is used. + * @type string $description + * Description of the selected proto element (e.g. a message, a method, a + * 'service' definition, or a field). Defaults to leading & trailing comments + * taken from the proto source definition of the proto element. + * @type string $deprecation_description + * Deprecation description of the selected element(s). It can be provided if + * an element is marked as `deprecated`. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Documentation::initOnce(); + parent::__construct($data); + } + + /** + * The selector is a comma-separated list of patterns for any element such as + * a method, a field, an enum value. Each pattern is a qualified name of the + * element which may end in "*", indicating a wildcard. Wildcards are only + * allowed at the end and for a whole component of the qualified name, + * i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A wildcard will match + * one or more components. To specify a default for all applicable elements, + * the whole pattern "*" is used. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * The selector is a comma-separated list of patterns for any element such as + * a method, a field, an enum value. Each pattern is a qualified name of the + * element which may end in "*", indicating a wildcard. Wildcards are only + * allowed at the end and for a whole component of the qualified name, + * i.e. "foo.*" is ok, but not "foo.b*" or "foo.*.bar". A wildcard will match + * one or more components. To specify a default for all applicable elements, + * the whole pattern "*" is used. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Description of the selected proto element (e.g. a message, a method, a + * 'service' definition, or a field). Defaults to leading & trailing comments + * taken from the proto source definition of the proto element. + * + * Generated from protobuf field string description = 2; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Description of the selected proto element (e.g. a message, a method, a + * 'service' definition, or a field). Defaults to leading & trailing comments + * taken from the proto source definition of the proto element. + * + * Generated from protobuf field string description = 2; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * Deprecation description of the selected element(s). It can be provided if + * an element is marked as `deprecated`. + * + * Generated from protobuf field string deprecation_description = 3; + * @return string + */ + public function getDeprecationDescription() + { + return $this->deprecation_description; + } + + /** + * Deprecation description of the selected element(s). It can be provided if + * an element is marked as `deprecated`. + * + * Generated from protobuf field string deprecation_description = 3; + * @param string $var + * @return $this + */ + public function setDeprecationDescription($var) + { + GPBUtil::checkString($var, True); + $this->deprecation_description = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/DotnetSettings.php b/lib/Google/vendor/google/common-protos/src/Api/DotnetSettings.php new file mode 100644 index 000000000..de7672c0f --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/DotnetSettings.php @@ -0,0 +1,307 @@ +google.api.DotnetSettings + */ +class DotnetSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + /** + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + * + * Generated from protobuf field map renamed_services = 2; + */ + private $renamed_services; + /** + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + * + * Generated from protobuf field map renamed_resources = 3; + */ + private $renamed_resources; + /** + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + * + * Generated from protobuf field repeated string ignored_resources = 4; + */ + private $ignored_resources; + /** + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + * + * Generated from protobuf field repeated string forced_namespace_aliases = 5; + */ + private $forced_namespace_aliases; + /** + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + * + * Generated from protobuf field repeated string handwritten_signatures = 6; + */ + private $handwritten_signatures; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * @type array|\Google\Protobuf\Internal\MapField $renamed_services + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + * @type array|\Google\Protobuf\Internal\MapField $renamed_resources + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + * @type array|\Google\Protobuf\Internal\RepeatedField $ignored_resources + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + * @type array|\Google\Protobuf\Internal\RepeatedField $forced_namespace_aliases + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + * @type array|\Google\Protobuf\Internal\RepeatedField $handwritten_signatures + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + + /** + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + * + * Generated from protobuf field map renamed_services = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getRenamedServices() + { + return $this->renamed_services; + } + + /** + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + * + * Generated from protobuf field map renamed_services = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setRenamedServices($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->renamed_services = $arr; + + return $this; + } + + /** + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + * + * Generated from protobuf field map renamed_resources = 3; + * @return \Google\Protobuf\Internal\MapField + */ + public function getRenamedResources() + { + return $this->renamed_resources; + } + + /** + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + * + * Generated from protobuf field map renamed_resources = 3; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setRenamedResources($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->renamed_resources = $arr; + + return $this; + } + + /** + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + * + * Generated from protobuf field repeated string ignored_resources = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getIgnoredResources() + { + return $this->ignored_resources; + } + + /** + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + * + * Generated from protobuf field repeated string ignored_resources = 4; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setIgnoredResources($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->ignored_resources = $arr; + + return $this; + } + + /** + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + * + * Generated from protobuf field repeated string forced_namespace_aliases = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getForcedNamespaceAliases() + { + return $this->forced_namespace_aliases; + } + + /** + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + * + * Generated from protobuf field repeated string forced_namespace_aliases = 5; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setForcedNamespaceAliases($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->forced_namespace_aliases = $arr; + + return $this; + } + + /** + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + * + * Generated from protobuf field repeated string handwritten_signatures = 6; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getHandwrittenSignatures() + { + return $this->handwritten_signatures; + } + + /** + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + * + * Generated from protobuf field repeated string handwritten_signatures = 6; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setHandwrittenSignatures($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->handwritten_signatures = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Endpoint.php b/lib/Google/vendor/google/common-protos/src/Api/Endpoint.php new file mode 100644 index 000000000..41c1cbe60 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Endpoint.php @@ -0,0 +1,231 @@ +google.api.Endpoint + */ +class Endpoint extends \Google\Protobuf\Internal\Message +{ + /** + * The canonical name of this endpoint. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * Aliases for this endpoint, these will be served by the same UrlMap as the + * parent endpoint, and will be provisioned in the GCP stack for the Regional + * Endpoints. + * + * Generated from protobuf field repeated string aliases = 2; + */ + private $aliases; + /** + * The specification of an Internet routable address of API frontend that will + * handle requests to this [API + * Endpoint](https://cloud.google.com/apis/design/glossary). It should be + * either a valid IPv4 address or a fully-qualified domain name. For example, + * "8.8.8.8" or "myservice.appspot.com". + * + * Generated from protobuf field string target = 101; + */ + protected $target = ''; + /** + * Allowing + * [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka + * cross-domain traffic, would allow the backends served from this endpoint to + * receive and respond to HTTP OPTIONS requests. The response will be used by + * the browser to determine whether the subsequent cross-origin request is + * allowed to proceed. + * + * Generated from protobuf field bool allow_cors = 5; + */ + protected $allow_cors = false; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The canonical name of this endpoint. + * @type array|\Google\Protobuf\Internal\RepeatedField $aliases + * Aliases for this endpoint, these will be served by the same UrlMap as the + * parent endpoint, and will be provisioned in the GCP stack for the Regional + * Endpoints. + * @type string $target + * The specification of an Internet routable address of API frontend that will + * handle requests to this [API + * Endpoint](https://cloud.google.com/apis/design/glossary). It should be + * either a valid IPv4 address or a fully-qualified domain name. For example, + * "8.8.8.8" or "myservice.appspot.com". + * @type bool $allow_cors + * Allowing + * [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka + * cross-domain traffic, would allow the backends served from this endpoint to + * receive and respond to HTTP OPTIONS requests. The response will be used by + * the browser to determine whether the subsequent cross-origin request is + * allowed to proceed. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Endpoint::initOnce(); + parent::__construct($data); + } + + /** + * The canonical name of this endpoint. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The canonical name of this endpoint. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Aliases for this endpoint, these will be served by the same UrlMap as the + * parent endpoint, and will be provisioned in the GCP stack for the Regional + * Endpoints. + * + * Generated from protobuf field repeated string aliases = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAliases() + { + return $this->aliases; + } + + /** + * Aliases for this endpoint, these will be served by the same UrlMap as the + * parent endpoint, and will be provisioned in the GCP stack for the Regional + * Endpoints. + * + * Generated from protobuf field repeated string aliases = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAliases($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->aliases = $arr; + + return $this; + } + + /** + * The specification of an Internet routable address of API frontend that will + * handle requests to this [API + * Endpoint](https://cloud.google.com/apis/design/glossary). It should be + * either a valid IPv4 address or a fully-qualified domain name. For example, + * "8.8.8.8" or "myservice.appspot.com". + * + * Generated from protobuf field string target = 101; + * @return string + */ + public function getTarget() + { + return $this->target; + } + + /** + * The specification of an Internet routable address of API frontend that will + * handle requests to this [API + * Endpoint](https://cloud.google.com/apis/design/glossary). It should be + * either a valid IPv4 address or a fully-qualified domain name. For example, + * "8.8.8.8" or "myservice.appspot.com". + * + * Generated from protobuf field string target = 101; + * @param string $var + * @return $this + */ + public function setTarget($var) + { + GPBUtil::checkString($var, True); + $this->target = $var; + + return $this; + } + + /** + * Allowing + * [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka + * cross-domain traffic, would allow the backends served from this endpoint to + * receive and respond to HTTP OPTIONS requests. The response will be used by + * the browser to determine whether the subsequent cross-origin request is + * allowed to proceed. + * + * Generated from protobuf field bool allow_cors = 5; + * @return bool + */ + public function getAllowCors() + { + return $this->allow_cors; + } + + /** + * Allowing + * [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing), aka + * cross-domain traffic, would allow the backends served from this endpoint to + * receive and respond to HTTP OPTIONS requests. The response will be used by + * the browser to determine whether the subsequent cross-origin request is + * allowed to proceed. + * + * Generated from protobuf field bool allow_cors = 5; + * @param bool $var + * @return $this + */ + public function setAllowCors($var) + { + GPBUtil::checkBool($var); + $this->allow_cors = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ErrorReason.php b/lib/Google/vendor/google/common-protos/src/Api/ErrorReason.php new file mode 100644 index 000000000..b582e3633 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ErrorReason.php @@ -0,0 +1,653 @@ +google.api.ErrorReason + */ +class ErrorReason +{ + /** + * Do not use this default value. + * + * Generated from protobuf enum ERROR_REASON_UNSPECIFIED = 0; + */ + const ERROR_REASON_UNSPECIFIED = 0; + /** + * The request is calling a disabled service for a consumer. + * Example of an ErrorInfo when the consumer "projects/123" contacting + * "pubsub.googleapis.com" service which is disabled: + * { "reason": "SERVICE_DISABLED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "pubsub.googleapis.com" + * } + * } + * This response indicates the "pubsub.googleapis.com" has been disabled in + * "projects/123". + * + * Generated from protobuf enum SERVICE_DISABLED = 1; + */ + const SERVICE_DISABLED = 1; + /** + * The request whose associated billing account is disabled. + * Example of an ErrorInfo when the consumer "projects/123" fails to contact + * "pubsub.googleapis.com" service because the associated billing account is + * disabled: + * { "reason": "BILLING_DISABLED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "pubsub.googleapis.com" + * } + * } + * This response indicates the billing account associated has been disabled. + * + * Generated from protobuf enum BILLING_DISABLED = 2; + */ + const BILLING_DISABLED = 2; + /** + * The request is denied because the provided [API + * key](https://cloud.google.com/docs/authentication/api-keys) is invalid. It + * may be in a bad format, cannot be found, or has been expired). + * Example of an ErrorInfo when the request is contacting + * "storage.googleapis.com" service with an invalid API key: + * { "reason": "API_KEY_INVALID", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * } + * } + * + * Generated from protobuf enum API_KEY_INVALID = 3; + */ + const API_KEY_INVALID = 3; + /** + * The request is denied because it violates [API key API + * restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_api_restrictions). + * Example of an ErrorInfo when the consumer "projects/123" fails to call the + * "storage.googleapis.com" service because this service is restricted in the + * API key: + * { "reason": "API_KEY_SERVICE_BLOCKED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum API_KEY_SERVICE_BLOCKED = 4; + */ + const API_KEY_SERVICE_BLOCKED = 4; + /** + * The request is denied because it violates [API key HTTP + * restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_http_restrictions). + * Example of an ErrorInfo when the consumer "projects/123" fails to call + * "storage.googleapis.com" service because the http referrer of the request + * violates API key HTTP restrictions: + * { "reason": "API_KEY_HTTP_REFERRER_BLOCKED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com", + * } + * } + * + * Generated from protobuf enum API_KEY_HTTP_REFERRER_BLOCKED = 7; + */ + const API_KEY_HTTP_REFERRER_BLOCKED = 7; + /** + * The request is denied because it violates [API key IP address + * restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + * Example of an ErrorInfo when the consumer "projects/123" fails to call + * "storage.googleapis.com" service because the caller IP of the request + * violates API key IP address restrictions: + * { "reason": "API_KEY_IP_ADDRESS_BLOCKED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com", + * } + * } + * + * Generated from protobuf enum API_KEY_IP_ADDRESS_BLOCKED = 8; + */ + const API_KEY_IP_ADDRESS_BLOCKED = 8; + /** + * The request is denied because it violates [API key Android application + * restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + * Example of an ErrorInfo when the consumer "projects/123" fails to call + * "storage.googleapis.com" service because the request from the Android apps + * violates the API key Android application restrictions: + * { "reason": "API_KEY_ANDROID_APP_BLOCKED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum API_KEY_ANDROID_APP_BLOCKED = 9; + */ + const API_KEY_ANDROID_APP_BLOCKED = 9; + /** + * The request is denied because it violates [API key iOS application + * restrictions](https://cloud.google.com/docs/authentication/api-keys#adding_application_restrictions). + * Example of an ErrorInfo when the consumer "projects/123" fails to call + * "storage.googleapis.com" service because the request from the iOS apps + * violates the API key iOS application restrictions: + * { "reason": "API_KEY_IOS_APP_BLOCKED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum API_KEY_IOS_APP_BLOCKED = 13; + */ + const API_KEY_IOS_APP_BLOCKED = 13; + /** + * The request is denied because there is not enough rate quota for the + * consumer. + * Example of an ErrorInfo when the consumer "projects/123" fails to contact + * "pubsub.googleapis.com" service because consumer's rate quota usage has + * reached the maximum value set for the quota limit + * "ReadsPerMinutePerProject" on the quota metric + * "pubsub.googleapis.com/read_requests": + * { "reason": "RATE_LIMIT_EXCEEDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "pubsub.googleapis.com", + * "quota_metric": "pubsub.googleapis.com/read_requests", + * "quota_limit": "ReadsPerMinutePerProject" + * } + * } + * Example of an ErrorInfo when the consumer "projects/123" checks quota on + * the service "dataflow.googleapis.com" and hits the organization quota + * limit "DefaultRequestsPerMinutePerOrganization" on the metric + * "dataflow.googleapis.com/default_requests". + * { "reason": "RATE_LIMIT_EXCEEDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "dataflow.googleapis.com", + * "quota_metric": "dataflow.googleapis.com/default_requests", + * "quota_limit": "DefaultRequestsPerMinutePerOrganization" + * } + * } + * + * Generated from protobuf enum RATE_LIMIT_EXCEEDED = 5; + */ + const RATE_LIMIT_EXCEEDED = 5; + /** + * The request is denied because there is not enough resource quota for the + * consumer. + * Example of an ErrorInfo when the consumer "projects/123" fails to contact + * "compute.googleapis.com" service because consumer's resource quota usage + * has reached the maximum value set for the quota limit "VMsPerProject" + * on the quota metric "compute.googleapis.com/vms": + * { "reason": "RESOURCE_QUOTA_EXCEEDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "compute.googleapis.com", + * "quota_metric": "compute.googleapis.com/vms", + * "quota_limit": "VMsPerProject" + * } + * } + * Example of an ErrorInfo when the consumer "projects/123" checks resource + * quota on the service "dataflow.googleapis.com" and hits the organization + * quota limit "jobs-per-organization" on the metric + * "dataflow.googleapis.com/job_count". + * { "reason": "RESOURCE_QUOTA_EXCEEDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "dataflow.googleapis.com", + * "quota_metric": "dataflow.googleapis.com/job_count", + * "quota_limit": "jobs-per-organization" + * } + * } + * + * Generated from protobuf enum RESOURCE_QUOTA_EXCEEDED = 6; + */ + const RESOURCE_QUOTA_EXCEEDED = 6; + /** + * The request whose associated billing account address is in a tax restricted + * location, violates the local tax restrictions when creating resources in + * the restricted region. + * Example of an ErrorInfo when creating the Cloud Storage Bucket in the + * container "projects/123" under a tax restricted region + * "locations/asia-northeast3": + * { "reason": "LOCATION_TAX_POLICY_VIOLATED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com", + * "location": "locations/asia-northeast3" + * } + * } + * This response indicates creating the Cloud Storage Bucket in + * "locations/asia-northeast3" violates the location tax restriction. + * + * Generated from protobuf enum LOCATION_TAX_POLICY_VIOLATED = 10; + */ + const LOCATION_TAX_POLICY_VIOLATED = 10; + /** + * The request is denied because the caller does not have required permission + * on the user project "projects/123" or the user project is invalid. For more + * information, check the [userProject System + * Parameters](https://cloud.google.com/apis/docs/system-parameters). + * Example of an ErrorInfo when the caller is calling Cloud Storage service + * with insufficient permissions on the user project: + * { "reason": "USER_PROJECT_DENIED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum USER_PROJECT_DENIED = 11; + */ + const USER_PROJECT_DENIED = 11; + /** + * The request is denied because the consumer "projects/123" is suspended due + * to Terms of Service(Tos) violations. Check [Project suspension + * guidelines](https://cloud.google.com/resource-manager/docs/project-suspension-guidelines) + * for more information. + * Example of an ErrorInfo when calling Cloud Storage service with the + * suspended consumer "projects/123": + * { "reason": "CONSUMER_SUSPENDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum CONSUMER_SUSPENDED = 12; + */ + const CONSUMER_SUSPENDED = 12; + /** + * The request is denied because the associated consumer is invalid. It may be + * in a bad format, cannot be found, or have been deleted. + * Example of an ErrorInfo when calling Cloud Storage service with the + * invalid consumer "projects/123": + * { "reason": "CONSUMER_INVALID", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum CONSUMER_INVALID = 14; + */ + const CONSUMER_INVALID = 14; + /** + * The request is denied because it violates [VPC Service + * Controls](https://cloud.google.com/vpc-service-controls/docs/overview). + * The 'uid' field is a random generated identifier that customer can use it + * to search the audit log for a request rejected by VPC Service Controls. For + * more information, please refer [VPC Service Controls + * Troubleshooting](https://cloud.google.com/vpc-service-controls/docs/troubleshooting#unique-id) + * Example of an ErrorInfo when the consumer "projects/123" fails to call + * Cloud Storage service because the request is prohibited by the VPC Service + * Controls. + * { "reason": "SECURITY_POLICY_VIOLATED", + * "domain": "googleapis.com", + * "metadata": { + * "uid": "123456789abcde", + * "consumer": "projects/123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum SECURITY_POLICY_VIOLATED = 15; + */ + const SECURITY_POLICY_VIOLATED = 15; + /** + * The request is denied because the provided access token has expired. + * Example of an ErrorInfo when the request is calling Cloud Storage service + * with an expired access token: + * { "reason": "ACCESS_TOKEN_EXPIRED", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject" + * } + * } + * + * Generated from protobuf enum ACCESS_TOKEN_EXPIRED = 16; + */ + const ACCESS_TOKEN_EXPIRED = 16; + /** + * The request is denied because the provided access token doesn't have at + * least one of the acceptable scopes required for the API. Please check + * [OAuth 2.0 Scopes for Google + * APIs](https://developers.google.com/identity/protocols/oauth2/scopes) for + * the list of the OAuth 2.0 scopes that you might need to request to access + * the API. + * Example of an ErrorInfo when the request is calling Cloud Storage service + * with an access token that is missing required scopes: + * { "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject" + * } + * } + * + * Generated from protobuf enum ACCESS_TOKEN_SCOPE_INSUFFICIENT = 17; + */ + const ACCESS_TOKEN_SCOPE_INSUFFICIENT = 17; + /** + * The request is denied because the account associated with the provided + * access token is in an invalid state, such as disabled or deleted. + * For more information, see https://cloud.google.com/docs/authentication. + * Warning: For privacy reasons, the server may not be able to disclose the + * email address for some accounts. The client MUST NOT depend on the + * availability of the `email` attribute. + * Example of an ErrorInfo when the request is to the Cloud Storage API with + * an access token that is associated with a disabled or deleted [service + * account](http://cloud/iam/docs/service-accounts): + * { "reason": "ACCOUNT_STATE_INVALID", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject", + * "email": "user@123.iam.gserviceaccount.com" + * } + * } + * + * Generated from protobuf enum ACCOUNT_STATE_INVALID = 18; + */ + const ACCOUNT_STATE_INVALID = 18; + /** + * The request is denied because the type of the provided access token is not + * supported by the API being called. + * Example of an ErrorInfo when the request is to the Cloud Storage API with + * an unsupported token type. + * { "reason": "ACCESS_TOKEN_TYPE_UNSUPPORTED", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject" + * } + * } + * + * Generated from protobuf enum ACCESS_TOKEN_TYPE_UNSUPPORTED = 19; + */ + const ACCESS_TOKEN_TYPE_UNSUPPORTED = 19; + /** + * The request is denied because the request doesn't have any authentication + * credentials. For more information regarding the supported authentication + * strategies for Google Cloud APIs, see + * https://cloud.google.com/docs/authentication. + * Example of an ErrorInfo when the request is to the Cloud Storage API + * without any authentication credentials. + * { "reason": "CREDENTIALS_MISSING", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject" + * } + * } + * + * Generated from protobuf enum CREDENTIALS_MISSING = 20; + */ + const CREDENTIALS_MISSING = 20; + /** + * The request is denied because the provided project owning the resource + * which acts as the [API + * consumer](https://cloud.google.com/apis/design/glossary#api_consumer) is + * invalid. It may be in a bad format or empty. + * Example of an ErrorInfo when the request is to the Cloud Functions API, + * but the offered resource project in the request in a bad format which can't + * perform the ListFunctions method. + * { "reason": "RESOURCE_PROJECT_INVALID", + * "domain": "googleapis.com", + * "metadata": { + * "service": "cloudfunctions.googleapis.com", + * "method": + * "google.cloud.functions.v1.CloudFunctionsService.ListFunctions" + * } + * } + * + * Generated from protobuf enum RESOURCE_PROJECT_INVALID = 21; + */ + const RESOURCE_PROJECT_INVALID = 21; + /** + * The request is denied because the provided session cookie is missing, + * invalid or failed to decode. + * Example of an ErrorInfo when the request is calling Cloud Storage service + * with a SID cookie which can't be decoded. + * { "reason": "SESSION_COOKIE_INVALID", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject", + * "cookie": "SID" + * } + * } + * + * Generated from protobuf enum SESSION_COOKIE_INVALID = 23; + */ + const SESSION_COOKIE_INVALID = 23; + /** + * The request is denied because the user is from a Google Workspace customer + * that blocks their users from accessing a particular service. + * Example scenario: https://support.google.com/a/answer/9197205?hl=en + * Example of an ErrorInfo when access to Google Cloud Storage service is + * blocked by the Google Workspace administrator: + * { "reason": "USER_BLOCKED_BY_ADMIN", + * "domain": "googleapis.com", + * "metadata": { + * "service": "storage.googleapis.com", + * "method": "google.storage.v1.Storage.GetObject", + * } + * } + * + * Generated from protobuf enum USER_BLOCKED_BY_ADMIN = 24; + */ + const USER_BLOCKED_BY_ADMIN = 24; + /** + * The request is denied because the resource service usage is restricted + * by administrators according to the organization policy constraint. + * For more information see + * https://cloud.google.com/resource-manager/docs/organization-policy/restricting-services. + * Example of an ErrorInfo when access to Google Cloud Storage service is + * restricted by Resource Usage Restriction policy: + * { "reason": "RESOURCE_USAGE_RESTRICTION_VIOLATED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/project-123", + * "service": "storage.googleapis.com" + * } + * } + * + * Generated from protobuf enum RESOURCE_USAGE_RESTRICTION_VIOLATED = 25; + */ + const RESOURCE_USAGE_RESTRICTION_VIOLATED = 25; + /** + * Unimplemented. Do not use. + * The request is denied because it contains unsupported system parameters in + * URL query parameters or HTTP headers. For more information, + * see https://cloud.google.com/apis/docs/system-parameters + * Example of an ErrorInfo when access "pubsub.googleapis.com" service with + * a request header of "x-goog-user-ip": + * { "reason": "SYSTEM_PARAMETER_UNSUPPORTED", + * "domain": "googleapis.com", + * "metadata": { + * "service": "pubsub.googleapis.com" + * "parameter": "x-goog-user-ip" + * } + * } + * + * Generated from protobuf enum SYSTEM_PARAMETER_UNSUPPORTED = 26; + */ + const SYSTEM_PARAMETER_UNSUPPORTED = 26; + /** + * The request is denied because it violates Org Restriction: the requested + * resource does not belong to allowed organizations specified in + * "X-Goog-Allowed-Resources" header. + * Example of an ErrorInfo when accessing a GCP resource that is restricted by + * Org Restriction for "pubsub.googleapis.com" service. + * { + * reason: "ORG_RESTRICTION_VIOLATION" + * domain: "googleapis.com" + * metadata { + * "consumer":"projects/123456" + * "service": "pubsub.googleapis.com" + * } + * } + * + * Generated from protobuf enum ORG_RESTRICTION_VIOLATION = 27; + */ + const ORG_RESTRICTION_VIOLATION = 27; + /** + * The request is denied because "X-Goog-Allowed-Resources" header is in a bad + * format. + * Example of an ErrorInfo when + * accessing "pubsub.googleapis.com" service with an invalid + * "X-Goog-Allowed-Resources" request header. + * { + * reason: "ORG_RESTRICTION_HEADER_INVALID" + * domain: "googleapis.com" + * metadata { + * "consumer":"projects/123456" + * "service": "pubsub.googleapis.com" + * } + * } + * + * Generated from protobuf enum ORG_RESTRICTION_HEADER_INVALID = 28; + */ + const ORG_RESTRICTION_HEADER_INVALID = 28; + /** + * Unimplemented. Do not use. + * The request is calling a service that is not visible to the consumer. + * Example of an ErrorInfo when the consumer "projects/123" contacting + * "pubsub.googleapis.com" service which is not visible to the consumer. + * { "reason": "SERVICE_NOT_VISIBLE", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "pubsub.googleapis.com" + * } + * } + * This response indicates the "pubsub.googleapis.com" is not visible to + * "projects/123" (or it may not exist). + * + * Generated from protobuf enum SERVICE_NOT_VISIBLE = 29; + */ + const SERVICE_NOT_VISIBLE = 29; + /** + * The request is related to a project for which GCP access is suspended. + * Example of an ErrorInfo when the consumer "projects/123" fails to contact + * "pubsub.googleapis.com" service because GCP access is suspended: + * { "reason": "GCP_SUSPENDED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "pubsub.googleapis.com" + * } + * } + * This response indicates the associated GCP account has been suspended. + * + * Generated from protobuf enum GCP_SUSPENDED = 30; + */ + const GCP_SUSPENDED = 30; + /** + * The request violates the location policies when creating resources in + * the restricted region. + * Example of an ErrorInfo when creating the Cloud Storage Bucket by + * "projects/123" for service storage.googleapis.com: + * { "reason": "LOCATION_POLICY_VIOLATED", + * "domain": "googleapis.com", + * "metadata": { + * "consumer": "projects/123", + * "service": "storage.googleapis.com", + * } + * } + * This response indicates creating the Cloud Storage Bucket in + * "locations/asia-northeast3" violates at least one location policy. + * The troubleshooting guidance is provided in the Help links. + * + * Generated from protobuf enum LOCATION_POLICY_VIOLATED = 31; + */ + const LOCATION_POLICY_VIOLATED = 31; + + private static $valueToName = [ + self::ERROR_REASON_UNSPECIFIED => 'ERROR_REASON_UNSPECIFIED', + self::SERVICE_DISABLED => 'SERVICE_DISABLED', + self::BILLING_DISABLED => 'BILLING_DISABLED', + self::API_KEY_INVALID => 'API_KEY_INVALID', + self::API_KEY_SERVICE_BLOCKED => 'API_KEY_SERVICE_BLOCKED', + self::API_KEY_HTTP_REFERRER_BLOCKED => 'API_KEY_HTTP_REFERRER_BLOCKED', + self::API_KEY_IP_ADDRESS_BLOCKED => 'API_KEY_IP_ADDRESS_BLOCKED', + self::API_KEY_ANDROID_APP_BLOCKED => 'API_KEY_ANDROID_APP_BLOCKED', + self::API_KEY_IOS_APP_BLOCKED => 'API_KEY_IOS_APP_BLOCKED', + self::RATE_LIMIT_EXCEEDED => 'RATE_LIMIT_EXCEEDED', + self::RESOURCE_QUOTA_EXCEEDED => 'RESOURCE_QUOTA_EXCEEDED', + self::LOCATION_TAX_POLICY_VIOLATED => 'LOCATION_TAX_POLICY_VIOLATED', + self::USER_PROJECT_DENIED => 'USER_PROJECT_DENIED', + self::CONSUMER_SUSPENDED => 'CONSUMER_SUSPENDED', + self::CONSUMER_INVALID => 'CONSUMER_INVALID', + self::SECURITY_POLICY_VIOLATED => 'SECURITY_POLICY_VIOLATED', + self::ACCESS_TOKEN_EXPIRED => 'ACCESS_TOKEN_EXPIRED', + self::ACCESS_TOKEN_SCOPE_INSUFFICIENT => 'ACCESS_TOKEN_SCOPE_INSUFFICIENT', + self::ACCOUNT_STATE_INVALID => 'ACCOUNT_STATE_INVALID', + self::ACCESS_TOKEN_TYPE_UNSUPPORTED => 'ACCESS_TOKEN_TYPE_UNSUPPORTED', + self::CREDENTIALS_MISSING => 'CREDENTIALS_MISSING', + self::RESOURCE_PROJECT_INVALID => 'RESOURCE_PROJECT_INVALID', + self::SESSION_COOKIE_INVALID => 'SESSION_COOKIE_INVALID', + self::USER_BLOCKED_BY_ADMIN => 'USER_BLOCKED_BY_ADMIN', + self::RESOURCE_USAGE_RESTRICTION_VIOLATED => 'RESOURCE_USAGE_RESTRICTION_VIOLATED', + self::SYSTEM_PARAMETER_UNSUPPORTED => 'SYSTEM_PARAMETER_UNSUPPORTED', + self::ORG_RESTRICTION_VIOLATION => 'ORG_RESTRICTION_VIOLATION', + self::ORG_RESTRICTION_HEADER_INVALID => 'ORG_RESTRICTION_HEADER_INVALID', + self::SERVICE_NOT_VISIBLE => 'SERVICE_NOT_VISIBLE', + self::GCP_SUSPENDED => 'GCP_SUSPENDED', + self::LOCATION_POLICY_VIOLATED => 'LOCATION_POLICY_VIOLATED', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/FieldBehavior.php b/lib/Google/vendor/google/common-protos/src/Api/FieldBehavior.php new file mode 100644 index 000000000..4c57c5080 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/FieldBehavior.php @@ -0,0 +1,133 @@ +google.api.FieldBehavior + */ +class FieldBehavior +{ + /** + * Conventional default for enums. Do not use this. + * + * Generated from protobuf enum FIELD_BEHAVIOR_UNSPECIFIED = 0; + */ + const FIELD_BEHAVIOR_UNSPECIFIED = 0; + /** + * Specifically denotes a field as optional. + * While all fields in protocol buffers are optional, this may be specified + * for emphasis if appropriate. + * + * Generated from protobuf enum OPTIONAL = 1; + */ + const OPTIONAL = 1; + /** + * Denotes a field as required. + * This indicates that the field **must** be provided as part of the request, + * and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + * + * Generated from protobuf enum REQUIRED = 2; + */ + const REQUIRED = 2; + /** + * Denotes a field as output only. + * This indicates that the field is provided in responses, but including the + * field in a request does nothing (the server *must* ignore it and + * *must not* throw an error as a result of the field's presence). + * + * Generated from protobuf enum OUTPUT_ONLY = 3; + */ + const OUTPUT_ONLY = 3; + /** + * Denotes a field as input only. + * This indicates that the field is provided in requests, and the + * corresponding field is not included in output. + * + * Generated from protobuf enum INPUT_ONLY = 4; + */ + const INPUT_ONLY = 4; + /** + * Denotes a field as immutable. + * This indicates that the field may be set once in a request to create a + * resource, but may not be changed thereafter. + * + * Generated from protobuf enum IMMUTABLE = 5; + */ + const IMMUTABLE = 5; + /** + * Denotes that a (repeated) field is an unordered list. + * This indicates that the service may provide the elements of the list + * in any arbitrary order, rather than the order the user originally + * provided. Additionally, the list's order may or may not be stable. + * + * Generated from protobuf enum UNORDERED_LIST = 6; + */ + const UNORDERED_LIST = 6; + /** + * Denotes that this field returns a non-empty default value if not set. + * This indicates that if the user provides the empty value in a request, + * a non-empty value will be returned. The user will not be aware of what + * non-empty value to expect. + * + * Generated from protobuf enum NON_EMPTY_DEFAULT = 7; + */ + const NON_EMPTY_DEFAULT = 7; + /** + * Denotes that the field in a resource (a message annotated with + * google.api.resource) is used in the resource name to uniquely identify the + * resource. For AIP-compliant APIs, this should only be applied to the + * `name` field on the resource. + * This behavior should not be applied to references to other resources within + * the message. + * The identifier field of resources often have different field behavior + * depending on the request it is embedded in (e.g. for Create methods name + * is optional and unused, while for Update methods it is required). Instead + * of method-specific annotations, only `IDENTIFIER` is required. + * + * Generated from protobuf enum IDENTIFIER = 8; + */ + const IDENTIFIER = 8; + + private static $valueToName = [ + self::FIELD_BEHAVIOR_UNSPECIFIED => 'FIELD_BEHAVIOR_UNSPECIFIED', + self::OPTIONAL => 'OPTIONAL', + self::REQUIRED => 'REQUIRED', + self::OUTPUT_ONLY => 'OUTPUT_ONLY', + self::INPUT_ONLY => 'INPUT_ONLY', + self::IMMUTABLE => 'IMMUTABLE', + self::UNORDERED_LIST => 'UNORDERED_LIST', + self::NON_EMPTY_DEFAULT => 'NON_EMPTY_DEFAULT', + self::IDENTIFIER => 'IDENTIFIER', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/FieldInfo.php b/lib/Google/vendor/google/common-protos/src/Api/FieldInfo.php new file mode 100644 index 000000000..617bf4026 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/FieldInfo.php @@ -0,0 +1,117 @@ +google.api.FieldInfo + */ +class FieldInfo extends \Google\Protobuf\Internal\Message +{ + /** + * The standard format of a field value. This does not explicitly configure + * any API consumer, just documents the API's format for the field it is + * applied to. + * + * Generated from protobuf field .google.api.FieldInfo.Format format = 1; + */ + protected $format = 0; + /** + * The type(s) that the annotated, generic field may represent. + * Currently, this must only be used on fields of type `google.protobuf.Any`. + * Supporting other generic types may be considered in the future. + * + * Generated from protobuf field repeated .google.api.TypeReference referenced_types = 2; + */ + private $referenced_types; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $format + * The standard format of a field value. This does not explicitly configure + * any API consumer, just documents the API's format for the field it is + * applied to. + * @type array<\Google\Api\TypeReference>|\Google\Protobuf\Internal\RepeatedField $referenced_types + * The type(s) that the annotated, generic field may represent. + * Currently, this must only be used on fields of type `google.protobuf.Any`. + * Supporting other generic types may be considered in the future. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\FieldInfo::initOnce(); + parent::__construct($data); + } + + /** + * The standard format of a field value. This does not explicitly configure + * any API consumer, just documents the API's format for the field it is + * applied to. + * + * Generated from protobuf field .google.api.FieldInfo.Format format = 1; + * @return int + */ + public function getFormat() + { + return $this->format; + } + + /** + * The standard format of a field value. This does not explicitly configure + * any API consumer, just documents the API's format for the field it is + * applied to. + * + * Generated from protobuf field .google.api.FieldInfo.Format format = 1; + * @param int $var + * @return $this + */ + public function setFormat($var) + { + GPBUtil::checkEnum($var, \Google\Api\FieldInfo\Format::class); + $this->format = $var; + + return $this; + } + + /** + * The type(s) that the annotated, generic field may represent. + * Currently, this must only be used on fields of type `google.protobuf.Any`. + * Supporting other generic types may be considered in the future. + * + * Generated from protobuf field repeated .google.api.TypeReference referenced_types = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getReferencedTypes() + { + return $this->referenced_types; + } + + /** + * The type(s) that the annotated, generic field may represent. + * Currently, this must only be used on fields of type `google.protobuf.Any`. + * Supporting other generic types may be considered in the future. + * + * Generated from protobuf field repeated .google.api.TypeReference referenced_types = 2; + * @param array<\Google\Api\TypeReference>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setReferencedTypes($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\TypeReference::class); + $this->referenced_types = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/FieldInfo/Format.php b/lib/Google/vendor/google/common-protos/src/Api/FieldInfo/Format.php new file mode 100644 index 000000000..1977ca973 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/FieldInfo/Format.php @@ -0,0 +1,90 @@ +google.api.FieldInfo.Format + */ +class Format +{ + /** + * Default, unspecified value. + * + * Generated from protobuf enum FORMAT_UNSPECIFIED = 0; + */ + const FORMAT_UNSPECIFIED = 0; + /** + * Universally Unique Identifier, version 4, value as defined by + * https://datatracker.ietf.org/doc/html/rfc4122. The value may be + * normalized to entirely lowercase letters. For example, the value + * `F47AC10B-58CC-0372-8567-0E02B2C3D479` would be normalized to + * `f47ac10b-58cc-0372-8567-0e02b2c3d479`. + * + * Generated from protobuf enum UUID4 = 1; + */ + const UUID4 = 1; + /** + * Internet Protocol v4 value as defined by [RFC + * 791](https://datatracker.ietf.org/doc/html/rfc791). The value may be + * condensed, with leading zeros in each octet stripped. For example, + * `001.022.233.040` would be condensed to `1.22.233.40`. + * + * Generated from protobuf enum IPV4 = 2; + */ + const IPV4 = 2; + /** + * Internet Protocol v6 value as defined by [RFC + * 2460](https://datatracker.ietf.org/doc/html/rfc2460). The value may be + * normalized to entirely lowercase letters with zeros compressed, following + * [RFC 5952](https://datatracker.ietf.org/doc/html/rfc5952). For example, + * the value `2001:0DB8:0::0` would be normalized to `2001:db8::`. + * + * Generated from protobuf enum IPV6 = 3; + */ + const IPV6 = 3; + /** + * An IP address in either v4 or v6 format as described by the individual + * values defined herein. See the comments on the IPV4 and IPV6 types for + * allowed normalizations of each. + * + * Generated from protobuf enum IPV4_OR_IPV6 = 4; + */ + const IPV4_OR_IPV6 = 4; + + private static $valueToName = [ + self::FORMAT_UNSPECIFIED => 'FORMAT_UNSPECIFIED', + self::UUID4 => 'UUID4', + self::IPV4 => 'IPV4', + self::IPV6 => 'IPV6', + self::IPV4_OR_IPV6 => 'IPV4_OR_IPV6', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/FieldPolicy.php b/lib/Google/vendor/google/common-protos/src/Api/FieldPolicy.php new file mode 100644 index 000000000..53474a456 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/FieldPolicy.php @@ -0,0 +1,181 @@ +google.api.FieldPolicy + */ +class FieldPolicy extends \Google\Protobuf\Internal\Message +{ + /** + * Selects one or more request or response message fields to apply this + * `FieldPolicy`. + * When a `FieldPolicy` is used in proto annotation, the selector must + * be left as empty. The service config generator will automatically fill + * the correct value. + * When a `FieldPolicy` is used in service config, the selector must be a + * comma-separated string with valid request or response field paths, + * such as "foo.bar" or "foo.bar,foo.baz". + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * Specifies the required permission(s) for the resource referred to by the + * field. It requires the field contains a valid resource reference, and + * the request must pass the permission checks to proceed. For example, + * "resourcemanager.projects.get". + * + * Generated from protobuf field string resource_permission = 2; + */ + protected $resource_permission = ''; + /** + * Specifies the resource type for the resource referred to by the field. + * + * Generated from protobuf field string resource_type = 3; + */ + protected $resource_type = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects one or more request or response message fields to apply this + * `FieldPolicy`. + * When a `FieldPolicy` is used in proto annotation, the selector must + * be left as empty. The service config generator will automatically fill + * the correct value. + * When a `FieldPolicy` is used in service config, the selector must be a + * comma-separated string with valid request or response field paths, + * such as "foo.bar" or "foo.bar,foo.baz". + * @type string $resource_permission + * Specifies the required permission(s) for the resource referred to by the + * field. It requires the field contains a valid resource reference, and + * the request must pass the permission checks to proceed. For example, + * "resourcemanager.projects.get". + * @type string $resource_type + * Specifies the resource type for the resource referred to by the field. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Policy::initOnce(); + parent::__construct($data); + } + + /** + * Selects one or more request or response message fields to apply this + * `FieldPolicy`. + * When a `FieldPolicy` is used in proto annotation, the selector must + * be left as empty. The service config generator will automatically fill + * the correct value. + * When a `FieldPolicy` is used in service config, the selector must be a + * comma-separated string with valid request or response field paths, + * such as "foo.bar" or "foo.bar,foo.baz". + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects one or more request or response message fields to apply this + * `FieldPolicy`. + * When a `FieldPolicy` is used in proto annotation, the selector must + * be left as empty. The service config generator will automatically fill + * the correct value. + * When a `FieldPolicy` is used in service config, the selector must be a + * comma-separated string with valid request or response field paths, + * such as "foo.bar" or "foo.bar,foo.baz". + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Specifies the required permission(s) for the resource referred to by the + * field. It requires the field contains a valid resource reference, and + * the request must pass the permission checks to proceed. For example, + * "resourcemanager.projects.get". + * + * Generated from protobuf field string resource_permission = 2; + * @return string + */ + public function getResourcePermission() + { + return $this->resource_permission; + } + + /** + * Specifies the required permission(s) for the resource referred to by the + * field. It requires the field contains a valid resource reference, and + * the request must pass the permission checks to proceed. For example, + * "resourcemanager.projects.get". + * + * Generated from protobuf field string resource_permission = 2; + * @param string $var + * @return $this + */ + public function setResourcePermission($var) + { + GPBUtil::checkString($var, True); + $this->resource_permission = $var; + + return $this; + } + + /** + * Specifies the resource type for the resource referred to by the field. + * + * Generated from protobuf field string resource_type = 3; + * @return string + */ + public function getResourceType() + { + return $this->resource_type; + } + + /** + * Specifies the resource type for the resource referred to by the field. + * + * Generated from protobuf field string resource_type = 3; + * @param string $var + * @return $this + */ + public function setResourceType($var) + { + GPBUtil::checkString($var, True); + $this->resource_type = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/GoSettings.php b/lib/Google/vendor/google/common-protos/src/Api/GoSettings.php new file mode 100644 index 000000000..10817e885 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/GoSettings.php @@ -0,0 +1,77 @@ +google.api.GoSettings + */ +class GoSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Http.php b/lib/Google/vendor/google/common-protos/src/Api/Http.php new file mode 100644 index 000000000..712894e0e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Http.php @@ -0,0 +1,123 @@ +google.api.Http + */ +class Http extends \Google\Protobuf\Internal\Message +{ + /** + * A list of HTTP configuration rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.HttpRule rules = 1; + */ + private $rules; + /** + * When set to true, URL path parameters will be fully URI-decoded except in + * cases of single segment matches in reserved expansion, where "%2F" will be + * left encoded. + * The default behavior is to not decode RFC 6570 reserved characters in multi + * segment matches. + * + * Generated from protobuf field bool fully_decode_reserved_expansion = 2; + */ + protected $fully_decode_reserved_expansion = false; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\HttpRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of HTTP configuration rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * @type bool $fully_decode_reserved_expansion + * When set to true, URL path parameters will be fully URI-decoded except in + * cases of single segment matches in reserved expansion, where "%2F" will be + * left encoded. + * The default behavior is to not decode RFC 6570 reserved characters in multi + * segment matches. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Http::initOnce(); + parent::__construct($data); + } + + /** + * A list of HTTP configuration rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.HttpRule rules = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of HTTP configuration rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.HttpRule rules = 1; + * @param array<\Google\Api\HttpRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\HttpRule::class); + $this->rules = $arr; + + return $this; + } + + /** + * When set to true, URL path parameters will be fully URI-decoded except in + * cases of single segment matches in reserved expansion, where "%2F" will be + * left encoded. + * The default behavior is to not decode RFC 6570 reserved characters in multi + * segment matches. + * + * Generated from protobuf field bool fully_decode_reserved_expansion = 2; + * @return bool + */ + public function getFullyDecodeReservedExpansion() + { + return $this->fully_decode_reserved_expansion; + } + + /** + * When set to true, URL path parameters will be fully URI-decoded except in + * cases of single segment matches in reserved expansion, where "%2F" will be + * left encoded. + * The default behavior is to not decode RFC 6570 reserved characters in multi + * segment matches. + * + * Generated from protobuf field bool fully_decode_reserved_expansion = 2; + * @param bool $var + * @return $this + */ + public function setFullyDecodeReservedExpansion($var) + { + GPBUtil::checkBool($var); + $this->fully_decode_reserved_expansion = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/HttpBody.php b/lib/Google/vendor/google/common-protos/src/Api/HttpBody.php new file mode 100644 index 000000000..c5626f101 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/HttpBody.php @@ -0,0 +1,168 @@ +google.api.HttpBody + */ +class HttpBody extends \Google\Protobuf\Internal\Message +{ + /** + * The HTTP Content-Type header value specifying the content type of the body. + * + * Generated from protobuf field string content_type = 1; + */ + protected $content_type = ''; + /** + * The HTTP request/response body as raw binary. + * + * Generated from protobuf field bytes data = 2; + */ + protected $data = ''; + /** + * Application specific response metadata. Must be set in the first response + * for streaming APIs. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 3; + */ + private $extensions; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $content_type + * The HTTP Content-Type header value specifying the content type of the body. + * @type string $data + * The HTTP request/response body as raw binary. + * @type array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $extensions + * Application specific response metadata. Must be set in the first response + * for streaming APIs. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Httpbody::initOnce(); + parent::__construct($data); + } + + /** + * The HTTP Content-Type header value specifying the content type of the body. + * + * Generated from protobuf field string content_type = 1; + * @return string + */ + public function getContentType() + { + return $this->content_type; + } + + /** + * The HTTP Content-Type header value specifying the content type of the body. + * + * Generated from protobuf field string content_type = 1; + * @param string $var + * @return $this + */ + public function setContentType($var) + { + GPBUtil::checkString($var, True); + $this->content_type = $var; + + return $this; + } + + /** + * The HTTP request/response body as raw binary. + * + * Generated from protobuf field bytes data = 2; + * @return string + */ + public function getData() + { + return $this->data; + } + + /** + * The HTTP request/response body as raw binary. + * + * Generated from protobuf field bytes data = 2; + * @param string $var + * @return $this + */ + public function setData($var) + { + GPBUtil::checkString($var, False); + $this->data = $var; + + return $this; + } + + /** + * Application specific response metadata. Must be set in the first response + * for streaming APIs. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Application specific response metadata. Must be set in the first response + * for streaming APIs. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 3; + * @param array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setExtensions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Any::class); + $this->extensions = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/HttpRule.php b/lib/Google/vendor/google/common-protos/src/Api/HttpRule.php new file mode 100644 index 000000000..3b72f5a4c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/HttpRule.php @@ -0,0 +1,651 @@ +google.api.HttpRule + */ +class HttpRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects a method to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * The name of the request field whose value is mapped to the HTTP request + * body, or `*` for mapping all request fields not captured by the path + * pattern to the HTTP body, or omitted for not having any HTTP request body. + * NOTE: the referred field must be present at the top-level of the request + * message type. + * + * Generated from protobuf field string body = 7; + */ + protected $body = ''; + /** + * Optional. The name of the response field whose value is mapped to the HTTP + * response body. When omitted, the entire response message will be used + * as the HTTP response body. + * NOTE: The referred field must be present at the top-level of the response + * message type. + * + * Generated from protobuf field string response_body = 12; + */ + protected $response_body = ''; + /** + * Additional HTTP bindings for the selector. Nested bindings must + * not contain an `additional_bindings` field themselves (that is, + * the nesting may only be one level deep). + * + * Generated from protobuf field repeated .google.api.HttpRule additional_bindings = 11; + */ + private $additional_bindings; + protected $pattern; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects a method to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type string $get + * Maps to HTTP GET. Used for listing and getting information about + * resources. + * @type string $put + * Maps to HTTP PUT. Used for replacing a resource. + * @type string $post + * Maps to HTTP POST. Used for creating a resource or performing an action. + * @type string $delete + * Maps to HTTP DELETE. Used for deleting a resource. + * @type string $patch + * Maps to HTTP PATCH. Used for updating a resource. + * @type \Google\Api\CustomHttpPattern $custom + * The custom pattern is used for specifying an HTTP method that is not + * included in the `pattern` field, such as HEAD, or "*" to leave the + * HTTP method unspecified for this rule. The wild-card rule is useful + * for services that provide content to Web (HTML) clients. + * @type string $body + * The name of the request field whose value is mapped to the HTTP request + * body, or `*` for mapping all request fields not captured by the path + * pattern to the HTTP body, or omitted for not having any HTTP request body. + * NOTE: the referred field must be present at the top-level of the request + * message type. + * @type string $response_body + * Optional. The name of the response field whose value is mapped to the HTTP + * response body. When omitted, the entire response message will be used + * as the HTTP response body. + * NOTE: The referred field must be present at the top-level of the response + * message type. + * @type array<\Google\Api\HttpRule>|\Google\Protobuf\Internal\RepeatedField $additional_bindings + * Additional HTTP bindings for the selector. Nested bindings must + * not contain an `additional_bindings` field themselves (that is, + * the nesting may only be one level deep). + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Http::initOnce(); + parent::__construct($data); + } + + /** + * Selects a method to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects a method to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Maps to HTTP GET. Used for listing and getting information about + * resources. + * + * Generated from protobuf field string get = 2; + * @return string + */ + public function getGet() + { + return $this->readOneof(2); + } + + public function hasGet() + { + return $this->hasOneof(2); + } + + /** + * Maps to HTTP GET. Used for listing and getting information about + * resources. + * + * Generated from protobuf field string get = 2; + * @param string $var + * @return $this + */ + public function setGet($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * Maps to HTTP PUT. Used for replacing a resource. + * + * Generated from protobuf field string put = 3; + * @return string + */ + public function getPut() + { + return $this->readOneof(3); + } + + public function hasPut() + { + return $this->hasOneof(3); + } + + /** + * Maps to HTTP PUT. Used for replacing a resource. + * + * Generated from protobuf field string put = 3; + * @param string $var + * @return $this + */ + public function setPut($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(3, $var); + + return $this; + } + + /** + * Maps to HTTP POST. Used for creating a resource or performing an action. + * + * Generated from protobuf field string post = 4; + * @return string + */ + public function getPost() + { + return $this->readOneof(4); + } + + public function hasPost() + { + return $this->hasOneof(4); + } + + /** + * Maps to HTTP POST. Used for creating a resource or performing an action. + * + * Generated from protobuf field string post = 4; + * @param string $var + * @return $this + */ + public function setPost($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(4, $var); + + return $this; + } + + /** + * Maps to HTTP DELETE. Used for deleting a resource. + * + * Generated from protobuf field string delete = 5; + * @return string + */ + public function getDelete() + { + return $this->readOneof(5); + } + + public function hasDelete() + { + return $this->hasOneof(5); + } + + /** + * Maps to HTTP DELETE. Used for deleting a resource. + * + * Generated from protobuf field string delete = 5; + * @param string $var + * @return $this + */ + public function setDelete($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(5, $var); + + return $this; + } + + /** + * Maps to HTTP PATCH. Used for updating a resource. + * + * Generated from protobuf field string patch = 6; + * @return string + */ + public function getPatch() + { + return $this->readOneof(6); + } + + public function hasPatch() + { + return $this->hasOneof(6); + } + + /** + * Maps to HTTP PATCH. Used for updating a resource. + * + * Generated from protobuf field string patch = 6; + * @param string $var + * @return $this + */ + public function setPatch($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(6, $var); + + return $this; + } + + /** + * The custom pattern is used for specifying an HTTP method that is not + * included in the `pattern` field, such as HEAD, or "*" to leave the + * HTTP method unspecified for this rule. The wild-card rule is useful + * for services that provide content to Web (HTML) clients. + * + * Generated from protobuf field .google.api.CustomHttpPattern custom = 8; + * @return \Google\Api\CustomHttpPattern|null + */ + public function getCustom() + { + return $this->readOneof(8); + } + + public function hasCustom() + { + return $this->hasOneof(8); + } + + /** + * The custom pattern is used for specifying an HTTP method that is not + * included in the `pattern` field, such as HEAD, or "*" to leave the + * HTTP method unspecified for this rule. The wild-card rule is useful + * for services that provide content to Web (HTML) clients. + * + * Generated from protobuf field .google.api.CustomHttpPattern custom = 8; + * @param \Google\Api\CustomHttpPattern $var + * @return $this + */ + public function setCustom($var) + { + GPBUtil::checkMessage($var, \Google\Api\CustomHttpPattern::class); + $this->writeOneof(8, $var); + + return $this; + } + + /** + * The name of the request field whose value is mapped to the HTTP request + * body, or `*` for mapping all request fields not captured by the path + * pattern to the HTTP body, or omitted for not having any HTTP request body. + * NOTE: the referred field must be present at the top-level of the request + * message type. + * + * Generated from protobuf field string body = 7; + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * The name of the request field whose value is mapped to the HTTP request + * body, or `*` for mapping all request fields not captured by the path + * pattern to the HTTP body, or omitted for not having any HTTP request body. + * NOTE: the referred field must be present at the top-level of the request + * message type. + * + * Generated from protobuf field string body = 7; + * @param string $var + * @return $this + */ + public function setBody($var) + { + GPBUtil::checkString($var, True); + $this->body = $var; + + return $this; + } + + /** + * Optional. The name of the response field whose value is mapped to the HTTP + * response body. When omitted, the entire response message will be used + * as the HTTP response body. + * NOTE: The referred field must be present at the top-level of the response + * message type. + * + * Generated from protobuf field string response_body = 12; + * @return string + */ + public function getResponseBody() + { + return $this->response_body; + } + + /** + * Optional. The name of the response field whose value is mapped to the HTTP + * response body. When omitted, the entire response message will be used + * as the HTTP response body. + * NOTE: The referred field must be present at the top-level of the response + * message type. + * + * Generated from protobuf field string response_body = 12; + * @param string $var + * @return $this + */ + public function setResponseBody($var) + { + GPBUtil::checkString($var, True); + $this->response_body = $var; + + return $this; + } + + /** + * Additional HTTP bindings for the selector. Nested bindings must + * not contain an `additional_bindings` field themselves (that is, + * the nesting may only be one level deep). + * + * Generated from protobuf field repeated .google.api.HttpRule additional_bindings = 11; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAdditionalBindings() + { + return $this->additional_bindings; + } + + /** + * Additional HTTP bindings for the selector. Nested bindings must + * not contain an `additional_bindings` field themselves (that is, + * the nesting may only be one level deep). + * + * Generated from protobuf field repeated .google.api.HttpRule additional_bindings = 11; + * @param array<\Google\Api\HttpRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAdditionalBindings($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\HttpRule::class); + $this->additional_bindings = $arr; + + return $this; + } + + /** + * @return string + */ + public function getPattern() + { + return $this->whichOneof("pattern"); + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/JavaSettings.php b/lib/Google/vendor/google/common-protos/src/Api/JavaSettings.php new file mode 100644 index 000000000..cddb41b39 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/JavaSettings.php @@ -0,0 +1,221 @@ +google.api.JavaSettings + */ +class JavaSettings extends \Google\Protobuf\Internal\Message +{ + /** + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + * + * Generated from protobuf field string library_package = 1; + */ + protected $library_package = ''; + /** + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + * + * Generated from protobuf field map service_class_names = 2; + */ + private $service_class_names; + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 3; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $library_package + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + * @type array|\Google\Protobuf\Internal\MapField $service_class_names + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + * + * Generated from protobuf field string library_package = 1; + * @return string + */ + public function getLibraryPackage() + { + return $this->library_package; + } + + /** + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + * + * Generated from protobuf field string library_package = 1; + * @param string $var + * @return $this + */ + public function setLibraryPackage($var) + { + GPBUtil::checkString($var, True); + $this->library_package = $var; + + return $this; + } + + /** + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + * + * Generated from protobuf field map service_class_names = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getServiceClassNames() + { + return $this->service_class_names; + } + + /** + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * Example of a YAML configuration:: + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + * + * Generated from protobuf field map service_class_names = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setServiceClassNames($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->service_class_names = $arr; + + return $this; + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 3; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 3; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/JwtLocation.php b/lib/Google/vendor/google/common-protos/src/Api/JwtLocation.php new file mode 100644 index 000000000..1bfbdd88e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/JwtLocation.php @@ -0,0 +1,199 @@ +google.api.JwtLocation + */ +class JwtLocation extends \Google\Protobuf\Internal\Message +{ + /** + * The value prefix. The value format is "value_prefix{token}" + * Only applies to "in" header type. Must be empty for "in" query type. + * If not empty, the header value has to match (case sensitive) this prefix. + * If not matched, JWT will not be extracted. If matched, JWT will be + * extracted after the prefix is removed. + * For example, for "Authorization: Bearer {JWT}", + * value_prefix="Bearer " with a space at the end. + * + * Generated from protobuf field string value_prefix = 3; + */ + protected $value_prefix = ''; + protected $in; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $header + * Specifies HTTP header name to extract JWT token. + * @type string $query + * Specifies URL query parameter name to extract JWT token. + * @type string $cookie + * Specifies cookie name to extract JWT token. + * @type string $value_prefix + * The value prefix. The value format is "value_prefix{token}" + * Only applies to "in" header type. Must be empty for "in" query type. + * If not empty, the header value has to match (case sensitive) this prefix. + * If not matched, JWT will not be extracted. If matched, JWT will be + * extracted after the prefix is removed. + * For example, for "Authorization: Bearer {JWT}", + * value_prefix="Bearer " with a space at the end. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * Specifies HTTP header name to extract JWT token. + * + * Generated from protobuf field string header = 1; + * @return string + */ + public function getHeader() + { + return $this->readOneof(1); + } + + public function hasHeader() + { + return $this->hasOneof(1); + } + + /** + * Specifies HTTP header name to extract JWT token. + * + * Generated from protobuf field string header = 1; + * @param string $var + * @return $this + */ + public function setHeader($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(1, $var); + + return $this; + } + + /** + * Specifies URL query parameter name to extract JWT token. + * + * Generated from protobuf field string query = 2; + * @return string + */ + public function getQuery() + { + return $this->readOneof(2); + } + + public function hasQuery() + { + return $this->hasOneof(2); + } + + /** + * Specifies URL query parameter name to extract JWT token. + * + * Generated from protobuf field string query = 2; + * @param string $var + * @return $this + */ + public function setQuery($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * Specifies cookie name to extract JWT token. + * + * Generated from protobuf field string cookie = 4; + * @return string + */ + public function getCookie() + { + return $this->readOneof(4); + } + + public function hasCookie() + { + return $this->hasOneof(4); + } + + /** + * Specifies cookie name to extract JWT token. + * + * Generated from protobuf field string cookie = 4; + * @param string $var + * @return $this + */ + public function setCookie($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(4, $var); + + return $this; + } + + /** + * The value prefix. The value format is "value_prefix{token}" + * Only applies to "in" header type. Must be empty for "in" query type. + * If not empty, the header value has to match (case sensitive) this prefix. + * If not matched, JWT will not be extracted. If matched, JWT will be + * extracted after the prefix is removed. + * For example, for "Authorization: Bearer {JWT}", + * value_prefix="Bearer " with a space at the end. + * + * Generated from protobuf field string value_prefix = 3; + * @return string + */ + public function getValuePrefix() + { + return $this->value_prefix; + } + + /** + * The value prefix. The value format is "value_prefix{token}" + * Only applies to "in" header type. Must be empty for "in" query type. + * If not empty, the header value has to match (case sensitive) this prefix. + * If not matched, JWT will not be extracted. If matched, JWT will be + * extracted after the prefix is removed. + * For example, for "Authorization: Bearer {JWT}", + * value_prefix="Bearer " with a space at the end. + * + * Generated from protobuf field string value_prefix = 3; + * @param string $var + * @return $this + */ + public function setValuePrefix($var) + { + GPBUtil::checkString($var, True); + $this->value_prefix = $var; + + return $this; + } + + /** + * @return string + */ + public function getIn() + { + return $this->whichOneof("in"); + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor.php b/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor.php new file mode 100644 index 000000000..67fa39ad3 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor.php @@ -0,0 +1,135 @@ +google.api.LabelDescriptor + */ +class LabelDescriptor extends \Google\Protobuf\Internal\Message +{ + /** + * The label key. + * + * Generated from protobuf field string key = 1; + */ + protected $key = ''; + /** + * The type of data that can be assigned to the label. + * + * Generated from protobuf field .google.api.LabelDescriptor.ValueType value_type = 2; + */ + protected $value_type = 0; + /** + * A human-readable description for the label. + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $key + * The label key. + * @type int $value_type + * The type of data that can be assigned to the label. + * @type string $description + * A human-readable description for the label. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Label::initOnce(); + parent::__construct($data); + } + + /** + * The label key. + * + * Generated from protobuf field string key = 1; + * @return string + */ + public function getKey() + { + return $this->key; + } + + /** + * The label key. + * + * Generated from protobuf field string key = 1; + * @param string $var + * @return $this + */ + public function setKey($var) + { + GPBUtil::checkString($var, True); + $this->key = $var; + + return $this; + } + + /** + * The type of data that can be assigned to the label. + * + * Generated from protobuf field .google.api.LabelDescriptor.ValueType value_type = 2; + * @return int + */ + public function getValueType() + { + return $this->value_type; + } + + /** + * The type of data that can be assigned to the label. + * + * Generated from protobuf field .google.api.LabelDescriptor.ValueType value_type = 2; + * @param int $var + * @return $this + */ + public function setValueType($var) + { + GPBUtil::checkEnum($var, \Google\Api\LabelDescriptor\ValueType::class); + $this->value_type = $var; + + return $this; + } + + /** + * A human-readable description for the label. + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A human-readable description for the label. + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor/ValueType.php b/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor/ValueType.php new file mode 100644 index 000000000..044b29d33 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/LabelDescriptor/ValueType.php @@ -0,0 +1,62 @@ +google.api.LabelDescriptor.ValueType + */ +class ValueType +{ + /** + * A variable-length string. This is the default. + * + * Generated from protobuf enum STRING = 0; + */ + const STRING = 0; + /** + * Boolean; true or false. + * + * Generated from protobuf enum BOOL = 1; + */ + const BOOL = 1; + /** + * A 64-bit signed integer. + * + * Generated from protobuf enum INT64 = 2; + */ + const INT64 = 2; + + private static $valueToName = [ + self::STRING => 'STRING', + self::BOOL => 'BOOL', + self::INT64 => 'INT64', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/LaunchStage.php b/lib/Google/vendor/google/common-protos/src/Api/LaunchStage.php new file mode 100644 index 000000000..766aa7903 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/LaunchStage.php @@ -0,0 +1,118 @@ +google.api.LaunchStage + */ +class LaunchStage +{ + /** + * Do not use this default value. + * + * Generated from protobuf enum LAUNCH_STAGE_UNSPECIFIED = 0; + */ + const LAUNCH_STAGE_UNSPECIFIED = 0; + /** + * The feature is not yet implemented. Users can not use it. + * + * Generated from protobuf enum UNIMPLEMENTED = 6; + */ + const UNIMPLEMENTED = 6; + /** + * Prelaunch features are hidden from users and are only visible internally. + * + * Generated from protobuf enum PRELAUNCH = 7; + */ + const PRELAUNCH = 7; + /** + * Early Access features are limited to a closed group of testers. To use + * these features, you must sign up in advance and sign a Trusted Tester + * agreement (which includes confidentiality provisions). These features may + * be unstable, changed in backward-incompatible ways, and are not + * guaranteed to be released. + * + * Generated from protobuf enum EARLY_ACCESS = 1; + */ + const EARLY_ACCESS = 1; + /** + * Alpha is a limited availability test for releases before they are cleared + * for widespread use. By Alpha, all significant design issues are resolved + * and we are in the process of verifying functionality. Alpha customers + * need to apply for access, agree to applicable terms, and have their + * projects allowlisted. Alpha releases don't have to be feature complete, + * no SLAs are provided, and there are no technical support obligations, but + * they will be far enough along that customers can actually use them in + * test environments or for limited-use tests -- just like they would in + * normal production cases. + * + * Generated from protobuf enum ALPHA = 2; + */ + const ALPHA = 2; + /** + * Beta is the point at which we are ready to open a release for any + * customer to use. There are no SLA or technical support obligations in a + * Beta release. Products will be complete from a feature perspective, but + * may have some open outstanding issues. Beta releases are suitable for + * limited production use cases. + * + * Generated from protobuf enum BETA = 3; + */ + const BETA = 3; + /** + * GA features are open to all developers and are considered stable and + * fully qualified for production use. + * + * Generated from protobuf enum GA = 4; + */ + const GA = 4; + /** + * Deprecated features are scheduled to be shut down and removed. For more + * information, see the "Deprecation Policy" section of our [Terms of + * Service](https://cloud.google.com/terms/) + * and the [Google Cloud Platform Subject to the Deprecation + * Policy](https://cloud.google.com/terms/deprecation) documentation. + * + * Generated from protobuf enum DEPRECATED = 5; + */ + const DEPRECATED = 5; + + private static $valueToName = [ + self::LAUNCH_STAGE_UNSPECIFIED => 'LAUNCH_STAGE_UNSPECIFIED', + self::UNIMPLEMENTED => 'UNIMPLEMENTED', + self::PRELAUNCH => 'PRELAUNCH', + self::EARLY_ACCESS => 'EARLY_ACCESS', + self::ALPHA => 'ALPHA', + self::BETA => 'BETA', + self::GA => 'GA', + self::DEPRECATED => 'DEPRECATED', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/LogDescriptor.php b/lib/Google/vendor/google/common-protos/src/Api/LogDescriptor.php new file mode 100644 index 000000000..bb4855885 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/LogDescriptor.php @@ -0,0 +1,203 @@ +google.api.LogDescriptor + */ +class LogDescriptor extends \Google\Protobuf\Internal\Message +{ + /** + * The name of the log. It must be less than 512 characters long and can + * include the following characters: upper- and lower-case alphanumeric + * characters [A-Za-z0-9], and punctuation characters including + * slash, underscore, hyphen, period [/_-.]. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The set of labels that are available to describe a specific log entry. + * Runtime requests that contain labels not specified here are + * considered invalid. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + */ + private $labels; + /** + * A human-readable description of this log. This information appears in + * the documentation and can contain details. + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + /** + * The human-readable name for this log. This information appears on + * the user interface and should be concise. + * + * Generated from protobuf field string display_name = 4; + */ + protected $display_name = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The name of the log. It must be less than 512 characters long and can + * include the following characters: upper- and lower-case alphanumeric + * characters [A-Za-z0-9], and punctuation characters including + * slash, underscore, hyphen, period [/_-.]. + * @type array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $labels + * The set of labels that are available to describe a specific log entry. + * Runtime requests that contain labels not specified here are + * considered invalid. + * @type string $description + * A human-readable description of this log. This information appears in + * the documentation and can contain details. + * @type string $display_name + * The human-readable name for this log. This information appears on + * the user interface and should be concise. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Log::initOnce(); + parent::__construct($data); + } + + /** + * The name of the log. It must be less than 512 characters long and can + * include the following characters: upper- and lower-case alphanumeric + * characters [A-Za-z0-9], and punctuation characters including + * slash, underscore, hyphen, period [/_-.]. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The name of the log. It must be less than 512 characters long and can + * include the following characters: upper- and lower-case alphanumeric + * characters [A-Za-z0-9], and punctuation characters including + * slash, underscore, hyphen, period [/_-.]. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The set of labels that are available to describe a specific log entry. + * Runtime requests that contain labels not specified here are + * considered invalid. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * The set of labels that are available to describe a specific log entry. + * Runtime requests that contain labels not specified here are + * considered invalid. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + * @param array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\LabelDescriptor::class); + $this->labels = $arr; + + return $this; + } + + /** + * A human-readable description of this log. This information appears in + * the documentation and can contain details. + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A human-readable description of this log. This information appears in + * the documentation and can contain details. + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * The human-readable name for this log. This information appears on + * the user interface and should be concise. + * + * Generated from protobuf field string display_name = 4; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * The human-readable name for this log. This information appears on + * the user interface and should be concise. + * + * Generated from protobuf field string display_name = 4; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Logging.php b/lib/Google/vendor/google/common-protos/src/Api/Logging.php new file mode 100644 index 000000000..52198c138 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Logging.php @@ -0,0 +1,151 @@ +google.api.Logging + */ +class Logging extends \Google\Protobuf\Internal\Message +{ + /** + * Logging configurations for sending logs to the producer project. + * There can be multiple producer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one producer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination producer_destinations = 1; + */ + private $producer_destinations; + /** + * Logging configurations for sending logs to the consumer project. + * There can be multiple consumer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination consumer_destinations = 2; + */ + private $consumer_destinations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\Logging\LoggingDestination>|\Google\Protobuf\Internal\RepeatedField $producer_destinations + * Logging configurations for sending logs to the producer project. + * There can be multiple producer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one producer destination. + * @type array<\Google\Api\Logging\LoggingDestination>|\Google\Protobuf\Internal\RepeatedField $consumer_destinations + * Logging configurations for sending logs to the consumer project. + * There can be multiple consumer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one consumer destination. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Logging::initOnce(); + parent::__construct($data); + } + + /** + * Logging configurations for sending logs to the producer project. + * There can be multiple producer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one producer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination producer_destinations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getProducerDestinations() + { + return $this->producer_destinations; + } + + /** + * Logging configurations for sending logs to the producer project. + * There can be multiple producer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one producer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination producer_destinations = 1; + * @param array<\Google\Api\Logging\LoggingDestination>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setProducerDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Logging\LoggingDestination::class); + $this->producer_destinations = $arr; + + return $this; + } + + /** + * Logging configurations for sending logs to the consumer project. + * There can be multiple consumer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination consumer_destinations = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getConsumerDestinations() + { + return $this->consumer_destinations; + } + + /** + * Logging configurations for sending logs to the consumer project. + * There can be multiple consumer destinations, each one must have a + * different monitored resource type. A log can be used in at most + * one consumer destination. + * + * Generated from protobuf field repeated .google.api.Logging.LoggingDestination consumer_destinations = 2; + * @param array<\Google\Api\Logging\LoggingDestination>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setConsumerDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Logging\LoggingDestination::class); + $this->consumer_destinations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Logging/LoggingDestination.php b/lib/Google/vendor/google/common-protos/src/Api/Logging/LoggingDestination.php new file mode 100644 index 000000000..22d2e9147 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Logging/LoggingDestination.php @@ -0,0 +1,123 @@ +google.api.Logging.LoggingDestination + */ +class LoggingDestination extends \Google\Protobuf\Internal\Message +{ + /** + * The monitored resource type. The type must be defined in the + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 3; + */ + protected $monitored_resource = ''; + /** + * Names of the logs to be sent to this destination. Each name must + * be defined in the [Service.logs][google.api.Service.logs] section. If the + * log name is not a domain scoped name, it will be automatically prefixed + * with the service name followed by "/". + * + * Generated from protobuf field repeated string logs = 1; + */ + private $logs; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $monitored_resource + * The monitored resource type. The type must be defined in the + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * @type array|\Google\Protobuf\Internal\RepeatedField $logs + * Names of the logs to be sent to this destination. Each name must + * be defined in the [Service.logs][google.api.Service.logs] section. If the + * log name is not a domain scoped name, it will be automatically prefixed + * with the service name followed by "/". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Logging::initOnce(); + parent::__construct($data); + } + + /** + * The monitored resource type. The type must be defined in the + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 3; + * @return string + */ + public function getMonitoredResource() + { + return $this->monitored_resource; + } + + /** + * The monitored resource type. The type must be defined in the + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 3; + * @param string $var + * @return $this + */ + public function setMonitoredResource($var) + { + GPBUtil::checkString($var, True); + $this->monitored_resource = $var; + + return $this; + } + + /** + * Names of the logs to be sent to this destination. Each name must + * be defined in the [Service.logs][google.api.Service.logs] section. If the + * log name is not a domain scoped name, it will be automatically prefixed + * with the service name followed by "/". + * + * Generated from protobuf field repeated string logs = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLogs() + { + return $this->logs; + } + + /** + * Names of the logs to be sent to this destination. Each name must + * be defined in the [Service.logs][google.api.Service.logs] section. If the + * log name is not a domain scoped name, it will be automatically prefixed + * with the service name followed by "/". + * + * Generated from protobuf field repeated string logs = 1; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLogs($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->logs = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MethodPolicy.php b/lib/Google/vendor/google/common-protos/src/Api/MethodPolicy.php new file mode 100644 index 000000000..faeb40a90 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MethodPolicy.php @@ -0,0 +1,121 @@ +google.api.MethodPolicy + */ +class MethodPolicy extends \Google\Protobuf\Internal\Message +{ + /** + * Selects a method to which these policies should be enforced, for example, + * "google.pubsub.v1.Subscriber.CreateSubscription". + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * NOTE: This field must not be set in the proto annotation. It will be + * automatically filled by the service config compiler . + * + * Generated from protobuf field string selector = 9; + */ + protected $selector = ''; + /** + * Policies that are applicable to the request message. + * + * Generated from protobuf field repeated .google.api.FieldPolicy request_policies = 2; + */ + private $request_policies; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects a method to which these policies should be enforced, for example, + * "google.pubsub.v1.Subscriber.CreateSubscription". + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * NOTE: This field must not be set in the proto annotation. It will be + * automatically filled by the service config compiler . + * @type array<\Google\Api\FieldPolicy>|\Google\Protobuf\Internal\RepeatedField $request_policies + * Policies that are applicable to the request message. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Policy::initOnce(); + parent::__construct($data); + } + + /** + * Selects a method to which these policies should be enforced, for example, + * "google.pubsub.v1.Subscriber.CreateSubscription". + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * NOTE: This field must not be set in the proto annotation. It will be + * automatically filled by the service config compiler . + * + * Generated from protobuf field string selector = 9; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects a method to which these policies should be enforced, for example, + * "google.pubsub.v1.Subscriber.CreateSubscription". + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * NOTE: This field must not be set in the proto annotation. It will be + * automatically filled by the service config compiler . + * + * Generated from protobuf field string selector = 9; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Policies that are applicable to the request message. + * + * Generated from protobuf field repeated .google.api.FieldPolicy request_policies = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRequestPolicies() + { + return $this->request_policies; + } + + /** + * Policies that are applicable to the request message. + * + * Generated from protobuf field repeated .google.api.FieldPolicy request_policies = 2; + * @param array<\Google\Api\FieldPolicy>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRequestPolicies($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\FieldPolicy::class); + $this->request_policies = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MethodSettings.php b/lib/Google/vendor/google/common-protos/src/Api/MethodSettings.php new file mode 100644 index 000000000..0e95d507a --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MethodSettings.php @@ -0,0 +1,245 @@ +google.api.MethodSettings + */ +class MethodSettings extends \Google\Protobuf\Internal\Message +{ + /** + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * Example: + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * Example of a YAML configuration:: + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + * + * Generated from protobuf field .google.api.MethodSettings.LongRunning long_running = 2; + */ + protected $long_running = null; + /** + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * Example of a YAML configuration: + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + * + * Generated from protobuf field repeated string auto_populated_fields = 3; + */ + private $auto_populated_fields; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * Example: + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + * @type \Google\Api\MethodSettings\LongRunning $long_running + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * Example of a YAML configuration:: + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + * @type array|\Google\Protobuf\Internal\RepeatedField $auto_populated_fields + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * Example of a YAML configuration: + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * Example: + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * Example: + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * Example of a YAML configuration:: + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + * + * Generated from protobuf field .google.api.MethodSettings.LongRunning long_running = 2; + * @return \Google\Api\MethodSettings\LongRunning|null + */ + public function getLongRunning() + { + return $this->long_running; + } + + public function hasLongRunning() + { + return isset($this->long_running); + } + + public function clearLongRunning() + { + unset($this->long_running); + } + + /** + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * Example of a YAML configuration:: + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + * + * Generated from protobuf field .google.api.MethodSettings.LongRunning long_running = 2; + * @param \Google\Api\MethodSettings\LongRunning $var + * @return $this + */ + public function setLongRunning($var) + { + GPBUtil::checkMessage($var, \Google\Api\MethodSettings\LongRunning::class); + $this->long_running = $var; + + return $this; + } + + /** + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * Example of a YAML configuration: + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + * + * Generated from protobuf field repeated string auto_populated_fields = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAutoPopulatedFields() + { + return $this->auto_populated_fields; + } + + /** + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * Example of a YAML configuration: + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + * + * Generated from protobuf field repeated string auto_populated_fields = 3; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAutoPopulatedFields($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->auto_populated_fields = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MethodSettings/LongRunning.php b/lib/Google/vendor/google/common-protos/src/Api/MethodSettings/LongRunning.php new file mode 100644 index 000000000..eba226558 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MethodSettings/LongRunning.php @@ -0,0 +1,224 @@ +google.api.MethodSettings.LongRunning + */ +class LongRunning extends \Google\Protobuf\Internal\Message +{ + /** + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + * + * Generated from protobuf field .google.protobuf.Duration initial_poll_delay = 1; + */ + protected $initial_poll_delay = null; + /** + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + * + * Generated from protobuf field float poll_delay_multiplier = 2; + */ + protected $poll_delay_multiplier = 0.0; + /** + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + * + * Generated from protobuf field .google.protobuf.Duration max_poll_delay = 3; + */ + protected $max_poll_delay = null; + /** + * Total polling timeout. + * Default value: 5 minutes. + * + * Generated from protobuf field .google.protobuf.Duration total_poll_timeout = 4; + */ + protected $total_poll_timeout = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Protobuf\Duration $initial_poll_delay + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + * @type float $poll_delay_multiplier + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + * @type \Google\Protobuf\Duration $max_poll_delay + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + * @type \Google\Protobuf\Duration $total_poll_timeout + * Total polling timeout. + * Default value: 5 minutes. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + * + * Generated from protobuf field .google.protobuf.Duration initial_poll_delay = 1; + * @return \Google\Protobuf\Duration|null + */ + public function getInitialPollDelay() + { + return $this->initial_poll_delay; + } + + public function hasInitialPollDelay() + { + return isset($this->initial_poll_delay); + } + + public function clearInitialPollDelay() + { + unset($this->initial_poll_delay); + } + + /** + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + * + * Generated from protobuf field .google.protobuf.Duration initial_poll_delay = 1; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setInitialPollDelay($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->initial_poll_delay = $var; + + return $this; + } + + /** + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + * + * Generated from protobuf field float poll_delay_multiplier = 2; + * @return float + */ + public function getPollDelayMultiplier() + { + return $this->poll_delay_multiplier; + } + + /** + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + * + * Generated from protobuf field float poll_delay_multiplier = 2; + * @param float $var + * @return $this + */ + public function setPollDelayMultiplier($var) + { + GPBUtil::checkFloat($var); + $this->poll_delay_multiplier = $var; + + return $this; + } + + /** + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + * + * Generated from protobuf field .google.protobuf.Duration max_poll_delay = 3; + * @return \Google\Protobuf\Duration|null + */ + public function getMaxPollDelay() + { + return $this->max_poll_delay; + } + + public function hasMaxPollDelay() + { + return isset($this->max_poll_delay); + } + + public function clearMaxPollDelay() + { + unset($this->max_poll_delay); + } + + /** + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + * + * Generated from protobuf field .google.protobuf.Duration max_poll_delay = 3; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setMaxPollDelay($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->max_poll_delay = $var; + + return $this; + } + + /** + * Total polling timeout. + * Default value: 5 minutes. + * + * Generated from protobuf field .google.protobuf.Duration total_poll_timeout = 4; + * @return \Google\Protobuf\Duration|null + */ + public function getTotalPollTimeout() + { + return $this->total_poll_timeout; + } + + public function hasTotalPollTimeout() + { + return isset($this->total_poll_timeout); + } + + public function clearTotalPollTimeout() + { + unset($this->total_poll_timeout); + } + + /** + * Total polling timeout. + * Default value: 5 minutes. + * + * Generated from protobuf field .google.protobuf.Duration total_poll_timeout = 4; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setTotalPollTimeout($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->total_poll_timeout = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Metric.php b/lib/Google/vendor/google/common-protos/src/Api/Metric.php new file mode 100644 index 000000000..488552fb8 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Metric.php @@ -0,0 +1,114 @@ +google.api.Metric + */ +class Metric extends \Google\Protobuf\Internal\Message +{ + /** + * An existing metric type, see + * [google.api.MetricDescriptor][google.api.MetricDescriptor]. For example, + * `custom.googleapis.com/invoice/paid/amount`. + * + * Generated from protobuf field string type = 3; + */ + protected $type = ''; + /** + * The set of label values that uniquely identify this metric. All + * labels listed in the `MetricDescriptor` must be assigned values. + * + * Generated from protobuf field map labels = 2; + */ + private $labels; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type + * An existing metric type, see + * [google.api.MetricDescriptor][google.api.MetricDescriptor]. For example, + * `custom.googleapis.com/invoice/paid/amount`. + * @type array|\Google\Protobuf\Internal\MapField $labels + * The set of label values that uniquely identify this metric. All + * labels listed in the `MetricDescriptor` must be assigned values. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Metric::initOnce(); + parent::__construct($data); + } + + /** + * An existing metric type, see + * [google.api.MetricDescriptor][google.api.MetricDescriptor]. For example, + * `custom.googleapis.com/invoice/paid/amount`. + * + * Generated from protobuf field string type = 3; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * An existing metric type, see + * [google.api.MetricDescriptor][google.api.MetricDescriptor]. For example, + * `custom.googleapis.com/invoice/paid/amount`. + * + * Generated from protobuf field string type = 3; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * The set of label values that uniquely identify this metric. All + * labels listed in the `MetricDescriptor` must be assigned values. + * + * Generated from protobuf field map labels = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * The set of label values that uniquely identify this metric. All + * labels listed in the `MetricDescriptor` must be assigned values. + * + * Generated from protobuf field map labels = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->labels = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor.php b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor.php new file mode 100644 index 000000000..b8a39d69d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor.php @@ -0,0 +1,831 @@ +google.api.MetricDescriptor + */ +class MetricDescriptor extends \Google\Protobuf\Internal\Message +{ + /** + * The resource name of the metric descriptor. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The metric type, including its DNS name prefix. The type is not + * URL-encoded. All user-defined metric types have the DNS name + * `custom.googleapis.com` or `external.googleapis.com`. Metric types should + * use a natural hierarchical grouping. For example: + * "custom.googleapis.com/invoice/paid/amount" + * "external.googleapis.com/prometheus/up" + * "appengine.googleapis.com/http/server/response_latencies" + * + * Generated from protobuf field string type = 8; + */ + protected $type = ''; + /** + * The set of labels that can be used to describe a specific + * instance of this metric type. For example, the + * `appengine.googleapis.com/http/server/response_latencies` metric + * type has a label for the HTTP response code, `response_code`, so + * you can look at latencies for successful responses or just + * for responses that failed. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + */ + private $labels; + /** + * Whether the metric records instantaneous values, changes to a value, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricKind metric_kind = 3; + */ + protected $metric_kind = 0; + /** + * Whether the measurement is an integer, a floating-point number, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.ValueType value_type = 4; + */ + protected $value_type = 0; + /** + * The units in which the metric value is reported. It is only applicable + * if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` + * defines the representation of the stored metric values. + * Different systems might scale the values to be more easily displayed (so a + * value of `0.02kBy` _might_ be displayed as `20By`, and a value of + * `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is + * `kBy`, then the value of the metric is always in thousands of bytes, no + * matter how it might be displayed. + * If you want a custom metric to record the exact number of CPU-seconds used + * by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is + * `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 + * CPU-seconds, then the value is written as `12005`. + * Alternatively, if you want a custom metric to record data in a more + * granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is + * `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), + * or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). + * The supported units are a subset of [The Unified Code for Units of + * Measure](https://unitsofmeasure.org/ucum.html) standard: + * **Basic units (UNIT)** + * * `bit` bit + * * `By` byte + * * `s` second + * * `min` minute + * * `h` hour + * * `d` day + * * `1` dimensionless + * **Prefixes (PREFIX)** + * * `k` kilo (10^3) + * * `M` mega (10^6) + * * `G` giga (10^9) + * * `T` tera (10^12) + * * `P` peta (10^15) + * * `E` exa (10^18) + * * `Z` zetta (10^21) + * * `Y` yotta (10^24) + * * `m` milli (10^-3) + * * `u` micro (10^-6) + * * `n` nano (10^-9) + * * `p` pico (10^-12) + * * `f` femto (10^-15) + * * `a` atto (10^-18) + * * `z` zepto (10^-21) + * * `y` yocto (10^-24) + * * `Ki` kibi (2^10) + * * `Mi` mebi (2^20) + * * `Gi` gibi (2^30) + * * `Ti` tebi (2^40) + * * `Pi` pebi (2^50) + * **Grammar** + * The grammar also includes these connectors: + * * `/` division or ratio (as an infix operator). For examples, + * `kBy/{email}` or `MiBy/10ms` (although you should almost never + * have `/s` in a metric `unit`; rates should always be computed at + * query time from the underlying cumulative or delta value). + * * `.` multiplication or composition (as an infix operator). For + * examples, `GBy.d` or `k{watt}.h`. + * The grammar for a unit is as follows: + * Expression = Component { "." Component } { "/" Component } ; + * Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] + * | Annotation + * | "1" + * ; + * Annotation = "{" NAME "}" ; + * Notes: + * * `Annotation` is just a comment if it follows a `UNIT`. If the annotation + * is used alone, then the unit is equivalent to `1`. For examples, + * `{request}/s == 1/s`, `By{transmitted}/s == By/s`. + * * `NAME` is a sequence of non-blank printable ASCII characters not + * containing `{` or `}`. + * * `1` represents a unitary [dimensionless + * unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such + * as in `1/s`. It is typically used when none of the basic units are + * appropriate. For example, "new users per day" can be represented as + * `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new + * users). Alternatively, "thousands of page views per day" would be + * represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric + * value of `5.3` would mean "5300 page views per day"). + * * `%` represents dimensionless value of 1/100, and annotates values giving + * a percentage (so the metric values are typically in the range of 0..100, + * and a metric value `3` means "3 percent"). + * * `10^2.%` indicates a metric contains a ratio, typically in the range + * 0..1, that will be multiplied by 100 and displayed as a percentage + * (so a metric value `0.03` means "3 percent"). + * + * Generated from protobuf field string unit = 5; + */ + protected $unit = ''; + /** + * A detailed description of the metric, which can be used in documentation. + * + * Generated from protobuf field string description = 6; + */ + protected $description = ''; + /** + * A concise name for the metric, which can be displayed in user interfaces. + * Use sentence case without an ending period, for example "Request count". + * This field is optional but it is recommended to be set for any metrics + * associated with user-visible concepts, such as Quota. + * + * Generated from protobuf field string display_name = 7; + */ + protected $display_name = ''; + /** + * Optional. Metadata which can be used to guide usage of the metric. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricDescriptorMetadata metadata = 10; + */ + protected $metadata = null; + /** + * Optional. The launch stage of the metric definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 12; + */ + protected $launch_stage = 0; + /** + * Read-only. If present, then a [time + * series][google.monitoring.v3.TimeSeries], which is identified partially by + * a metric type and a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that + * is associated with this metric type can only be associated with one of the + * monitored resource types listed here. + * + * Generated from protobuf field repeated string monitored_resource_types = 13; + */ + private $monitored_resource_types; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The resource name of the metric descriptor. + * @type string $type + * The metric type, including its DNS name prefix. The type is not + * URL-encoded. All user-defined metric types have the DNS name + * `custom.googleapis.com` or `external.googleapis.com`. Metric types should + * use a natural hierarchical grouping. For example: + * "custom.googleapis.com/invoice/paid/amount" + * "external.googleapis.com/prometheus/up" + * "appengine.googleapis.com/http/server/response_latencies" + * @type array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $labels + * The set of labels that can be used to describe a specific + * instance of this metric type. For example, the + * `appengine.googleapis.com/http/server/response_latencies` metric + * type has a label for the HTTP response code, `response_code`, so + * you can look at latencies for successful responses or just + * for responses that failed. + * @type int $metric_kind + * Whether the metric records instantaneous values, changes to a value, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * @type int $value_type + * Whether the measurement is an integer, a floating-point number, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * @type string $unit + * The units in which the metric value is reported. It is only applicable + * if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` + * defines the representation of the stored metric values. + * Different systems might scale the values to be more easily displayed (so a + * value of `0.02kBy` _might_ be displayed as `20By`, and a value of + * `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is + * `kBy`, then the value of the metric is always in thousands of bytes, no + * matter how it might be displayed. + * If you want a custom metric to record the exact number of CPU-seconds used + * by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is + * `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 + * CPU-seconds, then the value is written as `12005`. + * Alternatively, if you want a custom metric to record data in a more + * granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is + * `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), + * or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). + * The supported units are a subset of [The Unified Code for Units of + * Measure](https://unitsofmeasure.org/ucum.html) standard: + * **Basic units (UNIT)** + * * `bit` bit + * * `By` byte + * * `s` second + * * `min` minute + * * `h` hour + * * `d` day + * * `1` dimensionless + * **Prefixes (PREFIX)** + * * `k` kilo (10^3) + * * `M` mega (10^6) + * * `G` giga (10^9) + * * `T` tera (10^12) + * * `P` peta (10^15) + * * `E` exa (10^18) + * * `Z` zetta (10^21) + * * `Y` yotta (10^24) + * * `m` milli (10^-3) + * * `u` micro (10^-6) + * * `n` nano (10^-9) + * * `p` pico (10^-12) + * * `f` femto (10^-15) + * * `a` atto (10^-18) + * * `z` zepto (10^-21) + * * `y` yocto (10^-24) + * * `Ki` kibi (2^10) + * * `Mi` mebi (2^20) + * * `Gi` gibi (2^30) + * * `Ti` tebi (2^40) + * * `Pi` pebi (2^50) + * **Grammar** + * The grammar also includes these connectors: + * * `/` division or ratio (as an infix operator). For examples, + * `kBy/{email}` or `MiBy/10ms` (although you should almost never + * have `/s` in a metric `unit`; rates should always be computed at + * query time from the underlying cumulative or delta value). + * * `.` multiplication or composition (as an infix operator). For + * examples, `GBy.d` or `k{watt}.h`. + * The grammar for a unit is as follows: + * Expression = Component { "." Component } { "/" Component } ; + * Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] + * | Annotation + * | "1" + * ; + * Annotation = "{" NAME "}" ; + * Notes: + * * `Annotation` is just a comment if it follows a `UNIT`. If the annotation + * is used alone, then the unit is equivalent to `1`. For examples, + * `{request}/s == 1/s`, `By{transmitted}/s == By/s`. + * * `NAME` is a sequence of non-blank printable ASCII characters not + * containing `{` or `}`. + * * `1` represents a unitary [dimensionless + * unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such + * as in `1/s`. It is typically used when none of the basic units are + * appropriate. For example, "new users per day" can be represented as + * `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new + * users). Alternatively, "thousands of page views per day" would be + * represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric + * value of `5.3` would mean "5300 page views per day"). + * * `%` represents dimensionless value of 1/100, and annotates values giving + * a percentage (so the metric values are typically in the range of 0..100, + * and a metric value `3` means "3 percent"). + * * `10^2.%` indicates a metric contains a ratio, typically in the range + * 0..1, that will be multiplied by 100 and displayed as a percentage + * (so a metric value `0.03` means "3 percent"). + * @type string $description + * A detailed description of the metric, which can be used in documentation. + * @type string $display_name + * A concise name for the metric, which can be displayed in user interfaces. + * Use sentence case without an ending period, for example "Request count". + * This field is optional but it is recommended to be set for any metrics + * associated with user-visible concepts, such as Quota. + * @type \Google\Api\MetricDescriptor\MetricDescriptorMetadata $metadata + * Optional. Metadata which can be used to guide usage of the metric. + * @type int $launch_stage + * Optional. The launch stage of the metric definition. + * @type array|\Google\Protobuf\Internal\RepeatedField $monitored_resource_types + * Read-only. If present, then a [time + * series][google.monitoring.v3.TimeSeries], which is identified partially by + * a metric type and a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that + * is associated with this metric type can only be associated with one of the + * monitored resource types listed here. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Metric::initOnce(); + parent::__construct($data); + } + + /** + * The resource name of the metric descriptor. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The resource name of the metric descriptor. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The metric type, including its DNS name prefix. The type is not + * URL-encoded. All user-defined metric types have the DNS name + * `custom.googleapis.com` or `external.googleapis.com`. Metric types should + * use a natural hierarchical grouping. For example: + * "custom.googleapis.com/invoice/paid/amount" + * "external.googleapis.com/prometheus/up" + * "appengine.googleapis.com/http/server/response_latencies" + * + * Generated from protobuf field string type = 8; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * The metric type, including its DNS name prefix. The type is not + * URL-encoded. All user-defined metric types have the DNS name + * `custom.googleapis.com` or `external.googleapis.com`. Metric types should + * use a natural hierarchical grouping. For example: + * "custom.googleapis.com/invoice/paid/amount" + * "external.googleapis.com/prometheus/up" + * "appengine.googleapis.com/http/server/response_latencies" + * + * Generated from protobuf field string type = 8; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * The set of labels that can be used to describe a specific + * instance of this metric type. For example, the + * `appengine.googleapis.com/http/server/response_latencies` metric + * type has a label for the HTTP response code, `response_code`, so + * you can look at latencies for successful responses or just + * for responses that failed. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * The set of labels that can be used to describe a specific + * instance of this metric type. For example, the + * `appengine.googleapis.com/http/server/response_latencies` metric + * type has a label for the HTTP response code, `response_code`, so + * you can look at latencies for successful responses or just + * for responses that failed. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 2; + * @param array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\LabelDescriptor::class); + $this->labels = $arr; + + return $this; + } + + /** + * Whether the metric records instantaneous values, changes to a value, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricKind metric_kind = 3; + * @return int + */ + public function getMetricKind() + { + return $this->metric_kind; + } + + /** + * Whether the metric records instantaneous values, changes to a value, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricKind metric_kind = 3; + * @param int $var + * @return $this + */ + public function setMetricKind($var) + { + GPBUtil::checkEnum($var, \Google\Api\MetricDescriptor\MetricKind::class); + $this->metric_kind = $var; + + return $this; + } + + /** + * Whether the measurement is an integer, a floating-point number, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.ValueType value_type = 4; + * @return int + */ + public function getValueType() + { + return $this->value_type; + } + + /** + * Whether the measurement is an integer, a floating-point number, etc. + * Some combinations of `metric_kind` and `value_type` might not be supported. + * + * Generated from protobuf field .google.api.MetricDescriptor.ValueType value_type = 4; + * @param int $var + * @return $this + */ + public function setValueType($var) + { + GPBUtil::checkEnum($var, \Google\Api\MetricDescriptor\ValueType::class); + $this->value_type = $var; + + return $this; + } + + /** + * The units in which the metric value is reported. It is only applicable + * if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` + * defines the representation of the stored metric values. + * Different systems might scale the values to be more easily displayed (so a + * value of `0.02kBy` _might_ be displayed as `20By`, and a value of + * `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is + * `kBy`, then the value of the metric is always in thousands of bytes, no + * matter how it might be displayed. + * If you want a custom metric to record the exact number of CPU-seconds used + * by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is + * `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 + * CPU-seconds, then the value is written as `12005`. + * Alternatively, if you want a custom metric to record data in a more + * granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is + * `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), + * or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). + * The supported units are a subset of [The Unified Code for Units of + * Measure](https://unitsofmeasure.org/ucum.html) standard: + * **Basic units (UNIT)** + * * `bit` bit + * * `By` byte + * * `s` second + * * `min` minute + * * `h` hour + * * `d` day + * * `1` dimensionless + * **Prefixes (PREFIX)** + * * `k` kilo (10^3) + * * `M` mega (10^6) + * * `G` giga (10^9) + * * `T` tera (10^12) + * * `P` peta (10^15) + * * `E` exa (10^18) + * * `Z` zetta (10^21) + * * `Y` yotta (10^24) + * * `m` milli (10^-3) + * * `u` micro (10^-6) + * * `n` nano (10^-9) + * * `p` pico (10^-12) + * * `f` femto (10^-15) + * * `a` atto (10^-18) + * * `z` zepto (10^-21) + * * `y` yocto (10^-24) + * * `Ki` kibi (2^10) + * * `Mi` mebi (2^20) + * * `Gi` gibi (2^30) + * * `Ti` tebi (2^40) + * * `Pi` pebi (2^50) + * **Grammar** + * The grammar also includes these connectors: + * * `/` division or ratio (as an infix operator). For examples, + * `kBy/{email}` or `MiBy/10ms` (although you should almost never + * have `/s` in a metric `unit`; rates should always be computed at + * query time from the underlying cumulative or delta value). + * * `.` multiplication or composition (as an infix operator). For + * examples, `GBy.d` or `k{watt}.h`. + * The grammar for a unit is as follows: + * Expression = Component { "." Component } { "/" Component } ; + * Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] + * | Annotation + * | "1" + * ; + * Annotation = "{" NAME "}" ; + * Notes: + * * `Annotation` is just a comment if it follows a `UNIT`. If the annotation + * is used alone, then the unit is equivalent to `1`. For examples, + * `{request}/s == 1/s`, `By{transmitted}/s == By/s`. + * * `NAME` is a sequence of non-blank printable ASCII characters not + * containing `{` or `}`. + * * `1` represents a unitary [dimensionless + * unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such + * as in `1/s`. It is typically used when none of the basic units are + * appropriate. For example, "new users per day" can be represented as + * `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new + * users). Alternatively, "thousands of page views per day" would be + * represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric + * value of `5.3` would mean "5300 page views per day"). + * * `%` represents dimensionless value of 1/100, and annotates values giving + * a percentage (so the metric values are typically in the range of 0..100, + * and a metric value `3` means "3 percent"). + * * `10^2.%` indicates a metric contains a ratio, typically in the range + * 0..1, that will be multiplied by 100 and displayed as a percentage + * (so a metric value `0.03` means "3 percent"). + * + * Generated from protobuf field string unit = 5; + * @return string + */ + public function getUnit() + { + return $this->unit; + } + + /** + * The units in which the metric value is reported. It is only applicable + * if the `value_type` is `INT64`, `DOUBLE`, or `DISTRIBUTION`. The `unit` + * defines the representation of the stored metric values. + * Different systems might scale the values to be more easily displayed (so a + * value of `0.02kBy` _might_ be displayed as `20By`, and a value of + * `3523kBy` _might_ be displayed as `3.5MBy`). However, if the `unit` is + * `kBy`, then the value of the metric is always in thousands of bytes, no + * matter how it might be displayed. + * If you want a custom metric to record the exact number of CPU-seconds used + * by a job, you can create an `INT64 CUMULATIVE` metric whose `unit` is + * `s{CPU}` (or equivalently `1s{CPU}` or just `s`). If the job uses 12,005 + * CPU-seconds, then the value is written as `12005`. + * Alternatively, if you want a custom metric to record data in a more + * granular way, you can create a `DOUBLE CUMULATIVE` metric whose `unit` is + * `ks{CPU}`, and then write the value `12.005` (which is `12005/1000`), + * or use `Kis{CPU}` and write `11.723` (which is `12005/1024`). + * The supported units are a subset of [The Unified Code for Units of + * Measure](https://unitsofmeasure.org/ucum.html) standard: + * **Basic units (UNIT)** + * * `bit` bit + * * `By` byte + * * `s` second + * * `min` minute + * * `h` hour + * * `d` day + * * `1` dimensionless + * **Prefixes (PREFIX)** + * * `k` kilo (10^3) + * * `M` mega (10^6) + * * `G` giga (10^9) + * * `T` tera (10^12) + * * `P` peta (10^15) + * * `E` exa (10^18) + * * `Z` zetta (10^21) + * * `Y` yotta (10^24) + * * `m` milli (10^-3) + * * `u` micro (10^-6) + * * `n` nano (10^-9) + * * `p` pico (10^-12) + * * `f` femto (10^-15) + * * `a` atto (10^-18) + * * `z` zepto (10^-21) + * * `y` yocto (10^-24) + * * `Ki` kibi (2^10) + * * `Mi` mebi (2^20) + * * `Gi` gibi (2^30) + * * `Ti` tebi (2^40) + * * `Pi` pebi (2^50) + * **Grammar** + * The grammar also includes these connectors: + * * `/` division or ratio (as an infix operator). For examples, + * `kBy/{email}` or `MiBy/10ms` (although you should almost never + * have `/s` in a metric `unit`; rates should always be computed at + * query time from the underlying cumulative or delta value). + * * `.` multiplication or composition (as an infix operator). For + * examples, `GBy.d` or `k{watt}.h`. + * The grammar for a unit is as follows: + * Expression = Component { "." Component } { "/" Component } ; + * Component = ( [ PREFIX ] UNIT | "%" ) [ Annotation ] + * | Annotation + * | "1" + * ; + * Annotation = "{" NAME "}" ; + * Notes: + * * `Annotation` is just a comment if it follows a `UNIT`. If the annotation + * is used alone, then the unit is equivalent to `1`. For examples, + * `{request}/s == 1/s`, `By{transmitted}/s == By/s`. + * * `NAME` is a sequence of non-blank printable ASCII characters not + * containing `{` or `}`. + * * `1` represents a unitary [dimensionless + * unit](https://en.wikipedia.org/wiki/Dimensionless_quantity) of 1, such + * as in `1/s`. It is typically used when none of the basic units are + * appropriate. For example, "new users per day" can be represented as + * `1/d` or `{new-users}/d` (and a metric value `5` would mean "5 new + * users). Alternatively, "thousands of page views per day" would be + * represented as `1000/d` or `k1/d` or `k{page_views}/d` (and a metric + * value of `5.3` would mean "5300 page views per day"). + * * `%` represents dimensionless value of 1/100, and annotates values giving + * a percentage (so the metric values are typically in the range of 0..100, + * and a metric value `3` means "3 percent"). + * * `10^2.%` indicates a metric contains a ratio, typically in the range + * 0..1, that will be multiplied by 100 and displayed as a percentage + * (so a metric value `0.03` means "3 percent"). + * + * Generated from protobuf field string unit = 5; + * @param string $var + * @return $this + */ + public function setUnit($var) + { + GPBUtil::checkString($var, True); + $this->unit = $var; + + return $this; + } + + /** + * A detailed description of the metric, which can be used in documentation. + * + * Generated from protobuf field string description = 6; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A detailed description of the metric, which can be used in documentation. + * + * Generated from protobuf field string description = 6; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * A concise name for the metric, which can be displayed in user interfaces. + * Use sentence case without an ending period, for example "Request count". + * This field is optional but it is recommended to be set for any metrics + * associated with user-visible concepts, such as Quota. + * + * Generated from protobuf field string display_name = 7; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * A concise name for the metric, which can be displayed in user interfaces. + * Use sentence case without an ending period, for example "Request count". + * This field is optional but it is recommended to be set for any metrics + * associated with user-visible concepts, such as Quota. + * + * Generated from protobuf field string display_name = 7; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + + /** + * Optional. Metadata which can be used to guide usage of the metric. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricDescriptorMetadata metadata = 10; + * @return \Google\Api\MetricDescriptor\MetricDescriptorMetadata|null + */ + public function getMetadata() + { + return $this->metadata; + } + + public function hasMetadata() + { + return isset($this->metadata); + } + + public function clearMetadata() + { + unset($this->metadata); + } + + /** + * Optional. Metadata which can be used to guide usage of the metric. + * + * Generated from protobuf field .google.api.MetricDescriptor.MetricDescriptorMetadata metadata = 10; + * @param \Google\Api\MetricDescriptor\MetricDescriptorMetadata $var + * @return $this + */ + public function setMetadata($var) + { + GPBUtil::checkMessage($var, \Google\Api\MetricDescriptor\MetricDescriptorMetadata::class); + $this->metadata = $var; + + return $this; + } + + /** + * Optional. The launch stage of the metric definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 12; + * @return int + */ + public function getLaunchStage() + { + return $this->launch_stage; + } + + /** + * Optional. The launch stage of the metric definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 12; + * @param int $var + * @return $this + */ + public function setLaunchStage($var) + { + GPBUtil::checkEnum($var, \Google\Api\LaunchStage::class); + $this->launch_stage = $var; + + return $this; + } + + /** + * Read-only. If present, then a [time + * series][google.monitoring.v3.TimeSeries], which is identified partially by + * a metric type and a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that + * is associated with this metric type can only be associated with one of the + * monitored resource types listed here. + * + * Generated from protobuf field repeated string monitored_resource_types = 13; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMonitoredResourceTypes() + { + return $this->monitored_resource_types; + } + + /** + * Read-only. If present, then a [time + * series][google.monitoring.v3.TimeSeries], which is identified partially by + * a metric type and a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor], that + * is associated with this metric type can only be associated with one of the + * monitored resource types listed here. + * + * Generated from protobuf field repeated string monitored_resource_types = 13; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMonitoredResourceTypes($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->monitored_resource_types = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricDescriptorMetadata.php b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricDescriptorMetadata.php new file mode 100644 index 000000000..e1fe49d02 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricDescriptorMetadata.php @@ -0,0 +1,189 @@ +google.api.MetricDescriptor.MetricDescriptorMetadata + */ +class MetricDescriptorMetadata extends \Google\Protobuf\Internal\Message +{ + /** + * Deprecated. Must use the + * [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] + * instead. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 1 [deprecated = true]; + * @deprecated + */ + protected $launch_stage = 0; + /** + * The sampling period of metric data points. For metrics which are written + * periodically, consecutive data points are stored at this time interval, + * excluding data loss due to errors. Metrics with a higher granularity have + * a smaller sampling period. + * + * Generated from protobuf field .google.protobuf.Duration sample_period = 2; + */ + protected $sample_period = null; + /** + * The delay of data points caused by ingestion. Data points older than this + * age are guaranteed to be ingested and available to be read, excluding + * data loss due to errors. + * + * Generated from protobuf field .google.protobuf.Duration ingest_delay = 3; + */ + protected $ingest_delay = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $launch_stage + * Deprecated. Must use the + * [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] + * instead. + * @type \Google\Protobuf\Duration $sample_period + * The sampling period of metric data points. For metrics which are written + * periodically, consecutive data points are stored at this time interval, + * excluding data loss due to errors. Metrics with a higher granularity have + * a smaller sampling period. + * @type \Google\Protobuf\Duration $ingest_delay + * The delay of data points caused by ingestion. Data points older than this + * age are guaranteed to be ingested and available to be read, excluding + * data loss due to errors. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Metric::initOnce(); + parent::__construct($data); + } + + /** + * Deprecated. Must use the + * [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] + * instead. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 1 [deprecated = true]; + * @return int + * @deprecated + */ + public function getLaunchStage() + { + @trigger_error('launch_stage is deprecated.', E_USER_DEPRECATED); + return $this->launch_stage; + } + + /** + * Deprecated. Must use the + * [MetricDescriptor.launch_stage][google.api.MetricDescriptor.launch_stage] + * instead. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 1 [deprecated = true]; + * @param int $var + * @return $this + * @deprecated + */ + public function setLaunchStage($var) + { + @trigger_error('launch_stage is deprecated.', E_USER_DEPRECATED); + GPBUtil::checkEnum($var, \Google\Api\LaunchStage::class); + $this->launch_stage = $var; + + return $this; + } + + /** + * The sampling period of metric data points. For metrics which are written + * periodically, consecutive data points are stored at this time interval, + * excluding data loss due to errors. Metrics with a higher granularity have + * a smaller sampling period. + * + * Generated from protobuf field .google.protobuf.Duration sample_period = 2; + * @return \Google\Protobuf\Duration|null + */ + public function getSamplePeriod() + { + return $this->sample_period; + } + + public function hasSamplePeriod() + { + return isset($this->sample_period); + } + + public function clearSamplePeriod() + { + unset($this->sample_period); + } + + /** + * The sampling period of metric data points. For metrics which are written + * periodically, consecutive data points are stored at this time interval, + * excluding data loss due to errors. Metrics with a higher granularity have + * a smaller sampling period. + * + * Generated from protobuf field .google.protobuf.Duration sample_period = 2; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setSamplePeriod($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->sample_period = $var; + + return $this; + } + + /** + * The delay of data points caused by ingestion. Data points older than this + * age are guaranteed to be ingested and available to be read, excluding + * data loss due to errors. + * + * Generated from protobuf field .google.protobuf.Duration ingest_delay = 3; + * @return \Google\Protobuf\Duration|null + */ + public function getIngestDelay() + { + return $this->ingest_delay; + } + + public function hasIngestDelay() + { + return isset($this->ingest_delay); + } + + public function clearIngestDelay() + { + unset($this->ingest_delay); + } + + /** + * The delay of data points caused by ingestion. Data points older than this + * age are guaranteed to be ingested and available to be read, excluding + * data loss due to errors. + * + * Generated from protobuf field .google.protobuf.Duration ingest_delay = 3; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setIngestDelay($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->ingest_delay = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricKind.php b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricKind.php new file mode 100644 index 000000000..a486417ab --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/MetricKind.php @@ -0,0 +1,75 @@ +google.api.MetricDescriptor.MetricKind + */ +class MetricKind +{ + /** + * Do not use this default value. + * + * Generated from protobuf enum METRIC_KIND_UNSPECIFIED = 0; + */ + const METRIC_KIND_UNSPECIFIED = 0; + /** + * An instantaneous measurement of a value. + * + * Generated from protobuf enum GAUGE = 1; + */ + const GAUGE = 1; + /** + * The change in a value during a time interval. + * + * Generated from protobuf enum DELTA = 2; + */ + const DELTA = 2; + /** + * A value accumulated over a time interval. Cumulative + * measurements in a time series should have the same start time + * and increasing end times, until an event resets the cumulative + * value to zero and sets a new start time for the following + * points. + * + * Generated from protobuf enum CUMULATIVE = 3; + */ + const CUMULATIVE = 3; + + private static $valueToName = [ + self::METRIC_KIND_UNSPECIFIED => 'METRIC_KIND_UNSPECIFIED', + self::GAUGE => 'GAUGE', + self::DELTA => 'DELTA', + self::CUMULATIVE => 'CUMULATIVE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/ValueType.php b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/ValueType.php new file mode 100644 index 000000000..d433d2e2d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MetricDescriptor/ValueType.php @@ -0,0 +1,92 @@ +google.api.MetricDescriptor.ValueType + */ +class ValueType +{ + /** + * Do not use this default value. + * + * Generated from protobuf enum VALUE_TYPE_UNSPECIFIED = 0; + */ + const VALUE_TYPE_UNSPECIFIED = 0; + /** + * The value is a boolean. + * This value type can be used only if the metric kind is `GAUGE`. + * + * Generated from protobuf enum BOOL = 1; + */ + const BOOL = 1; + /** + * The value is a signed 64-bit integer. + * + * Generated from protobuf enum INT64 = 2; + */ + const INT64 = 2; + /** + * The value is a double precision floating point number. + * + * Generated from protobuf enum DOUBLE = 3; + */ + const DOUBLE = 3; + /** + * The value is a text string. + * This value type can be used only if the metric kind is `GAUGE`. + * + * Generated from protobuf enum STRING = 4; + */ + const STRING = 4; + /** + * The value is a [`Distribution`][google.api.Distribution]. + * + * Generated from protobuf enum DISTRIBUTION = 5; + */ + const DISTRIBUTION = 5; + /** + * The value is money. + * + * Generated from protobuf enum MONEY = 6; + */ + const MONEY = 6; + + private static $valueToName = [ + self::VALUE_TYPE_UNSPECIFIED => 'VALUE_TYPE_UNSPECIFIED', + self::BOOL => 'BOOL', + self::INT64 => 'INT64', + self::DOUBLE => 'DOUBLE', + self::STRING => 'STRING', + self::DISTRIBUTION => 'DISTRIBUTION', + self::MONEY => 'MONEY', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MetricRule.php b/lib/Google/vendor/google/common-protos/src/Api/MetricRule.php new file mode 100644 index 000000000..f8eeccd4c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MetricRule.php @@ -0,0 +1,126 @@ +google.api.MetricRule + */ +class MetricRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * Metrics to update when the selected methods are called, and the associated + * cost applied to each metric. + * The key of the map is the metric name, and the values are the amount + * increased for the metric against which the quota limits are defined. + * The value must not be negative. + * + * Generated from protobuf field map metric_costs = 2; + */ + private $metric_costs; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type array|\Google\Protobuf\Internal\MapField $metric_costs + * Metrics to update when the selected methods are called, and the associated + * cost applied to each metric. + * The key of the map is the metric name, and the values are the amount + * increased for the metric against which the quota limits are defined. + * The value must not be negative. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Quota::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Metrics to update when the selected methods are called, and the associated + * cost applied to each metric. + * The key of the map is the metric name, and the values are the amount + * increased for the metric against which the quota limits are defined. + * The value must not be negative. + * + * Generated from protobuf field map metric_costs = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getMetricCosts() + { + return $this->metric_costs; + } + + /** + * Metrics to update when the selected methods are called, and the associated + * cost applied to each metric. + * The key of the map is the metric name, and the values are the amount + * increased for the metric against which the quota limits are defined. + * The value must not be negative. + * + * Generated from protobuf field map metric_costs = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setMetricCosts($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::INT64); + $this->metric_costs = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MonitoredResource.php b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResource.php new file mode 100644 index 000000000..7af0f6df2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResource.php @@ -0,0 +1,147 @@ +google.api.MonitoredResource + */ +class MonitoredResource extends \Google\Protobuf\Internal\Message +{ + /** + * Required. The monitored resource type. This field must match + * the `type` field of a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] + * object. For example, the type of a Compute Engine VM instance is + * `gce_instance`. Some descriptors include the service name in the type; for + * example, the type of a Datastream stream is + * `datastream.googleapis.com/Stream`. + * + * Generated from protobuf field string type = 1; + */ + protected $type = ''; + /** + * Required. Values for all of the labels listed in the associated monitored + * resource descriptor. For example, Compute Engine VM instances use the + * labels `"project_id"`, `"instance_id"`, and `"zone"`. + * + * Generated from protobuf field map labels = 2; + */ + private $labels; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type + * Required. The monitored resource type. This field must match + * the `type` field of a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] + * object. For example, the type of a Compute Engine VM instance is + * `gce_instance`. Some descriptors include the service name in the type; for + * example, the type of a Datastream stream is + * `datastream.googleapis.com/Stream`. + * @type array|\Google\Protobuf\Internal\MapField $labels + * Required. Values for all of the labels listed in the associated monitored + * resource descriptor. For example, Compute Engine VM instances use the + * labels `"project_id"`, `"instance_id"`, and `"zone"`. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\MonitoredResource::initOnce(); + parent::__construct($data); + } + + /** + * Required. The monitored resource type. This field must match + * the `type` field of a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] + * object. For example, the type of a Compute Engine VM instance is + * `gce_instance`. Some descriptors include the service name in the type; for + * example, the type of a Datastream stream is + * `datastream.googleapis.com/Stream`. + * + * Generated from protobuf field string type = 1; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Required. The monitored resource type. This field must match + * the `type` field of a + * [MonitoredResourceDescriptor][google.api.MonitoredResourceDescriptor] + * object. For example, the type of a Compute Engine VM instance is + * `gce_instance`. Some descriptors include the service name in the type; for + * example, the type of a Datastream stream is + * `datastream.googleapis.com/Stream`. + * + * Generated from protobuf field string type = 1; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * Required. Values for all of the labels listed in the associated monitored + * resource descriptor. For example, Compute Engine VM instances use the + * labels `"project_id"`, `"instance_id"`, and `"zone"`. + * + * Generated from protobuf field map labels = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * Required. Values for all of the labels listed in the associated monitored + * resource descriptor. For example, Compute Engine VM instances use the + * labels `"project_id"`, `"instance_id"`, and `"zone"`. + * + * Generated from protobuf field map labels = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->labels = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceDescriptor.php b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceDescriptor.php new file mode 100644 index 000000000..c6727e2c4 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceDescriptor.php @@ -0,0 +1,309 @@ +google.api.MonitoredResourceDescriptor + */ +class MonitoredResourceDescriptor extends \Google\Protobuf\Internal\Message +{ + /** + * Optional. The resource name of the monitored resource descriptor: + * `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where + * {type} is the value of the `type` field in this object and + * {project_id} is a project ID that provides API-specific context for + * accessing the type. APIs that do not use project information can use the + * resource name format `"monitoredResourceDescriptors/{type}"`. + * + * Generated from protobuf field string name = 5; + */ + protected $name = ''; + /** + * Required. The monitored resource type. For example, the type + * `"cloudsql_database"` represents databases in Google Cloud SQL. + * For a list of types, see [Monitored resource + * types](https://cloud.google.com/monitoring/api/resources) + * and [Logging resource + * types](https://cloud.google.com/logging/docs/api/v2/resource-list). + * + * Generated from protobuf field string type = 1; + */ + protected $type = ''; + /** + * Optional. A concise name for the monitored resource type that might be + * displayed in user interfaces. It should be a Title Cased Noun Phrase, + * without any article or other determiners. For example, + * `"Google Cloud SQL Database"`. + * + * Generated from protobuf field string display_name = 2; + */ + protected $display_name = ''; + /** + * Optional. A detailed description of the monitored resource type that might + * be used in documentation. + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + /** + * Required. A set of labels used to describe instances of this monitored + * resource type. For example, an individual Google Cloud SQL database is + * identified by values for the labels `"database_id"` and `"zone"`. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 4; + */ + private $labels; + /** + * Optional. The launch stage of the monitored resource definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 7; + */ + protected $launch_stage = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Optional. The resource name of the monitored resource descriptor: + * `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where + * {type} is the value of the `type` field in this object and + * {project_id} is a project ID that provides API-specific context for + * accessing the type. APIs that do not use project information can use the + * resource name format `"monitoredResourceDescriptors/{type}"`. + * @type string $type + * Required. The monitored resource type. For example, the type + * `"cloudsql_database"` represents databases in Google Cloud SQL. + * For a list of types, see [Monitored resource + * types](https://cloud.google.com/monitoring/api/resources) + * and [Logging resource + * types](https://cloud.google.com/logging/docs/api/v2/resource-list). + * @type string $display_name + * Optional. A concise name for the monitored resource type that might be + * displayed in user interfaces. It should be a Title Cased Noun Phrase, + * without any article or other determiners. For example, + * `"Google Cloud SQL Database"`. + * @type string $description + * Optional. A detailed description of the monitored resource type that might + * be used in documentation. + * @type array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $labels + * Required. A set of labels used to describe instances of this monitored + * resource type. For example, an individual Google Cloud SQL database is + * identified by values for the labels `"database_id"` and `"zone"`. + * @type int $launch_stage + * Optional. The launch stage of the monitored resource definition. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\MonitoredResource::initOnce(); + parent::__construct($data); + } + + /** + * Optional. The resource name of the monitored resource descriptor: + * `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where + * {type} is the value of the `type` field in this object and + * {project_id} is a project ID that provides API-specific context for + * accessing the type. APIs that do not use project information can use the + * resource name format `"monitoredResourceDescriptors/{type}"`. + * + * Generated from protobuf field string name = 5; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Optional. The resource name of the monitored resource descriptor: + * `"projects/{project_id}/monitoredResourceDescriptors/{type}"` where + * {type} is the value of the `type` field in this object and + * {project_id} is a project ID that provides API-specific context for + * accessing the type. APIs that do not use project information can use the + * resource name format `"monitoredResourceDescriptors/{type}"`. + * + * Generated from protobuf field string name = 5; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Required. The monitored resource type. For example, the type + * `"cloudsql_database"` represents databases in Google Cloud SQL. + * For a list of types, see [Monitored resource + * types](https://cloud.google.com/monitoring/api/resources) + * and [Logging resource + * types](https://cloud.google.com/logging/docs/api/v2/resource-list). + * + * Generated from protobuf field string type = 1; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Required. The monitored resource type. For example, the type + * `"cloudsql_database"` represents databases in Google Cloud SQL. + * For a list of types, see [Monitored resource + * types](https://cloud.google.com/monitoring/api/resources) + * and [Logging resource + * types](https://cloud.google.com/logging/docs/api/v2/resource-list). + * + * Generated from protobuf field string type = 1; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * Optional. A concise name for the monitored resource type that might be + * displayed in user interfaces. It should be a Title Cased Noun Phrase, + * without any article or other determiners. For example, + * `"Google Cloud SQL Database"`. + * + * Generated from protobuf field string display_name = 2; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * Optional. A concise name for the monitored resource type that might be + * displayed in user interfaces. It should be a Title Cased Noun Phrase, + * without any article or other determiners. For example, + * `"Google Cloud SQL Database"`. + * + * Generated from protobuf field string display_name = 2; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + + /** + * Optional. A detailed description of the monitored resource type that might + * be used in documentation. + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Optional. A detailed description of the monitored resource type that might + * be used in documentation. + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * Required. A set of labels used to describe instances of this monitored + * resource type. For example, an individual Google Cloud SQL database is + * identified by values for the labels `"database_id"` and `"zone"`. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * Required. A set of labels used to describe instances of this monitored + * resource type. For example, an individual Google Cloud SQL database is + * identified by values for the labels `"database_id"` and `"zone"`. + * + * Generated from protobuf field repeated .google.api.LabelDescriptor labels = 4; + * @param array<\Google\Api\LabelDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\LabelDescriptor::class); + $this->labels = $arr; + + return $this; + } + + /** + * Optional. The launch stage of the monitored resource definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 7; + * @return int + */ + public function getLaunchStage() + { + return $this->launch_stage; + } + + /** + * Optional. The launch stage of the monitored resource definition. + * + * Generated from protobuf field .google.api.LaunchStage launch_stage = 7; + * @param int $var + * @return $this + */ + public function setLaunchStage($var) + { + GPBUtil::checkEnum($var, \Google\Api\LaunchStage::class); + $this->launch_stage = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceMetadata.php b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceMetadata.php new file mode 100644 index 000000000..da6dc4b17 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/MonitoredResourceMetadata.php @@ -0,0 +1,148 @@ +google.api.MonitoredResourceMetadata + */ +class MonitoredResourceMetadata extends \Google\Protobuf\Internal\Message +{ + /** + * Output only. Values for predefined system metadata labels. + * System labels are a kind of metadata extracted by Google, including + * "machine_image", "vpc", "subnet_id", + * "security_group", "name", etc. + * System label values can be only strings, Boolean values, or a list of + * strings. For example: + * { "name": "my-test-instance", + * "security_group": ["a", "b", "c"], + * "spot_instance": false } + * + * Generated from protobuf field .google.protobuf.Struct system_labels = 1; + */ + protected $system_labels = null; + /** + * Output only. A map of user-defined metadata labels. + * + * Generated from protobuf field map user_labels = 2; + */ + private $user_labels; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Protobuf\Struct $system_labels + * Output only. Values for predefined system metadata labels. + * System labels are a kind of metadata extracted by Google, including + * "machine_image", "vpc", "subnet_id", + * "security_group", "name", etc. + * System label values can be only strings, Boolean values, or a list of + * strings. For example: + * { "name": "my-test-instance", + * "security_group": ["a", "b", "c"], + * "spot_instance": false } + * @type array|\Google\Protobuf\Internal\MapField $user_labels + * Output only. A map of user-defined metadata labels. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\MonitoredResource::initOnce(); + parent::__construct($data); + } + + /** + * Output only. Values for predefined system metadata labels. + * System labels are a kind of metadata extracted by Google, including + * "machine_image", "vpc", "subnet_id", + * "security_group", "name", etc. + * System label values can be only strings, Boolean values, or a list of + * strings. For example: + * { "name": "my-test-instance", + * "security_group": ["a", "b", "c"], + * "spot_instance": false } + * + * Generated from protobuf field .google.protobuf.Struct system_labels = 1; + * @return \Google\Protobuf\Struct|null + */ + public function getSystemLabels() + { + return $this->system_labels; + } + + public function hasSystemLabels() + { + return isset($this->system_labels); + } + + public function clearSystemLabels() + { + unset($this->system_labels); + } + + /** + * Output only. Values for predefined system metadata labels. + * System labels are a kind of metadata extracted by Google, including + * "machine_image", "vpc", "subnet_id", + * "security_group", "name", etc. + * System label values can be only strings, Boolean values, or a list of + * strings. For example: + * { "name": "my-test-instance", + * "security_group": ["a", "b", "c"], + * "spot_instance": false } + * + * Generated from protobuf field .google.protobuf.Struct system_labels = 1; + * @param \Google\Protobuf\Struct $var + * @return $this + */ + public function setSystemLabels($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class); + $this->system_labels = $var; + + return $this; + } + + /** + * Output only. A map of user-defined metadata labels. + * + * Generated from protobuf field map user_labels = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getUserLabels() + { + return $this->user_labels; + } + + /** + * Output only. A map of user-defined metadata labels. + * + * Generated from protobuf field map user_labels = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setUserLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->user_labels = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Monitoring.php b/lib/Google/vendor/google/common-protos/src/Api/Monitoring.php new file mode 100644 index 000000000..5415b64f7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Monitoring.php @@ -0,0 +1,190 @@ +google.api.Monitoring + */ +class Monitoring extends \Google\Protobuf\Internal\Message +{ + /** + * Monitoring configurations for sending metrics to the producer project. + * There can be multiple producer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination producer_destinations = 1; + */ + private $producer_destinations; + /** + * Monitoring configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination consumer_destinations = 2; + */ + private $consumer_destinations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\Monitoring\MonitoringDestination>|\Google\Protobuf\Internal\RepeatedField $producer_destinations + * Monitoring configurations for sending metrics to the producer project. + * There can be multiple producer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * @type array<\Google\Api\Monitoring\MonitoringDestination>|\Google\Protobuf\Internal\RepeatedField $consumer_destinations + * Monitoring configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Monitoring::initOnce(); + parent::__construct($data); + } + + /** + * Monitoring configurations for sending metrics to the producer project. + * There can be multiple producer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination producer_destinations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getProducerDestinations() + { + return $this->producer_destinations; + } + + /** + * Monitoring configurations for sending metrics to the producer project. + * There can be multiple producer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination producer_destinations = 1; + * @param array<\Google\Api\Monitoring\MonitoringDestination>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setProducerDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Monitoring\MonitoringDestination::class); + $this->producer_destinations = $arr; + + return $this; + } + + /** + * Monitoring configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination consumer_destinations = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getConsumerDestinations() + { + return $this->consumer_destinations; + } + + /** + * Monitoring configurations for sending metrics to the consumer project. + * There can be multiple consumer destinations. A monitored resource type may + * appear in multiple monitoring destinations if different aggregations are + * needed for different sets of metrics associated with that monitored + * resource type. A monitored resource and metric pair may only be used once + * in the Monitoring configuration. + * + * Generated from protobuf field repeated .google.api.Monitoring.MonitoringDestination consumer_destinations = 2; + * @param array<\Google\Api\Monitoring\MonitoringDestination>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setConsumerDestinations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Monitoring\MonitoringDestination::class); + $this->consumer_destinations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Monitoring/MonitoringDestination.php b/lib/Google/vendor/google/common-protos/src/Api/Monitoring/MonitoringDestination.php new file mode 100644 index 000000000..050620e84 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Monitoring/MonitoringDestination.php @@ -0,0 +1,119 @@ +google.api.Monitoring.MonitoringDestination + */ +class MonitoringDestination extends \Google\Protobuf\Internal\Message +{ + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + */ + protected $monitored_resource = ''; + /** + * Types of the metrics to report to this monitoring destination. + * Each type must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + */ + private $metrics; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $monitored_resource + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * @type array|\Google\Protobuf\Internal\RepeatedField $metrics + * Types of the metrics to report to this monitoring destination. + * Each type must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Monitoring::initOnce(); + parent::__construct($data); + } + + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + * @return string + */ + public function getMonitoredResource() + { + return $this->monitored_resource; + } + + /** + * The monitored resource type. The type must be defined in + * [Service.monitored_resources][google.api.Service.monitored_resources] + * section. + * + * Generated from protobuf field string monitored_resource = 1; + * @param string $var + * @return $this + */ + public function setMonitoredResource($var) + { + GPBUtil::checkString($var, True); + $this->monitored_resource = $var; + + return $this; + } + + /** + * Types of the metrics to report to this monitoring destination. + * Each type must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMetrics() + { + return $this->metrics; + } + + /** + * Types of the metrics to report to this monitoring destination. + * Each type must be defined in + * [Service.metrics][google.api.Service.metrics] section. + * + * Generated from protobuf field repeated string metrics = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMetrics($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->metrics = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/NodeSettings.php b/lib/Google/vendor/google/common-protos/src/Api/NodeSettings.php new file mode 100644 index 000000000..54b8ccb46 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/NodeSettings.php @@ -0,0 +1,77 @@ +google.api.NodeSettings + */ +class NodeSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/OAuthRequirements.php b/lib/Google/vendor/google/common-protos/src/Api/OAuthRequirements.php new file mode 100644 index 000000000..842640cc1 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/OAuthRequirements.php @@ -0,0 +1,96 @@ +google.api.OAuthRequirements + */ +class OAuthRequirements extends \Google\Protobuf\Internal\Message +{ + /** + * The list of publicly documented OAuth scopes that are allowed access. An + * OAuth token containing any of these scopes will be accepted. + * Example: + * canonical_scopes: https://www.googleapis.com/auth/calendar, + * https://www.googleapis.com/auth/calendar.read + * + * Generated from protobuf field string canonical_scopes = 1; + */ + protected $canonical_scopes = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $canonical_scopes + * The list of publicly documented OAuth scopes that are allowed access. An + * OAuth token containing any of these scopes will be accepted. + * Example: + * canonical_scopes: https://www.googleapis.com/auth/calendar, + * https://www.googleapis.com/auth/calendar.read + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Auth::initOnce(); + parent::__construct($data); + } + + /** + * The list of publicly documented OAuth scopes that are allowed access. An + * OAuth token containing any of these scopes will be accepted. + * Example: + * canonical_scopes: https://www.googleapis.com/auth/calendar, + * https://www.googleapis.com/auth/calendar.read + * + * Generated from protobuf field string canonical_scopes = 1; + * @return string + */ + public function getCanonicalScopes() + { + return $this->canonical_scopes; + } + + /** + * The list of publicly documented OAuth scopes that are allowed access. An + * OAuth token containing any of these scopes will be accepted. + * Example: + * canonical_scopes: https://www.googleapis.com/auth/calendar, + * https://www.googleapis.com/auth/calendar.read + * + * Generated from protobuf field string canonical_scopes = 1; + * @param string $var + * @return $this + */ + public function setCanonicalScopes($var) + { + GPBUtil::checkString($var, True); + $this->canonical_scopes = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Page.php b/lib/Google/vendor/google/common-protos/src/Api/Page.php new file mode 100644 index 000000000..2812764c0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Page.php @@ -0,0 +1,200 @@ +google.api.Page + */ +class Page extends \Google\Protobuf\Internal\Message +{ + /** + * The name of the page. It will be used as an identity of the page to + * generate URI of the page, text of the link to this page in navigation, + * etc. The full page name (start from the root page name to this page + * concatenated with `.`) can be used as reference to the page in your + * documentation. For example: + *
pages:
+     * - name: Tutorial
+     *   content: (== include tutorial.md ==)
+     *   subpages:
+     *   - name: Java
+     *     content: (== include tutorial_java.md ==)
+     * 
+ * You can reference `Java` page using Markdown reference link syntax: + * `[Java][Tutorial.Java]`. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The Markdown content of the page. You can use (== include {path} + * ==) to include content from a Markdown file. The content can be + * used to produce the documentation page such as HTML format page. + * + * Generated from protobuf field string content = 2; + */ + protected $content = ''; + /** + * Subpages of this page. The order of subpages specified here will be + * honored in the generated docset. + * + * Generated from protobuf field repeated .google.api.Page subpages = 3; + */ + private $subpages; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The name of the page. It will be used as an identity of the page to + * generate URI of the page, text of the link to this page in navigation, + * etc. The full page name (start from the root page name to this page + * concatenated with `.`) can be used as reference to the page in your + * documentation. For example: + *
pages:
+     *           - name: Tutorial
+     *             content: (== include tutorial.md ==)
+     *             subpages:
+     *             - name: Java
+     *               content: (== include tutorial_java.md ==)
+     *           
+ * You can reference `Java` page using Markdown reference link syntax: + * `[Java][Tutorial.Java]`. + * @type string $content + * The Markdown content of the page. You can use (== include {path} + * ==) to include content from a Markdown file. The content can be + * used to produce the documentation page such as HTML format page. + * @type array<\Google\Api\Page>|\Google\Protobuf\Internal\RepeatedField $subpages + * Subpages of this page. The order of subpages specified here will be + * honored in the generated docset. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Documentation::initOnce(); + parent::__construct($data); + } + + /** + * The name of the page. It will be used as an identity of the page to + * generate URI of the page, text of the link to this page in navigation, + * etc. The full page name (start from the root page name to this page + * concatenated with `.`) can be used as reference to the page in your + * documentation. For example: + *
pages:
+     * - name: Tutorial
+     *   content: (== include tutorial.md ==)
+     *   subpages:
+     *   - name: Java
+     *     content: (== include tutorial_java.md ==)
+     * 
+ * You can reference `Java` page using Markdown reference link syntax: + * `[Java][Tutorial.Java]`. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The name of the page. It will be used as an identity of the page to + * generate URI of the page, text of the link to this page in navigation, + * etc. The full page name (start from the root page name to this page + * concatenated with `.`) can be used as reference to the page in your + * documentation. For example: + *
pages:
+     * - name: Tutorial
+     *   content: (== include tutorial.md ==)
+     *   subpages:
+     *   - name: Java
+     *     content: (== include tutorial_java.md ==)
+     * 
+ * You can reference `Java` page using Markdown reference link syntax: + * `[Java][Tutorial.Java]`. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The Markdown content of the page. You can use (== include {path} + * ==) to include content from a Markdown file. The content can be + * used to produce the documentation page such as HTML format page. + * + * Generated from protobuf field string content = 2; + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * The Markdown content of the page. You can use (== include {path} + * ==) to include content from a Markdown file. The content can be + * used to produce the documentation page such as HTML format page. + * + * Generated from protobuf field string content = 2; + * @param string $var + * @return $this + */ + public function setContent($var) + { + GPBUtil::checkString($var, True); + $this->content = $var; + + return $this; + } + + /** + * Subpages of this page. The order of subpages specified here will be + * honored in the generated docset. + * + * Generated from protobuf field repeated .google.api.Page subpages = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getSubpages() + { + return $this->subpages; + } + + /** + * Subpages of this page. The order of subpages specified here will be + * honored in the generated docset. + * + * Generated from protobuf field repeated .google.api.Page subpages = 3; + * @param array<\Google\Api\Page>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setSubpages($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Page::class); + $this->subpages = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/PhpSettings.php b/lib/Google/vendor/google/common-protos/src/Api/PhpSettings.php new file mode 100644 index 000000000..06486ac81 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/PhpSettings.php @@ -0,0 +1,77 @@ +google.api.PhpSettings + */ +class PhpSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ProjectProperties.php b/lib/Google/vendor/google/common-protos/src/Api/ProjectProperties.php new file mode 100644 index 000000000..122688d6d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ProjectProperties.php @@ -0,0 +1,80 @@ +google.api.ProjectProperties + */ +class ProjectProperties extends \Google\Protobuf\Internal\Message +{ + /** + * List of per consumer project-specific properties. + * + * Generated from protobuf field repeated .google.api.Property properties = 1; + */ + private $properties; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\Property>|\Google\Protobuf\Internal\RepeatedField $properties + * List of per consumer project-specific properties. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Consumer::initOnce(); + parent::__construct($data); + } + + /** + * List of per consumer project-specific properties. + * + * Generated from protobuf field repeated .google.api.Property properties = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getProperties() + { + return $this->properties; + } + + /** + * List of per consumer project-specific properties. + * + * Generated from protobuf field repeated .google.api.Property properties = 1; + * @param array<\Google\Api\Property>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setProperties($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Property::class); + $this->properties = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Property.php b/lib/Google/vendor/google/common-protos/src/Api/Property.php new file mode 100644 index 000000000..6212e635e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Property.php @@ -0,0 +1,142 @@ +google.api.Property + */ +class Property extends \Google\Protobuf\Internal\Message +{ + /** + * The name of the property (a.k.a key). + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The type of this property. + * + * Generated from protobuf field .google.api.Property.PropertyType type = 2; + */ + protected $type = 0; + /** + * The description of the property + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The name of the property (a.k.a key). + * @type int $type + * The type of this property. + * @type string $description + * The description of the property + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Consumer::initOnce(); + parent::__construct($data); + } + + /** + * The name of the property (a.k.a key). + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The name of the property (a.k.a key). + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The type of this property. + * + * Generated from protobuf field .google.api.Property.PropertyType type = 2; + * @return int + */ + public function getType() + { + return $this->type; + } + + /** + * The type of this property. + * + * Generated from protobuf field .google.api.Property.PropertyType type = 2; + * @param int $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkEnum($var, \Google\Api\Property\PropertyType::class); + $this->type = $var; + + return $this; + } + + /** + * The description of the property + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * The description of the property + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Property/PropertyType.php b/lib/Google/vendor/google/common-protos/src/Api/Property/PropertyType.php new file mode 100644 index 000000000..b4b6cd7a0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Property/PropertyType.php @@ -0,0 +1,76 @@ +google.api.Property.PropertyType + */ +class PropertyType +{ + /** + * The type is unspecified, and will result in an error. + * + * Generated from protobuf enum UNSPECIFIED = 0; + */ + const UNSPECIFIED = 0; + /** + * The type is `int64`. + * + * Generated from protobuf enum INT64 = 1; + */ + const INT64 = 1; + /** + * The type is `bool`. + * + * Generated from protobuf enum BOOL = 2; + */ + const BOOL = 2; + /** + * The type is `string`. + * + * Generated from protobuf enum STRING = 3; + */ + const STRING = 3; + /** + * The type is 'double'. + * + * Generated from protobuf enum DOUBLE = 4; + */ + const DOUBLE = 4; + + private static $valueToName = [ + self::UNSPECIFIED => 'UNSPECIFIED', + self::INT64 => 'INT64', + self::BOOL => 'BOOL', + self::STRING => 'STRING', + self::DOUBLE => 'DOUBLE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Publishing.php b/lib/Google/vendor/google/common-protos/src/Api/Publishing.php new file mode 100644 index 000000000..66186172b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Publishing.php @@ -0,0 +1,453 @@ +google.api.Publishing + */ +class Publishing extends \Google\Protobuf\Internal\Message +{ + /** + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + * + * Generated from protobuf field repeated .google.api.MethodSettings method_settings = 2; + */ + private $method_settings; + /** + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + * + * Generated from protobuf field string new_issue_uri = 101; + */ + protected $new_issue_uri = ''; + /** + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + * + * Generated from protobuf field string documentation_uri = 102; + */ + protected $documentation_uri = ''; + /** + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + * + * Generated from protobuf field string api_short_name = 103; + */ + protected $api_short_name = ''; + /** + * GitHub label to apply to issues and pull requests opened for this API. + * + * Generated from protobuf field string github_label = 104; + */ + protected $github_label = ''; + /** + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + * + * Generated from protobuf field repeated string codeowner_github_teams = 105; + */ + private $codeowner_github_teams; + /** + * A prefix used in sample code when demarking regions to be included in + * documentation. + * + * Generated from protobuf field string doc_tag_prefix = 106; + */ + protected $doc_tag_prefix = ''; + /** + * For whom the client library is being published. + * + * Generated from protobuf field .google.api.ClientLibraryOrganization organization = 107; + */ + protected $organization = 0; + /** + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + * + * Generated from protobuf field repeated .google.api.ClientLibrarySettings library_settings = 109; + */ + private $library_settings; + /** + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + * + * Generated from protobuf field string proto_reference_documentation_uri = 110; + */ + protected $proto_reference_documentation_uri = ''; + /** + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + * + * Generated from protobuf field string rest_reference_documentation_uri = 111; + */ + protected $rest_reference_documentation_uri = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\MethodSettings>|\Google\Protobuf\Internal\RepeatedField $method_settings + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + * @type string $new_issue_uri + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + * @type string $documentation_uri + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + * @type string $api_short_name + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + * @type string $github_label + * GitHub label to apply to issues and pull requests opened for this API. + * @type array|\Google\Protobuf\Internal\RepeatedField $codeowner_github_teams + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + * @type string $doc_tag_prefix + * A prefix used in sample code when demarking regions to be included in + * documentation. + * @type int $organization + * For whom the client library is being published. + * @type array<\Google\Api\ClientLibrarySettings>|\Google\Protobuf\Internal\RepeatedField $library_settings + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + * @type string $proto_reference_documentation_uri + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + * @type string $rest_reference_documentation_uri + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + * + * Generated from protobuf field repeated .google.api.MethodSettings method_settings = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMethodSettings() + { + return $this->method_settings; + } + + /** + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + * + * Generated from protobuf field repeated .google.api.MethodSettings method_settings = 2; + * @param array<\Google\Api\MethodSettings>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMethodSettings($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\MethodSettings::class); + $this->method_settings = $arr; + + return $this; + } + + /** + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + * + * Generated from protobuf field string new_issue_uri = 101; + * @return string + */ + public function getNewIssueUri() + { + return $this->new_issue_uri; + } + + /** + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + * + * Generated from protobuf field string new_issue_uri = 101; + * @param string $var + * @return $this + */ + public function setNewIssueUri($var) + { + GPBUtil::checkString($var, True); + $this->new_issue_uri = $var; + + return $this; + } + + /** + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + * + * Generated from protobuf field string documentation_uri = 102; + * @return string + */ + public function getDocumentationUri() + { + return $this->documentation_uri; + } + + /** + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + * + * Generated from protobuf field string documentation_uri = 102; + * @param string $var + * @return $this + */ + public function setDocumentationUri($var) + { + GPBUtil::checkString($var, True); + $this->documentation_uri = $var; + + return $this; + } + + /** + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + * + * Generated from protobuf field string api_short_name = 103; + * @return string + */ + public function getApiShortName() + { + return $this->api_short_name; + } + + /** + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + * + * Generated from protobuf field string api_short_name = 103; + * @param string $var + * @return $this + */ + public function setApiShortName($var) + { + GPBUtil::checkString($var, True); + $this->api_short_name = $var; + + return $this; + } + + /** + * GitHub label to apply to issues and pull requests opened for this API. + * + * Generated from protobuf field string github_label = 104; + * @return string + */ + public function getGithubLabel() + { + return $this->github_label; + } + + /** + * GitHub label to apply to issues and pull requests opened for this API. + * + * Generated from protobuf field string github_label = 104; + * @param string $var + * @return $this + */ + public function setGithubLabel($var) + { + GPBUtil::checkString($var, True); + $this->github_label = $var; + + return $this; + } + + /** + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + * + * Generated from protobuf field repeated string codeowner_github_teams = 105; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getCodeownerGithubTeams() + { + return $this->codeowner_github_teams; + } + + /** + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + * + * Generated from protobuf field repeated string codeowner_github_teams = 105; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setCodeownerGithubTeams($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->codeowner_github_teams = $arr; + + return $this; + } + + /** + * A prefix used in sample code when demarking regions to be included in + * documentation. + * + * Generated from protobuf field string doc_tag_prefix = 106; + * @return string + */ + public function getDocTagPrefix() + { + return $this->doc_tag_prefix; + } + + /** + * A prefix used in sample code when demarking regions to be included in + * documentation. + * + * Generated from protobuf field string doc_tag_prefix = 106; + * @param string $var + * @return $this + */ + public function setDocTagPrefix($var) + { + GPBUtil::checkString($var, True); + $this->doc_tag_prefix = $var; + + return $this; + } + + /** + * For whom the client library is being published. + * + * Generated from protobuf field .google.api.ClientLibraryOrganization organization = 107; + * @return int + */ + public function getOrganization() + { + return $this->organization; + } + + /** + * For whom the client library is being published. + * + * Generated from protobuf field .google.api.ClientLibraryOrganization organization = 107; + * @param int $var + * @return $this + */ + public function setOrganization($var) + { + GPBUtil::checkEnum($var, \Google\Api\ClientLibraryOrganization::class); + $this->organization = $var; + + return $this; + } + + /** + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + * + * Generated from protobuf field repeated .google.api.ClientLibrarySettings library_settings = 109; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLibrarySettings() + { + return $this->library_settings; + } + + /** + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + * + * Generated from protobuf field repeated .google.api.ClientLibrarySettings library_settings = 109; + * @param array<\Google\Api\ClientLibrarySettings>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLibrarySettings($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\ClientLibrarySettings::class); + $this->library_settings = $arr; + + return $this; + } + + /** + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + * + * Generated from protobuf field string proto_reference_documentation_uri = 110; + * @return string + */ + public function getProtoReferenceDocumentationUri() + { + return $this->proto_reference_documentation_uri; + } + + /** + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + * + * Generated from protobuf field string proto_reference_documentation_uri = 110; + * @param string $var + * @return $this + */ + public function setProtoReferenceDocumentationUri($var) + { + GPBUtil::checkString($var, True); + $this->proto_reference_documentation_uri = $var; + + return $this; + } + + /** + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + * + * Generated from protobuf field string rest_reference_documentation_uri = 111; + * @return string + */ + public function getRestReferenceDocumentationUri() + { + return $this->rest_reference_documentation_uri; + } + + /** + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + * + * Generated from protobuf field string rest_reference_documentation_uri = 111; + * @param string $var + * @return $this + */ + public function setRestReferenceDocumentationUri($var) + { + GPBUtil::checkString($var, True); + $this->rest_reference_documentation_uri = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/PythonSettings.php b/lib/Google/vendor/google/common-protos/src/Api/PythonSettings.php new file mode 100644 index 000000000..a86a02261 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/PythonSettings.php @@ -0,0 +1,77 @@ +google.api.PythonSettings + */ +class PythonSettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Quota.php b/lib/Google/vendor/google/common-protos/src/Api/Quota.php new file mode 100644 index 000000000..a4d5db9de --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Quota.php @@ -0,0 +1,144 @@ +google.api.Quota + */ +class Quota extends \Google\Protobuf\Internal\Message +{ + /** + * List of QuotaLimit definitions for the service. + * + * Generated from protobuf field repeated .google.api.QuotaLimit limits = 3; + */ + private $limits; + /** + * List of MetricRule definitions, each one mapping a selected method to one + * or more metrics. + * + * Generated from protobuf field repeated .google.api.MetricRule metric_rules = 4; + */ + private $metric_rules; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\QuotaLimit>|\Google\Protobuf\Internal\RepeatedField $limits + * List of QuotaLimit definitions for the service. + * @type array<\Google\Api\MetricRule>|\Google\Protobuf\Internal\RepeatedField $metric_rules + * List of MetricRule definitions, each one mapping a selected method to one + * or more metrics. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Quota::initOnce(); + parent::__construct($data); + } + + /** + * List of QuotaLimit definitions for the service. + * + * Generated from protobuf field repeated .google.api.QuotaLimit limits = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLimits() + { + return $this->limits; + } + + /** + * List of QuotaLimit definitions for the service. + * + * Generated from protobuf field repeated .google.api.QuotaLimit limits = 3; + * @param array<\Google\Api\QuotaLimit>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLimits($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\QuotaLimit::class); + $this->limits = $arr; + + return $this; + } + + /** + * List of MetricRule definitions, each one mapping a selected method to one + * or more metrics. + * + * Generated from protobuf field repeated .google.api.MetricRule metric_rules = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMetricRules() + { + return $this->metric_rules; + } + + /** + * List of MetricRule definitions, each one mapping a selected method to one + * or more metrics. + * + * Generated from protobuf field repeated .google.api.MetricRule metric_rules = 4; + * @param array<\Google\Api\MetricRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMetricRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\MetricRule::class); + $this->metric_rules = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/QuotaLimit.php b/lib/Google/vendor/google/common-protos/src/Api/QuotaLimit.php new file mode 100644 index 000000000..f34ffb4b0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/QuotaLimit.php @@ -0,0 +1,527 @@ +google.api.QuotaLimit + */ +class QuotaLimit extends \Google\Protobuf\Internal\Message +{ + /** + * Name of the quota limit. + * The name must be provided, and it must be unique within the service. The + * name can only include alphanumeric characters as well as '-'. + * The maximum length of the limit name is 64 characters. + * + * Generated from protobuf field string name = 6; + */ + protected $name = ''; + /** + * Optional. User-visible, extended description for this quota limit. + * Should be used only when more context is needed to understand this limit + * than provided by the limit's display name (see: `display_name`). + * + * Generated from protobuf field string description = 2; + */ + protected $description = ''; + /** + * Default number of tokens that can be consumed during the specified + * duration. This is the number of tokens assigned when a client + * application developer activates the service for his/her project. + * Specifying a value of 0 will block all requests. This can be used if you + * are provisioning quota to selected consumers and blocking others. + * Similarly, a value of -1 will indicate an unlimited quota. No other + * negative values are allowed. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 default_limit = 3; + */ + protected $default_limit = 0; + /** + * Maximum number of tokens that can be consumed during the specified + * duration. Client application developers can override the default limit up + * to this maximum. If specified, this value cannot be set to a value less + * than the default limit. If not specified, it is set to the default limit. + * To allow clients to apply overrides with no upper bound, set this to -1, + * indicating unlimited maximum quota. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 max_limit = 4; + */ + protected $max_limit = 0; + /** + * Free tier value displayed in the Developers Console for this limit. + * The free tier is the number of tokens that will be subtracted from the + * billed amount when billing is enabled. + * This field can only be set on a limit with duration "1d", in a billable + * group; it is invalid on any other limit. If this field is not set, it + * defaults to 0, indicating that there is no free tier for this service. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 free_tier = 7; + */ + protected $free_tier = 0; + /** + * Duration of this limit in textual notation. Must be "100s" or "1d". + * Used by group-based quotas only. + * + * Generated from protobuf field string duration = 5; + */ + protected $duration = ''; + /** + * The name of the metric this quota limit applies to. The quota limits with + * the same metric will be checked together during runtime. The metric must be + * defined within the service config. + * + * Generated from protobuf field string metric = 8; + */ + protected $metric = ''; + /** + * Specify the unit of the quota limit. It uses the same syntax as + * [Metric.unit][]. The supported unit kinds are determined by the quota + * backend system. + * Here are some examples: + * * "1/min/{project}" for quota per minute per project. + * Note: the order of unit components is insignificant. + * The "1" at the beginning is required to follow the metric unit syntax. + * + * Generated from protobuf field string unit = 9; + */ + protected $unit = ''; + /** + * Tiered limit values. You must specify this as a key:value pair, with an + * integer value that is the maximum number of requests allowed for the + * specified unit. Currently only STANDARD is supported. + * + * Generated from protobuf field map values = 10; + */ + private $values; + /** + * User-visible display name for this limit. + * Optional. If not set, the UI will provide a default display name based on + * the quota configuration. This field can be used to override the default + * display name generated from the configuration. + * + * Generated from protobuf field string display_name = 12; + */ + protected $display_name = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Name of the quota limit. + * The name must be provided, and it must be unique within the service. The + * name can only include alphanumeric characters as well as '-'. + * The maximum length of the limit name is 64 characters. + * @type string $description + * Optional. User-visible, extended description for this quota limit. + * Should be used only when more context is needed to understand this limit + * than provided by the limit's display name (see: `display_name`). + * @type int|string $default_limit + * Default number of tokens that can be consumed during the specified + * duration. This is the number of tokens assigned when a client + * application developer activates the service for his/her project. + * Specifying a value of 0 will block all requests. This can be used if you + * are provisioning quota to selected consumers and blocking others. + * Similarly, a value of -1 will indicate an unlimited quota. No other + * negative values are allowed. + * Used by group-based quotas only. + * @type int|string $max_limit + * Maximum number of tokens that can be consumed during the specified + * duration. Client application developers can override the default limit up + * to this maximum. If specified, this value cannot be set to a value less + * than the default limit. If not specified, it is set to the default limit. + * To allow clients to apply overrides with no upper bound, set this to -1, + * indicating unlimited maximum quota. + * Used by group-based quotas only. + * @type int|string $free_tier + * Free tier value displayed in the Developers Console for this limit. + * The free tier is the number of tokens that will be subtracted from the + * billed amount when billing is enabled. + * This field can only be set on a limit with duration "1d", in a billable + * group; it is invalid on any other limit. If this field is not set, it + * defaults to 0, indicating that there is no free tier for this service. + * Used by group-based quotas only. + * @type string $duration + * Duration of this limit in textual notation. Must be "100s" or "1d". + * Used by group-based quotas only. + * @type string $metric + * The name of the metric this quota limit applies to. The quota limits with + * the same metric will be checked together during runtime. The metric must be + * defined within the service config. + * @type string $unit + * Specify the unit of the quota limit. It uses the same syntax as + * [Metric.unit][]. The supported unit kinds are determined by the quota + * backend system. + * Here are some examples: + * * "1/min/{project}" for quota per minute per project. + * Note: the order of unit components is insignificant. + * The "1" at the beginning is required to follow the metric unit syntax. + * @type array|\Google\Protobuf\Internal\MapField $values + * Tiered limit values. You must specify this as a key:value pair, with an + * integer value that is the maximum number of requests allowed for the + * specified unit. Currently only STANDARD is supported. + * @type string $display_name + * User-visible display name for this limit. + * Optional. If not set, the UI will provide a default display name based on + * the quota configuration. This field can be used to override the default + * display name generated from the configuration. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Quota::initOnce(); + parent::__construct($data); + } + + /** + * Name of the quota limit. + * The name must be provided, and it must be unique within the service. The + * name can only include alphanumeric characters as well as '-'. + * The maximum length of the limit name is 64 characters. + * + * Generated from protobuf field string name = 6; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Name of the quota limit. + * The name must be provided, and it must be unique within the service. The + * name can only include alphanumeric characters as well as '-'. + * The maximum length of the limit name is 64 characters. + * + * Generated from protobuf field string name = 6; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Optional. User-visible, extended description for this quota limit. + * Should be used only when more context is needed to understand this limit + * than provided by the limit's display name (see: `display_name`). + * + * Generated from protobuf field string description = 2; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Optional. User-visible, extended description for this quota limit. + * Should be used only when more context is needed to understand this limit + * than provided by the limit's display name (see: `display_name`). + * + * Generated from protobuf field string description = 2; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * Default number of tokens that can be consumed during the specified + * duration. This is the number of tokens assigned when a client + * application developer activates the service for his/her project. + * Specifying a value of 0 will block all requests. This can be used if you + * are provisioning quota to selected consumers and blocking others. + * Similarly, a value of -1 will indicate an unlimited quota. No other + * negative values are allowed. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 default_limit = 3; + * @return int|string + */ + public function getDefaultLimit() + { + return $this->default_limit; + } + + /** + * Default number of tokens that can be consumed during the specified + * duration. This is the number of tokens assigned when a client + * application developer activates the service for his/her project. + * Specifying a value of 0 will block all requests. This can be used if you + * are provisioning quota to selected consumers and blocking others. + * Similarly, a value of -1 will indicate an unlimited quota. No other + * negative values are allowed. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 default_limit = 3; + * @param int|string $var + * @return $this + */ + public function setDefaultLimit($var) + { + GPBUtil::checkInt64($var); + $this->default_limit = $var; + + return $this; + } + + /** + * Maximum number of tokens that can be consumed during the specified + * duration. Client application developers can override the default limit up + * to this maximum. If specified, this value cannot be set to a value less + * than the default limit. If not specified, it is set to the default limit. + * To allow clients to apply overrides with no upper bound, set this to -1, + * indicating unlimited maximum quota. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 max_limit = 4; + * @return int|string + */ + public function getMaxLimit() + { + return $this->max_limit; + } + + /** + * Maximum number of tokens that can be consumed during the specified + * duration. Client application developers can override the default limit up + * to this maximum. If specified, this value cannot be set to a value less + * than the default limit. If not specified, it is set to the default limit. + * To allow clients to apply overrides with no upper bound, set this to -1, + * indicating unlimited maximum quota. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 max_limit = 4; + * @param int|string $var + * @return $this + */ + public function setMaxLimit($var) + { + GPBUtil::checkInt64($var); + $this->max_limit = $var; + + return $this; + } + + /** + * Free tier value displayed in the Developers Console for this limit. + * The free tier is the number of tokens that will be subtracted from the + * billed amount when billing is enabled. + * This field can only be set on a limit with duration "1d", in a billable + * group; it is invalid on any other limit. If this field is not set, it + * defaults to 0, indicating that there is no free tier for this service. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 free_tier = 7; + * @return int|string + */ + public function getFreeTier() + { + return $this->free_tier; + } + + /** + * Free tier value displayed in the Developers Console for this limit. + * The free tier is the number of tokens that will be subtracted from the + * billed amount when billing is enabled. + * This field can only be set on a limit with duration "1d", in a billable + * group; it is invalid on any other limit. If this field is not set, it + * defaults to 0, indicating that there is no free tier for this service. + * Used by group-based quotas only. + * + * Generated from protobuf field int64 free_tier = 7; + * @param int|string $var + * @return $this + */ + public function setFreeTier($var) + { + GPBUtil::checkInt64($var); + $this->free_tier = $var; + + return $this; + } + + /** + * Duration of this limit in textual notation. Must be "100s" or "1d". + * Used by group-based quotas only. + * + * Generated from protobuf field string duration = 5; + * @return string + */ + public function getDuration() + { + return $this->duration; + } + + /** + * Duration of this limit in textual notation. Must be "100s" or "1d". + * Used by group-based quotas only. + * + * Generated from protobuf field string duration = 5; + * @param string $var + * @return $this + */ + public function setDuration($var) + { + GPBUtil::checkString($var, True); + $this->duration = $var; + + return $this; + } + + /** + * The name of the metric this quota limit applies to. The quota limits with + * the same metric will be checked together during runtime. The metric must be + * defined within the service config. + * + * Generated from protobuf field string metric = 8; + * @return string + */ + public function getMetric() + { + return $this->metric; + } + + /** + * The name of the metric this quota limit applies to. The quota limits with + * the same metric will be checked together during runtime. The metric must be + * defined within the service config. + * + * Generated from protobuf field string metric = 8; + * @param string $var + * @return $this + */ + public function setMetric($var) + { + GPBUtil::checkString($var, True); + $this->metric = $var; + + return $this; + } + + /** + * Specify the unit of the quota limit. It uses the same syntax as + * [Metric.unit][]. The supported unit kinds are determined by the quota + * backend system. + * Here are some examples: + * * "1/min/{project}" for quota per minute per project. + * Note: the order of unit components is insignificant. + * The "1" at the beginning is required to follow the metric unit syntax. + * + * Generated from protobuf field string unit = 9; + * @return string + */ + public function getUnit() + { + return $this->unit; + } + + /** + * Specify the unit of the quota limit. It uses the same syntax as + * [Metric.unit][]. The supported unit kinds are determined by the quota + * backend system. + * Here are some examples: + * * "1/min/{project}" for quota per minute per project. + * Note: the order of unit components is insignificant. + * The "1" at the beginning is required to follow the metric unit syntax. + * + * Generated from protobuf field string unit = 9; + * @param string $var + * @return $this + */ + public function setUnit($var) + { + GPBUtil::checkString($var, True); + $this->unit = $var; + + return $this; + } + + /** + * Tiered limit values. You must specify this as a key:value pair, with an + * integer value that is the maximum number of requests allowed for the + * specified unit. Currently only STANDARD is supported. + * + * Generated from protobuf field map values = 10; + * @return \Google\Protobuf\Internal\MapField + */ + public function getValues() + { + return $this->values; + } + + /** + * Tiered limit values. You must specify this as a key:value pair, with an + * integer value that is the maximum number of requests allowed for the + * specified unit. Currently only STANDARD is supported. + * + * Generated from protobuf field map values = 10; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setValues($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::INT64); + $this->values = $arr; + + return $this; + } + + /** + * User-visible display name for this limit. + * Optional. If not set, the UI will provide a default display name based on + * the quota configuration. This field can be used to override the default + * display name generated from the configuration. + * + * Generated from protobuf field string display_name = 12; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * User-visible display name for this limit. + * Optional. If not set, the UI will provide a default display name based on + * the quota configuration. This field can be used to override the default + * display name generated from the configuration. + * + * Generated from protobuf field string display_name = 12; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor.php b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor.php new file mode 100644 index 000000000..f2c9f73bc --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor.php @@ -0,0 +1,495 @@ +google.api.ResourceDescriptor + */ +class ResourceDescriptor extends \Google\Protobuf\Internal\Message +{ + /** + * The resource type. It must be in the format of + * {service_name}/{resource_type_kind}. The `resource_type_kind` must be + * singular and must not include version numbers. + * Example: `storage.googleapis.com/Bucket` + * The value of the resource_type_kind must follow the regular expression + * /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + * should use PascalCase (UpperCamelCase). The maximum number of + * characters allowed for the `resource_type_kind` is 100. + * + * Generated from protobuf field string type = 1; + */ + protected $type = ''; + /** + * Optional. The relative resource name pattern associated with this resource + * type. The DNS prefix of the full resource name shouldn't be specified here. + * The path pattern must follow the syntax, which aligns with HTTP binding + * syntax: + * Template = Segment { "/" Segment } ; + * Segment = LITERAL | Variable ; + * Variable = "{" LITERAL "}" ; + * Examples: + * - "projects/{project}/topics/{topic}" + * - "projects/{project}/knowledgeBases/{knowledge_base}" + * The components in braces correspond to the IDs for each resource in the + * hierarchy. It is expected that, if multiple patterns are provided, + * the same component name (e.g. "project") refers to IDs of the same + * type of resource. + * + * Generated from protobuf field repeated string pattern = 2; + */ + private $pattern; + /** + * Optional. The field on the resource that designates the resource name + * field. If omitted, this is assumed to be "name". + * + * Generated from protobuf field string name_field = 3; + */ + protected $name_field = ''; + /** + * Optional. The historical or future-looking state of the resource pattern. + * Example: + * // The InspectTemplate message originally only supported resource + * // names with organization, and project was added later. + * message InspectTemplate { + * option (google.api.resource) = { + * type: "dlp.googleapis.com/InspectTemplate" + * pattern: + * "organizations/{organization}/inspectTemplates/{inspect_template}" + * pattern: "projects/{project}/inspectTemplates/{inspect_template}" + * history: ORIGINALLY_SINGLE_PATTERN + * }; + * } + * + * Generated from protobuf field .google.api.ResourceDescriptor.History history = 4; + */ + protected $history = 0; + /** + * The plural name used in the resource name and permission names, such as + * 'projects' for the resource name of 'projects/{project}' and the permission + * name of 'cloudresourcemanager.googleapis.com/projects.get'. One exception + * to this is for Nested Collections that have stuttering names, as defined + * in [AIP-122](https://google.aip.dev/122#nested-collections), where the + * collection ID in the resource name pattern does not necessarily directly + * match the `plural` value. + * It is the same concept of the `plural` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Note: The plural form is required even for singleton resources. See + * https://aip.dev/156 + * + * Generated from protobuf field string plural = 5; + */ + protected $plural = ''; + /** + * The same concept of the `singular` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Such as "project" for the `resourcemanager.googleapis.com/Project` type. + * + * Generated from protobuf field string singular = 6; + */ + protected $singular = ''; + /** + * Style flag(s) for this resource. + * These indicate that a resource is expected to conform to a given + * style. See the specific style flags for additional information. + * + * Generated from protobuf field repeated .google.api.ResourceDescriptor.Style style = 10; + */ + private $style; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type + * The resource type. It must be in the format of + * {service_name}/{resource_type_kind}. The `resource_type_kind` must be + * singular and must not include version numbers. + * Example: `storage.googleapis.com/Bucket` + * The value of the resource_type_kind must follow the regular expression + * /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + * should use PascalCase (UpperCamelCase). The maximum number of + * characters allowed for the `resource_type_kind` is 100. + * @type array|\Google\Protobuf\Internal\RepeatedField $pattern + * Optional. The relative resource name pattern associated with this resource + * type. The DNS prefix of the full resource name shouldn't be specified here. + * The path pattern must follow the syntax, which aligns with HTTP binding + * syntax: + * Template = Segment { "/" Segment } ; + * Segment = LITERAL | Variable ; + * Variable = "{" LITERAL "}" ; + * Examples: + * - "projects/{project}/topics/{topic}" + * - "projects/{project}/knowledgeBases/{knowledge_base}" + * The components in braces correspond to the IDs for each resource in the + * hierarchy. It is expected that, if multiple patterns are provided, + * the same component name (e.g. "project") refers to IDs of the same + * type of resource. + * @type string $name_field + * Optional. The field on the resource that designates the resource name + * field. If omitted, this is assumed to be "name". + * @type int $history + * Optional. The historical or future-looking state of the resource pattern. + * Example: + * // The InspectTemplate message originally only supported resource + * // names with organization, and project was added later. + * message InspectTemplate { + * option (google.api.resource) = { + * type: "dlp.googleapis.com/InspectTemplate" + * pattern: + * "organizations/{organization}/inspectTemplates/{inspect_template}" + * pattern: "projects/{project}/inspectTemplates/{inspect_template}" + * history: ORIGINALLY_SINGLE_PATTERN + * }; + * } + * @type string $plural + * The plural name used in the resource name and permission names, such as + * 'projects' for the resource name of 'projects/{project}' and the permission + * name of 'cloudresourcemanager.googleapis.com/projects.get'. One exception + * to this is for Nested Collections that have stuttering names, as defined + * in [AIP-122](https://google.aip.dev/122#nested-collections), where the + * collection ID in the resource name pattern does not necessarily directly + * match the `plural` value. + * It is the same concept of the `plural` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Note: The plural form is required even for singleton resources. See + * https://aip.dev/156 + * @type string $singular + * The same concept of the `singular` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Such as "project" for the `resourcemanager.googleapis.com/Project` type. + * @type array|\Google\Protobuf\Internal\RepeatedField $style + * Style flag(s) for this resource. + * These indicate that a resource is expected to conform to a given + * style. See the specific style flags for additional information. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Resource::initOnce(); + parent::__construct($data); + } + + /** + * The resource type. It must be in the format of + * {service_name}/{resource_type_kind}. The `resource_type_kind` must be + * singular and must not include version numbers. + * Example: `storage.googleapis.com/Bucket` + * The value of the resource_type_kind must follow the regular expression + * /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + * should use PascalCase (UpperCamelCase). The maximum number of + * characters allowed for the `resource_type_kind` is 100. + * + * Generated from protobuf field string type = 1; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * The resource type. It must be in the format of + * {service_name}/{resource_type_kind}. The `resource_type_kind` must be + * singular and must not include version numbers. + * Example: `storage.googleapis.com/Bucket` + * The value of the resource_type_kind must follow the regular expression + * /[A-Za-z][a-zA-Z0-9]+/. It should start with an upper case character and + * should use PascalCase (UpperCamelCase). The maximum number of + * characters allowed for the `resource_type_kind` is 100. + * + * Generated from protobuf field string type = 1; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * Optional. The relative resource name pattern associated with this resource + * type. The DNS prefix of the full resource name shouldn't be specified here. + * The path pattern must follow the syntax, which aligns with HTTP binding + * syntax: + * Template = Segment { "/" Segment } ; + * Segment = LITERAL | Variable ; + * Variable = "{" LITERAL "}" ; + * Examples: + * - "projects/{project}/topics/{topic}" + * - "projects/{project}/knowledgeBases/{knowledge_base}" + * The components in braces correspond to the IDs for each resource in the + * hierarchy. It is expected that, if multiple patterns are provided, + * the same component name (e.g. "project") refers to IDs of the same + * type of resource. + * + * Generated from protobuf field repeated string pattern = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getPattern() + { + return $this->pattern; + } + + /** + * Optional. The relative resource name pattern associated with this resource + * type. The DNS prefix of the full resource name shouldn't be specified here. + * The path pattern must follow the syntax, which aligns with HTTP binding + * syntax: + * Template = Segment { "/" Segment } ; + * Segment = LITERAL | Variable ; + * Variable = "{" LITERAL "}" ; + * Examples: + * - "projects/{project}/topics/{topic}" + * - "projects/{project}/knowledgeBases/{knowledge_base}" + * The components in braces correspond to the IDs for each resource in the + * hierarchy. It is expected that, if multiple patterns are provided, + * the same component name (e.g. "project") refers to IDs of the same + * type of resource. + * + * Generated from protobuf field repeated string pattern = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setPattern($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->pattern = $arr; + + return $this; + } + + /** + * Optional. The field on the resource that designates the resource name + * field. If omitted, this is assumed to be "name". + * + * Generated from protobuf field string name_field = 3; + * @return string + */ + public function getNameField() + { + return $this->name_field; + } + + /** + * Optional. The field on the resource that designates the resource name + * field. If omitted, this is assumed to be "name". + * + * Generated from protobuf field string name_field = 3; + * @param string $var + * @return $this + */ + public function setNameField($var) + { + GPBUtil::checkString($var, True); + $this->name_field = $var; + + return $this; + } + + /** + * Optional. The historical or future-looking state of the resource pattern. + * Example: + * // The InspectTemplate message originally only supported resource + * // names with organization, and project was added later. + * message InspectTemplate { + * option (google.api.resource) = { + * type: "dlp.googleapis.com/InspectTemplate" + * pattern: + * "organizations/{organization}/inspectTemplates/{inspect_template}" + * pattern: "projects/{project}/inspectTemplates/{inspect_template}" + * history: ORIGINALLY_SINGLE_PATTERN + * }; + * } + * + * Generated from protobuf field .google.api.ResourceDescriptor.History history = 4; + * @return int + */ + public function getHistory() + { + return $this->history; + } + + /** + * Optional. The historical or future-looking state of the resource pattern. + * Example: + * // The InspectTemplate message originally only supported resource + * // names with organization, and project was added later. + * message InspectTemplate { + * option (google.api.resource) = { + * type: "dlp.googleapis.com/InspectTemplate" + * pattern: + * "organizations/{organization}/inspectTemplates/{inspect_template}" + * pattern: "projects/{project}/inspectTemplates/{inspect_template}" + * history: ORIGINALLY_SINGLE_PATTERN + * }; + * } + * + * Generated from protobuf field .google.api.ResourceDescriptor.History history = 4; + * @param int $var + * @return $this + */ + public function setHistory($var) + { + GPBUtil::checkEnum($var, \Google\Api\ResourceDescriptor\History::class); + $this->history = $var; + + return $this; + } + + /** + * The plural name used in the resource name and permission names, such as + * 'projects' for the resource name of 'projects/{project}' and the permission + * name of 'cloudresourcemanager.googleapis.com/projects.get'. One exception + * to this is for Nested Collections that have stuttering names, as defined + * in [AIP-122](https://google.aip.dev/122#nested-collections), where the + * collection ID in the resource name pattern does not necessarily directly + * match the `plural` value. + * It is the same concept of the `plural` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Note: The plural form is required even for singleton resources. See + * https://aip.dev/156 + * + * Generated from protobuf field string plural = 5; + * @return string + */ + public function getPlural() + { + return $this->plural; + } + + /** + * The plural name used in the resource name and permission names, such as + * 'projects' for the resource name of 'projects/{project}' and the permission + * name of 'cloudresourcemanager.googleapis.com/projects.get'. One exception + * to this is for Nested Collections that have stuttering names, as defined + * in [AIP-122](https://google.aip.dev/122#nested-collections), where the + * collection ID in the resource name pattern does not necessarily directly + * match the `plural` value. + * It is the same concept of the `plural` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Note: The plural form is required even for singleton resources. See + * https://aip.dev/156 + * + * Generated from protobuf field string plural = 5; + * @param string $var + * @return $this + */ + public function setPlural($var) + { + GPBUtil::checkString($var, True); + $this->plural = $var; + + return $this; + } + + /** + * The same concept of the `singular` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Such as "project" for the `resourcemanager.googleapis.com/Project` type. + * + * Generated from protobuf field string singular = 6; + * @return string + */ + public function getSingular() + { + return $this->singular; + } + + /** + * The same concept of the `singular` field in k8s CRD spec + * https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/ + * Such as "project" for the `resourcemanager.googleapis.com/Project` type. + * + * Generated from protobuf field string singular = 6; + * @param string $var + * @return $this + */ + public function setSingular($var) + { + GPBUtil::checkString($var, True); + $this->singular = $var; + + return $this; + } + + /** + * Style flag(s) for this resource. + * These indicate that a resource is expected to conform to a given + * style. See the specific style flags for additional information. + * + * Generated from protobuf field repeated .google.api.ResourceDescriptor.Style style = 10; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getStyle() + { + return $this->style; + } + + /** + * Style flag(s) for this resource. + * These indicate that a resource is expected to conform to a given + * style. See the specific style flags for additional information. + * + * Generated from protobuf field repeated .google.api.ResourceDescriptor.Style style = 10; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setStyle($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::ENUM, \Google\Api\ResourceDescriptor\Style::class); + $this->style = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/History.php b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/History.php new file mode 100644 index 000000000..5005eb2a7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/History.php @@ -0,0 +1,66 @@ +google.api.ResourceDescriptor.History + */ +class History +{ + /** + * The "unset" value. + * + * Generated from protobuf enum HISTORY_UNSPECIFIED = 0; + */ + const HISTORY_UNSPECIFIED = 0; + /** + * The resource originally had one pattern and launched as such, and + * additional patterns were added later. + * + * Generated from protobuf enum ORIGINALLY_SINGLE_PATTERN = 1; + */ + const ORIGINALLY_SINGLE_PATTERN = 1; + /** + * The resource has one pattern, but the API owner expects to add more + * later. (This is the inverse of ORIGINALLY_SINGLE_PATTERN, and prevents + * that from being necessary once there are multiple patterns.) + * + * Generated from protobuf enum FUTURE_MULTI_PATTERN = 2; + */ + const FUTURE_MULTI_PATTERN = 2; + + private static $valueToName = [ + self::HISTORY_UNSPECIFIED => 'HISTORY_UNSPECIFIED', + self::ORIGINALLY_SINGLE_PATTERN => 'ORIGINALLY_SINGLE_PATTERN', + self::FUTURE_MULTI_PATTERN => 'FUTURE_MULTI_PATTERN', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/Style.php b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/Style.php new file mode 100644 index 000000000..4d0c56e9c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ResourceDescriptor/Style.php @@ -0,0 +1,60 @@ +google.api.ResourceDescriptor.Style + */ +class Style +{ + /** + * The unspecified value. Do not use. + * + * Generated from protobuf enum STYLE_UNSPECIFIED = 0; + */ + const STYLE_UNSPECIFIED = 0; + /** + * This resource is intended to be "declarative-friendly". + * Declarative-friendly resources must be more strictly consistent, and + * setting this to true communicates to tools that this resource should + * adhere to declarative-friendly expectations. + * Note: This is used by the API linter (linter.aip.dev) to enable + * additional checks. + * + * Generated from protobuf enum DECLARATIVE_FRIENDLY = 1; + */ + const DECLARATIVE_FRIENDLY = 1; + + private static $valueToName = [ + self::STYLE_UNSPECIFIED => 'STYLE_UNSPECIFIED', + self::DECLARATIVE_FRIENDLY => 'DECLARATIVE_FRIENDLY', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Api/ResourceReference.php b/lib/Google/vendor/google/common-protos/src/Api/ResourceReference.php new file mode 100644 index 000000000..c4c282d16 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/ResourceReference.php @@ -0,0 +1,190 @@ +google.api.ResourceReference + */ +class ResourceReference extends \Google\Protobuf\Internal\Message +{ + /** + * The resource type that the annotated field references. + * Example: + * message Subscription { + * string topic = 2 [(google.api.resource_reference) = { + * type: "pubsub.googleapis.com/Topic" + * }]; + * } + * Occasionally, a field may reference an arbitrary resource. In this case, + * APIs use the special value * in their resource reference. + * Example: + * message GetIamPolicyRequest { + * string resource = 2 [(google.api.resource_reference) = { + * type: "*" + * }]; + * } + * + * Generated from protobuf field string type = 1; + */ + protected $type = ''; + /** + * The resource type of a child collection that the annotated field + * references. This is useful for annotating the `parent` field that + * doesn't have a fixed resource type. + * Example: + * message ListLogEntriesRequest { + * string parent = 1 [(google.api.resource_reference) = { + * child_type: "logging.googleapis.com/LogEntry" + * }; + * } + * + * Generated from protobuf field string child_type = 2; + */ + protected $child_type = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type + * The resource type that the annotated field references. + * Example: + * message Subscription { + * string topic = 2 [(google.api.resource_reference) = { + * type: "pubsub.googleapis.com/Topic" + * }]; + * } + * Occasionally, a field may reference an arbitrary resource. In this case, + * APIs use the special value * in their resource reference. + * Example: + * message GetIamPolicyRequest { + * string resource = 2 [(google.api.resource_reference) = { + * type: "*" + * }]; + * } + * @type string $child_type + * The resource type of a child collection that the annotated field + * references. This is useful for annotating the `parent` field that + * doesn't have a fixed resource type. + * Example: + * message ListLogEntriesRequest { + * string parent = 1 [(google.api.resource_reference) = { + * child_type: "logging.googleapis.com/LogEntry" + * }; + * } + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Resource::initOnce(); + parent::__construct($data); + } + + /** + * The resource type that the annotated field references. + * Example: + * message Subscription { + * string topic = 2 [(google.api.resource_reference) = { + * type: "pubsub.googleapis.com/Topic" + * }]; + * } + * Occasionally, a field may reference an arbitrary resource. In this case, + * APIs use the special value * in their resource reference. + * Example: + * message GetIamPolicyRequest { + * string resource = 2 [(google.api.resource_reference) = { + * type: "*" + * }]; + * } + * + * Generated from protobuf field string type = 1; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * The resource type that the annotated field references. + * Example: + * message Subscription { + * string topic = 2 [(google.api.resource_reference) = { + * type: "pubsub.googleapis.com/Topic" + * }]; + * } + * Occasionally, a field may reference an arbitrary resource. In this case, + * APIs use the special value * in their resource reference. + * Example: + * message GetIamPolicyRequest { + * string resource = 2 [(google.api.resource_reference) = { + * type: "*" + * }]; + * } + * + * Generated from protobuf field string type = 1; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * The resource type of a child collection that the annotated field + * references. This is useful for annotating the `parent` field that + * doesn't have a fixed resource type. + * Example: + * message ListLogEntriesRequest { + * string parent = 1 [(google.api.resource_reference) = { + * child_type: "logging.googleapis.com/LogEntry" + * }; + * } + * + * Generated from protobuf field string child_type = 2; + * @return string + */ + public function getChildType() + { + return $this->child_type; + } + + /** + * The resource type of a child collection that the annotated field + * references. This is useful for annotating the `parent` field that + * doesn't have a fixed resource type. + * Example: + * message ListLogEntriesRequest { + * string parent = 1 [(google.api.resource_reference) = { + * child_type: "logging.googleapis.com/LogEntry" + * }; + * } + * + * Generated from protobuf field string child_type = 2; + * @param string $var + * @return $this + */ + public function setChildType($var) + { + GPBUtil::checkString($var, True); + $this->child_type = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/RoutingParameter.php b/lib/Google/vendor/google/common-protos/src/Api/RoutingParameter.php new file mode 100644 index 000000000..1b32a8ffa --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/RoutingParameter.php @@ -0,0 +1,281 @@ +google.api.RoutingParameter + */ +class RoutingParameter extends \Google\Protobuf\Internal\Message +{ + /** + * A request field to extract the header key-value pair from. + * + * Generated from protobuf field string field = 1; + */ + protected $field = ''; + /** + * A pattern matching the key-value field. Optional. + * If not specified, the whole field specified in the `field` field will be + * taken as value, and its name used as key. If specified, it MUST contain + * exactly one named segment (along with any number of unnamed segments) The + * pattern will be matched over the field specified in the `field` field, then + * if the match is successful: + * - the name of the single named segment will be used as a header name, + * - the match value of the segment will be used as a header value; + * if the match is NOT successful, nothing will be sent. + * Example: + * -- This is a field in the request message + * | that the header value will be extracted from. + * | + * | -- This is the key name in the + * | | routing header. + * V | + * field: "table_name" v + * path_template: "projects/*/{table_location=instances/*}/tables/*" + * ^ ^ + * | | + * In the {} brackets is the pattern that -- | + * specifies what to extract from the | + * field as a value to be sent. | + * | + * The string in the field must match the whole pattern -- + * before brackets, inside brackets, after brackets. + * When looking at this specific example, we can see that: + * - A key-value pair with the key `table_location` + * and the value matching `instances/*` should be added + * to the x-goog-request-params routing header. + * - The value is extracted from the request message's `table_name` field + * if it matches the full pattern specified: + * `projects/*/instances/*/tables/*`. + * **NB:** If the `path_template` field is not provided, the key name is + * equal to the field name, and the whole field should be sent as a value. + * This makes the pattern for the field and the value functionally equivalent + * to `**`, and the configuration + * { + * field: "table_name" + * } + * is a functionally equivalent shorthand to: + * { + * field: "table_name" + * path_template: "{table_name=**}" + * } + * See Example 1 for more details. + * + * Generated from protobuf field string path_template = 2; + */ + protected $path_template = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $field + * A request field to extract the header key-value pair from. + * @type string $path_template + * A pattern matching the key-value field. Optional. + * If not specified, the whole field specified in the `field` field will be + * taken as value, and its name used as key. If specified, it MUST contain + * exactly one named segment (along with any number of unnamed segments) The + * pattern will be matched over the field specified in the `field` field, then + * if the match is successful: + * - the name of the single named segment will be used as a header name, + * - the match value of the segment will be used as a header value; + * if the match is NOT successful, nothing will be sent. + * Example: + * -- This is a field in the request message + * | that the header value will be extracted from. + * | + * | -- This is the key name in the + * | | routing header. + * V | + * field: "table_name" v + * path_template: "projects/*/{table_location=instances/*}/tables/*" + * ^ ^ + * | | + * In the {} brackets is the pattern that -- | + * specifies what to extract from the | + * field as a value to be sent. | + * | + * The string in the field must match the whole pattern -- + * before brackets, inside brackets, after brackets. + * When looking at this specific example, we can see that: + * - A key-value pair with the key `table_location` + * and the value matching `instances/*` should be added + * to the x-goog-request-params routing header. + * - The value is extracted from the request message's `table_name` field + * if it matches the full pattern specified: + * `projects/*/instances/*/tables/*`. + * **NB:** If the `path_template` field is not provided, the key name is + * equal to the field name, and the whole field should be sent as a value. + * This makes the pattern for the field and the value functionally equivalent + * to `**`, and the configuration + * { + * field: "table_name" + * } + * is a functionally equivalent shorthand to: + * { + * field: "table_name" + * path_template: "{table_name=**}" + * } + * See Example 1 for more details. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Routing::initOnce(); + parent::__construct($data); + } + + /** + * A request field to extract the header key-value pair from. + * + * Generated from protobuf field string field = 1; + * @return string + */ + public function getField() + { + return $this->field; + } + + /** + * A request field to extract the header key-value pair from. + * + * Generated from protobuf field string field = 1; + * @param string $var + * @return $this + */ + public function setField($var) + { + GPBUtil::checkString($var, True); + $this->field = $var; + + return $this; + } + + /** + * A pattern matching the key-value field. Optional. + * If not specified, the whole field specified in the `field` field will be + * taken as value, and its name used as key. If specified, it MUST contain + * exactly one named segment (along with any number of unnamed segments) The + * pattern will be matched over the field specified in the `field` field, then + * if the match is successful: + * - the name of the single named segment will be used as a header name, + * - the match value of the segment will be used as a header value; + * if the match is NOT successful, nothing will be sent. + * Example: + * -- This is a field in the request message + * | that the header value will be extracted from. + * | + * | -- This is the key name in the + * | | routing header. + * V | + * field: "table_name" v + * path_template: "projects/*/{table_location=instances/*}/tables/*" + * ^ ^ + * | | + * In the {} brackets is the pattern that -- | + * specifies what to extract from the | + * field as a value to be sent. | + * | + * The string in the field must match the whole pattern -- + * before brackets, inside brackets, after brackets. + * When looking at this specific example, we can see that: + * - A key-value pair with the key `table_location` + * and the value matching `instances/*` should be added + * to the x-goog-request-params routing header. + * - The value is extracted from the request message's `table_name` field + * if it matches the full pattern specified: + * `projects/*/instances/*/tables/*`. + * **NB:** If the `path_template` field is not provided, the key name is + * equal to the field name, and the whole field should be sent as a value. + * This makes the pattern for the field and the value functionally equivalent + * to `**`, and the configuration + * { + * field: "table_name" + * } + * is a functionally equivalent shorthand to: + * { + * field: "table_name" + * path_template: "{table_name=**}" + * } + * See Example 1 for more details. + * + * Generated from protobuf field string path_template = 2; + * @return string + */ + public function getPathTemplate() + { + return $this->path_template; + } + + /** + * A pattern matching the key-value field. Optional. + * If not specified, the whole field specified in the `field` field will be + * taken as value, and its name used as key. If specified, it MUST contain + * exactly one named segment (along with any number of unnamed segments) The + * pattern will be matched over the field specified in the `field` field, then + * if the match is successful: + * - the name of the single named segment will be used as a header name, + * - the match value of the segment will be used as a header value; + * if the match is NOT successful, nothing will be sent. + * Example: + * -- This is a field in the request message + * | that the header value will be extracted from. + * | + * | -- This is the key name in the + * | | routing header. + * V | + * field: "table_name" v + * path_template: "projects/*/{table_location=instances/*}/tables/*" + * ^ ^ + * | | + * In the {} brackets is the pattern that -- | + * specifies what to extract from the | + * field as a value to be sent. | + * | + * The string in the field must match the whole pattern -- + * before brackets, inside brackets, after brackets. + * When looking at this specific example, we can see that: + * - A key-value pair with the key `table_location` + * and the value matching `instances/*` should be added + * to the x-goog-request-params routing header. + * - The value is extracted from the request message's `table_name` field + * if it matches the full pattern specified: + * `projects/*/instances/*/tables/*`. + * **NB:** If the `path_template` field is not provided, the key name is + * equal to the field name, and the whole field should be sent as a value. + * This makes the pattern for the field and the value functionally equivalent + * to `**`, and the configuration + * { + * field: "table_name" + * } + * is a functionally equivalent shorthand to: + * { + * field: "table_name" + * path_template: "{table_name=**}" + * } + * See Example 1 for more details. + * + * Generated from protobuf field string path_template = 2; + * @param string $var + * @return $this + */ + public function setPathTemplate($var) + { + GPBUtil::checkString($var, True); + $this->path_template = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/RoutingRule.php b/lib/Google/vendor/google/common-protos/src/Api/RoutingRule.php new file mode 100644 index 000000000..c47012d87 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/RoutingRule.php @@ -0,0 +1,353 @@ +/tables/` + * // - `projects//instances//tables/
` + * // - `region//zones//tables/
` + * string table_name = 1; + * // This value specifies routing for replication. + * // It can be in the following formats: + * // - `profiles/` + * // - a legacy `profile_id` that can be any string + * string app_profile_id = 2; + * } + * Example message: + * { + * table_name: projects/proj_foo/instances/instance_bar/table/table_baz, + * app_profile_id: profiles/prof_qux + * } + * The routing header consists of one or multiple key-value pairs. Every key + * and value must be percent-encoded, and joined together in the format of + * `key1=value1&key2=value2`. + * In the examples below I am skipping the percent-encoding for readablity. + * Example 1 + * Extracting a field from the request to put into the routing header + * unchanged, with the key equal to the field name. + * annotation: + * option (google.api.routing) = { + * // Take the `app_profile_id`. + * routing_parameters { + * field: "app_profile_id" + * } + * }; + * result: + * x-goog-request-params: app_profile_id=profiles/prof_qux + * Example 2 + * Extracting a field from the request to put into the routing header + * unchanged, with the key different from the field name. + * annotation: + * option (google.api.routing) = { + * // Take the `app_profile_id`, but name it `routing_id` in the header. + * routing_parameters { + * field: "app_profile_id" + * path_template: "{routing_id=**}" + * } + * }; + * result: + * x-goog-request-params: routing_id=profiles/prof_qux + * Example 3 + * Extracting a field from the request to put into the routing + * header, while matching a path template syntax on the field's value. + * NB: it is more useful to send nothing than to send garbage for the purpose + * of dynamic routing, since garbage pollutes cache. Thus the matching. + * Sub-example 3a + * The field matches the template. + * annotation: + * option (google.api.routing) = { + * // Take the `table_name`, if it's well-formed (with project-based + * // syntax). + * routing_parameters { + * field: "table_name" + * path_template: "{table_name=projects/*/instances/*/**}" + * } + * }; + * result: + * x-goog-request-params: + * table_name=projects/proj_foo/instances/instance_bar/table/table_baz + * Sub-example 3b + * The field does not match the template. + * annotation: + * option (google.api.routing) = { + * // Take the `table_name`, if it's well-formed (with region-based + * // syntax). + * routing_parameters { + * field: "table_name" + * path_template: "{table_name=regions/*/zones/*/**}" + * } + * }; + * result: + * + * Sub-example 3c + * Multiple alternative conflictingly named path templates are + * specified. The one that matches is used to construct the header. + * annotation: + * option (google.api.routing) = { + * // Take the `table_name`, if it's well-formed, whether + * // using the region- or projects-based syntax. + * routing_parameters { + * field: "table_name" + * path_template: "{table_name=regions/*/zones/*/**}" + * } + * routing_parameters { + * field: "table_name" + * path_template: "{table_name=projects/*/instances/*/**}" + * } + * }; + * result: + * x-goog-request-params: + * table_name=projects/proj_foo/instances/instance_bar/table/table_baz + * Example 4 + * Extracting a single routing header key-value pair by matching a + * template syntax on (a part of) a single request field. + * annotation: + * option (google.api.routing) = { + * // Take just the project id from the `table_name` field. + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=projects/*}/**" + * } + * }; + * result: + * x-goog-request-params: routing_id=projects/proj_foo + * Example 5 + * Extracting a single routing header key-value pair by matching + * several conflictingly named path templates on (parts of) a single request + * field. The last template to match "wins" the conflict. + * annotation: + * option (google.api.routing) = { + * // If the `table_name` does not have instances information, + * // take just the project id for routing. + * // Otherwise take project + instance. + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=projects/*}/**" + * } + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=projects/*/instances/*}/**" + * } + * }; + * result: + * x-goog-request-params: + * routing_id=projects/proj_foo/instances/instance_bar + * Example 6 + * Extracting multiple routing header key-value pairs by matching + * several non-conflicting path templates on (parts of) a single request field. + * Sub-example 6a + * Make the templates strict, so that if the `table_name` does not + * have an instance information, nothing is sent. + * annotation: + * option (google.api.routing) = { + * // The routing code needs two keys instead of one composite + * // but works only for the tables with the "project-instance" name + * // syntax. + * routing_parameters { + * field: "table_name" + * path_template: "{project_id=projects/*}/instances/*/**" + * } + * routing_parameters { + * field: "table_name" + * path_template: "projects/*/{instance_id=instances/*}/**" + * } + * }; + * result: + * x-goog-request-params: + * project_id=projects/proj_foo&instance_id=instances/instance_bar + * Sub-example 6b + * Make the templates loose, so that if the `table_name` does not + * have an instance information, just the project id part is sent. + * annotation: + * option (google.api.routing) = { + * // The routing code wants two keys instead of one composite + * // but will work with just the `project_id` for tables without + * // an instance in the `table_name`. + * routing_parameters { + * field: "table_name" + * path_template: "{project_id=projects/*}/**" + * } + * routing_parameters { + * field: "table_name" + * path_template: "projects/*/{instance_id=instances/*}/**" + * } + * }; + * result (is the same as 6a for our example message because it has the instance + * information): + * x-goog-request-params: + * project_id=projects/proj_foo&instance_id=instances/instance_bar + * Example 7 + * Extracting multiple routing header key-value pairs by matching + * several path templates on multiple request fields. + * NB: note that here there is no way to specify sending nothing if one of the + * fields does not match its template. E.g. if the `table_name` is in the wrong + * format, the `project_id` will not be sent, but the `routing_id` will be. + * The backend routing code has to be aware of that and be prepared to not + * receive a full complement of keys if it expects multiple. + * annotation: + * option (google.api.routing) = { + * // The routing needs both `project_id` and `routing_id` + * // (from the `app_profile_id` field) for routing. + * routing_parameters { + * field: "table_name" + * path_template: "{project_id=projects/*}/**" + * } + * routing_parameters { + * field: "app_profile_id" + * path_template: "{routing_id=**}" + * } + * }; + * result: + * x-goog-request-params: + * project_id=projects/proj_foo&routing_id=profiles/prof_qux + * Example 8 + * Extracting a single routing header key-value pair by matching + * several conflictingly named path templates on several request fields. The + * last template to match "wins" the conflict. + * annotation: + * option (google.api.routing) = { + * // The `routing_id` can be a project id or a region id depending on + * // the table name format, but only if the `app_profile_id` is not set. + * // If `app_profile_id` is set it should be used instead. + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=projects/*}/**" + * } + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=regions/*}/**" + * } + * routing_parameters { + * field: "app_profile_id" + * path_template: "{routing_id=**}" + * } + * }; + * result: + * x-goog-request-params: routing_id=profiles/prof_qux + * Example 9 + * Bringing it all together. + * annotation: + * option (google.api.routing) = { + * // For routing both `table_location` and a `routing_id` are needed. + * // + * // table_location can be either an instance id or a region+zone id. + * // + * // For `routing_id`, take the value of `app_profile_id` + * // - If it's in the format `profiles/`, send + * // just the `` part. + * // - If it's any other literal, send it as is. + * // If the `app_profile_id` is empty, and the `table_name` starts with + * // the project_id, send that instead. + * routing_parameters { + * field: "table_name" + * path_template: "projects/*/{table_location=instances/*}/tables/*" + * } + * routing_parameters { + * field: "table_name" + * path_template: "{table_location=regions/*/zones/*}/tables/*" + * } + * routing_parameters { + * field: "table_name" + * path_template: "{routing_id=projects/*}/**" + * } + * routing_parameters { + * field: "app_profile_id" + * path_template: "{routing_id=**}" + * } + * routing_parameters { + * field: "app_profile_id" + * path_template: "profiles/{routing_id=*}" + * } + * }; + * result: + * x-goog-request-params: + * table_location=instances/instance_bar&routing_id=prof_qux + * + * Generated from protobuf message google.api.RoutingRule + */ +class RoutingRule extends \Google\Protobuf\Internal\Message +{ + /** + * A collection of Routing Parameter specifications. + * **NOTE:** If multiple Routing Parameters describe the same key + * (via the `path_template` field or via the `field` field when + * `path_template` is not provided), "last one wins" rule + * determines which Parameter gets used. + * See the examples for more details. + * + * Generated from protobuf field repeated .google.api.RoutingParameter routing_parameters = 2; + */ + private $routing_parameters; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\RoutingParameter>|\Google\Protobuf\Internal\RepeatedField $routing_parameters + * A collection of Routing Parameter specifications. + * **NOTE:** If multiple Routing Parameters describe the same key + * (via the `path_template` field or via the `field` field when + * `path_template` is not provided), "last one wins" rule + * determines which Parameter gets used. + * See the examples for more details. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Routing::initOnce(); + parent::__construct($data); + } + + /** + * A collection of Routing Parameter specifications. + * **NOTE:** If multiple Routing Parameters describe the same key + * (via the `path_template` field or via the `field` field when + * `path_template` is not provided), "last one wins" rule + * determines which Parameter gets used. + * See the examples for more details. + * + * Generated from protobuf field repeated .google.api.RoutingParameter routing_parameters = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRoutingParameters() + { + return $this->routing_parameters; + } + + /** + * A collection of Routing Parameter specifications. + * **NOTE:** If multiple Routing Parameters describe the same key + * (via the `path_template` field or via the `field` field when + * `path_template` is not provided), "last one wins" rule + * determines which Parameter gets used. + * See the examples for more details. + * + * Generated from protobuf field repeated .google.api.RoutingParameter routing_parameters = 2; + * @param array<\Google\Api\RoutingParameter>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRoutingParameters($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\RoutingParameter::class); + $this->routing_parameters = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/RubySettings.php b/lib/Google/vendor/google/common-protos/src/Api/RubySettings.php new file mode 100644 index 000000000..2ca343c26 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/RubySettings.php @@ -0,0 +1,77 @@ +google.api.RubySettings + */ +class RubySettings extends \Google\Protobuf\Internal\Message +{ + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + */ + protected $common = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Api\CommonLanguageSettings $common + * Some settings. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Client::initOnce(); + parent::__construct($data); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @return \Google\Api\CommonLanguageSettings|null + */ + public function getCommon() + { + return $this->common; + } + + public function hasCommon() + { + return isset($this->common); + } + + public function clearCommon() + { + unset($this->common); + } + + /** + * Some settings. + * + * Generated from protobuf field .google.api.CommonLanguageSettings common = 1; + * @param \Google\Api\CommonLanguageSettings $var + * @return $this + */ + public function setCommon($var) + { + GPBUtil::checkMessage($var, \Google\Api\CommonLanguageSettings::class); + $this->common = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Service.php b/lib/Google/vendor/google/common-protos/src/Api/Service.php new file mode 100644 index 000000000..c7ec18eea --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Service.php @@ -0,0 +1,1246 @@ +google.api.Service + */ +class Service extends \Google\Protobuf\Internal\Message +{ + /** + * The service name, which is a DNS-like logical identifier for the + * service, such as `calendar.googleapis.com`. The service name + * typically goes through DNS verification to make sure the owner + * of the service also owns the DNS name. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The product title for this service, it is the name displayed in Google + * Cloud Console. + * + * Generated from protobuf field string title = 2; + */ + protected $title = ''; + /** + * The Google project that owns this service. + * + * Generated from protobuf field string producer_project_id = 22; + */ + protected $producer_project_id = ''; + /** + * A unique ID for a specific instance of this message, typically assigned + * by the client for tracking purpose. Must be no longer than 63 characters + * and only lower case letters, digits, '.', '_' and '-' are allowed. If + * empty, the server may choose to generate one instead. + * + * Generated from protobuf field string id = 33; + */ + protected $id = ''; + /** + * A list of API interfaces exported by this service. Only the `name` field + * of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by + * the configuration author, as the remaining fields will be derived from the + * IDL during the normalization process. It is an error to specify an API + * interface here which cannot be resolved against the associated IDL files. + * + * Generated from protobuf field repeated .google.protobuf.Api apis = 3; + */ + private $apis; + /** + * A list of all proto message types included in this API service. + * Types referenced directly or indirectly by the `apis` are automatically + * included. Messages which are not referenced but shall be included, such as + * types used by the `google.protobuf.Any` type, should be listed here by + * name by the configuration author. Example: + * types: + * - name: google.protobuf.Int32 + * + * Generated from protobuf field repeated .google.protobuf.Type types = 4; + */ + private $types; + /** + * A list of all enum types included in this API service. Enums referenced + * directly or indirectly by the `apis` are automatically included. Enums + * which are not referenced but shall be included should be listed here by + * name by the configuration author. Example: + * enums: + * - name: google.someapi.v1.SomeEnum + * + * Generated from protobuf field repeated .google.protobuf.Enum enums = 5; + */ + private $enums; + /** + * Additional API documentation. + * + * Generated from protobuf field .google.api.Documentation documentation = 6; + */ + protected $documentation = null; + /** + * API backend configuration. + * + * Generated from protobuf field .google.api.Backend backend = 8; + */ + protected $backend = null; + /** + * HTTP configuration. + * + * Generated from protobuf field .google.api.Http http = 9; + */ + protected $http = null; + /** + * Quota configuration. + * + * Generated from protobuf field .google.api.Quota quota = 10; + */ + protected $quota = null; + /** + * Auth configuration. + * + * Generated from protobuf field .google.api.Authentication authentication = 11; + */ + protected $authentication = null; + /** + * Context configuration. + * + * Generated from protobuf field .google.api.Context context = 12; + */ + protected $context = null; + /** + * Configuration controlling usage of this service. + * + * Generated from protobuf field .google.api.Usage usage = 15; + */ + protected $usage = null; + /** + * Configuration for network endpoints. If this is empty, then an endpoint + * with the same name as the service is automatically generated to service all + * defined APIs. + * + * Generated from protobuf field repeated .google.api.Endpoint endpoints = 18; + */ + private $endpoints; + /** + * Configuration for the service control plane. + * + * Generated from protobuf field .google.api.Control control = 21; + */ + protected $control = null; + /** + * Defines the logs used by this service. + * + * Generated from protobuf field repeated .google.api.LogDescriptor logs = 23; + */ + private $logs; + /** + * Defines the metrics used by this service. + * + * Generated from protobuf field repeated .google.api.MetricDescriptor metrics = 24; + */ + private $metrics; + /** + * Defines the monitored resources used by this service. This is required + * by the [Service.monitoring][google.api.Service.monitoring] and + * [Service.logging][google.api.Service.logging] configurations. + * + * Generated from protobuf field repeated .google.api.MonitoredResourceDescriptor monitored_resources = 25; + */ + private $monitored_resources; + /** + * Billing configuration. + * + * Generated from protobuf field .google.api.Billing billing = 26; + */ + protected $billing = null; + /** + * Logging configuration. + * + * Generated from protobuf field .google.api.Logging logging = 27; + */ + protected $logging = null; + /** + * Monitoring configuration. + * + * Generated from protobuf field .google.api.Monitoring monitoring = 28; + */ + protected $monitoring = null; + /** + * System parameter configuration. + * + * Generated from protobuf field .google.api.SystemParameters system_parameters = 29; + */ + protected $system_parameters = null; + /** + * Output only. The source information for this configuration if available. + * + * Generated from protobuf field .google.api.SourceInfo source_info = 37; + */ + protected $source_info = null; + /** + * Settings for [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from APIs defined as protocol buffers. + * + * Generated from protobuf field .google.api.Publishing publishing = 45; + */ + protected $publishing = null; + /** + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * + * Generated from protobuf field .google.protobuf.UInt32Value config_version = 20; + */ + protected $config_version = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The service name, which is a DNS-like logical identifier for the + * service, such as `calendar.googleapis.com`. The service name + * typically goes through DNS verification to make sure the owner + * of the service also owns the DNS name. + * @type string $title + * The product title for this service, it is the name displayed in Google + * Cloud Console. + * @type string $producer_project_id + * The Google project that owns this service. + * @type string $id + * A unique ID for a specific instance of this message, typically assigned + * by the client for tracking purpose. Must be no longer than 63 characters + * and only lower case letters, digits, '.', '_' and '-' are allowed. If + * empty, the server may choose to generate one instead. + * @type array<\Google\Protobuf\Api>|\Google\Protobuf\Internal\RepeatedField $apis + * A list of API interfaces exported by this service. Only the `name` field + * of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by + * the configuration author, as the remaining fields will be derived from the + * IDL during the normalization process. It is an error to specify an API + * interface here which cannot be resolved against the associated IDL files. + * @type array<\Google\Protobuf\Type>|\Google\Protobuf\Internal\RepeatedField $types + * A list of all proto message types included in this API service. + * Types referenced directly or indirectly by the `apis` are automatically + * included. Messages which are not referenced but shall be included, such as + * types used by the `google.protobuf.Any` type, should be listed here by + * name by the configuration author. Example: + * types: + * - name: google.protobuf.Int32 + * @type array<\Google\Protobuf\Enum>|\Google\Protobuf\Internal\RepeatedField $enums + * A list of all enum types included in this API service. Enums referenced + * directly or indirectly by the `apis` are automatically included. Enums + * which are not referenced but shall be included should be listed here by + * name by the configuration author. Example: + * enums: + * - name: google.someapi.v1.SomeEnum + * @type \Google\Api\Documentation $documentation + * Additional API documentation. + * @type \Google\Api\Backend $backend + * API backend configuration. + * @type \Google\Api\Http $http + * HTTP configuration. + * @type \Google\Api\Quota $quota + * Quota configuration. + * @type \Google\Api\Authentication $authentication + * Auth configuration. + * @type \Google\Api\Context $context + * Context configuration. + * @type \Google\Api\Usage $usage + * Configuration controlling usage of this service. + * @type array<\Google\Api\Endpoint>|\Google\Protobuf\Internal\RepeatedField $endpoints + * Configuration for network endpoints. If this is empty, then an endpoint + * with the same name as the service is automatically generated to service all + * defined APIs. + * @type \Google\Api\Control $control + * Configuration for the service control plane. + * @type array<\Google\Api\LogDescriptor>|\Google\Protobuf\Internal\RepeatedField $logs + * Defines the logs used by this service. + * @type array<\Google\Api\MetricDescriptor>|\Google\Protobuf\Internal\RepeatedField $metrics + * Defines the metrics used by this service. + * @type array<\Google\Api\MonitoredResourceDescriptor>|\Google\Protobuf\Internal\RepeatedField $monitored_resources + * Defines the monitored resources used by this service. This is required + * by the [Service.monitoring][google.api.Service.monitoring] and + * [Service.logging][google.api.Service.logging] configurations. + * @type \Google\Api\Billing $billing + * Billing configuration. + * @type \Google\Api\Logging $logging + * Logging configuration. + * @type \Google\Api\Monitoring $monitoring + * Monitoring configuration. + * @type \Google\Api\SystemParameters $system_parameters + * System parameter configuration. + * @type \Google\Api\SourceInfo $source_info + * Output only. The source information for this configuration if available. + * @type \Google\Api\Publishing $publishing + * Settings for [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from APIs defined as protocol buffers. + * @type \Google\Protobuf\UInt32Value $config_version + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Service::initOnce(); + parent::__construct($data); + } + + /** + * The service name, which is a DNS-like logical identifier for the + * service, such as `calendar.googleapis.com`. The service name + * typically goes through DNS verification to make sure the owner + * of the service also owns the DNS name. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The service name, which is a DNS-like logical identifier for the + * service, such as `calendar.googleapis.com`. The service name + * typically goes through DNS verification to make sure the owner + * of the service also owns the DNS name. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The product title for this service, it is the name displayed in Google + * Cloud Console. + * + * Generated from protobuf field string title = 2; + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * The product title for this service, it is the name displayed in Google + * Cloud Console. + * + * Generated from protobuf field string title = 2; + * @param string $var + * @return $this + */ + public function setTitle($var) + { + GPBUtil::checkString($var, True); + $this->title = $var; + + return $this; + } + + /** + * The Google project that owns this service. + * + * Generated from protobuf field string producer_project_id = 22; + * @return string + */ + public function getProducerProjectId() + { + return $this->producer_project_id; + } + + /** + * The Google project that owns this service. + * + * Generated from protobuf field string producer_project_id = 22; + * @param string $var + * @return $this + */ + public function setProducerProjectId($var) + { + GPBUtil::checkString($var, True); + $this->producer_project_id = $var; + + return $this; + } + + /** + * A unique ID for a specific instance of this message, typically assigned + * by the client for tracking purpose. Must be no longer than 63 characters + * and only lower case letters, digits, '.', '_' and '-' are allowed. If + * empty, the server may choose to generate one instead. + * + * Generated from protobuf field string id = 33; + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * A unique ID for a specific instance of this message, typically assigned + * by the client for tracking purpose. Must be no longer than 63 characters + * and only lower case letters, digits, '.', '_' and '-' are allowed. If + * empty, the server may choose to generate one instead. + * + * Generated from protobuf field string id = 33; + * @param string $var + * @return $this + */ + public function setId($var) + { + GPBUtil::checkString($var, True); + $this->id = $var; + + return $this; + } + + /** + * A list of API interfaces exported by this service. Only the `name` field + * of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by + * the configuration author, as the remaining fields will be derived from the + * IDL during the normalization process. It is an error to specify an API + * interface here which cannot be resolved against the associated IDL files. + * + * Generated from protobuf field repeated .google.protobuf.Api apis = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getApis() + { + return $this->apis; + } + + /** + * A list of API interfaces exported by this service. Only the `name` field + * of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by + * the configuration author, as the remaining fields will be derived from the + * IDL during the normalization process. It is an error to specify an API + * interface here which cannot be resolved against the associated IDL files. + * + * Generated from protobuf field repeated .google.protobuf.Api apis = 3; + * @param array<\Google\Protobuf\Api>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setApis($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Api::class); + $this->apis = $arr; + + return $this; + } + + /** + * A list of all proto message types included in this API service. + * Types referenced directly or indirectly by the `apis` are automatically + * included. Messages which are not referenced but shall be included, such as + * types used by the `google.protobuf.Any` type, should be listed here by + * name by the configuration author. Example: + * types: + * - name: google.protobuf.Int32 + * + * Generated from protobuf field repeated .google.protobuf.Type types = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getTypes() + { + return $this->types; + } + + /** + * A list of all proto message types included in this API service. + * Types referenced directly or indirectly by the `apis` are automatically + * included. Messages which are not referenced but shall be included, such as + * types used by the `google.protobuf.Any` type, should be listed here by + * name by the configuration author. Example: + * types: + * - name: google.protobuf.Int32 + * + * Generated from protobuf field repeated .google.protobuf.Type types = 4; + * @param array<\Google\Protobuf\Type>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setTypes($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Type::class); + $this->types = $arr; + + return $this; + } + + /** + * A list of all enum types included in this API service. Enums referenced + * directly or indirectly by the `apis` are automatically included. Enums + * which are not referenced but shall be included should be listed here by + * name by the configuration author. Example: + * enums: + * - name: google.someapi.v1.SomeEnum + * + * Generated from protobuf field repeated .google.protobuf.Enum enums = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getEnums() + { + return $this->enums; + } + + /** + * A list of all enum types included in this API service. Enums referenced + * directly or indirectly by the `apis` are automatically included. Enums + * which are not referenced but shall be included should be listed here by + * name by the configuration author. Example: + * enums: + * - name: google.someapi.v1.SomeEnum + * + * Generated from protobuf field repeated .google.protobuf.Enum enums = 5; + * @param array<\Google\Protobuf\Enum>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setEnums($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Enum::class); + $this->enums = $arr; + + return $this; + } + + /** + * Additional API documentation. + * + * Generated from protobuf field .google.api.Documentation documentation = 6; + * @return \Google\Api\Documentation|null + */ + public function getDocumentation() + { + return $this->documentation; + } + + public function hasDocumentation() + { + return isset($this->documentation); + } + + public function clearDocumentation() + { + unset($this->documentation); + } + + /** + * Additional API documentation. + * + * Generated from protobuf field .google.api.Documentation documentation = 6; + * @param \Google\Api\Documentation $var + * @return $this + */ + public function setDocumentation($var) + { + GPBUtil::checkMessage($var, \Google\Api\Documentation::class); + $this->documentation = $var; + + return $this; + } + + /** + * API backend configuration. + * + * Generated from protobuf field .google.api.Backend backend = 8; + * @return \Google\Api\Backend|null + */ + public function getBackend() + { + return $this->backend; + } + + public function hasBackend() + { + return isset($this->backend); + } + + public function clearBackend() + { + unset($this->backend); + } + + /** + * API backend configuration. + * + * Generated from protobuf field .google.api.Backend backend = 8; + * @param \Google\Api\Backend $var + * @return $this + */ + public function setBackend($var) + { + GPBUtil::checkMessage($var, \Google\Api\Backend::class); + $this->backend = $var; + + return $this; + } + + /** + * HTTP configuration. + * + * Generated from protobuf field .google.api.Http http = 9; + * @return \Google\Api\Http|null + */ + public function getHttp() + { + return $this->http; + } + + public function hasHttp() + { + return isset($this->http); + } + + public function clearHttp() + { + unset($this->http); + } + + /** + * HTTP configuration. + * + * Generated from protobuf field .google.api.Http http = 9; + * @param \Google\Api\Http $var + * @return $this + */ + public function setHttp($var) + { + GPBUtil::checkMessage($var, \Google\Api\Http::class); + $this->http = $var; + + return $this; + } + + /** + * Quota configuration. + * + * Generated from protobuf field .google.api.Quota quota = 10; + * @return \Google\Api\Quota|null + */ + public function getQuota() + { + return $this->quota; + } + + public function hasQuota() + { + return isset($this->quota); + } + + public function clearQuota() + { + unset($this->quota); + } + + /** + * Quota configuration. + * + * Generated from protobuf field .google.api.Quota quota = 10; + * @param \Google\Api\Quota $var + * @return $this + */ + public function setQuota($var) + { + GPBUtil::checkMessage($var, \Google\Api\Quota::class); + $this->quota = $var; + + return $this; + } + + /** + * Auth configuration. + * + * Generated from protobuf field .google.api.Authentication authentication = 11; + * @return \Google\Api\Authentication|null + */ + public function getAuthentication() + { + return $this->authentication; + } + + public function hasAuthentication() + { + return isset($this->authentication); + } + + public function clearAuthentication() + { + unset($this->authentication); + } + + /** + * Auth configuration. + * + * Generated from protobuf field .google.api.Authentication authentication = 11; + * @param \Google\Api\Authentication $var + * @return $this + */ + public function setAuthentication($var) + { + GPBUtil::checkMessage($var, \Google\Api\Authentication::class); + $this->authentication = $var; + + return $this; + } + + /** + * Context configuration. + * + * Generated from protobuf field .google.api.Context context = 12; + * @return \Google\Api\Context|null + */ + public function getContext() + { + return $this->context; + } + + public function hasContext() + { + return isset($this->context); + } + + public function clearContext() + { + unset($this->context); + } + + /** + * Context configuration. + * + * Generated from protobuf field .google.api.Context context = 12; + * @param \Google\Api\Context $var + * @return $this + */ + public function setContext($var) + { + GPBUtil::checkMessage($var, \Google\Api\Context::class); + $this->context = $var; + + return $this; + } + + /** + * Configuration controlling usage of this service. + * + * Generated from protobuf field .google.api.Usage usage = 15; + * @return \Google\Api\Usage|null + */ + public function getUsage() + { + return $this->usage; + } + + public function hasUsage() + { + return isset($this->usage); + } + + public function clearUsage() + { + unset($this->usage); + } + + /** + * Configuration controlling usage of this service. + * + * Generated from protobuf field .google.api.Usage usage = 15; + * @param \Google\Api\Usage $var + * @return $this + */ + public function setUsage($var) + { + GPBUtil::checkMessage($var, \Google\Api\Usage::class); + $this->usage = $var; + + return $this; + } + + /** + * Configuration for network endpoints. If this is empty, then an endpoint + * with the same name as the service is automatically generated to service all + * defined APIs. + * + * Generated from protobuf field repeated .google.api.Endpoint endpoints = 18; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getEndpoints() + { + return $this->endpoints; + } + + /** + * Configuration for network endpoints. If this is empty, then an endpoint + * with the same name as the service is automatically generated to service all + * defined APIs. + * + * Generated from protobuf field repeated .google.api.Endpoint endpoints = 18; + * @param array<\Google\Api\Endpoint>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setEndpoints($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\Endpoint::class); + $this->endpoints = $arr; + + return $this; + } + + /** + * Configuration for the service control plane. + * + * Generated from protobuf field .google.api.Control control = 21; + * @return \Google\Api\Control|null + */ + public function getControl() + { + return $this->control; + } + + public function hasControl() + { + return isset($this->control); + } + + public function clearControl() + { + unset($this->control); + } + + /** + * Configuration for the service control plane. + * + * Generated from protobuf field .google.api.Control control = 21; + * @param \Google\Api\Control $var + * @return $this + */ + public function setControl($var) + { + GPBUtil::checkMessage($var, \Google\Api\Control::class); + $this->control = $var; + + return $this; + } + + /** + * Defines the logs used by this service. + * + * Generated from protobuf field repeated .google.api.LogDescriptor logs = 23; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLogs() + { + return $this->logs; + } + + /** + * Defines the logs used by this service. + * + * Generated from protobuf field repeated .google.api.LogDescriptor logs = 23; + * @param array<\Google\Api\LogDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLogs($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\LogDescriptor::class); + $this->logs = $arr; + + return $this; + } + + /** + * Defines the metrics used by this service. + * + * Generated from protobuf field repeated .google.api.MetricDescriptor metrics = 24; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMetrics() + { + return $this->metrics; + } + + /** + * Defines the metrics used by this service. + * + * Generated from protobuf field repeated .google.api.MetricDescriptor metrics = 24; + * @param array<\Google\Api\MetricDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMetrics($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\MetricDescriptor::class); + $this->metrics = $arr; + + return $this; + } + + /** + * Defines the monitored resources used by this service. This is required + * by the [Service.monitoring][google.api.Service.monitoring] and + * [Service.logging][google.api.Service.logging] configurations. + * + * Generated from protobuf field repeated .google.api.MonitoredResourceDescriptor monitored_resources = 25; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMonitoredResources() + { + return $this->monitored_resources; + } + + /** + * Defines the monitored resources used by this service. This is required + * by the [Service.monitoring][google.api.Service.monitoring] and + * [Service.logging][google.api.Service.logging] configurations. + * + * Generated from protobuf field repeated .google.api.MonitoredResourceDescriptor monitored_resources = 25; + * @param array<\Google\Api\MonitoredResourceDescriptor>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMonitoredResources($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\MonitoredResourceDescriptor::class); + $this->monitored_resources = $arr; + + return $this; + } + + /** + * Billing configuration. + * + * Generated from protobuf field .google.api.Billing billing = 26; + * @return \Google\Api\Billing|null + */ + public function getBilling() + { + return $this->billing; + } + + public function hasBilling() + { + return isset($this->billing); + } + + public function clearBilling() + { + unset($this->billing); + } + + /** + * Billing configuration. + * + * Generated from protobuf field .google.api.Billing billing = 26; + * @param \Google\Api\Billing $var + * @return $this + */ + public function setBilling($var) + { + GPBUtil::checkMessage($var, \Google\Api\Billing::class); + $this->billing = $var; + + return $this; + } + + /** + * Logging configuration. + * + * Generated from protobuf field .google.api.Logging logging = 27; + * @return \Google\Api\Logging|null + */ + public function getLogging() + { + return $this->logging; + } + + public function hasLogging() + { + return isset($this->logging); + } + + public function clearLogging() + { + unset($this->logging); + } + + /** + * Logging configuration. + * + * Generated from protobuf field .google.api.Logging logging = 27; + * @param \Google\Api\Logging $var + * @return $this + */ + public function setLogging($var) + { + GPBUtil::checkMessage($var, \Google\Api\Logging::class); + $this->logging = $var; + + return $this; + } + + /** + * Monitoring configuration. + * + * Generated from protobuf field .google.api.Monitoring monitoring = 28; + * @return \Google\Api\Monitoring|null + */ + public function getMonitoring() + { + return $this->monitoring; + } + + public function hasMonitoring() + { + return isset($this->monitoring); + } + + public function clearMonitoring() + { + unset($this->monitoring); + } + + /** + * Monitoring configuration. + * + * Generated from protobuf field .google.api.Monitoring monitoring = 28; + * @param \Google\Api\Monitoring $var + * @return $this + */ + public function setMonitoring($var) + { + GPBUtil::checkMessage($var, \Google\Api\Monitoring::class); + $this->monitoring = $var; + + return $this; + } + + /** + * System parameter configuration. + * + * Generated from protobuf field .google.api.SystemParameters system_parameters = 29; + * @return \Google\Api\SystemParameters|null + */ + public function getSystemParameters() + { + return $this->system_parameters; + } + + public function hasSystemParameters() + { + return isset($this->system_parameters); + } + + public function clearSystemParameters() + { + unset($this->system_parameters); + } + + /** + * System parameter configuration. + * + * Generated from protobuf field .google.api.SystemParameters system_parameters = 29; + * @param \Google\Api\SystemParameters $var + * @return $this + */ + public function setSystemParameters($var) + { + GPBUtil::checkMessage($var, \Google\Api\SystemParameters::class); + $this->system_parameters = $var; + + return $this; + } + + /** + * Output only. The source information for this configuration if available. + * + * Generated from protobuf field .google.api.SourceInfo source_info = 37; + * @return \Google\Api\SourceInfo|null + */ + public function getSourceInfo() + { + return $this->source_info; + } + + public function hasSourceInfo() + { + return isset($this->source_info); + } + + public function clearSourceInfo() + { + unset($this->source_info); + } + + /** + * Output only. The source information for this configuration if available. + * + * Generated from protobuf field .google.api.SourceInfo source_info = 37; + * @param \Google\Api\SourceInfo $var + * @return $this + */ + public function setSourceInfo($var) + { + GPBUtil::checkMessage($var, \Google\Api\SourceInfo::class); + $this->source_info = $var; + + return $this; + } + + /** + * Settings for [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from APIs defined as protocol buffers. + * + * Generated from protobuf field .google.api.Publishing publishing = 45; + * @return \Google\Api\Publishing|null + */ + public function getPublishing() + { + return $this->publishing; + } + + public function hasPublishing() + { + return isset($this->publishing); + } + + public function clearPublishing() + { + unset($this->publishing); + } + + /** + * Settings for [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from APIs defined as protocol buffers. + * + * Generated from protobuf field .google.api.Publishing publishing = 45; + * @param \Google\Api\Publishing $var + * @return $this + */ + public function setPublishing($var) + { + GPBUtil::checkMessage($var, \Google\Api\Publishing::class); + $this->publishing = $var; + + return $this; + } + + /** + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * + * Generated from protobuf field .google.protobuf.UInt32Value config_version = 20; + * @return \Google\Protobuf\UInt32Value|null + */ + public function getConfigVersion() + { + return $this->config_version; + } + + public function hasConfigVersion() + { + return isset($this->config_version); + } + + public function clearConfigVersion() + { + unset($this->config_version); + } + + /** + * Returns the unboxed value from getConfigVersion() + + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * + * Generated from protobuf field .google.protobuf.UInt32Value config_version = 20; + * @return int|null + */ + public function getConfigVersionUnwrapped() + { + return $this->readWrapperValue("config_version"); + } + + /** + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * + * Generated from protobuf field .google.protobuf.UInt32Value config_version = 20; + * @param \Google\Protobuf\UInt32Value $var + * @return $this + */ + public function setConfigVersion($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\UInt32Value::class); + $this->config_version = $var; + + return $this; + } + + /** + * Sets the field by wrapping a primitive type in a Google\Protobuf\UInt32Value object. + + * Obsolete. Do not use. + * This field has no semantic meaning. The service config compiler always + * sets this field to `3`. + * + * Generated from protobuf field .google.protobuf.UInt32Value config_version = 20; + * @param int|null $var + * @return $this + */ + public function setConfigVersionUnwrapped($var) + { + $this->writeWrapperValue("config_version", $var); + return $this;} + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/SourceInfo.php b/lib/Google/vendor/google/common-protos/src/Api/SourceInfo.php new file mode 100644 index 000000000..503f317bc --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/SourceInfo.php @@ -0,0 +1,67 @@ +google.api.SourceInfo + */ +class SourceInfo extends \Google\Protobuf\Internal\Message +{ + /** + * All files used during config generation. + * + * Generated from protobuf field repeated .google.protobuf.Any source_files = 1; + */ + private $source_files; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $source_files + * All files used during config generation. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\SourceInfo::initOnce(); + parent::__construct($data); + } + + /** + * All files used during config generation. + * + * Generated from protobuf field repeated .google.protobuf.Any source_files = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getSourceFiles() + { + return $this->source_files; + } + + /** + * All files used during config generation. + * + * Generated from protobuf field repeated .google.protobuf.Any source_files = 1; + * @param array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setSourceFiles($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Any::class); + $this->source_files = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/SystemParameter.php b/lib/Google/vendor/google/common-protos/src/Api/SystemParameter.php new file mode 100644 index 000000000..e6828a272 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/SystemParameter.php @@ -0,0 +1,145 @@ +google.api.SystemParameter + */ +class SystemParameter extends \Google\Protobuf\Internal\Message +{ + /** + * Define the name of the parameter, such as "api_key" . It is case sensitive. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * Define the HTTP header name to use for the parameter. It is case + * insensitive. + * + * Generated from protobuf field string http_header = 2; + */ + protected $http_header = ''; + /** + * Define the URL query parameter name to use for the parameter. It is case + * sensitive. + * + * Generated from protobuf field string url_query_parameter = 3; + */ + protected $url_query_parameter = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Define the name of the parameter, such as "api_key" . It is case sensitive. + * @type string $http_header + * Define the HTTP header name to use for the parameter. It is case + * insensitive. + * @type string $url_query_parameter + * Define the URL query parameter name to use for the parameter. It is case + * sensitive. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\SystemParameter::initOnce(); + parent::__construct($data); + } + + /** + * Define the name of the parameter, such as "api_key" . It is case sensitive. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Define the name of the parameter, such as "api_key" . It is case sensitive. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Define the HTTP header name to use for the parameter. It is case + * insensitive. + * + * Generated from protobuf field string http_header = 2; + * @return string + */ + public function getHttpHeader() + { + return $this->http_header; + } + + /** + * Define the HTTP header name to use for the parameter. It is case + * insensitive. + * + * Generated from protobuf field string http_header = 2; + * @param string $var + * @return $this + */ + public function setHttpHeader($var) + { + GPBUtil::checkString($var, True); + $this->http_header = $var; + + return $this; + } + + /** + * Define the URL query parameter name to use for the parameter. It is case + * sensitive. + * + * Generated from protobuf field string url_query_parameter = 3; + * @return string + */ + public function getUrlQueryParameter() + { + return $this->url_query_parameter; + } + + /** + * Define the URL query parameter name to use for the parameter. It is case + * sensitive. + * + * Generated from protobuf field string url_query_parameter = 3; + * @param string $var + * @return $this + */ + public function setUrlQueryParameter($var) + { + GPBUtil::checkString($var, True); + $this->url_query_parameter = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/SystemParameterRule.php b/lib/Google/vendor/google/common-protos/src/Api/SystemParameterRule.php new file mode 100644 index 000000000..b2b475ce7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/SystemParameterRule.php @@ -0,0 +1,130 @@ +google.api.SystemParameterRule + */ +class SystemParameterRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * Define parameters. Multiple names may be defined for a parameter. + * For a given method call, only one of them should be used. If multiple + * names are used the behavior is implementation-dependent. + * If none of the specified names are present the behavior is + * parameter-dependent. + * + * Generated from protobuf field repeated .google.api.SystemParameter parameters = 2; + */ + private $parameters; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type array<\Google\Api\SystemParameter>|\Google\Protobuf\Internal\RepeatedField $parameters + * Define parameters. Multiple names may be defined for a parameter. + * For a given method call, only one of them should be used. If multiple + * names are used the behavior is implementation-dependent. + * If none of the specified names are present the behavior is + * parameter-dependent. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\SystemParameter::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * Define parameters. Multiple names may be defined for a parameter. + * For a given method call, only one of them should be used. If multiple + * names are used the behavior is implementation-dependent. + * If none of the specified names are present the behavior is + * parameter-dependent. + * + * Generated from protobuf field repeated .google.api.SystemParameter parameters = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Define parameters. Multiple names may be defined for a parameter. + * For a given method call, only one of them should be used. If multiple + * names are used the behavior is implementation-dependent. + * If none of the specified names are present the behavior is + * parameter-dependent. + * + * Generated from protobuf field repeated .google.api.SystemParameter parameters = 2; + * @param array<\Google\Api\SystemParameter>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setParameters($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\SystemParameter::class); + $this->parameters = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/SystemParameters.php b/lib/Google/vendor/google/common-protos/src/Api/SystemParameters.php new file mode 100644 index 000000000..04a674c87 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/SystemParameters.php @@ -0,0 +1,155 @@ +google.api.SystemParameters + */ +class SystemParameters extends \Google\Protobuf\Internal\Message +{ + /** + * Define system parameters. + * The parameters defined here will override the default parameters + * implemented by the system. If this field is missing from the service + * config, default system parameters will be used. Default system parameters + * and names is implementation-dependent. + * Example: define api key for all methods + * system_parameters + * rules: + * - selector: "*" + * parameters: + * - name: api_key + * url_query_parameter: api_key + * Example: define 2 api key names for a specific method. + * system_parameters + * rules: + * - selector: "/ListShelves" + * parameters: + * - name: api_key + * http_header: Api-Key1 + * - name: api_key + * http_header: Api-Key2 + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.SystemParameterRule rules = 1; + */ + private $rules; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\SystemParameterRule>|\Google\Protobuf\Internal\RepeatedField $rules + * Define system parameters. + * The parameters defined here will override the default parameters + * implemented by the system. If this field is missing from the service + * config, default system parameters will be used. Default system parameters + * and names is implementation-dependent. + * Example: define api key for all methods + * system_parameters + * rules: + * - selector: "*" + * parameters: + * - name: api_key + * url_query_parameter: api_key + * Example: define 2 api key names for a specific method. + * system_parameters + * rules: + * - selector: "/ListShelves" + * parameters: + * - name: api_key + * http_header: Api-Key1 + * - name: api_key + * http_header: Api-Key2 + * **NOTE:** All service configuration rules follow "last one wins" order. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\SystemParameter::initOnce(); + parent::__construct($data); + } + + /** + * Define system parameters. + * The parameters defined here will override the default parameters + * implemented by the system. If this field is missing from the service + * config, default system parameters will be used. Default system parameters + * and names is implementation-dependent. + * Example: define api key for all methods + * system_parameters + * rules: + * - selector: "*" + * parameters: + * - name: api_key + * url_query_parameter: api_key + * Example: define 2 api key names for a specific method. + * system_parameters + * rules: + * - selector: "/ListShelves" + * parameters: + * - name: api_key + * http_header: Api-Key1 + * - name: api_key + * http_header: Api-Key2 + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.SystemParameterRule rules = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * Define system parameters. + * The parameters defined here will override the default parameters + * implemented by the system. If this field is missing from the service + * config, default system parameters will be used. Default system parameters + * and names is implementation-dependent. + * Example: define api key for all methods + * system_parameters + * rules: + * - selector: "*" + * parameters: + * - name: api_key + * url_query_parameter: api_key + * Example: define 2 api key names for a specific method. + * system_parameters + * rules: + * - selector: "/ListShelves" + * parameters: + * - name: api_key + * http_header: Api-Key1 + * - name: api_key + * http_header: Api-Key2 + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.SystemParameterRule rules = 1; + * @param array<\Google\Api\SystemParameterRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\SystemParameterRule::class); + $this->rules = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/TypeReference.php b/lib/Google/vendor/google/common-protos/src/Api/TypeReference.php new file mode 100644 index 000000000..1ce287b6c --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/TypeReference.php @@ -0,0 +1,91 @@ +google.api.TypeReference + */ +class TypeReference extends \Google\Protobuf\Internal\Message +{ + /** + * The name of the type that the annotated, generic field may represent. + * If the type is in the same protobuf package, the value can be the simple + * message name e.g., `"MyMessage"`. Otherwise, the value must be the + * fully-qualified message name e.g., `"google.library.v1.Book"`. + * If the type(s) are unknown to the service (e.g. the field accepts generic + * user input), use the wildcard `"*"` to denote this behavior. + * See [AIP-202](https://google.aip.dev/202#type-references) for more details. + * + * Generated from protobuf field string type_name = 1; + */ + protected $type_name = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type_name + * The name of the type that the annotated, generic field may represent. + * If the type is in the same protobuf package, the value can be the simple + * message name e.g., `"MyMessage"`. Otherwise, the value must be the + * fully-qualified message name e.g., `"google.library.v1.Book"`. + * If the type(s) are unknown to the service (e.g. the field accepts generic + * user input), use the wildcard `"*"` to denote this behavior. + * See [AIP-202](https://google.aip.dev/202#type-references) for more details. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\FieldInfo::initOnce(); + parent::__construct($data); + } + + /** + * The name of the type that the annotated, generic field may represent. + * If the type is in the same protobuf package, the value can be the simple + * message name e.g., `"MyMessage"`. Otherwise, the value must be the + * fully-qualified message name e.g., `"google.library.v1.Book"`. + * If the type(s) are unknown to the service (e.g. the field accepts generic + * user input), use the wildcard `"*"` to denote this behavior. + * See [AIP-202](https://google.aip.dev/202#type-references) for more details. + * + * Generated from protobuf field string type_name = 1; + * @return string + */ + public function getTypeName() + { + return $this->type_name; + } + + /** + * The name of the type that the annotated, generic field may represent. + * If the type is in the same protobuf package, the value can be the simple + * message name e.g., `"MyMessage"`. Otherwise, the value must be the + * fully-qualified message name e.g., `"google.library.v1.Book"`. + * If the type(s) are unknown to the service (e.g. the field accepts generic + * user input), use the wildcard `"*"` to denote this behavior. + * See [AIP-202](https://google.aip.dev/202#type-references) for more details. + * + * Generated from protobuf field string type_name = 1; + * @param string $var + * @return $this + */ + public function setTypeName($var) + { + GPBUtil::checkString($var, True); + $this->type_name = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Usage.php b/lib/Google/vendor/google/common-protos/src/Api/Usage.php new file mode 100644 index 000000000..0ebe664e1 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Usage.php @@ -0,0 +1,191 @@ +google.api.Usage + */ +class Usage extends \Google\Protobuf\Internal\Message +{ + /** + * Requirements that must be satisfied before a consumer project can use the + * service. Each requirement is of the form /; + * for example 'serviceusage.googleapis.com/billing-enabled'. + * For Google APIs, a Terms of Service requirement must be included here. + * Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud". + * Other Google APIs should include + * "serviceusage.googleapis.com/tos/universal". Additional ToS can be + * included based on the business needs. + * + * Generated from protobuf field repeated string requirements = 1; + */ + private $requirements; + /** + * A list of usage rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.UsageRule rules = 6; + */ + private $rules; + /** + * The full resource name of a channel used for sending notifications to the + * service producer. + * Google Service Management currently only supports + * [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification + * channel. To use Google Cloud Pub/Sub as the channel, this must be the name + * of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format + * documented in https://cloud.google.com/pubsub/docs/overview. + * + * Generated from protobuf field string producer_notification_channel = 7; + */ + protected $producer_notification_channel = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\RepeatedField $requirements + * Requirements that must be satisfied before a consumer project can use the + * service. Each requirement is of the form /; + * for example 'serviceusage.googleapis.com/billing-enabled'. + * For Google APIs, a Terms of Service requirement must be included here. + * Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud". + * Other Google APIs should include + * "serviceusage.googleapis.com/tos/universal". Additional ToS can be + * included based on the business needs. + * @type array<\Google\Api\UsageRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of usage rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * @type string $producer_notification_channel + * The full resource name of a channel used for sending notifications to the + * service producer. + * Google Service Management currently only supports + * [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification + * channel. To use Google Cloud Pub/Sub as the channel, this must be the name + * of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format + * documented in https://cloud.google.com/pubsub/docs/overview. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Usage::initOnce(); + parent::__construct($data); + } + + /** + * Requirements that must be satisfied before a consumer project can use the + * service. Each requirement is of the form /; + * for example 'serviceusage.googleapis.com/billing-enabled'. + * For Google APIs, a Terms of Service requirement must be included here. + * Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud". + * Other Google APIs should include + * "serviceusage.googleapis.com/tos/universal". Additional ToS can be + * included based on the business needs. + * + * Generated from protobuf field repeated string requirements = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRequirements() + { + return $this->requirements; + } + + /** + * Requirements that must be satisfied before a consumer project can use the + * service. Each requirement is of the form /; + * for example 'serviceusage.googleapis.com/billing-enabled'. + * For Google APIs, a Terms of Service requirement must be included here. + * Google Cloud APIs must include "serviceusage.googleapis.com/tos/cloud". + * Other Google APIs should include + * "serviceusage.googleapis.com/tos/universal". Additional ToS can be + * included based on the business needs. + * + * Generated from protobuf field repeated string requirements = 1; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRequirements($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->requirements = $arr; + + return $this; + } + + /** + * A list of usage rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.UsageRule rules = 6; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of usage rules that apply to individual API methods. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.UsageRule rules = 6; + * @param array<\Google\Api\UsageRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\UsageRule::class); + $this->rules = $arr; + + return $this; + } + + /** + * The full resource name of a channel used for sending notifications to the + * service producer. + * Google Service Management currently only supports + * [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification + * channel. To use Google Cloud Pub/Sub as the channel, this must be the name + * of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format + * documented in https://cloud.google.com/pubsub/docs/overview. + * + * Generated from protobuf field string producer_notification_channel = 7; + * @return string + */ + public function getProducerNotificationChannel() + { + return $this->producer_notification_channel; + } + + /** + * The full resource name of a channel used for sending notifications to the + * service producer. + * Google Service Management currently only supports + * [Google Cloud Pub/Sub](https://cloud.google.com/pubsub) as a notification + * channel. To use Google Cloud Pub/Sub as the channel, this must be the name + * of a Cloud Pub/Sub topic that uses the Cloud Pub/Sub topic name format + * documented in https://cloud.google.com/pubsub/docs/overview. + * + * Generated from protobuf field string producer_notification_channel = 7; + * @param string $var + * @return $this + */ + public function setProducerNotificationChannel($var) + { + GPBUtil::checkString($var, True); + $this->producer_notification_channel = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/UsageRule.php b/lib/Google/vendor/google/common-protos/src/Api/UsageRule.php new file mode 100644 index 000000000..fcd4f54cc --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/UsageRule.php @@ -0,0 +1,180 @@ +google.api.UsageRule + */ +class UsageRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * If true, the selected method allows unregistered calls, e.g. calls + * that don't identify any user or application. + * + * Generated from protobuf field bool allow_unregistered_calls = 2; + */ + protected $allow_unregistered_calls = false; + /** + * If true, the selected method should skip service control and the control + * plane features, such as quota and billing, will not be available. + * This flag is used by Google Cloud Endpoints to bypass checks for internal + * methods, such as service health check methods. + * + * Generated from protobuf field bool skip_service_control = 3; + */ + protected $skip_service_control = false; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type bool $allow_unregistered_calls + * If true, the selected method allows unregistered calls, e.g. calls + * that don't identify any user or application. + * @type bool $skip_service_control + * If true, the selected method should skip service control and the control + * plane features, such as quota and billing, will not be available. + * This flag is used by Google Cloud Endpoints to bypass checks for internal + * methods, such as service health check methods. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Usage::initOnce(); + parent::__construct($data); + } + + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects the methods to which this rule applies. Use '*' to indicate all + * methods in all APIs. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * If true, the selected method allows unregistered calls, e.g. calls + * that don't identify any user or application. + * + * Generated from protobuf field bool allow_unregistered_calls = 2; + * @return bool + */ + public function getAllowUnregisteredCalls() + { + return $this->allow_unregistered_calls; + } + + /** + * If true, the selected method allows unregistered calls, e.g. calls + * that don't identify any user or application. + * + * Generated from protobuf field bool allow_unregistered_calls = 2; + * @param bool $var + * @return $this + */ + public function setAllowUnregisteredCalls($var) + { + GPBUtil::checkBool($var); + $this->allow_unregistered_calls = $var; + + return $this; + } + + /** + * If true, the selected method should skip service control and the control + * plane features, such as quota and billing, will not be available. + * This flag is used by Google Cloud Endpoints to bypass checks for internal + * methods, such as service health check methods. + * + * Generated from protobuf field bool skip_service_control = 3; + * @return bool + */ + public function getSkipServiceControl() + { + return $this->skip_service_control; + } + + /** + * If true, the selected method should skip service control and the control + * plane features, such as quota and billing, will not be available. + * This flag is used by Google Cloud Endpoints to bypass checks for internal + * methods, such as service health check methods. + * + * Generated from protobuf field bool skip_service_control = 3; + * @param bool $var + * @return $this + */ + public function setSkipServiceControl($var) + { + GPBUtil::checkBool($var); + $this->skip_service_control = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/Visibility.php b/lib/Google/vendor/google/common-protos/src/Api/Visibility.php new file mode 100644 index 000000000..b232df6c9 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/Visibility.php @@ -0,0 +1,88 @@ +google.api.Visibility + */ +class Visibility extends \Google\Protobuf\Internal\Message +{ + /** + * A list of visibility rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.VisibilityRule rules = 1; + */ + private $rules; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Api\VisibilityRule>|\Google\Protobuf\Internal\RepeatedField $rules + * A list of visibility rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Visibility::initOnce(); + parent::__construct($data); + } + + /** + * A list of visibility rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.VisibilityRule rules = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRules() + { + return $this->rules; + } + + /** + * A list of visibility rules that apply to individual API elements. + * **NOTE:** All service configuration rules follow "last one wins" order. + * + * Generated from protobuf field repeated .google.api.VisibilityRule rules = 1; + * @param array<\Google\Api\VisibilityRule>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRules($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Api\VisibilityRule::class); + $this->rules = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Api/VisibilityRule.php b/lib/Google/vendor/google/common-protos/src/Api/VisibilityRule.php new file mode 100644 index 000000000..74c522fa6 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Api/VisibilityRule.php @@ -0,0 +1,150 @@ +google.api.VisibilityRule + */ +class VisibilityRule extends \Google\Protobuf\Internal\Message +{ + /** + * Selects methods, messages, fields, enums, etc. to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + */ + protected $selector = ''; + /** + * A comma-separated list of visibility labels that apply to the `selector`. + * Any of the listed labels can be used to grant the visibility. + * If a rule has multiple labels, removing one of the labels but not all of + * them can break clients. + * Example: + * visibility: + * rules: + * - selector: google.calendar.Calendar.EnhancedSearch + * restriction: INTERNAL, PREVIEW + * Removing INTERNAL from this restriction will break clients that rely on + * this method and only had access to it through INTERNAL. + * + * Generated from protobuf field string restriction = 2; + */ + protected $restriction = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $selector + * Selects methods, messages, fields, enums, etc. to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * @type string $restriction + * A comma-separated list of visibility labels that apply to the `selector`. + * Any of the listed labels can be used to grant the visibility. + * If a rule has multiple labels, removing one of the labels but not all of + * them can break clients. + * Example: + * visibility: + * rules: + * - selector: google.calendar.Calendar.EnhancedSearch + * restriction: INTERNAL, PREVIEW + * Removing INTERNAL from this restriction will break clients that rely on + * this method and only had access to it through INTERNAL. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Api\Visibility::initOnce(); + parent::__construct($data); + } + + /** + * Selects methods, messages, fields, enums, etc. to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @return string + */ + public function getSelector() + { + return $this->selector; + } + + /** + * Selects methods, messages, fields, enums, etc. to which this rule applies. + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + * + * Generated from protobuf field string selector = 1; + * @param string $var + * @return $this + */ + public function setSelector($var) + { + GPBUtil::checkString($var, True); + $this->selector = $var; + + return $this; + } + + /** + * A comma-separated list of visibility labels that apply to the `selector`. + * Any of the listed labels can be used to grant the visibility. + * If a rule has multiple labels, removing one of the labels but not all of + * them can break clients. + * Example: + * visibility: + * rules: + * - selector: google.calendar.Calendar.EnhancedSearch + * restriction: INTERNAL, PREVIEW + * Removing INTERNAL from this restriction will break clients that rely on + * this method and only had access to it through INTERNAL. + * + * Generated from protobuf field string restriction = 2; + * @return string + */ + public function getRestriction() + { + return $this->restriction; + } + + /** + * A comma-separated list of visibility labels that apply to the `selector`. + * Any of the listed labels can be used to grant the visibility. + * If a rule has multiple labels, removing one of the labels but not all of + * them can break clients. + * Example: + * visibility: + * rules: + * - selector: google.calendar.Calendar.EnhancedSearch + * restriction: INTERNAL, PREVIEW + * Removing INTERNAL from this restriction will break clients that rely on + * this method and only had access to it through INTERNAL. + * + * Generated from protobuf field string restriction = 2; + * @param string $var + * @return $this + */ + public function setRestriction($var) + { + GPBUtil::checkString($var, True); + $this->restriction = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfig.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfig.php new file mode 100644 index 000000000..b2594319e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfig.php @@ -0,0 +1,155 @@ +google.iam.v1.AuditConfig + */ +class AuditConfig extends \Google\Protobuf\Internal\Message +{ + /** + * Specifies a service that will be enabled for audit logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * + * Generated from protobuf field string service = 1; + */ + protected $service = ''; + /** + * The configuration for logging of each type of permission. + * + * Generated from protobuf field repeated .google.iam.v1.AuditLogConfig audit_log_configs = 3; + */ + private $audit_log_configs; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $service + * Specifies a service that will be enabled for audit logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * @type array<\Google\Cloud\Iam\V1\AuditLogConfig>|\Google\Protobuf\Internal\RepeatedField $audit_log_configs + * The configuration for logging of each type of permission. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * Specifies a service that will be enabled for audit logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * + * Generated from protobuf field string service = 1; + * @return string + */ + public function getService() + { + return $this->service; + } + + /** + * Specifies a service that will be enabled for audit logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * + * Generated from protobuf field string service = 1; + * @param string $var + * @return $this + */ + public function setService($var) + { + GPBUtil::checkString($var, True); + $this->service = $var; + + return $this; + } + + /** + * The configuration for logging of each type of permission. + * + * Generated from protobuf field repeated .google.iam.v1.AuditLogConfig audit_log_configs = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAuditLogConfigs() + { + return $this->audit_log_configs; + } + + /** + * The configuration for logging of each type of permission. + * + * Generated from protobuf field repeated .google.iam.v1.AuditLogConfig audit_log_configs = 3; + * @param array<\Google\Cloud\Iam\V1\AuditLogConfig>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAuditLogConfigs($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Iam\V1\AuditLogConfig::class); + $this->audit_log_configs = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta.php new file mode 100644 index 000000000..02c622ef2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta.php @@ -0,0 +1,202 @@ +google.iam.v1.AuditConfigDelta + */ +class AuditConfigDelta extends \Google\Protobuf\Internal\Message +{ + /** + * The action that was performed on an audit configuration in a policy. + * Required + * + * Generated from protobuf field .google.iam.v1.AuditConfigDelta.Action action = 1; + */ + protected $action = 0; + /** + * Specifies a service that was configured for Cloud Audit Logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * Required + * + * Generated from protobuf field string service = 2; + */ + protected $service = ''; + /** + * A single identity that is exempted from "data access" audit + * logging for the `service` specified above. + * Follows the same format of Binding.members. + * + * Generated from protobuf field string exempted_member = 3; + */ + protected $exempted_member = ''; + /** + * Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always + * enabled, and cannot be configured. + * Required + * + * Generated from protobuf field string log_type = 4; + */ + protected $log_type = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $action + * The action that was performed on an audit configuration in a policy. + * Required + * @type string $service + * Specifies a service that was configured for Cloud Audit Logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * Required + * @type string $exempted_member + * A single identity that is exempted from "data access" audit + * logging for the `service` specified above. + * Follows the same format of Binding.members. + * @type string $log_type + * Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always + * enabled, and cannot be configured. + * Required + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * The action that was performed on an audit configuration in a policy. + * Required + * + * Generated from protobuf field .google.iam.v1.AuditConfigDelta.Action action = 1; + * @return int + */ + public function getAction() + { + return $this->action; + } + + /** + * The action that was performed on an audit configuration in a policy. + * Required + * + * Generated from protobuf field .google.iam.v1.AuditConfigDelta.Action action = 1; + * @param int $var + * @return $this + */ + public function setAction($var) + { + GPBUtil::checkEnum($var, \Google\Cloud\Iam\V1\AuditConfigDelta\Action::class); + $this->action = $var; + + return $this; + } + + /** + * Specifies a service that was configured for Cloud Audit Logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * Required + * + * Generated from protobuf field string service = 2; + * @return string + */ + public function getService() + { + return $this->service; + } + + /** + * Specifies a service that was configured for Cloud Audit Logging. + * For example, `storage.googleapis.com`, `cloudsql.googleapis.com`. + * `allServices` is a special value that covers all services. + * Required + * + * Generated from protobuf field string service = 2; + * @param string $var + * @return $this + */ + public function setService($var) + { + GPBUtil::checkString($var, True); + $this->service = $var; + + return $this; + } + + /** + * A single identity that is exempted from "data access" audit + * logging for the `service` specified above. + * Follows the same format of Binding.members. + * + * Generated from protobuf field string exempted_member = 3; + * @return string + */ + public function getExemptedMember() + { + return $this->exempted_member; + } + + /** + * A single identity that is exempted from "data access" audit + * logging for the `service` specified above. + * Follows the same format of Binding.members. + * + * Generated from protobuf field string exempted_member = 3; + * @param string $var + * @return $this + */ + public function setExemptedMember($var) + { + GPBUtil::checkString($var, True); + $this->exempted_member = $var; + + return $this; + } + + /** + * Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always + * enabled, and cannot be configured. + * Required + * + * Generated from protobuf field string log_type = 4; + * @return string + */ + public function getLogType() + { + return $this->log_type; + } + + /** + * Specifies the log_type that was be enabled. ADMIN_ACTIVITY is always + * enabled, and cannot be configured. + * Required + * + * Generated from protobuf field string log_type = 4; + * @param string $var + * @return $this + */ + public function setLogType($var) + { + GPBUtil::checkString($var, True); + $this->log_type = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta/Action.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta/Action.php new file mode 100644 index 000000000..ffce349b2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditConfigDelta/Action.php @@ -0,0 +1,62 @@ +google.iam.v1.AuditConfigDelta.Action + */ +class Action +{ + /** + * Unspecified. + * + * Generated from protobuf enum ACTION_UNSPECIFIED = 0; + */ + const ACTION_UNSPECIFIED = 0; + /** + * Addition of an audit configuration. + * + * Generated from protobuf enum ADD = 1; + */ + const ADD = 1; + /** + * Removal of an audit configuration. + * + * Generated from protobuf enum REMOVE = 2; + */ + const REMOVE = 2; + + private static $valueToName = [ + self::ACTION_UNSPECIFIED => 'ACTION_UNSPECIFIED', + self::ADD => 'ADD', + self::REMOVE => 'REMOVE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig.php new file mode 100644 index 000000000..83b994045 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig.php @@ -0,0 +1,129 @@ +google.iam.v1.AuditLogConfig + */ +class AuditLogConfig extends \Google\Protobuf\Internal\Message +{ + /** + * The log type that this config enables. + * + * Generated from protobuf field .google.iam.v1.AuditLogConfig.LogType log_type = 1; + */ + protected $log_type = 0; + /** + * Specifies the identities that do not cause logging for this type of + * permission. + * Follows the same format of + * [Binding.members][google.iam.v1.Binding.members]. + * + * Generated from protobuf field repeated string exempted_members = 2; + */ + private $exempted_members; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $log_type + * The log type that this config enables. + * @type array|\Google\Protobuf\Internal\RepeatedField $exempted_members + * Specifies the identities that do not cause logging for this type of + * permission. + * Follows the same format of + * [Binding.members][google.iam.v1.Binding.members]. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * The log type that this config enables. + * + * Generated from protobuf field .google.iam.v1.AuditLogConfig.LogType log_type = 1; + * @return int + */ + public function getLogType() + { + return $this->log_type; + } + + /** + * The log type that this config enables. + * + * Generated from protobuf field .google.iam.v1.AuditLogConfig.LogType log_type = 1; + * @param int $var + * @return $this + */ + public function setLogType($var) + { + GPBUtil::checkEnum($var, \Google\Cloud\Iam\V1\AuditLogConfig\LogType::class); + $this->log_type = $var; + + return $this; + } + + /** + * Specifies the identities that do not cause logging for this type of + * permission. + * Follows the same format of + * [Binding.members][google.iam.v1.Binding.members]. + * + * Generated from protobuf field repeated string exempted_members = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getExemptedMembers() + { + return $this->exempted_members; + } + + /** + * Specifies the identities that do not cause logging for this type of + * permission. + * Follows the same format of + * [Binding.members][google.iam.v1.Binding.members]. + * + * Generated from protobuf field repeated string exempted_members = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setExemptedMembers($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->exempted_members = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig/LogType.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig/LogType.php new file mode 100644 index 000000000..f78a01bfb --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/AuditLogConfig/LogType.php @@ -0,0 +1,70 @@ +google.iam.v1.AuditLogConfig.LogType + */ +class LogType +{ + /** + * Default case. Should never be this. + * + * Generated from protobuf enum LOG_TYPE_UNSPECIFIED = 0; + */ + const LOG_TYPE_UNSPECIFIED = 0; + /** + * Admin reads. Example: CloudIAM getIamPolicy + * + * Generated from protobuf enum ADMIN_READ = 1; + */ + const ADMIN_READ = 1; + /** + * Data writes. Example: CloudSQL Users create + * + * Generated from protobuf enum DATA_WRITE = 2; + */ + const DATA_WRITE = 2; + /** + * Data reads. Example: CloudSQL Users list + * + * Generated from protobuf enum DATA_READ = 3; + */ + const DATA_READ = 3; + + private static $valueToName = [ + self::LOG_TYPE_UNSPECIFIED => 'LOG_TYPE_UNSPECIFIED', + self::ADMIN_READ => 'ADMIN_READ', + self::DATA_WRITE => 'DATA_WRITE', + self::DATA_READ => 'DATA_READ', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Binding.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Binding.php new file mode 100644 index 000000000..af64546bd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Binding.php @@ -0,0 +1,301 @@ +google.iam.v1.Binding + */ +class Binding extends \Google\Protobuf\Internal\Message +{ + /** + * Role that is assigned to the list of `members`, or principals. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * + * Generated from protobuf field string role = 1; + */ + protected $role = ''; + /** + * Specifies the principals requesting access for a Google Cloud resource. + * `members` can have the following values: + * * `allUsers`: A special identifier that represents anyone who is + * on the internet; with or without a Google account. + * * `allAuthenticatedUsers`: A special identifier that represents anyone + * who is authenticated with a Google account or a service account. + * * `user:{emailid}`: An email address that represents a specific Google + * account. For example, `alice@example.com` . + * * `serviceAccount:{emailid}`: An email address that represents a service + * account. For example, `my-other-app@appspot.gserviceaccount.com`. + * * `group:{emailid}`: An email address that represents a Google group. + * For example, `admins@example.com`. + * * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a user that has been recently deleted. For + * example, `alice@example.com?uid=123456789012345678901`. If the user is + * recovered, this value reverts to `user:{emailid}` and the recovered user + * retains the role in the binding. + * * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus + * unique identifier) representing a service account that has been recently + * deleted. For example, + * `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. + * If the service account is undeleted, this value reverts to + * `serviceAccount:{emailid}` and the undeleted service account retains the + * role in the binding. + * * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a Google group that has been recently + * deleted. For example, `admins@example.com?uid=123456789012345678901`. If + * the group is recovered, this value reverts to `group:{emailid}` and the + * recovered group retains the role in the binding. + * * `domain:{domain}`: The G Suite domain (primary) that represents all the + * users of that domain. For example, `google.com` or `example.com`. + * + * Generated from protobuf field repeated string members = 2; + */ + private $members; + /** + * The condition that is associated with this binding. + * If the condition evaluates to `true`, then this binding applies to the + * current request. + * If the condition evaluates to `false`, then this binding does not apply to + * the current request. However, a different role binding might grant the same + * role to one or more of the principals in this binding. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field .google.type.Expr condition = 3; + */ + protected $condition = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $role + * Role that is assigned to the list of `members`, or principals. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * @type array|\Google\Protobuf\Internal\RepeatedField $members + * Specifies the principals requesting access for a Google Cloud resource. + * `members` can have the following values: + * * `allUsers`: A special identifier that represents anyone who is + * on the internet; with or without a Google account. + * * `allAuthenticatedUsers`: A special identifier that represents anyone + * who is authenticated with a Google account or a service account. + * * `user:{emailid}`: An email address that represents a specific Google + * account. For example, `alice@example.com` . + * * `serviceAccount:{emailid}`: An email address that represents a service + * account. For example, `my-other-app@appspot.gserviceaccount.com`. + * * `group:{emailid}`: An email address that represents a Google group. + * For example, `admins@example.com`. + * * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a user that has been recently deleted. For + * example, `alice@example.com?uid=123456789012345678901`. If the user is + * recovered, this value reverts to `user:{emailid}` and the recovered user + * retains the role in the binding. + * * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus + * unique identifier) representing a service account that has been recently + * deleted. For example, + * `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. + * If the service account is undeleted, this value reverts to + * `serviceAccount:{emailid}` and the undeleted service account retains the + * role in the binding. + * * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a Google group that has been recently + * deleted. For example, `admins@example.com?uid=123456789012345678901`. If + * the group is recovered, this value reverts to `group:{emailid}` and the + * recovered group retains the role in the binding. + * * `domain:{domain}`: The G Suite domain (primary) that represents all the + * users of that domain. For example, `google.com` or `example.com`. + * @type \Google\Type\Expr $condition + * The condition that is associated with this binding. + * If the condition evaluates to `true`, then this binding applies to the + * current request. + * If the condition evaluates to `false`, then this binding does not apply to + * the current request. However, a different role binding might grant the same + * role to one or more of the principals in this binding. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * Role that is assigned to the list of `members`, or principals. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * + * Generated from protobuf field string role = 1; + * @return string + */ + public function getRole() + { + return $this->role; + } + + /** + * Role that is assigned to the list of `members`, or principals. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * + * Generated from protobuf field string role = 1; + * @param string $var + * @return $this + */ + public function setRole($var) + { + GPBUtil::checkString($var, True); + $this->role = $var; + + return $this; + } + + /** + * Specifies the principals requesting access for a Google Cloud resource. + * `members` can have the following values: + * * `allUsers`: A special identifier that represents anyone who is + * on the internet; with or without a Google account. + * * `allAuthenticatedUsers`: A special identifier that represents anyone + * who is authenticated with a Google account or a service account. + * * `user:{emailid}`: An email address that represents a specific Google + * account. For example, `alice@example.com` . + * * `serviceAccount:{emailid}`: An email address that represents a service + * account. For example, `my-other-app@appspot.gserviceaccount.com`. + * * `group:{emailid}`: An email address that represents a Google group. + * For example, `admins@example.com`. + * * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a user that has been recently deleted. For + * example, `alice@example.com?uid=123456789012345678901`. If the user is + * recovered, this value reverts to `user:{emailid}` and the recovered user + * retains the role in the binding. + * * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus + * unique identifier) representing a service account that has been recently + * deleted. For example, + * `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. + * If the service account is undeleted, this value reverts to + * `serviceAccount:{emailid}` and the undeleted service account retains the + * role in the binding. + * * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a Google group that has been recently + * deleted. For example, `admins@example.com?uid=123456789012345678901`. If + * the group is recovered, this value reverts to `group:{emailid}` and the + * recovered group retains the role in the binding. + * * `domain:{domain}`: The G Suite domain (primary) that represents all the + * users of that domain. For example, `google.com` or `example.com`. + * + * Generated from protobuf field repeated string members = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getMembers() + { + return $this->members; + } + + /** + * Specifies the principals requesting access for a Google Cloud resource. + * `members` can have the following values: + * * `allUsers`: A special identifier that represents anyone who is + * on the internet; with or without a Google account. + * * `allAuthenticatedUsers`: A special identifier that represents anyone + * who is authenticated with a Google account or a service account. + * * `user:{emailid}`: An email address that represents a specific Google + * account. For example, `alice@example.com` . + * * `serviceAccount:{emailid}`: An email address that represents a service + * account. For example, `my-other-app@appspot.gserviceaccount.com`. + * * `group:{emailid}`: An email address that represents a Google group. + * For example, `admins@example.com`. + * * `deleted:user:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a user that has been recently deleted. For + * example, `alice@example.com?uid=123456789012345678901`. If the user is + * recovered, this value reverts to `user:{emailid}` and the recovered user + * retains the role in the binding. + * * `deleted:serviceAccount:{emailid}?uid={uniqueid}`: An email address (plus + * unique identifier) representing a service account that has been recently + * deleted. For example, + * `my-other-app@appspot.gserviceaccount.com?uid=123456789012345678901`. + * If the service account is undeleted, this value reverts to + * `serviceAccount:{emailid}` and the undeleted service account retains the + * role in the binding. + * * `deleted:group:{emailid}?uid={uniqueid}`: An email address (plus unique + * identifier) representing a Google group that has been recently + * deleted. For example, `admins@example.com?uid=123456789012345678901`. If + * the group is recovered, this value reverts to `group:{emailid}` and the + * recovered group retains the role in the binding. + * * `domain:{domain}`: The G Suite domain (primary) that represents all the + * users of that domain. For example, `google.com` or `example.com`. + * + * Generated from protobuf field repeated string members = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setMembers($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->members = $arr; + + return $this; + } + + /** + * The condition that is associated with this binding. + * If the condition evaluates to `true`, then this binding applies to the + * current request. + * If the condition evaluates to `false`, then this binding does not apply to + * the current request. However, a different role binding might grant the same + * role to one or more of the principals in this binding. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field .google.type.Expr condition = 3; + * @return \Google\Type\Expr|null + */ + public function getCondition() + { + return $this->condition; + } + + public function hasCondition() + { + return isset($this->condition); + } + + public function clearCondition() + { + unset($this->condition); + } + + /** + * The condition that is associated with this binding. + * If the condition evaluates to `true`, then this binding applies to the + * current request. + * If the condition evaluates to `false`, then this binding does not apply to + * the current request. However, a different role binding might grant the same + * role to one or more of the principals in this binding. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field .google.type.Expr condition = 3; + * @param \Google\Type\Expr $var + * @return $this + */ + public function setCondition($var) + { + GPBUtil::checkMessage($var, \Google\Type\Expr::class); + $this->condition = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta.php new file mode 100644 index 000000000..3993a7f2e --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta.php @@ -0,0 +1,200 @@ +google.iam.v1.BindingDelta + */ +class BindingDelta extends \Google\Protobuf\Internal\Message +{ + /** + * The action that was performed on a Binding. + * Required + * + * Generated from protobuf field .google.iam.v1.BindingDelta.Action action = 1; + */ + protected $action = 0; + /** + * Role that is assigned to `members`. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * Required + * + * Generated from protobuf field string role = 2; + */ + protected $role = ''; + /** + * A single identity requesting access for a Google Cloud resource. + * Follows the same format of Binding.members. + * Required + * + * Generated from protobuf field string member = 3; + */ + protected $member = ''; + /** + * The condition that is associated with this binding. + * + * Generated from protobuf field .google.type.Expr condition = 4; + */ + protected $condition = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $action + * The action that was performed on a Binding. + * Required + * @type string $role + * Role that is assigned to `members`. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * Required + * @type string $member + * A single identity requesting access for a Google Cloud resource. + * Follows the same format of Binding.members. + * Required + * @type \Google\Type\Expr $condition + * The condition that is associated with this binding. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * The action that was performed on a Binding. + * Required + * + * Generated from protobuf field .google.iam.v1.BindingDelta.Action action = 1; + * @return int + */ + public function getAction() + { + return $this->action; + } + + /** + * The action that was performed on a Binding. + * Required + * + * Generated from protobuf field .google.iam.v1.BindingDelta.Action action = 1; + * @param int $var + * @return $this + */ + public function setAction($var) + { + GPBUtil::checkEnum($var, \Google\Cloud\Iam\V1\BindingDelta\Action::class); + $this->action = $var; + + return $this; + } + + /** + * Role that is assigned to `members`. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * Required + * + * Generated from protobuf field string role = 2; + * @return string + */ + public function getRole() + { + return $this->role; + } + + /** + * Role that is assigned to `members`. + * For example, `roles/viewer`, `roles/editor`, or `roles/owner`. + * Required + * + * Generated from protobuf field string role = 2; + * @param string $var + * @return $this + */ + public function setRole($var) + { + GPBUtil::checkString($var, True); + $this->role = $var; + + return $this; + } + + /** + * A single identity requesting access for a Google Cloud resource. + * Follows the same format of Binding.members. + * Required + * + * Generated from protobuf field string member = 3; + * @return string + */ + public function getMember() + { + return $this->member; + } + + /** + * A single identity requesting access for a Google Cloud resource. + * Follows the same format of Binding.members. + * Required + * + * Generated from protobuf field string member = 3; + * @param string $var + * @return $this + */ + public function setMember($var) + { + GPBUtil::checkString($var, True); + $this->member = $var; + + return $this; + } + + /** + * The condition that is associated with this binding. + * + * Generated from protobuf field .google.type.Expr condition = 4; + * @return \Google\Type\Expr|null + */ + public function getCondition() + { + return $this->condition; + } + + public function hasCondition() + { + return isset($this->condition); + } + + public function clearCondition() + { + unset($this->condition); + } + + /** + * The condition that is associated with this binding. + * + * Generated from protobuf field .google.type.Expr condition = 4; + * @param \Google\Type\Expr $var + * @return $this + */ + public function setCondition($var) + { + GPBUtil::checkMessage($var, \Google\Type\Expr::class); + $this->condition = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta/Action.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta/Action.php new file mode 100644 index 000000000..f119696bf --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/BindingDelta/Action.php @@ -0,0 +1,62 @@ +google.iam.v1.BindingDelta.Action + */ +class Action +{ + /** + * Unspecified. + * + * Generated from protobuf enum ACTION_UNSPECIFIED = 0; + */ + const ACTION_UNSPECIFIED = 0; + /** + * Addition of a Binding. + * + * Generated from protobuf enum ADD = 1; + */ + const ADD = 1; + /** + * Removal of a Binding. + * + * Generated from protobuf enum REMOVE = 2; + */ + const REMOVE = 2; + + private static $valueToName = [ + self::ACTION_UNSPECIFIED => 'ACTION_UNSPECIFIED', + self::ADD => 'ADD', + self::REMOVE => 'REMOVE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetIamPolicyRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetIamPolicyRequest.php new file mode 100644 index 000000000..d74e0e887 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetIamPolicyRequest.php @@ -0,0 +1,119 @@ +google.iam.v1.GetIamPolicyRequest + */ +class GetIamPolicyRequest extends \Google\Protobuf\Internal\Message +{ + /** + * REQUIRED: The resource for which the policy is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + */ + protected $resource = ''; + /** + * OPTIONAL: A `GetPolicyOptions` object for specifying options to + * `GetIamPolicy`. + * + * Generated from protobuf field .google.iam.v1.GetPolicyOptions options = 2; + */ + protected $options = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $resource + * REQUIRED: The resource for which the policy is being requested. + * See the operation documentation for the appropriate value for this field. + * @type \Google\Cloud\Iam\V1\GetPolicyOptions $options + * OPTIONAL: A `GetPolicyOptions` object for specifying options to + * `GetIamPolicy`. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\IamPolicy::initOnce(); + parent::__construct($data); + } + + /** + * REQUIRED: The resource for which the policy is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @return string + */ + public function getResource() + { + return $this->resource; + } + + /** + * REQUIRED: The resource for which the policy is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @param string $var + * @return $this + */ + public function setResource($var) + { + GPBUtil::checkString($var, True); + $this->resource = $var; + + return $this; + } + + /** + * OPTIONAL: A `GetPolicyOptions` object for specifying options to + * `GetIamPolicy`. + * + * Generated from protobuf field .google.iam.v1.GetPolicyOptions options = 2; + * @return \Google\Cloud\Iam\V1\GetPolicyOptions|null + */ + public function getOptions() + { + return $this->options; + } + + public function hasOptions() + { + return isset($this->options); + } + + public function clearOptions() + { + unset($this->options); + } + + /** + * OPTIONAL: A `GetPolicyOptions` object for specifying options to + * `GetIamPolicy`. + * + * Generated from protobuf field .google.iam.v1.GetPolicyOptions options = 2; + * @param \Google\Cloud\Iam\V1\GetPolicyOptions $var + * @return $this + */ + public function setOptions($var) + { + GPBUtil::checkMessage($var, \Google\Cloud\Iam\V1\GetPolicyOptions::class); + $this->options = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetPolicyOptions.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetPolicyOptions.php new file mode 100644 index 000000000..a2600d0ff --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/GetPolicyOptions.php @@ -0,0 +1,119 @@ +google.iam.v1.GetPolicyOptions + */ +class GetPolicyOptions extends \Google\Protobuf\Internal\Message +{ + /** + * Optional. The maximum policy version that will be used to format the + * policy. + * Valid values are 0, 1, and 3. Requests specifying an invalid value will be + * rejected. + * Requests for policies with any conditional role bindings must specify + * version 3. Policies with no conditional role bindings may specify any valid + * value or leave the field unset. + * The policy in the response might use the policy version that you specified, + * or it might use a lower policy version. For example, if you specify version + * 3, but the policy has no conditional role bindings, the response uses + * version 1. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 requested_policy_version = 1; + */ + protected $requested_policy_version = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $requested_policy_version + * Optional. The maximum policy version that will be used to format the + * policy. + * Valid values are 0, 1, and 3. Requests specifying an invalid value will be + * rejected. + * Requests for policies with any conditional role bindings must specify + * version 3. Policies with no conditional role bindings may specify any valid + * value or leave the field unset. + * The policy in the response might use the policy version that you specified, + * or it might use a lower policy version. For example, if you specify version + * 3, but the policy has no conditional role bindings, the response uses + * version 1. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Options::initOnce(); + parent::__construct($data); + } + + /** + * Optional. The maximum policy version that will be used to format the + * policy. + * Valid values are 0, 1, and 3. Requests specifying an invalid value will be + * rejected. + * Requests for policies with any conditional role bindings must specify + * version 3. Policies with no conditional role bindings may specify any valid + * value or leave the field unset. + * The policy in the response might use the policy version that you specified, + * or it might use a lower policy version. For example, if you specify version + * 3, but the policy has no conditional role bindings, the response uses + * version 1. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 requested_policy_version = 1; + * @return int + */ + public function getRequestedPolicyVersion() + { + return $this->requested_policy_version; + } + + /** + * Optional. The maximum policy version that will be used to format the + * policy. + * Valid values are 0, 1, and 3. Requests specifying an invalid value will be + * rejected. + * Requests for policies with any conditional role bindings must specify + * version 3. Policies with no conditional role bindings may specify any valid + * value or leave the field unset. + * The policy in the response might use the policy version that you specified, + * or it might use a lower policy version. For example, if you specify version + * 3, but the policy has no conditional role bindings, the response uses + * version 1. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 requested_policy_version = 1; + * @param int $var + * @return $this + */ + public function setRequestedPolicyVersion($var) + { + GPBUtil::checkInt32($var); + $this->requested_policy_version = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Policy.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Policy.php new file mode 100644 index 000000000..8b4633b79 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/Policy.php @@ -0,0 +1,377 @@ +google.iam.v1.Policy + */ +class Policy extends \Google\Protobuf\Internal\Message +{ + /** + * Specifies the format of the policy. + * Valid values are `0`, `1`, and `3`. Requests that specify an invalid value + * are rejected. + * Any operation that affects conditional role bindings must specify version + * `3`. This requirement applies to the following operations: + * * Getting a policy that includes a conditional role binding + * * Adding a conditional role binding to a policy + * * Changing a conditional role binding in a policy + * * Removing any role binding, with or without a condition, from a policy + * that includes conditions + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * If a policy does not include any conditions, operations on that policy may + * specify any valid version or leave the field unset. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 version = 1; + */ + protected $version = 0; + /** + * Associates a list of `members`, or principals, with a `role`. Optionally, + * may specify a `condition` that determines how and when the `bindings` are + * applied. Each of the `bindings` must contain at least one principal. + * The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250 + * of these principals can be Google groups. Each occurrence of a principal + * counts towards these limits. For example, if the `bindings` grant 50 + * different roles to `user:alice@example.com`, and not to any other + * principal, then you can add another 1,450 principals to the `bindings` in + * the `Policy`. + * + * Generated from protobuf field repeated .google.iam.v1.Binding bindings = 4; + */ + private $bindings; + /** + * Specifies cloud audit logging configuration for this policy. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfig audit_configs = 6; + */ + private $audit_configs; + /** + * `etag` is used for optimistic concurrency control as a way to help + * prevent simultaneous updates of a policy from overwriting each other. + * It is strongly suggested that systems make use of the `etag` in the + * read-modify-write cycle to perform policy updates in order to avoid race + * conditions: An `etag` is returned in the response to `getIamPolicy`, and + * systems are expected to put that etag in the request to `setIamPolicy` to + * ensure that their change will be applied to the same version of the policy. + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * + * Generated from protobuf field bytes etag = 3; + */ + protected $etag = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $version + * Specifies the format of the policy. + * Valid values are `0`, `1`, and `3`. Requests that specify an invalid value + * are rejected. + * Any operation that affects conditional role bindings must specify version + * `3`. This requirement applies to the following operations: + * * Getting a policy that includes a conditional role binding + * * Adding a conditional role binding to a policy + * * Changing a conditional role binding in a policy + * * Removing any role binding, with or without a condition, from a policy + * that includes conditions + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * If a policy does not include any conditions, operations on that policy may + * specify any valid version or leave the field unset. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * @type array<\Google\Cloud\Iam\V1\Binding>|\Google\Protobuf\Internal\RepeatedField $bindings + * Associates a list of `members`, or principals, with a `role`. Optionally, + * may specify a `condition` that determines how and when the `bindings` are + * applied. Each of the `bindings` must contain at least one principal. + * The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250 + * of these principals can be Google groups. Each occurrence of a principal + * counts towards these limits. For example, if the `bindings` grant 50 + * different roles to `user:alice@example.com`, and not to any other + * principal, then you can add another 1,450 principals to the `bindings` in + * the `Policy`. + * @type array<\Google\Cloud\Iam\V1\AuditConfig>|\Google\Protobuf\Internal\RepeatedField $audit_configs + * Specifies cloud audit logging configuration for this policy. + * @type string $etag + * `etag` is used for optimistic concurrency control as a way to help + * prevent simultaneous updates of a policy from overwriting each other. + * It is strongly suggested that systems make use of the `etag` in the + * read-modify-write cycle to perform policy updates in order to avoid race + * conditions: An `etag` is returned in the response to `getIamPolicy`, and + * systems are expected to put that etag in the request to `setIamPolicy` to + * ensure that their change will be applied to the same version of the policy. + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * Specifies the format of the policy. + * Valid values are `0`, `1`, and `3`. Requests that specify an invalid value + * are rejected. + * Any operation that affects conditional role bindings must specify version + * `3`. This requirement applies to the following operations: + * * Getting a policy that includes a conditional role binding + * * Adding a conditional role binding to a policy + * * Changing a conditional role binding in a policy + * * Removing any role binding, with or without a condition, from a policy + * that includes conditions + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * If a policy does not include any conditions, operations on that policy may + * specify any valid version or leave the field unset. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 version = 1; + * @return int + */ + public function getVersion() + { + return $this->version; + } + + /** + * Specifies the format of the policy. + * Valid values are `0`, `1`, and `3`. Requests that specify an invalid value + * are rejected. + * Any operation that affects conditional role bindings must specify version + * `3`. This requirement applies to the following operations: + * * Getting a policy that includes a conditional role binding + * * Adding a conditional role binding to a policy + * * Changing a conditional role binding in a policy + * * Removing any role binding, with or without a condition, from a policy + * that includes conditions + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * If a policy does not include any conditions, operations on that policy may + * specify any valid version or leave the field unset. + * To learn which resources support conditions in their IAM policies, see the + * [IAM + * documentation](https://cloud.google.com/iam/help/conditions/resource-policies). + * + * Generated from protobuf field int32 version = 1; + * @param int $var + * @return $this + */ + public function setVersion($var) + { + GPBUtil::checkInt32($var); + $this->version = $var; + + return $this; + } + + /** + * Associates a list of `members`, or principals, with a `role`. Optionally, + * may specify a `condition` that determines how and when the `bindings` are + * applied. Each of the `bindings` must contain at least one principal. + * The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250 + * of these principals can be Google groups. Each occurrence of a principal + * counts towards these limits. For example, if the `bindings` grant 50 + * different roles to `user:alice@example.com`, and not to any other + * principal, then you can add another 1,450 principals to the `bindings` in + * the `Policy`. + * + * Generated from protobuf field repeated .google.iam.v1.Binding bindings = 4; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getBindings() + { + return $this->bindings; + } + + /** + * Associates a list of `members`, or principals, with a `role`. Optionally, + * may specify a `condition` that determines how and when the `bindings` are + * applied. Each of the `bindings` must contain at least one principal. + * The `bindings` in a `Policy` can refer to up to 1,500 principals; up to 250 + * of these principals can be Google groups. Each occurrence of a principal + * counts towards these limits. For example, if the `bindings` grant 50 + * different roles to `user:alice@example.com`, and not to any other + * principal, then you can add another 1,450 principals to the `bindings` in + * the `Policy`. + * + * Generated from protobuf field repeated .google.iam.v1.Binding bindings = 4; + * @param array<\Google\Cloud\Iam\V1\Binding>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setBindings($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Iam\V1\Binding::class); + $this->bindings = $arr; + + return $this; + } + + /** + * Specifies cloud audit logging configuration for this policy. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfig audit_configs = 6; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAuditConfigs() + { + return $this->audit_configs; + } + + /** + * Specifies cloud audit logging configuration for this policy. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfig audit_configs = 6; + * @param array<\Google\Cloud\Iam\V1\AuditConfig>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAuditConfigs($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Iam\V1\AuditConfig::class); + $this->audit_configs = $arr; + + return $this; + } + + /** + * `etag` is used for optimistic concurrency control as a way to help + * prevent simultaneous updates of a policy from overwriting each other. + * It is strongly suggested that systems make use of the `etag` in the + * read-modify-write cycle to perform policy updates in order to avoid race + * conditions: An `etag` is returned in the response to `getIamPolicy`, and + * systems are expected to put that etag in the request to `setIamPolicy` to + * ensure that their change will be applied to the same version of the policy. + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * + * Generated from protobuf field bytes etag = 3; + * @return string + */ + public function getEtag() + { + return $this->etag; + } + + /** + * `etag` is used for optimistic concurrency control as a way to help + * prevent simultaneous updates of a policy from overwriting each other. + * It is strongly suggested that systems make use of the `etag` in the + * read-modify-write cycle to perform policy updates in order to avoid race + * conditions: An `etag` is returned in the response to `getIamPolicy`, and + * systems are expected to put that etag in the request to `setIamPolicy` to + * ensure that their change will be applied to the same version of the policy. + * **Important:** If you use IAM Conditions, you must include the `etag` field + * whenever you call `setIamPolicy`. If you omit this field, then IAM allows + * you to overwrite a version `3` policy with a version `1` policy, and all of + * the conditions in the version `3` policy are lost. + * + * Generated from protobuf field bytes etag = 3; + * @param string $var + * @return $this + */ + public function setEtag($var) + { + GPBUtil::checkString($var, False); + $this->etag = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/PolicyDelta.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/PolicyDelta.php new file mode 100644 index 000000000..dde1c0f68 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/PolicyDelta.php @@ -0,0 +1,101 @@ +google.iam.v1.PolicyDelta + */ +class PolicyDelta extends \Google\Protobuf\Internal\Message +{ + /** + * The delta for Bindings between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.BindingDelta binding_deltas = 1; + */ + private $binding_deltas; + /** + * The delta for AuditConfigs between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfigDelta audit_config_deltas = 2; + */ + private $audit_config_deltas; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Cloud\Iam\V1\BindingDelta>|\Google\Protobuf\Internal\RepeatedField $binding_deltas + * The delta for Bindings between two policies. + * @type array<\Google\Cloud\Iam\V1\AuditConfigDelta>|\Google\Protobuf\Internal\RepeatedField $audit_config_deltas + * The delta for AuditConfigs between two policies. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Policy::initOnce(); + parent::__construct($data); + } + + /** + * The delta for Bindings between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.BindingDelta binding_deltas = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getBindingDeltas() + { + return $this->binding_deltas; + } + + /** + * The delta for Bindings between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.BindingDelta binding_deltas = 1; + * @param array<\Google\Cloud\Iam\V1\BindingDelta>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setBindingDeltas($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Iam\V1\BindingDelta::class); + $this->binding_deltas = $arr; + + return $this; + } + + /** + * The delta for AuditConfigs between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfigDelta audit_config_deltas = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAuditConfigDeltas() + { + return $this->audit_config_deltas; + } + + /** + * The delta for AuditConfigs between two policies. + * + * Generated from protobuf field repeated .google.iam.v1.AuditConfigDelta audit_config_deltas = 2; + * @param array<\Google\Cloud\Iam\V1\AuditConfigDelta>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAuditConfigDeltas($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Iam\V1\AuditConfigDelta::class); + $this->audit_config_deltas = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/SetIamPolicyRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/SetIamPolicyRequest.php new file mode 100644 index 000000000..3bc7a5a60 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/SetIamPolicyRequest.php @@ -0,0 +1,183 @@ +google.iam.v1.SetIamPolicyRequest + */ +class SetIamPolicyRequest extends \Google\Protobuf\Internal\Message +{ + /** + * REQUIRED: The resource for which the policy is being specified. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + */ + protected $resource = ''; + /** + * REQUIRED: The complete policy to be applied to the `resource`. The size of + * the policy is limited to a few 10s of KB. An empty policy is a + * valid policy but certain Cloud Platform services (such as Projects) + * might reject them. + * + * Generated from protobuf field .google.iam.v1.Policy policy = 2 [(.google.api.field_behavior) = REQUIRED]; + */ + protected $policy = null; + /** + * OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only + * the fields in the mask will be modified. If no mask is provided, the + * following default mask is used: + * `paths: "bindings, etag"` + * + * Generated from protobuf field .google.protobuf.FieldMask update_mask = 3; + */ + protected $update_mask = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $resource + * REQUIRED: The resource for which the policy is being specified. + * See the operation documentation for the appropriate value for this field. + * @type \Google\Cloud\Iam\V1\Policy $policy + * REQUIRED: The complete policy to be applied to the `resource`. The size of + * the policy is limited to a few 10s of KB. An empty policy is a + * valid policy but certain Cloud Platform services (such as Projects) + * might reject them. + * @type \Google\Protobuf\FieldMask $update_mask + * OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only + * the fields in the mask will be modified. If no mask is provided, the + * following default mask is used: + * `paths: "bindings, etag"` + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\IamPolicy::initOnce(); + parent::__construct($data); + } + + /** + * REQUIRED: The resource for which the policy is being specified. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @return string + */ + public function getResource() + { + return $this->resource; + } + + /** + * REQUIRED: The resource for which the policy is being specified. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @param string $var + * @return $this + */ + public function setResource($var) + { + GPBUtil::checkString($var, True); + $this->resource = $var; + + return $this; + } + + /** + * REQUIRED: The complete policy to be applied to the `resource`. The size of + * the policy is limited to a few 10s of KB. An empty policy is a + * valid policy but certain Cloud Platform services (such as Projects) + * might reject them. + * + * Generated from protobuf field .google.iam.v1.Policy policy = 2 [(.google.api.field_behavior) = REQUIRED]; + * @return \Google\Cloud\Iam\V1\Policy|null + */ + public function getPolicy() + { + return $this->policy; + } + + public function hasPolicy() + { + return isset($this->policy); + } + + public function clearPolicy() + { + unset($this->policy); + } + + /** + * REQUIRED: The complete policy to be applied to the `resource`. The size of + * the policy is limited to a few 10s of KB. An empty policy is a + * valid policy but certain Cloud Platform services (such as Projects) + * might reject them. + * + * Generated from protobuf field .google.iam.v1.Policy policy = 2 [(.google.api.field_behavior) = REQUIRED]; + * @param \Google\Cloud\Iam\V1\Policy $var + * @return $this + */ + public function setPolicy($var) + { + GPBUtil::checkMessage($var, \Google\Cloud\Iam\V1\Policy::class); + $this->policy = $var; + + return $this; + } + + /** + * OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only + * the fields in the mask will be modified. If no mask is provided, the + * following default mask is used: + * `paths: "bindings, etag"` + * + * Generated from protobuf field .google.protobuf.FieldMask update_mask = 3; + * @return \Google\Protobuf\FieldMask|null + */ + public function getUpdateMask() + { + return $this->update_mask; + } + + public function hasUpdateMask() + { + return isset($this->update_mask); + } + + public function clearUpdateMask() + { + unset($this->update_mask); + } + + /** + * OPTIONAL: A FieldMask specifying which fields of the policy to modify. Only + * the fields in the mask will be modified. If no mask is provided, the + * following default mask is used: + * `paths: "bindings, etag"` + * + * Generated from protobuf field .google.protobuf.FieldMask update_mask = 3; + * @param \Google\Protobuf\FieldMask $var + * @return $this + */ + public function setUpdateMask($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\FieldMask::class); + $this->update_mask = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsRequest.php new file mode 100644 index 000000000..dba237c24 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsRequest.php @@ -0,0 +1,117 @@ +google.iam.v1.TestIamPermissionsRequest + */ +class TestIamPermissionsRequest extends \Google\Protobuf\Internal\Message +{ + /** + * REQUIRED: The resource for which the policy detail is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + */ + protected $resource = ''; + /** + * The set of permissions to check for the `resource`. Permissions with + * wildcards (such as '*' or 'storage.*') are not allowed. For more + * information see + * [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions). + * + * Generated from protobuf field repeated string permissions = 2 [(.google.api.field_behavior) = REQUIRED]; + */ + private $permissions; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $resource + * REQUIRED: The resource for which the policy detail is being requested. + * See the operation documentation for the appropriate value for this field. + * @type array|\Google\Protobuf\Internal\RepeatedField $permissions + * The set of permissions to check for the `resource`. Permissions with + * wildcards (such as '*' or 'storage.*') are not allowed. For more + * information see + * [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions). + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\IamPolicy::initOnce(); + parent::__construct($data); + } + + /** + * REQUIRED: The resource for which the policy detail is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @return string + */ + public function getResource() + { + return $this->resource; + } + + /** + * REQUIRED: The resource for which the policy detail is being requested. + * See the operation documentation for the appropriate value for this field. + * + * Generated from protobuf field string resource = 1 [(.google.api.field_behavior) = REQUIRED, (.google.api.resource_reference) = { + * @param string $var + * @return $this + */ + public function setResource($var) + { + GPBUtil::checkString($var, True); + $this->resource = $var; + + return $this; + } + + /** + * The set of permissions to check for the `resource`. Permissions with + * wildcards (such as '*' or 'storage.*') are not allowed. For more + * information see + * [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions). + * + * Generated from protobuf field repeated string permissions = 2 [(.google.api.field_behavior) = REQUIRED]; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getPermissions() + { + return $this->permissions; + } + + /** + * The set of permissions to check for the `resource`. Permissions with + * wildcards (such as '*' or 'storage.*') are not allowed. For more + * information see + * [IAM Overview](https://cloud.google.com/iam/docs/overview#permissions). + * + * Generated from protobuf field repeated string permissions = 2 [(.google.api.field_behavior) = REQUIRED]; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setPermissions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->permissions = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsResponse.php b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsResponse.php new file mode 100644 index 000000000..fe3a85e68 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Iam/V1/TestIamPermissionsResponse.php @@ -0,0 +1,71 @@ +google.iam.v1.TestIamPermissionsResponse + */ +class TestIamPermissionsResponse extends \Google\Protobuf\Internal\Message +{ + /** + * A subset of `TestPermissionsRequest.permissions` that the caller is + * allowed. + * + * Generated from protobuf field repeated string permissions = 1; + */ + private $permissions; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\RepeatedField $permissions + * A subset of `TestPermissionsRequest.permissions` that the caller is + * allowed. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\IamPolicy::initOnce(); + parent::__construct($data); + } + + /** + * A subset of `TestPermissionsRequest.permissions` that the caller is + * allowed. + * + * Generated from protobuf field repeated string permissions = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getPermissions() + { + return $this->permissions; + } + + /** + * A subset of `TestPermissionsRequest.permissions` that the caller is + * allowed. + * + * Generated from protobuf field repeated string permissions = 1; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setPermissions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->permissions = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Location/GetLocationRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Location/GetLocationRequest.php new file mode 100644 index 000000000..cb43058ee --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Location/GetLocationRequest.php @@ -0,0 +1,67 @@ +google.cloud.location.GetLocationRequest + */ +class GetLocationRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Resource name for the location. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Resource name for the location. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Cloud\Location\Locations::initOnce(); + parent::__construct($data); + } + + /** + * Resource name for the location. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Resource name for the location. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsRequest.php new file mode 100644 index 000000000..927987267 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsRequest.php @@ -0,0 +1,169 @@ +google.cloud.location.ListLocationsRequest + */ +class ListLocationsRequest extends \Google\Protobuf\Internal\Message +{ + /** + * The resource that owns the locations collection, if applicable. + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The standard list filter. + * + * Generated from protobuf field string filter = 2; + */ + protected $filter = ''; + /** + * The standard list page size. + * + * Generated from protobuf field int32 page_size = 3; + */ + protected $page_size = 0; + /** + * The standard list page token. + * + * Generated from protobuf field string page_token = 4; + */ + protected $page_token = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * The resource that owns the locations collection, if applicable. + * @type string $filter + * The standard list filter. + * @type int $page_size + * The standard list page size. + * @type string $page_token + * The standard list page token. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Cloud\Location\Locations::initOnce(); + parent::__construct($data); + } + + /** + * The resource that owns the locations collection, if applicable. + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The resource that owns the locations collection, if applicable. + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The standard list filter. + * + * Generated from protobuf field string filter = 2; + * @return string + */ + public function getFilter() + { + return $this->filter; + } + + /** + * The standard list filter. + * + * Generated from protobuf field string filter = 2; + * @param string $var + * @return $this + */ + public function setFilter($var) + { + GPBUtil::checkString($var, True); + $this->filter = $var; + + return $this; + } + + /** + * The standard list page size. + * + * Generated from protobuf field int32 page_size = 3; + * @return int + */ + public function getPageSize() + { + return $this->page_size; + } + + /** + * The standard list page size. + * + * Generated from protobuf field int32 page_size = 3; + * @param int $var + * @return $this + */ + public function setPageSize($var) + { + GPBUtil::checkInt32($var); + $this->page_size = $var; + + return $this; + } + + /** + * The standard list page token. + * + * Generated from protobuf field string page_token = 4; + * @return string + */ + public function getPageToken() + { + return $this->page_token; + } + + /** + * The standard list page token. + * + * Generated from protobuf field string page_token = 4; + * @param string $var + * @return $this + */ + public function setPageToken($var) + { + GPBUtil::checkString($var, True); + $this->page_token = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsResponse.php b/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsResponse.php new file mode 100644 index 000000000..169a8e736 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Location/ListLocationsResponse.php @@ -0,0 +1,101 @@ +google.cloud.location.ListLocationsResponse + */ +class ListLocationsResponse extends \Google\Protobuf\Internal\Message +{ + /** + * A list of locations that matches the specified filter in the request. + * + * Generated from protobuf field repeated .google.cloud.location.Location locations = 1; + */ + private $locations; + /** + * The standard List next-page token. + * + * Generated from protobuf field string next_page_token = 2; + */ + protected $next_page_token = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Cloud\Location\Location>|\Google\Protobuf\Internal\RepeatedField $locations + * A list of locations that matches the specified filter in the request. + * @type string $next_page_token + * The standard List next-page token. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Cloud\Location\Locations::initOnce(); + parent::__construct($data); + } + + /** + * A list of locations that matches the specified filter in the request. + * + * Generated from protobuf field repeated .google.cloud.location.Location locations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLocations() + { + return $this->locations; + } + + /** + * A list of locations that matches the specified filter in the request. + * + * Generated from protobuf field repeated .google.cloud.location.Location locations = 1; + * @param array<\Google\Cloud\Location\Location>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLocations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Cloud\Location\Location::class); + $this->locations = $arr; + + return $this; + } + + /** + * The standard List next-page token. + * + * Generated from protobuf field string next_page_token = 2; + * @return string + */ + public function getNextPageToken() + { + return $this->next_page_token; + } + + /** + * The standard List next-page token. + * + * Generated from protobuf field string next_page_token = 2; + * @param string $var + * @return $this + */ + public function setNextPageToken($var) + { + GPBUtil::checkString($var, True); + $this->next_page_token = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Location/Location.php b/lib/Google/vendor/google/common-protos/src/Cloud/Location/Location.php new file mode 100644 index 000000000..f953e2ef7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Location/Location.php @@ -0,0 +1,229 @@ +google.cloud.location.Location + */ +class Location extends \Google\Protobuf\Internal\Message +{ + /** + * Resource name for the location, which may vary between implementations. + * For example: `"projects/example-project/locations/us-east1"` + * + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * The canonical id for this location. For example: `"us-east1"`. + * + * Generated from protobuf field string location_id = 4; + */ + protected $location_id = ''; + /** + * The friendly name for this location, typically a nearby city name. + * For example, "Tokyo". + * + * Generated from protobuf field string display_name = 5; + */ + protected $display_name = ''; + /** + * Cross-service attributes for the location. For example + * {"cloud.googleapis.com/region": "us-east1"} + * + * Generated from protobuf field map labels = 2; + */ + private $labels; + /** + * Service-specific metadata. For example the available capacity at the given + * location. + * + * Generated from protobuf field .google.protobuf.Any metadata = 3; + */ + protected $metadata = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * Resource name for the location, which may vary between implementations. + * For example: `"projects/example-project/locations/us-east1"` + * @type string $location_id + * The canonical id for this location. For example: `"us-east1"`. + * @type string $display_name + * The friendly name for this location, typically a nearby city name. + * For example, "Tokyo". + * @type array|\Google\Protobuf\Internal\MapField $labels + * Cross-service attributes for the location. For example + * {"cloud.googleapis.com/region": "us-east1"} + * @type \Google\Protobuf\Any $metadata + * Service-specific metadata. For example the available capacity at the given + * location. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Cloud\Location\Locations::initOnce(); + parent::__construct($data); + } + + /** + * Resource name for the location, which may vary between implementations. + * For example: `"projects/example-project/locations/us-east1"` + * + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Resource name for the location, which may vary between implementations. + * For example: `"projects/example-project/locations/us-east1"` + * + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The canonical id for this location. For example: `"us-east1"`. + * + * Generated from protobuf field string location_id = 4; + * @return string + */ + public function getLocationId() + { + return $this->location_id; + } + + /** + * The canonical id for this location. For example: `"us-east1"`. + * + * Generated from protobuf field string location_id = 4; + * @param string $var + * @return $this + */ + public function setLocationId($var) + { + GPBUtil::checkString($var, True); + $this->location_id = $var; + + return $this; + } + + /** + * The friendly name for this location, typically a nearby city name. + * For example, "Tokyo". + * + * Generated from protobuf field string display_name = 5; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * The friendly name for this location, typically a nearby city name. + * For example, "Tokyo". + * + * Generated from protobuf field string display_name = 5; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + + /** + * Cross-service attributes for the location. For example + * {"cloud.googleapis.com/region": "us-east1"} + * + * Generated from protobuf field map labels = 2; + * @return \Google\Protobuf\Internal\MapField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * Cross-service attributes for the location. For example + * {"cloud.googleapis.com/region": "us-east1"} + * + * Generated from protobuf field map labels = 2; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->labels = $arr; + + return $this; + } + + /** + * Service-specific metadata. For example the available capacity at the given + * location. + * + * Generated from protobuf field .google.protobuf.Any metadata = 3; + * @return \Google\Protobuf\Any|null + */ + public function getMetadata() + { + return $this->metadata; + } + + public function hasMetadata() + { + return isset($this->metadata); + } + + public function clearMetadata() + { + unset($this->metadata); + } + + /** + * Service-specific metadata. For example the available capacity at the given + * location. + * + * Generated from protobuf field .google.protobuf.Any metadata = 3; + * @param \Google\Protobuf\Any $var + * @return $this + */ + public function setMetadata($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Any::class); + $this->metadata = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/HttpRequest.php b/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/HttpRequest.php new file mode 100644 index 000000000..09073406a --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/HttpRequest.php @@ -0,0 +1,627 @@ +google.logging.type.HttpRequest + */ +class HttpRequest extends \Google\Protobuf\Internal\Message +{ + /** + * The request method. Examples: `"GET"`, `"HEAD"`, `"PUT"`, `"POST"`. + * + * Generated from protobuf field string request_method = 1; + */ + protected $request_method = ''; + /** + * The scheme (http, https), the host name, the path and the query + * portion of the URL that was requested. + * Example: `"http://example.com/some/info?color=red"`. + * + * Generated from protobuf field string request_url = 2; + */ + protected $request_url = ''; + /** + * The size of the HTTP request message in bytes, including the request + * headers and the request body. + * + * Generated from protobuf field int64 request_size = 3; + */ + protected $request_size = 0; + /** + * The response code indicating the status of response. + * Examples: 200, 404. + * + * Generated from protobuf field int32 status = 4; + */ + protected $status = 0; + /** + * The size of the HTTP response message sent back to the client, in bytes, + * including the response headers and the response body. + * + * Generated from protobuf field int64 response_size = 5; + */ + protected $response_size = 0; + /** + * The user agent sent by the client. Example: + * `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET + * CLR 1.0.3705)"`. + * + * Generated from protobuf field string user_agent = 6; + */ + protected $user_agent = ''; + /** + * The IP address (IPv4 or IPv6) of the client that issued the HTTP + * request. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string remote_ip = 7; + */ + protected $remote_ip = ''; + /** + * The IP address (IPv4 or IPv6) of the origin server that the request was + * sent to. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string server_ip = 13; + */ + protected $server_ip = ''; + /** + * The referer URL of the request, as defined in + * [HTTP/1.1 Header Field + * Definitions](https://datatracker.ietf.org/doc/html/rfc2616#section-14.36). + * + * Generated from protobuf field string referer = 8; + */ + protected $referer = ''; + /** + * The request processing latency on the server, from the time the request was + * received until the response was sent. + * + * Generated from protobuf field .google.protobuf.Duration latency = 14; + */ + protected $latency = null; + /** + * Whether or not a cache lookup was attempted. + * + * Generated from protobuf field bool cache_lookup = 11; + */ + protected $cache_lookup = false; + /** + * Whether or not an entity was served from cache + * (with or without validation). + * + * Generated from protobuf field bool cache_hit = 9; + */ + protected $cache_hit = false; + /** + * Whether or not the response was validated with the origin server before + * being served from cache. This field is only meaningful if `cache_hit` is + * True. + * + * Generated from protobuf field bool cache_validated_with_origin_server = 10; + */ + protected $cache_validated_with_origin_server = false; + /** + * The number of HTTP response bytes inserted into cache. Set only when a + * cache fill was attempted. + * + * Generated from protobuf field int64 cache_fill_bytes = 12; + */ + protected $cache_fill_bytes = 0; + /** + * Protocol used for the request. Examples: "HTTP/1.1", "HTTP/2", "websocket" + * + * Generated from protobuf field string protocol = 15; + */ + protected $protocol = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $request_method + * The request method. Examples: `"GET"`, `"HEAD"`, `"PUT"`, `"POST"`. + * @type string $request_url + * The scheme (http, https), the host name, the path and the query + * portion of the URL that was requested. + * Example: `"http://example.com/some/info?color=red"`. + * @type int|string $request_size + * The size of the HTTP request message in bytes, including the request + * headers and the request body. + * @type int $status + * The response code indicating the status of response. + * Examples: 200, 404. + * @type int|string $response_size + * The size of the HTTP response message sent back to the client, in bytes, + * including the response headers and the response body. + * @type string $user_agent + * The user agent sent by the client. Example: + * `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET + * CLR 1.0.3705)"`. + * @type string $remote_ip + * The IP address (IPv4 or IPv6) of the client that issued the HTTP + * request. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * @type string $server_ip + * The IP address (IPv4 or IPv6) of the origin server that the request was + * sent to. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * @type string $referer + * The referer URL of the request, as defined in + * [HTTP/1.1 Header Field + * Definitions](https://datatracker.ietf.org/doc/html/rfc2616#section-14.36). + * @type \Google\Protobuf\Duration $latency + * The request processing latency on the server, from the time the request was + * received until the response was sent. + * @type bool $cache_lookup + * Whether or not a cache lookup was attempted. + * @type bool $cache_hit + * Whether or not an entity was served from cache + * (with or without validation). + * @type bool $cache_validated_with_origin_server + * Whether or not the response was validated with the origin server before + * being served from cache. This field is only meaningful if `cache_hit` is + * True. + * @type int|string $cache_fill_bytes + * The number of HTTP response bytes inserted into cache. Set only when a + * cache fill was attempted. + * @type string $protocol + * Protocol used for the request. Examples: "HTTP/1.1", "HTTP/2", "websocket" + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Logging\Type\HttpRequest::initOnce(); + parent::__construct($data); + } + + /** + * The request method. Examples: `"GET"`, `"HEAD"`, `"PUT"`, `"POST"`. + * + * Generated from protobuf field string request_method = 1; + * @return string + */ + public function getRequestMethod() + { + return $this->request_method; + } + + /** + * The request method. Examples: `"GET"`, `"HEAD"`, `"PUT"`, `"POST"`. + * + * Generated from protobuf field string request_method = 1; + * @param string $var + * @return $this + */ + public function setRequestMethod($var) + { + GPBUtil::checkString($var, True); + $this->request_method = $var; + + return $this; + } + + /** + * The scheme (http, https), the host name, the path and the query + * portion of the URL that was requested. + * Example: `"http://example.com/some/info?color=red"`. + * + * Generated from protobuf field string request_url = 2; + * @return string + */ + public function getRequestUrl() + { + return $this->request_url; + } + + /** + * The scheme (http, https), the host name, the path and the query + * portion of the URL that was requested. + * Example: `"http://example.com/some/info?color=red"`. + * + * Generated from protobuf field string request_url = 2; + * @param string $var + * @return $this + */ + public function setRequestUrl($var) + { + GPBUtil::checkString($var, True); + $this->request_url = $var; + + return $this; + } + + /** + * The size of the HTTP request message in bytes, including the request + * headers and the request body. + * + * Generated from protobuf field int64 request_size = 3; + * @return int|string + */ + public function getRequestSize() + { + return $this->request_size; + } + + /** + * The size of the HTTP request message in bytes, including the request + * headers and the request body. + * + * Generated from protobuf field int64 request_size = 3; + * @param int|string $var + * @return $this + */ + public function setRequestSize($var) + { + GPBUtil::checkInt64($var); + $this->request_size = $var; + + return $this; + } + + /** + * The response code indicating the status of response. + * Examples: 200, 404. + * + * Generated from protobuf field int32 status = 4; + * @return int + */ + public function getStatus() + { + return $this->status; + } + + /** + * The response code indicating the status of response. + * Examples: 200, 404. + * + * Generated from protobuf field int32 status = 4; + * @param int $var + * @return $this + */ + public function setStatus($var) + { + GPBUtil::checkInt32($var); + $this->status = $var; + + return $this; + } + + /** + * The size of the HTTP response message sent back to the client, in bytes, + * including the response headers and the response body. + * + * Generated from protobuf field int64 response_size = 5; + * @return int|string + */ + public function getResponseSize() + { + return $this->response_size; + } + + /** + * The size of the HTTP response message sent back to the client, in bytes, + * including the response headers and the response body. + * + * Generated from protobuf field int64 response_size = 5; + * @param int|string $var + * @return $this + */ + public function setResponseSize($var) + { + GPBUtil::checkInt64($var); + $this->response_size = $var; + + return $this; + } + + /** + * The user agent sent by the client. Example: + * `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET + * CLR 1.0.3705)"`. + * + * Generated from protobuf field string user_agent = 6; + * @return string + */ + public function getUserAgent() + { + return $this->user_agent; + } + + /** + * The user agent sent by the client. Example: + * `"Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Q312461; .NET + * CLR 1.0.3705)"`. + * + * Generated from protobuf field string user_agent = 6; + * @param string $var + * @return $this + */ + public function setUserAgent($var) + { + GPBUtil::checkString($var, True); + $this->user_agent = $var; + + return $this; + } + + /** + * The IP address (IPv4 or IPv6) of the client that issued the HTTP + * request. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string remote_ip = 7; + * @return string + */ + public function getRemoteIp() + { + return $this->remote_ip; + } + + /** + * The IP address (IPv4 or IPv6) of the client that issued the HTTP + * request. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string remote_ip = 7; + * @param string $var + * @return $this + */ + public function setRemoteIp($var) + { + GPBUtil::checkString($var, True); + $this->remote_ip = $var; + + return $this; + } + + /** + * The IP address (IPv4 or IPv6) of the origin server that the request was + * sent to. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string server_ip = 13; + * @return string + */ + public function getServerIp() + { + return $this->server_ip; + } + + /** + * The IP address (IPv4 or IPv6) of the origin server that the request was + * sent to. This field can include port information. Examples: + * `"192.168.1.1"`, `"10.0.0.1:80"`, `"FE80::0202:B3FF:FE1E:8329"`. + * + * Generated from protobuf field string server_ip = 13; + * @param string $var + * @return $this + */ + public function setServerIp($var) + { + GPBUtil::checkString($var, True); + $this->server_ip = $var; + + return $this; + } + + /** + * The referer URL of the request, as defined in + * [HTTP/1.1 Header Field + * Definitions](https://datatracker.ietf.org/doc/html/rfc2616#section-14.36). + * + * Generated from protobuf field string referer = 8; + * @return string + */ + public function getReferer() + { + return $this->referer; + } + + /** + * The referer URL of the request, as defined in + * [HTTP/1.1 Header Field + * Definitions](https://datatracker.ietf.org/doc/html/rfc2616#section-14.36). + * + * Generated from protobuf field string referer = 8; + * @param string $var + * @return $this + */ + public function setReferer($var) + { + GPBUtil::checkString($var, True); + $this->referer = $var; + + return $this; + } + + /** + * The request processing latency on the server, from the time the request was + * received until the response was sent. + * + * Generated from protobuf field .google.protobuf.Duration latency = 14; + * @return \Google\Protobuf\Duration|null + */ + public function getLatency() + { + return $this->latency; + } + + public function hasLatency() + { + return isset($this->latency); + } + + public function clearLatency() + { + unset($this->latency); + } + + /** + * The request processing latency on the server, from the time the request was + * received until the response was sent. + * + * Generated from protobuf field .google.protobuf.Duration latency = 14; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setLatency($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->latency = $var; + + return $this; + } + + /** + * Whether or not a cache lookup was attempted. + * + * Generated from protobuf field bool cache_lookup = 11; + * @return bool + */ + public function getCacheLookup() + { + return $this->cache_lookup; + } + + /** + * Whether or not a cache lookup was attempted. + * + * Generated from protobuf field bool cache_lookup = 11; + * @param bool $var + * @return $this + */ + public function setCacheLookup($var) + { + GPBUtil::checkBool($var); + $this->cache_lookup = $var; + + return $this; + } + + /** + * Whether or not an entity was served from cache + * (with or without validation). + * + * Generated from protobuf field bool cache_hit = 9; + * @return bool + */ + public function getCacheHit() + { + return $this->cache_hit; + } + + /** + * Whether or not an entity was served from cache + * (with or without validation). + * + * Generated from protobuf field bool cache_hit = 9; + * @param bool $var + * @return $this + */ + public function setCacheHit($var) + { + GPBUtil::checkBool($var); + $this->cache_hit = $var; + + return $this; + } + + /** + * Whether or not the response was validated with the origin server before + * being served from cache. This field is only meaningful if `cache_hit` is + * True. + * + * Generated from protobuf field bool cache_validated_with_origin_server = 10; + * @return bool + */ + public function getCacheValidatedWithOriginServer() + { + return $this->cache_validated_with_origin_server; + } + + /** + * Whether or not the response was validated with the origin server before + * being served from cache. This field is only meaningful if `cache_hit` is + * True. + * + * Generated from protobuf field bool cache_validated_with_origin_server = 10; + * @param bool $var + * @return $this + */ + public function setCacheValidatedWithOriginServer($var) + { + GPBUtil::checkBool($var); + $this->cache_validated_with_origin_server = $var; + + return $this; + } + + /** + * The number of HTTP response bytes inserted into cache. Set only when a + * cache fill was attempted. + * + * Generated from protobuf field int64 cache_fill_bytes = 12; + * @return int|string + */ + public function getCacheFillBytes() + { + return $this->cache_fill_bytes; + } + + /** + * The number of HTTP response bytes inserted into cache. Set only when a + * cache fill was attempted. + * + * Generated from protobuf field int64 cache_fill_bytes = 12; + * @param int|string $var + * @return $this + */ + public function setCacheFillBytes($var) + { + GPBUtil::checkInt64($var); + $this->cache_fill_bytes = $var; + + return $this; + } + + /** + * Protocol used for the request. Examples: "HTTP/1.1", "HTTP/2", "websocket" + * + * Generated from protobuf field string protocol = 15; + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * Protocol used for the request. Examples: "HTTP/1.1", "HTTP/2", "websocket" + * + * Generated from protobuf field string protocol = 15; + * @param string $var + * @return $this + */ + public function setProtocol($var) + { + GPBUtil::checkString($var, True); + $this->protocol = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/LogSeverity.php b/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/LogSeverity.php new file mode 100644 index 000000000..dc64792e5 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/Logging/Type/LogSeverity.php @@ -0,0 +1,119 @@ + DEBUG AND severity <= WARNING + * If you are writing log entries, you should map other severity encodings to + * one of these standard levels. For example, you might map all of Java's FINE, + * FINER, and FINEST levels to `LogSeverity.DEBUG`. You can preserve the + * original severity level in the log entry payload if you wish. + * + * Protobuf type google.logging.type.LogSeverity + */ +class LogSeverity +{ + /** + * (0) The log entry has no assigned severity level. + * + * Generated from protobuf enum DEFAULT = 0; + */ + const PBDEFAULT = 0; + /** + * (100) Debug or trace information. + * + * Generated from protobuf enum DEBUG = 100; + */ + const DEBUG = 100; + /** + * (200) Routine information, such as ongoing status or performance. + * + * Generated from protobuf enum INFO = 200; + */ + const INFO = 200; + /** + * (300) Normal but significant events, such as start up, shut down, or + * a configuration change. + * + * Generated from protobuf enum NOTICE = 300; + */ + const NOTICE = 300; + /** + * (400) Warning events might cause problems. + * + * Generated from protobuf enum WARNING = 400; + */ + const WARNING = 400; + /** + * (500) Error events are likely to cause problems. + * + * Generated from protobuf enum ERROR = 500; + */ + const ERROR = 500; + /** + * (600) Critical events cause more severe problems or outages. + * + * Generated from protobuf enum CRITICAL = 600; + */ + const CRITICAL = 600; + /** + * (700) A person must take an action immediately. + * + * Generated from protobuf enum ALERT = 700; + */ + const ALERT = 700; + /** + * (800) One or more systems are unusable. + * + * Generated from protobuf enum EMERGENCY = 800; + */ + const EMERGENCY = 800; + + private static $valueToName = [ + self::PBDEFAULT => 'DEFAULT', + self::DEBUG => 'DEBUG', + self::INFO => 'INFO', + self::NOTICE => 'NOTICE', + self::WARNING => 'WARNING', + self::ERROR => 'ERROR', + self::CRITICAL => 'CRITICAL', + self::ALERT => 'ALERT', + self::EMERGENCY => 'EMERGENCY', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + $pbconst = __CLASS__. '::PB' . strtoupper($name); + if (!defined($pbconst)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($pbconst); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Cloud/OperationResponseMapping.php b/lib/Google/vendor/google/common-protos/src/Cloud/OperationResponseMapping.php new file mode 100644 index 000000000..c21c294e7 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Cloud/OperationResponseMapping.php @@ -0,0 +1,86 @@ +google.cloud.OperationResponseMapping + */ +class OperationResponseMapping +{ + /** + * Do not use. + * + * Generated from protobuf enum UNDEFINED = 0; + */ + const UNDEFINED = 0; + /** + * A field in an API-specific (custom) Operation object which carries the same + * meaning as google.longrunning.Operation.name. + * + * Generated from protobuf enum NAME = 1; + */ + const NAME = 1; + /** + * A field in an API-specific (custom) Operation object which carries the same + * meaning as google.longrunning.Operation.done. If the annotated field is of + * an enum type, `annotated_field_name == EnumType.DONE` semantics should be + * equivalent to `Operation.done == true`. If the annotated field is of type + * boolean, then it should follow the same semantics as Operation.done. + * Otherwise, a non-empty value should be treated as `Operation.done == true`. + * + * Generated from protobuf enum STATUS = 2; + */ + const STATUS = 2; + /** + * A field in an API-specific (custom) Operation object which carries the same + * meaning as google.longrunning.Operation.error.code. + * + * Generated from protobuf enum ERROR_CODE = 3; + */ + const ERROR_CODE = 3; + /** + * A field in an API-specific (custom) Operation object which carries the same + * meaning as google.longrunning.Operation.error.message. + * + * Generated from protobuf enum ERROR_MESSAGE = 4; + */ + const ERROR_MESSAGE = 4; + + private static $valueToName = [ + self::UNDEFINED => 'UNDEFINED', + self::NAME => 'NAME', + self::STATUS => 'STATUS', + self::ERROR_CODE => 'ERROR_CODE', + self::ERROR_MESSAGE => 'ERROR_MESSAGE', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Iam/V1/Logging/AuditData.php b/lib/Google/vendor/google/common-protos/src/Iam/V1/Logging/AuditData.php new file mode 100644 index 000000000..447ed72c2 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Iam/V1/Logging/AuditData.php @@ -0,0 +1,79 @@ +google.iam.v1.logging.AuditData + */ +class AuditData extends \Google\Protobuf\Internal\Message +{ + /** + * Policy delta between the original policy and the newly set policy. + * + * Generated from protobuf field .google.iam.v1.PolicyDelta policy_delta = 2; + */ + protected $policy_delta = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Cloud\Iam\V1\PolicyDelta $policy_delta + * Policy delta between the original policy and the newly set policy. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Iam\V1\Logging\AuditData::initOnce(); + parent::__construct($data); + } + + /** + * Policy delta between the original policy and the newly set policy. + * + * Generated from protobuf field .google.iam.v1.PolicyDelta policy_delta = 2; + * @return \Google\Cloud\Iam\V1\PolicyDelta|null + */ + public function getPolicyDelta() + { + return $this->policy_delta; + } + + public function hasPolicyDelta() + { + return isset($this->policy_delta); + } + + public function clearPolicyDelta() + { + unset($this->policy_delta); + } + + /** + * Policy delta between the original policy and the newly set policy. + * + * Generated from protobuf field .google.iam.v1.PolicyDelta policy_delta = 2; + * @param \Google\Cloud\Iam\V1\PolicyDelta $var + * @return $this + */ + public function setPolicyDelta($var) + { + GPBUtil::checkMessage($var, \Google\Cloud\Iam\V1\PolicyDelta::class); + $this->policy_delta = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest.php b/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest.php new file mode 100644 index 000000000..03e55d6ee --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest.php @@ -0,0 +1,68 @@ +google.rpc.BadRequest + */ +class BadRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Describes all violations in a client request. + * + * Generated from protobuf field repeated .google.rpc.BadRequest.FieldViolation field_violations = 1; + */ + private $field_violations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Rpc\BadRequest\FieldViolation>|\Google\Protobuf\Internal\RepeatedField $field_violations + * Describes all violations in a client request. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * Describes all violations in a client request. + * + * Generated from protobuf field repeated .google.rpc.BadRequest.FieldViolation field_violations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getFieldViolations() + { + return $this->field_violations; + } + + /** + * Describes all violations in a client request. + * + * Generated from protobuf field repeated .google.rpc.BadRequest.FieldViolation field_violations = 1; + * @param array<\Google\Rpc\BadRequest\FieldViolation>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setFieldViolations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Rpc\BadRequest\FieldViolation::class); + $this->field_violations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest/FieldViolation.php b/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest/FieldViolation.php new file mode 100644 index 000000000..fd245f68b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/BadRequest/FieldViolation.php @@ -0,0 +1,214 @@ +google.rpc.BadRequest.FieldViolation + */ +class FieldViolation extends \Google\Protobuf\Internal\Message +{ + /** + * A path that leads to a field in the request body. The value will be a + * sequence of dot-separated identifiers that identify a protocol buffer + * field. + * Consider the following: + * message CreateContactRequest { + * message EmailAddress { + * enum Type { + * TYPE_UNSPECIFIED = 0; + * HOME = 1; + * WORK = 2; + * } + * optional string email = 1; + * repeated EmailType type = 2; + * } + * string full_name = 1; + * repeated EmailAddress email_addresses = 2; + * } + * In this example, in proto `field` could take one of the following values: + * * `full_name` for a violation in the `full_name` value + * * `email_addresses[1].email` for a violation in the `email` field of the + * first `email_addresses` message + * * `email_addresses[3].type[2]` for a violation in the second `type` + * value in the third `email_addresses` message. + * In JSON, the same values are represented as: + * * `fullName` for a violation in the `fullName` value + * * `emailAddresses[1].email` for a violation in the `email` field of the + * first `emailAddresses` message + * * `emailAddresses[3].type[2]` for a violation in the second `type` + * value in the third `emailAddresses` message. + * + * Generated from protobuf field string field = 1; + */ + protected $field = ''; + /** + * A description of why the request element is bad. + * + * Generated from protobuf field string description = 2; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $field + * A path that leads to a field in the request body. The value will be a + * sequence of dot-separated identifiers that identify a protocol buffer + * field. + * Consider the following: + * message CreateContactRequest { + * message EmailAddress { + * enum Type { + * TYPE_UNSPECIFIED = 0; + * HOME = 1; + * WORK = 2; + * } + * optional string email = 1; + * repeated EmailType type = 2; + * } + * string full_name = 1; + * repeated EmailAddress email_addresses = 2; + * } + * In this example, in proto `field` could take one of the following values: + * * `full_name` for a violation in the `full_name` value + * * `email_addresses[1].email` for a violation in the `email` field of the + * first `email_addresses` message + * * `email_addresses[3].type[2]` for a violation in the second `type` + * value in the third `email_addresses` message. + * In JSON, the same values are represented as: + * * `fullName` for a violation in the `fullName` value + * * `emailAddresses[1].email` for a violation in the `email` field of the + * first `emailAddresses` message + * * `emailAddresses[3].type[2]` for a violation in the second `type` + * value in the third `emailAddresses` message. + * @type string $description + * A description of why the request element is bad. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * A path that leads to a field in the request body. The value will be a + * sequence of dot-separated identifiers that identify a protocol buffer + * field. + * Consider the following: + * message CreateContactRequest { + * message EmailAddress { + * enum Type { + * TYPE_UNSPECIFIED = 0; + * HOME = 1; + * WORK = 2; + * } + * optional string email = 1; + * repeated EmailType type = 2; + * } + * string full_name = 1; + * repeated EmailAddress email_addresses = 2; + * } + * In this example, in proto `field` could take one of the following values: + * * `full_name` for a violation in the `full_name` value + * * `email_addresses[1].email` for a violation in the `email` field of the + * first `email_addresses` message + * * `email_addresses[3].type[2]` for a violation in the second `type` + * value in the third `email_addresses` message. + * In JSON, the same values are represented as: + * * `fullName` for a violation in the `fullName` value + * * `emailAddresses[1].email` for a violation in the `email` field of the + * first `emailAddresses` message + * * `emailAddresses[3].type[2]` for a violation in the second `type` + * value in the third `emailAddresses` message. + * + * Generated from protobuf field string field = 1; + * @return string + */ + public function getField() + { + return $this->field; + } + + /** + * A path that leads to a field in the request body. The value will be a + * sequence of dot-separated identifiers that identify a protocol buffer + * field. + * Consider the following: + * message CreateContactRequest { + * message EmailAddress { + * enum Type { + * TYPE_UNSPECIFIED = 0; + * HOME = 1; + * WORK = 2; + * } + * optional string email = 1; + * repeated EmailType type = 2; + * } + * string full_name = 1; + * repeated EmailAddress email_addresses = 2; + * } + * In this example, in proto `field` could take one of the following values: + * * `full_name` for a violation in the `full_name` value + * * `email_addresses[1].email` for a violation in the `email` field of the + * first `email_addresses` message + * * `email_addresses[3].type[2]` for a violation in the second `type` + * value in the third `email_addresses` message. + * In JSON, the same values are represented as: + * * `fullName` for a violation in the `fullName` value + * * `emailAddresses[1].email` for a violation in the `email` field of the + * first `emailAddresses` message + * * `emailAddresses[3].type[2]` for a violation in the second `type` + * value in the third `emailAddresses` message. + * + * Generated from protobuf field string field = 1; + * @param string $var + * @return $this + */ + public function setField($var) + { + GPBUtil::checkString($var, True); + $this->field = $var; + + return $this; + } + + /** + * A description of why the request element is bad. + * + * Generated from protobuf field string description = 2; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A description of why the request element is bad. + * + * Generated from protobuf field string description = 2; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Code.php b/lib/Google/vendor/google/common-protos/src/Rpc/Code.php new file mode 100644 index 000000000..b82e88f3b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Code.php @@ -0,0 +1,243 @@ +google.rpc.Code + */ +class Code +{ + /** + * Not an error; returned on success. + * HTTP Mapping: 200 OK + * + * Generated from protobuf enum OK = 0; + */ + const OK = 0; + /** + * The operation was cancelled, typically by the caller. + * HTTP Mapping: 499 Client Closed Request + * + * Generated from protobuf enum CANCELLED = 1; + */ + const CANCELLED = 1; + /** + * Unknown error. For example, this error may be returned when + * a `Status` value received from another address space belongs to + * an error space that is not known in this address space. Also + * errors raised by APIs that do not return enough error information + * may be converted to this error. + * HTTP Mapping: 500 Internal Server Error + * + * Generated from protobuf enum UNKNOWN = 2; + */ + const UNKNOWN = 2; + /** + * The client specified an invalid argument. Note that this differs + * from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments + * that are problematic regardless of the state of the system + * (e.g., a malformed file name). + * HTTP Mapping: 400 Bad Request + * + * Generated from protobuf enum INVALID_ARGUMENT = 3; + */ + const INVALID_ARGUMENT = 3; + /** + * The deadline expired before the operation could complete. For operations + * that change the state of the system, this error may be returned + * even if the operation has completed successfully. For example, a + * successful response from a server could have been delayed long + * enough for the deadline to expire. + * HTTP Mapping: 504 Gateway Timeout + * + * Generated from protobuf enum DEADLINE_EXCEEDED = 4; + */ + const DEADLINE_EXCEEDED = 4; + /** + * Some requested entity (e.g., file or directory) was not found. + * Note to server developers: if a request is denied for an entire class + * of users, such as gradual feature rollout or undocumented allowlist, + * `NOT_FOUND` may be used. If a request is denied for some users within + * a class of users, such as user-based access control, `PERMISSION_DENIED` + * must be used. + * HTTP Mapping: 404 Not Found + * + * Generated from protobuf enum NOT_FOUND = 5; + */ + const NOT_FOUND = 5; + /** + * The entity that a client attempted to create (e.g., file or directory) + * already exists. + * HTTP Mapping: 409 Conflict + * + * Generated from protobuf enum ALREADY_EXISTS = 6; + */ + const ALREADY_EXISTS = 6; + /** + * The caller does not have permission to execute the specified + * operation. `PERMISSION_DENIED` must not be used for rejections + * caused by exhausting some resource (use `RESOURCE_EXHAUSTED` + * instead for those errors). `PERMISSION_DENIED` must not be + * used if the caller can not be identified (use `UNAUTHENTICATED` + * instead for those errors). This error code does not imply the + * request is valid or the requested entity exists or satisfies + * other pre-conditions. + * HTTP Mapping: 403 Forbidden + * + * Generated from protobuf enum PERMISSION_DENIED = 7; + */ + const PERMISSION_DENIED = 7; + /** + * The request does not have valid authentication credentials for the + * operation. + * HTTP Mapping: 401 Unauthorized + * + * Generated from protobuf enum UNAUTHENTICATED = 16; + */ + const UNAUTHENTICATED = 16; + /** + * Some resource has been exhausted, perhaps a per-user quota, or + * perhaps the entire file system is out of space. + * HTTP Mapping: 429 Too Many Requests + * + * Generated from protobuf enum RESOURCE_EXHAUSTED = 8; + */ + const RESOURCE_EXHAUSTED = 8; + /** + * The operation was rejected because the system is not in a state + * required for the operation's execution. For example, the directory + * to be deleted is non-empty, an rmdir operation is applied to + * a non-directory, etc. + * Service implementors can use the following guidelines to decide + * between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: + * (a) Use `UNAVAILABLE` if the client can retry just the failing call. + * (b) Use `ABORTED` if the client should retry at a higher level. For + * example, when a client-specified test-and-set fails, indicating the + * client should restart a read-modify-write sequence. + * (c) Use `FAILED_PRECONDITION` if the client should not retry until + * the system state has been explicitly fixed. For example, if an "rmdir" + * fails because the directory is non-empty, `FAILED_PRECONDITION` + * should be returned since the client should not retry unless + * the files are deleted from the directory. + * HTTP Mapping: 400 Bad Request + * + * Generated from protobuf enum FAILED_PRECONDITION = 9; + */ + const FAILED_PRECONDITION = 9; + /** + * The operation was aborted, typically due to a concurrency issue such as + * a sequencer check failure or transaction abort. + * See the guidelines above for deciding between `FAILED_PRECONDITION`, + * `ABORTED`, and `UNAVAILABLE`. + * HTTP Mapping: 409 Conflict + * + * Generated from protobuf enum ABORTED = 10; + */ + const ABORTED = 10; + /** + * The operation was attempted past the valid range. E.g., seeking or + * reading past end-of-file. + * Unlike `INVALID_ARGUMENT`, this error indicates a problem that may + * be fixed if the system state changes. For example, a 32-bit file + * system will generate `INVALID_ARGUMENT` if asked to read at an + * offset that is not in the range [0,2^32-1], but it will generate + * `OUT_OF_RANGE` if asked to read from an offset past the current + * file size. + * There is a fair bit of overlap between `FAILED_PRECONDITION` and + * `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific + * error) when it applies so that callers who are iterating through + * a space can easily look for an `OUT_OF_RANGE` error to detect when + * they are done. + * HTTP Mapping: 400 Bad Request + * + * Generated from protobuf enum OUT_OF_RANGE = 11; + */ + const OUT_OF_RANGE = 11; + /** + * The operation is not implemented or is not supported/enabled in this + * service. + * HTTP Mapping: 501 Not Implemented + * + * Generated from protobuf enum UNIMPLEMENTED = 12; + */ + const UNIMPLEMENTED = 12; + /** + * Internal errors. This means that some invariants expected by the + * underlying system have been broken. This error code is reserved + * for serious errors. + * HTTP Mapping: 500 Internal Server Error + * + * Generated from protobuf enum INTERNAL = 13; + */ + const INTERNAL = 13; + /** + * The service is currently unavailable. This is most likely a + * transient condition, which can be corrected by retrying with + * a backoff. Note that it is not always safe to retry + * non-idempotent operations. + * See the guidelines above for deciding between `FAILED_PRECONDITION`, + * `ABORTED`, and `UNAVAILABLE`. + * HTTP Mapping: 503 Service Unavailable + * + * Generated from protobuf enum UNAVAILABLE = 14; + */ + const UNAVAILABLE = 14; + /** + * Unrecoverable data loss or corruption. + * HTTP Mapping: 500 Internal Server Error + * + * Generated from protobuf enum DATA_LOSS = 15; + */ + const DATA_LOSS = 15; + + private static $valueToName = [ + self::OK => 'OK', + self::CANCELLED => 'CANCELLED', + self::UNKNOWN => 'UNKNOWN', + self::INVALID_ARGUMENT => 'INVALID_ARGUMENT', + self::DEADLINE_EXCEEDED => 'DEADLINE_EXCEEDED', + self::NOT_FOUND => 'NOT_FOUND', + self::ALREADY_EXISTS => 'ALREADY_EXISTS', + self::PERMISSION_DENIED => 'PERMISSION_DENIED', + self::UNAUTHENTICATED => 'UNAUTHENTICATED', + self::RESOURCE_EXHAUSTED => 'RESOURCE_EXHAUSTED', + self::FAILED_PRECONDITION => 'FAILED_PRECONDITION', + self::ABORTED => 'ABORTED', + self::OUT_OF_RANGE => 'OUT_OF_RANGE', + self::UNIMPLEMENTED => 'UNIMPLEMENTED', + self::INTERNAL => 'INTERNAL', + self::UNAVAILABLE => 'UNAVAILABLE', + self::DATA_LOSS => 'DATA_LOSS', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext.php new file mode 100644 index 000000000..a18f30364 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext.php @@ -0,0 +1,419 @@ +google.rpc.context.AttributeContext + */ +class AttributeContext extends \Google\Protobuf\Internal\Message +{ + /** + * The origin of a network activity. In a multi hop network activity, + * the origin represents the sender of the first hop. For the first hop, + * the `source` and the `origin` must have the same content. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer origin = 7; + */ + protected $origin = null; + /** + * The source of a network activity, such as starting a TCP connection. + * In a multi hop network activity, the source represents the sender of the + * last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer source = 1; + */ + protected $source = null; + /** + * The destination of a network activity, such as accepting a TCP connection. + * In a multi hop network activity, the destination represents the receiver of + * the last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer destination = 2; + */ + protected $destination = null; + /** + * Represents a network request, such as an HTTP request. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Request request = 3; + */ + protected $request = null; + /** + * Represents a network response, such as an HTTP response. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Response response = 4; + */ + protected $response = null; + /** + * Represents a target resource that is involved with a network activity. + * If multiple resources are involved with an activity, this must be the + * primary one. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Resource resource = 5; + */ + protected $resource = null; + /** + * Represents an API operation that is involved to a network activity. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Api api = 6; + */ + protected $api = null; + /** + * Supports extensions for advanced use cases, such as logs and metrics. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 8; + */ + private $extensions; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Rpc\Context\AttributeContext\Peer $origin + * The origin of a network activity. In a multi hop network activity, + * the origin represents the sender of the first hop. For the first hop, + * the `source` and the `origin` must have the same content. + * @type \Google\Rpc\Context\AttributeContext\Peer $source + * The source of a network activity, such as starting a TCP connection. + * In a multi hop network activity, the source represents the sender of the + * last hop. + * @type \Google\Rpc\Context\AttributeContext\Peer $destination + * The destination of a network activity, such as accepting a TCP connection. + * In a multi hop network activity, the destination represents the receiver of + * the last hop. + * @type \Google\Rpc\Context\AttributeContext\Request $request + * Represents a network request, such as an HTTP request. + * @type \Google\Rpc\Context\AttributeContext\Response $response + * Represents a network response, such as an HTTP response. + * @type \Google\Rpc\Context\AttributeContext\Resource $resource + * Represents a target resource that is involved with a network activity. + * If multiple resources are involved with an activity, this must be the + * primary one. + * @type \Google\Rpc\Context\AttributeContext\Api $api + * Represents an API operation that is involved to a network activity. + * @type array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $extensions + * Supports extensions for advanced use cases, such as logs and metrics. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The origin of a network activity. In a multi hop network activity, + * the origin represents the sender of the first hop. For the first hop, + * the `source` and the `origin` must have the same content. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer origin = 7; + * @return \Google\Rpc\Context\AttributeContext\Peer|null + */ + public function getOrigin() + { + return $this->origin; + } + + public function hasOrigin() + { + return isset($this->origin); + } + + public function clearOrigin() + { + unset($this->origin); + } + + /** + * The origin of a network activity. In a multi hop network activity, + * the origin represents the sender of the first hop. For the first hop, + * the `source` and the `origin` must have the same content. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer origin = 7; + * @param \Google\Rpc\Context\AttributeContext\Peer $var + * @return $this + */ + public function setOrigin($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Peer::class); + $this->origin = $var; + + return $this; + } + + /** + * The source of a network activity, such as starting a TCP connection. + * In a multi hop network activity, the source represents the sender of the + * last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer source = 1; + * @return \Google\Rpc\Context\AttributeContext\Peer|null + */ + public function getSource() + { + return $this->source; + } + + public function hasSource() + { + return isset($this->source); + } + + public function clearSource() + { + unset($this->source); + } + + /** + * The source of a network activity, such as starting a TCP connection. + * In a multi hop network activity, the source represents the sender of the + * last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer source = 1; + * @param \Google\Rpc\Context\AttributeContext\Peer $var + * @return $this + */ + public function setSource($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Peer::class); + $this->source = $var; + + return $this; + } + + /** + * The destination of a network activity, such as accepting a TCP connection. + * In a multi hop network activity, the destination represents the receiver of + * the last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer destination = 2; + * @return \Google\Rpc\Context\AttributeContext\Peer|null + */ + public function getDestination() + { + return $this->destination; + } + + public function hasDestination() + { + return isset($this->destination); + } + + public function clearDestination() + { + unset($this->destination); + } + + /** + * The destination of a network activity, such as accepting a TCP connection. + * In a multi hop network activity, the destination represents the receiver of + * the last hop. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Peer destination = 2; + * @param \Google\Rpc\Context\AttributeContext\Peer $var + * @return $this + */ + public function setDestination($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Peer::class); + $this->destination = $var; + + return $this; + } + + /** + * Represents a network request, such as an HTTP request. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Request request = 3; + * @return \Google\Rpc\Context\AttributeContext\Request|null + */ + public function getRequest() + { + return $this->request; + } + + public function hasRequest() + { + return isset($this->request); + } + + public function clearRequest() + { + unset($this->request); + } + + /** + * Represents a network request, such as an HTTP request. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Request request = 3; + * @param \Google\Rpc\Context\AttributeContext\Request $var + * @return $this + */ + public function setRequest($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Request::class); + $this->request = $var; + + return $this; + } + + /** + * Represents a network response, such as an HTTP response. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Response response = 4; + * @return \Google\Rpc\Context\AttributeContext\Response|null + */ + public function getResponse() + { + return $this->response; + } + + public function hasResponse() + { + return isset($this->response); + } + + public function clearResponse() + { + unset($this->response); + } + + /** + * Represents a network response, such as an HTTP response. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Response response = 4; + * @param \Google\Rpc\Context\AttributeContext\Response $var + * @return $this + */ + public function setResponse($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Response::class); + $this->response = $var; + + return $this; + } + + /** + * Represents a target resource that is involved with a network activity. + * If multiple resources are involved with an activity, this must be the + * primary one. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Resource resource = 5; + * @return \Google\Rpc\Context\AttributeContext\Resource|null + */ + public function getResource() + { + return $this->resource; + } + + public function hasResource() + { + return isset($this->resource); + } + + public function clearResource() + { + unset($this->resource); + } + + /** + * Represents a target resource that is involved with a network activity. + * If multiple resources are involved with an activity, this must be the + * primary one. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Resource resource = 5; + * @param \Google\Rpc\Context\AttributeContext\Resource $var + * @return $this + */ + public function setResource($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Resource::class); + $this->resource = $var; + + return $this; + } + + /** + * Represents an API operation that is involved to a network activity. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Api api = 6; + * @return \Google\Rpc\Context\AttributeContext\Api|null + */ + public function getApi() + { + return $this->api; + } + + public function hasApi() + { + return isset($this->api); + } + + public function clearApi() + { + unset($this->api); + } + + /** + * Represents an API operation that is involved to a network activity. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Api api = 6; + * @param \Google\Rpc\Context\AttributeContext\Api $var + * @return $this + */ + public function setApi($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Api::class); + $this->api = $var; + + return $this; + } + + /** + * Supports extensions for advanced use cases, such as logs and metrics. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 8; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getExtensions() + { + return $this->extensions; + } + + /** + * Supports extensions for advanced use cases, such as logs and metrics. + * + * Generated from protobuf field repeated .google.protobuf.Any extensions = 8; + * @param array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setExtensions($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Any::class); + $this->extensions = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Api.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Api.php new file mode 100644 index 000000000..5cba42296 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Api.php @@ -0,0 +1,196 @@ +google.rpc.context.AttributeContext.Api + */ +class Api extends \Google\Protobuf\Internal\Message +{ + /** + * The API service name. It is a logical identifier for a networked API, + * such as "pubsub.googleapis.com". The naming syntax depends on the + * API management system being used for handling the request. + * + * Generated from protobuf field string service = 1; + */ + protected $service = ''; + /** + * The API operation name. For gRPC requests, it is the fully qualified API + * method name, such as "google.pubsub.v1.Publisher.Publish". For OpenAPI + * requests, it is the `operationId`, such as "getPet". + * + * Generated from protobuf field string operation = 2; + */ + protected $operation = ''; + /** + * The API protocol used for sending the request, such as "http", "https", + * "grpc", or "internal". + * + * Generated from protobuf field string protocol = 3; + */ + protected $protocol = ''; + /** + * The API version associated with the API operation above, such as "v1" or + * "v1alpha1". + * + * Generated from protobuf field string version = 4; + */ + protected $version = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $service + * The API service name. It is a logical identifier for a networked API, + * such as "pubsub.googleapis.com". The naming syntax depends on the + * API management system being used for handling the request. + * @type string $operation + * The API operation name. For gRPC requests, it is the fully qualified API + * method name, such as "google.pubsub.v1.Publisher.Publish". For OpenAPI + * requests, it is the `operationId`, such as "getPet". + * @type string $protocol + * The API protocol used for sending the request, such as "http", "https", + * "grpc", or "internal". + * @type string $version + * The API version associated with the API operation above, such as "v1" or + * "v1alpha1". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The API service name. It is a logical identifier for a networked API, + * such as "pubsub.googleapis.com". The naming syntax depends on the + * API management system being used for handling the request. + * + * Generated from protobuf field string service = 1; + * @return string + */ + public function getService() + { + return $this->service; + } + + /** + * The API service name. It is a logical identifier for a networked API, + * such as "pubsub.googleapis.com". The naming syntax depends on the + * API management system being used for handling the request. + * + * Generated from protobuf field string service = 1; + * @param string $var + * @return $this + */ + public function setService($var) + { + GPBUtil::checkString($var, True); + $this->service = $var; + + return $this; + } + + /** + * The API operation name. For gRPC requests, it is the fully qualified API + * method name, such as "google.pubsub.v1.Publisher.Publish". For OpenAPI + * requests, it is the `operationId`, such as "getPet". + * + * Generated from protobuf field string operation = 2; + * @return string + */ + public function getOperation() + { + return $this->operation; + } + + /** + * The API operation name. For gRPC requests, it is the fully qualified API + * method name, such as "google.pubsub.v1.Publisher.Publish". For OpenAPI + * requests, it is the `operationId`, such as "getPet". + * + * Generated from protobuf field string operation = 2; + * @param string $var + * @return $this + */ + public function setOperation($var) + { + GPBUtil::checkString($var, True); + $this->operation = $var; + + return $this; + } + + /** + * The API protocol used for sending the request, such as "http", "https", + * "grpc", or "internal". + * + * Generated from protobuf field string protocol = 3; + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * The API protocol used for sending the request, such as "http", "https", + * "grpc", or "internal". + * + * Generated from protobuf field string protocol = 3; + * @param string $var + * @return $this + */ + public function setProtocol($var) + { + GPBUtil::checkString($var, True); + $this->protocol = $var; + + return $this; + } + + /** + * The API version associated with the API operation above, such as "v1" or + * "v1alpha1". + * + * Generated from protobuf field string version = 4; + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * The API version associated with the API operation above, such as "v1" or + * "v1alpha1". + * + * Generated from protobuf field string version = 4; + * @param string $var + * @return $this + */ + public function setVersion($var) + { + GPBUtil::checkString($var, True); + $this->version = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Auth.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Auth.php new file mode 100644 index 000000000..dd42490ff --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Auth.php @@ -0,0 +1,356 @@ +google.rpc.context.AttributeContext.Auth + */ +class Auth extends \Google\Protobuf\Internal\Message +{ + /** + * The authenticated principal. Reflects the issuer (`iss`) and subject + * (`sub`) claims within a JWT. The issuer and subject should be `/` + * delimited, with `/` percent-encoded within the subject fragment. For + * Google accounts, the principal format is: + * "https://accounts.google.com/{id}" + * + * Generated from protobuf field string principal = 1; + */ + protected $principal = ''; + /** + * The intended audience(s) for this authentication information. Reflects + * the audience (`aud`) claim within a JWT. The audience + * value(s) depends on the `issuer`, but typically include one or more of + * the following pieces of information: + * * The services intended to receive the credential. For example, + * ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"]. + * * A set of service-based scopes. For example, + * ["https://www.googleapis.com/auth/cloud-platform"]. + * * The client id of an app, such as the Firebase project id for JWTs + * from Firebase Auth. + * Consult the documentation for the credential issuer to determine the + * information provided. + * + * Generated from protobuf field repeated string audiences = 2; + */ + private $audiences; + /** + * The authorized presenter of the credential. Reflects the optional + * Authorized Presenter (`azp`) claim within a JWT or the + * OAuth client id. For example, a Google Cloud Platform client id looks + * as follows: "123456789012.apps.googleusercontent.com". + * + * Generated from protobuf field string presenter = 3; + */ + protected $presenter = ''; + /** + * Structured claims presented with the credential. JWTs include + * `{key: value}` pairs for standard and private claims. The following + * is a subset of the standard required and optional claims that would + * typically be presented for a Google-based JWT: + * {'iss': 'accounts.google.com', + * 'sub': '113289723416554971153', + * 'aud': ['123456789012', 'pubsub.googleapis.com'], + * 'azp': '123456789012.apps.googleusercontent.com', + * 'email': 'jsmith@example.com', + * 'iat': 1353601026, + * 'exp': 1353604926} + * SAML assertions are similarly specified, but with an identity provider + * dependent structure. + * + * Generated from protobuf field .google.protobuf.Struct claims = 4; + */ + protected $claims = null; + /** + * A list of access level resource names that allow resources to be + * accessed by authenticated requester. It is part of Secure GCP processing + * for the incoming request. An access level string has the format: + * "//{api_service_name}/accessPolicies/{policy_id}/accessLevels/{short_name}" + * Example: + * "//accesscontextmanager.googleapis.com/accessPolicies/MY_POLICY_ID/accessLevels/MY_LEVEL" + * + * Generated from protobuf field repeated string access_levels = 5; + */ + private $access_levels; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $principal + * The authenticated principal. Reflects the issuer (`iss`) and subject + * (`sub`) claims within a JWT. The issuer and subject should be `/` + * delimited, with `/` percent-encoded within the subject fragment. For + * Google accounts, the principal format is: + * "https://accounts.google.com/{id}" + * @type array|\Google\Protobuf\Internal\RepeatedField $audiences + * The intended audience(s) for this authentication information. Reflects + * the audience (`aud`) claim within a JWT. The audience + * value(s) depends on the `issuer`, but typically include one or more of + * the following pieces of information: + * * The services intended to receive the credential. For example, + * ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"]. + * * A set of service-based scopes. For example, + * ["https://www.googleapis.com/auth/cloud-platform"]. + * * The client id of an app, such as the Firebase project id for JWTs + * from Firebase Auth. + * Consult the documentation for the credential issuer to determine the + * information provided. + * @type string $presenter + * The authorized presenter of the credential. Reflects the optional + * Authorized Presenter (`azp`) claim within a JWT or the + * OAuth client id. For example, a Google Cloud Platform client id looks + * as follows: "123456789012.apps.googleusercontent.com". + * @type \Google\Protobuf\Struct $claims + * Structured claims presented with the credential. JWTs include + * `{key: value}` pairs for standard and private claims. The following + * is a subset of the standard required and optional claims that would + * typically be presented for a Google-based JWT: + * {'iss': 'accounts.google.com', + * 'sub': '113289723416554971153', + * 'aud': ['123456789012', 'pubsub.googleapis.com'], + * 'azp': '123456789012.apps.googleusercontent.com', + * 'email': 'jsmith@example.com', + * 'iat': 1353601026, + * 'exp': 1353604926} + * SAML assertions are similarly specified, but with an identity provider + * dependent structure. + * @type array|\Google\Protobuf\Internal\RepeatedField $access_levels + * A list of access level resource names that allow resources to be + * accessed by authenticated requester. It is part of Secure GCP processing + * for the incoming request. An access level string has the format: + * "//{api_service_name}/accessPolicies/{policy_id}/accessLevels/{short_name}" + * Example: + * "//accesscontextmanager.googleapis.com/accessPolicies/MY_POLICY_ID/accessLevels/MY_LEVEL" + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The authenticated principal. Reflects the issuer (`iss`) and subject + * (`sub`) claims within a JWT. The issuer and subject should be `/` + * delimited, with `/` percent-encoded within the subject fragment. For + * Google accounts, the principal format is: + * "https://accounts.google.com/{id}" + * + * Generated from protobuf field string principal = 1; + * @return string + */ + public function getPrincipal() + { + return $this->principal; + } + + /** + * The authenticated principal. Reflects the issuer (`iss`) and subject + * (`sub`) claims within a JWT. The issuer and subject should be `/` + * delimited, with `/` percent-encoded within the subject fragment. For + * Google accounts, the principal format is: + * "https://accounts.google.com/{id}" + * + * Generated from protobuf field string principal = 1; + * @param string $var + * @return $this + */ + public function setPrincipal($var) + { + GPBUtil::checkString($var, True); + $this->principal = $var; + + return $this; + } + + /** + * The intended audience(s) for this authentication information. Reflects + * the audience (`aud`) claim within a JWT. The audience + * value(s) depends on the `issuer`, but typically include one or more of + * the following pieces of information: + * * The services intended to receive the credential. For example, + * ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"]. + * * A set of service-based scopes. For example, + * ["https://www.googleapis.com/auth/cloud-platform"]. + * * The client id of an app, such as the Firebase project id for JWTs + * from Firebase Auth. + * Consult the documentation for the credential issuer to determine the + * information provided. + * + * Generated from protobuf field repeated string audiences = 2; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAudiences() + { + return $this->audiences; + } + + /** + * The intended audience(s) for this authentication information. Reflects + * the audience (`aud`) claim within a JWT. The audience + * value(s) depends on the `issuer`, but typically include one or more of + * the following pieces of information: + * * The services intended to receive the credential. For example, + * ["https://pubsub.googleapis.com/", "https://storage.googleapis.com/"]. + * * A set of service-based scopes. For example, + * ["https://www.googleapis.com/auth/cloud-platform"]. + * * The client id of an app, such as the Firebase project id for JWTs + * from Firebase Auth. + * Consult the documentation for the credential issuer to determine the + * information provided. + * + * Generated from protobuf field repeated string audiences = 2; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAudiences($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->audiences = $arr; + + return $this; + } + + /** + * The authorized presenter of the credential. Reflects the optional + * Authorized Presenter (`azp`) claim within a JWT or the + * OAuth client id. For example, a Google Cloud Platform client id looks + * as follows: "123456789012.apps.googleusercontent.com". + * + * Generated from protobuf field string presenter = 3; + * @return string + */ + public function getPresenter() + { + return $this->presenter; + } + + /** + * The authorized presenter of the credential. Reflects the optional + * Authorized Presenter (`azp`) claim within a JWT or the + * OAuth client id. For example, a Google Cloud Platform client id looks + * as follows: "123456789012.apps.googleusercontent.com". + * + * Generated from protobuf field string presenter = 3; + * @param string $var + * @return $this + */ + public function setPresenter($var) + { + GPBUtil::checkString($var, True); + $this->presenter = $var; + + return $this; + } + + /** + * Structured claims presented with the credential. JWTs include + * `{key: value}` pairs for standard and private claims. The following + * is a subset of the standard required and optional claims that would + * typically be presented for a Google-based JWT: + * {'iss': 'accounts.google.com', + * 'sub': '113289723416554971153', + * 'aud': ['123456789012', 'pubsub.googleapis.com'], + * 'azp': '123456789012.apps.googleusercontent.com', + * 'email': 'jsmith@example.com', + * 'iat': 1353601026, + * 'exp': 1353604926} + * SAML assertions are similarly specified, but with an identity provider + * dependent structure. + * + * Generated from protobuf field .google.protobuf.Struct claims = 4; + * @return \Google\Protobuf\Struct|null + */ + public function getClaims() + { + return $this->claims; + } + + public function hasClaims() + { + return isset($this->claims); + } + + public function clearClaims() + { + unset($this->claims); + } + + /** + * Structured claims presented with the credential. JWTs include + * `{key: value}` pairs for standard and private claims. The following + * is a subset of the standard required and optional claims that would + * typically be presented for a Google-based JWT: + * {'iss': 'accounts.google.com', + * 'sub': '113289723416554971153', + * 'aud': ['123456789012', 'pubsub.googleapis.com'], + * 'azp': '123456789012.apps.googleusercontent.com', + * 'email': 'jsmith@example.com', + * 'iat': 1353601026, + * 'exp': 1353604926} + * SAML assertions are similarly specified, but with an identity provider + * dependent structure. + * + * Generated from protobuf field .google.protobuf.Struct claims = 4; + * @param \Google\Protobuf\Struct $var + * @return $this + */ + public function setClaims($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class); + $this->claims = $var; + + return $this; + } + + /** + * A list of access level resource names that allow resources to be + * accessed by authenticated requester. It is part of Secure GCP processing + * for the incoming request. An access level string has the format: + * "//{api_service_name}/accessPolicies/{policy_id}/accessLevels/{short_name}" + * Example: + * "//accesscontextmanager.googleapis.com/accessPolicies/MY_POLICY_ID/accessLevels/MY_LEVEL" + * + * Generated from protobuf field repeated string access_levels = 5; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAccessLevels() + { + return $this->access_levels; + } + + /** + * A list of access level resource names that allow resources to be + * accessed by authenticated requester. It is part of Secure GCP processing + * for the incoming request. An access level string has the format: + * "//{api_service_name}/accessPolicies/{policy_id}/accessLevels/{short_name}" + * Example: + * "//accesscontextmanager.googleapis.com/accessPolicies/MY_POLICY_ID/accessLevels/MY_LEVEL" + * + * Generated from protobuf field repeated string access_levels = 5; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAccessLevels($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->access_levels = $arr; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Peer.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Peer.php new file mode 100644 index 000000000..9d3e1b6e1 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Peer.php @@ -0,0 +1,223 @@ +google.rpc.context.AttributeContext.Peer + */ +class Peer extends \Google\Protobuf\Internal\Message +{ + /** + * The IP address of the peer. + * + * Generated from protobuf field string ip = 1; + */ + protected $ip = ''; + /** + * The network port of the peer. + * + * Generated from protobuf field int64 port = 2; + */ + protected $port = 0; + /** + * The labels associated with the peer. + * + * Generated from protobuf field map labels = 6; + */ + private $labels; + /** + * The identity of this peer. Similar to `Request.auth.principal`, but + * relative to the peer instead of the request. For example, the + * identity associated with a load balancer that forwarded the request. + * + * Generated from protobuf field string principal = 7; + */ + protected $principal = ''; + /** + * The CLDR country/region code associated with the above IP address. + * If the IP address is private, the `region_code` should reflect the + * physical location where this peer is running. + * + * Generated from protobuf field string region_code = 8; + */ + protected $region_code = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $ip + * The IP address of the peer. + * @type int|string $port + * The network port of the peer. + * @type array|\Google\Protobuf\Internal\MapField $labels + * The labels associated with the peer. + * @type string $principal + * The identity of this peer. Similar to `Request.auth.principal`, but + * relative to the peer instead of the request. For example, the + * identity associated with a load balancer that forwarded the request. + * @type string $region_code + * The CLDR country/region code associated with the above IP address. + * If the IP address is private, the `region_code` should reflect the + * physical location where this peer is running. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The IP address of the peer. + * + * Generated from protobuf field string ip = 1; + * @return string + */ + public function getIp() + { + return $this->ip; + } + + /** + * The IP address of the peer. + * + * Generated from protobuf field string ip = 1; + * @param string $var + * @return $this + */ + public function setIp($var) + { + GPBUtil::checkString($var, True); + $this->ip = $var; + + return $this; + } + + /** + * The network port of the peer. + * + * Generated from protobuf field int64 port = 2; + * @return int|string + */ + public function getPort() + { + return $this->port; + } + + /** + * The network port of the peer. + * + * Generated from protobuf field int64 port = 2; + * @param int|string $var + * @return $this + */ + public function setPort($var) + { + GPBUtil::checkInt64($var); + $this->port = $var; + + return $this; + } + + /** + * The labels associated with the peer. + * + * Generated from protobuf field map labels = 6; + * @return \Google\Protobuf\Internal\MapField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * The labels associated with the peer. + * + * Generated from protobuf field map labels = 6; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->labels = $arr; + + return $this; + } + + /** + * The identity of this peer. Similar to `Request.auth.principal`, but + * relative to the peer instead of the request. For example, the + * identity associated with a load balancer that forwarded the request. + * + * Generated from protobuf field string principal = 7; + * @return string + */ + public function getPrincipal() + { + return $this->principal; + } + + /** + * The identity of this peer. Similar to `Request.auth.principal`, but + * relative to the peer instead of the request. For example, the + * identity associated with a load balancer that forwarded the request. + * + * Generated from protobuf field string principal = 7; + * @param string $var + * @return $this + */ + public function setPrincipal($var) + { + GPBUtil::checkString($var, True); + $this->principal = $var; + + return $this; + } + + /** + * The CLDR country/region code associated with the above IP address. + * If the IP address is private, the `region_code` should reflect the + * physical location where this peer is running. + * + * Generated from protobuf field string region_code = 8; + * @return string + */ + public function getRegionCode() + { + return $this->region_code; + } + + /** + * The CLDR country/region code associated with the above IP address. + * If the IP address is private, the `region_code` should reflect the + * physical location where this peer is running. + * + * Generated from protobuf field string region_code = 8; + * @param string $var + * @return $this + */ + public function setRegionCode($var) + { + GPBUtil::checkString($var, True); + $this->region_code = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Request.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Request.php new file mode 100644 index 000000000..928794a28 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Request.php @@ -0,0 +1,508 @@ +google.rpc.context.AttributeContext.Request + */ +class Request extends \Google\Protobuf\Internal\Message +{ + /** + * The unique ID for a request, which can be propagated to downstream + * systems. The ID should have low probability of collision + * within a single day for a specific service. + * + * Generated from protobuf field string id = 1; + */ + protected $id = ''; + /** + * The HTTP request method, such as `GET`, `POST`. + * + * Generated from protobuf field string method = 2; + */ + protected $method = ''; + /** + * The HTTP request headers. If multiple headers share the same key, they + * must be merged according to the HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + */ + private $headers; + /** + * The HTTP URL path, excluding the query parameters. + * + * Generated from protobuf field string path = 4; + */ + protected $path = ''; + /** + * The HTTP request `Host` header value. + * + * Generated from protobuf field string host = 5; + */ + protected $host = ''; + /** + * The HTTP URL scheme, such as `http` and `https`. + * + * Generated from protobuf field string scheme = 6; + */ + protected $scheme = ''; + /** + * The HTTP URL query in the format of `name1=value1&name2=value2`, as it + * appears in the first line of the HTTP request. No decoding is performed. + * + * Generated from protobuf field string query = 7; + */ + protected $query = ''; + /** + * The timestamp when the `destination` service receives the last byte of + * the request. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 9; + */ + protected $time = null; + /** + * The HTTP request size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 10; + */ + protected $size = 0; + /** + * The network protocol used with the request, such as "http/1.1", + * "spdy/3", "h2", "h2c", "webrtc", "tcp", "udp", "quic". See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for details. + * + * Generated from protobuf field string protocol = 11; + */ + protected $protocol = ''; + /** + * A special parameter for request reason. It is used by security systems + * to associate auditing information with a request. + * + * Generated from protobuf field string reason = 12; + */ + protected $reason = ''; + /** + * The request authentication. May be absent for unauthenticated requests. + * Derived from the HTTP request `Authorization` header or equivalent. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Auth auth = 13; + */ + protected $auth = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $id + * The unique ID for a request, which can be propagated to downstream + * systems. The ID should have low probability of collision + * within a single day for a specific service. + * @type string $method + * The HTTP request method, such as `GET`, `POST`. + * @type array|\Google\Protobuf\Internal\MapField $headers + * The HTTP request headers. If multiple headers share the same key, they + * must be merged according to the HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * @type string $path + * The HTTP URL path, excluding the query parameters. + * @type string $host + * The HTTP request `Host` header value. + * @type string $scheme + * The HTTP URL scheme, such as `http` and `https`. + * @type string $query + * The HTTP URL query in the format of `name1=value1&name2=value2`, as it + * appears in the first line of the HTTP request. No decoding is performed. + * @type \Google\Protobuf\Timestamp $time + * The timestamp when the `destination` service receives the last byte of + * the request. + * @type int|string $size + * The HTTP request size in bytes. If unknown, it must be -1. + * @type string $protocol + * The network protocol used with the request, such as "http/1.1", + * "spdy/3", "h2", "h2c", "webrtc", "tcp", "udp", "quic". See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for details. + * @type string $reason + * A special parameter for request reason. It is used by security systems + * to associate auditing information with a request. + * @type \Google\Rpc\Context\AttributeContext\Auth $auth + * The request authentication. May be absent for unauthenticated requests. + * Derived from the HTTP request `Authorization` header or equivalent. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The unique ID for a request, which can be propagated to downstream + * systems. The ID should have low probability of collision + * within a single day for a specific service. + * + * Generated from protobuf field string id = 1; + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * The unique ID for a request, which can be propagated to downstream + * systems. The ID should have low probability of collision + * within a single day for a specific service. + * + * Generated from protobuf field string id = 1; + * @param string $var + * @return $this + */ + public function setId($var) + { + GPBUtil::checkString($var, True); + $this->id = $var; + + return $this; + } + + /** + * The HTTP request method, such as `GET`, `POST`. + * + * Generated from protobuf field string method = 2; + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * The HTTP request method, such as `GET`, `POST`. + * + * Generated from protobuf field string method = 2; + * @param string $var + * @return $this + */ + public function setMethod($var) + { + GPBUtil::checkString($var, True); + $this->method = $var; + + return $this; + } + + /** + * The HTTP request headers. If multiple headers share the same key, they + * must be merged according to the HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + * @return \Google\Protobuf\Internal\MapField + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * The HTTP request headers. If multiple headers share the same key, they + * must be merged according to the HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setHeaders($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->headers = $arr; + + return $this; + } + + /** + * The HTTP URL path, excluding the query parameters. + * + * Generated from protobuf field string path = 4; + * @return string + */ + public function getPath() + { + return $this->path; + } + + /** + * The HTTP URL path, excluding the query parameters. + * + * Generated from protobuf field string path = 4; + * @param string $var + * @return $this + */ + public function setPath($var) + { + GPBUtil::checkString($var, True); + $this->path = $var; + + return $this; + } + + /** + * The HTTP request `Host` header value. + * + * Generated from protobuf field string host = 5; + * @return string + */ + public function getHost() + { + return $this->host; + } + + /** + * The HTTP request `Host` header value. + * + * Generated from protobuf field string host = 5; + * @param string $var + * @return $this + */ + public function setHost($var) + { + GPBUtil::checkString($var, True); + $this->host = $var; + + return $this; + } + + /** + * The HTTP URL scheme, such as `http` and `https`. + * + * Generated from protobuf field string scheme = 6; + * @return string + */ + public function getScheme() + { + return $this->scheme; + } + + /** + * The HTTP URL scheme, such as `http` and `https`. + * + * Generated from protobuf field string scheme = 6; + * @param string $var + * @return $this + */ + public function setScheme($var) + { + GPBUtil::checkString($var, True); + $this->scheme = $var; + + return $this; + } + + /** + * The HTTP URL query in the format of `name1=value1&name2=value2`, as it + * appears in the first line of the HTTP request. No decoding is performed. + * + * Generated from protobuf field string query = 7; + * @return string + */ + public function getQuery() + { + return $this->query; + } + + /** + * The HTTP URL query in the format of `name1=value1&name2=value2`, as it + * appears in the first line of the HTTP request. No decoding is performed. + * + * Generated from protobuf field string query = 7; + * @param string $var + * @return $this + */ + public function setQuery($var) + { + GPBUtil::checkString($var, True); + $this->query = $var; + + return $this; + } + + /** + * The timestamp when the `destination` service receives the last byte of + * the request. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 9; + * @return \Google\Protobuf\Timestamp|null + */ + public function getTime() + { + return $this->time; + } + + public function hasTime() + { + return isset($this->time); + } + + public function clearTime() + { + unset($this->time); + } + + /** + * The timestamp when the `destination` service receives the last byte of + * the request. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 9; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->time = $var; + + return $this; + } + + /** + * The HTTP request size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 10; + * @return int|string + */ + public function getSize() + { + return $this->size; + } + + /** + * The HTTP request size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 10; + * @param int|string $var + * @return $this + */ + public function setSize($var) + { + GPBUtil::checkInt64($var); + $this->size = $var; + + return $this; + } + + /** + * The network protocol used with the request, such as "http/1.1", + * "spdy/3", "h2", "h2c", "webrtc", "tcp", "udp", "quic". See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for details. + * + * Generated from protobuf field string protocol = 11; + * @return string + */ + public function getProtocol() + { + return $this->protocol; + } + + /** + * The network protocol used with the request, such as "http/1.1", + * "spdy/3", "h2", "h2c", "webrtc", "tcp", "udp", "quic". See + * https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids + * for details. + * + * Generated from protobuf field string protocol = 11; + * @param string $var + * @return $this + */ + public function setProtocol($var) + { + GPBUtil::checkString($var, True); + $this->protocol = $var; + + return $this; + } + + /** + * A special parameter for request reason. It is used by security systems + * to associate auditing information with a request. + * + * Generated from protobuf field string reason = 12; + * @return string + */ + public function getReason() + { + return $this->reason; + } + + /** + * A special parameter for request reason. It is used by security systems + * to associate auditing information with a request. + * + * Generated from protobuf field string reason = 12; + * @param string $var + * @return $this + */ + public function setReason($var) + { + GPBUtil::checkString($var, True); + $this->reason = $var; + + return $this; + } + + /** + * The request authentication. May be absent for unauthenticated requests. + * Derived from the HTTP request `Authorization` header or equivalent. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Auth auth = 13; + * @return \Google\Rpc\Context\AttributeContext\Auth|null + */ + public function getAuth() + { + return $this->auth; + } + + public function hasAuth() + { + return isset($this->auth); + } + + public function clearAuth() + { + unset($this->auth); + } + + /** + * The request authentication. May be absent for unauthenticated requests. + * Derived from the HTTP request `Authorization` header or equivalent. + * + * Generated from protobuf field .google.rpc.context.AttributeContext.Auth auth = 13; + * @param \Google\Rpc\Context\AttributeContext\Auth $var + * @return $this + */ + public function setAuth($var) + { + GPBUtil::checkMessage($var, \Google\Rpc\Context\AttributeContext\Auth::class); + $this->auth = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Resource.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Resource.php new file mode 100644 index 000000000..6cf4b69e5 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Resource.php @@ -0,0 +1,610 @@ +google.rpc.context.AttributeContext.Resource + */ +class Resource extends \Google\Protobuf\Internal\Message +{ + /** + * The name of the service that this resource belongs to, such as + * `pubsub.googleapis.com`. The service may be different from the DNS + * hostname that actually serves the request. + * + * Generated from protobuf field string service = 1; + */ + protected $service = ''; + /** + * The stable identifier (name) of a resource on the `service`. A resource + * can be logically identified as "//{resource.service}/{resource.name}". + * The differences between a resource name and a URI are: + * * Resource name is a logical identifier, independent of network + * protocol and API version. For example, + * `//pubsub.googleapis.com/projects/123/topics/news-feed`. + * * URI often includes protocol and version information, so it can + * be used directly by applications. For example, + * `https://pubsub.googleapis.com/v1/projects/123/topics/news-feed`. + * See https://cloud.google.com/apis/design/resource_names for details. + * + * Generated from protobuf field string name = 2; + */ + protected $name = ''; + /** + * The type of the resource. The syntax is platform-specific because + * different platforms define their resources differently. + * For Google APIs, the type format must be "{service}/{kind}", such as + * "pubsub.googleapis.com/Topic". + * + * Generated from protobuf field string type = 3; + */ + protected $type = ''; + /** + * The labels or tags on the resource, such as AWS resource tags and + * Kubernetes resource labels. + * + * Generated from protobuf field map labels = 4; + */ + private $labels; + /** + * The unique identifier of the resource. UID is unique in the time + * and space for this resource within the scope of the service. It is + * typically generated by the server on successful creation of a resource + * and must not be changed. UID is used to uniquely identify resources + * with resource name reuses. This should be a UUID4. + * + * Generated from protobuf field string uid = 5; + */ + protected $uid = ''; + /** + * Annotations is an unstructured key-value map stored with a resource that + * may be set by external tools to store and retrieve arbitrary metadata. + * They are not queryable and should be preserved when modifying objects. + * More info: https://kubernetes.io/docs/user-guide/annotations + * + * Generated from protobuf field map annotations = 6; + */ + private $annotations; + /** + * Mutable. The display name set by clients. Must be <= 63 characters. + * + * Generated from protobuf field string display_name = 7; + */ + protected $display_name = ''; + /** + * Output only. The timestamp when the resource was created. This may + * be either the time creation was initiated or when it was completed. + * + * Generated from protobuf field .google.protobuf.Timestamp create_time = 8; + */ + protected $create_time = null; + /** + * Output only. The timestamp when the resource was last updated. Any + * change to the resource made by users must refresh this value. + * Changes to a resource made by the service should refresh this value. + * + * Generated from protobuf field .google.protobuf.Timestamp update_time = 9; + */ + protected $update_time = null; + /** + * Output only. The timestamp when the resource was deleted. + * If the resource is not deleted, this must be empty. + * + * Generated from protobuf field .google.protobuf.Timestamp delete_time = 10; + */ + protected $delete_time = null; + /** + * Output only. An opaque value that uniquely identifies a version or + * generation of a resource. It can be used to confirm that the client + * and server agree on the ordering of a resource being written. + * + * Generated from protobuf field string etag = 11; + */ + protected $etag = ''; + /** + * Immutable. The location of the resource. The location encoding is + * specific to the service provider, and new encoding may be introduced + * as the service evolves. + * For Google Cloud products, the encoding is what is used by Google Cloud + * APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The + * semantics of `location` is identical to the + * `cloud.googleapis.com/location` label used by some Google Cloud APIs. + * + * Generated from protobuf field string location = 12; + */ + protected $location = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $service + * The name of the service that this resource belongs to, such as + * `pubsub.googleapis.com`. The service may be different from the DNS + * hostname that actually serves the request. + * @type string $name + * The stable identifier (name) of a resource on the `service`. A resource + * can be logically identified as "//{resource.service}/{resource.name}". + * The differences between a resource name and a URI are: + * * Resource name is a logical identifier, independent of network + * protocol and API version. For example, + * `//pubsub.googleapis.com/projects/123/topics/news-feed`. + * * URI often includes protocol and version information, so it can + * be used directly by applications. For example, + * `https://pubsub.googleapis.com/v1/projects/123/topics/news-feed`. + * See https://cloud.google.com/apis/design/resource_names for details. + * @type string $type + * The type of the resource. The syntax is platform-specific because + * different platforms define their resources differently. + * For Google APIs, the type format must be "{service}/{kind}", such as + * "pubsub.googleapis.com/Topic". + * @type array|\Google\Protobuf\Internal\MapField $labels + * The labels or tags on the resource, such as AWS resource tags and + * Kubernetes resource labels. + * @type string $uid + * The unique identifier of the resource. UID is unique in the time + * and space for this resource within the scope of the service. It is + * typically generated by the server on successful creation of a resource + * and must not be changed. UID is used to uniquely identify resources + * with resource name reuses. This should be a UUID4. + * @type array|\Google\Protobuf\Internal\MapField $annotations + * Annotations is an unstructured key-value map stored with a resource that + * may be set by external tools to store and retrieve arbitrary metadata. + * They are not queryable and should be preserved when modifying objects. + * More info: https://kubernetes.io/docs/user-guide/annotations + * @type string $display_name + * Mutable. The display name set by clients. Must be <= 63 characters. + * @type \Google\Protobuf\Timestamp $create_time + * Output only. The timestamp when the resource was created. This may + * be either the time creation was initiated or when it was completed. + * @type \Google\Protobuf\Timestamp $update_time + * Output only. The timestamp when the resource was last updated. Any + * change to the resource made by users must refresh this value. + * Changes to a resource made by the service should refresh this value. + * @type \Google\Protobuf\Timestamp $delete_time + * Output only. The timestamp when the resource was deleted. + * If the resource is not deleted, this must be empty. + * @type string $etag + * Output only. An opaque value that uniquely identifies a version or + * generation of a resource. It can be used to confirm that the client + * and server agree on the ordering of a resource being written. + * @type string $location + * Immutable. The location of the resource. The location encoding is + * specific to the service provider, and new encoding may be introduced + * as the service evolves. + * For Google Cloud products, the encoding is what is used by Google Cloud + * APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The + * semantics of `location` is identical to the + * `cloud.googleapis.com/location` label used by some Google Cloud APIs. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The name of the service that this resource belongs to, such as + * `pubsub.googleapis.com`. The service may be different from the DNS + * hostname that actually serves the request. + * + * Generated from protobuf field string service = 1; + * @return string + */ + public function getService() + { + return $this->service; + } + + /** + * The name of the service that this resource belongs to, such as + * `pubsub.googleapis.com`. The service may be different from the DNS + * hostname that actually serves the request. + * + * Generated from protobuf field string service = 1; + * @param string $var + * @return $this + */ + public function setService($var) + { + GPBUtil::checkString($var, True); + $this->service = $var; + + return $this; + } + + /** + * The stable identifier (name) of a resource on the `service`. A resource + * can be logically identified as "//{resource.service}/{resource.name}". + * The differences between a resource name and a URI are: + * * Resource name is a logical identifier, independent of network + * protocol and API version. For example, + * `//pubsub.googleapis.com/projects/123/topics/news-feed`. + * * URI often includes protocol and version information, so it can + * be used directly by applications. For example, + * `https://pubsub.googleapis.com/v1/projects/123/topics/news-feed`. + * See https://cloud.google.com/apis/design/resource_names for details. + * + * Generated from protobuf field string name = 2; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * The stable identifier (name) of a resource on the `service`. A resource + * can be logically identified as "//{resource.service}/{resource.name}". + * The differences between a resource name and a URI are: + * * Resource name is a logical identifier, independent of network + * protocol and API version. For example, + * `//pubsub.googleapis.com/projects/123/topics/news-feed`. + * * URI often includes protocol and version information, so it can + * be used directly by applications. For example, + * `https://pubsub.googleapis.com/v1/projects/123/topics/news-feed`. + * See https://cloud.google.com/apis/design/resource_names for details. + * + * Generated from protobuf field string name = 2; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * The type of the resource. The syntax is platform-specific because + * different platforms define their resources differently. + * For Google APIs, the type format must be "{service}/{kind}", such as + * "pubsub.googleapis.com/Topic". + * + * Generated from protobuf field string type = 3; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * The type of the resource. The syntax is platform-specific because + * different platforms define their resources differently. + * For Google APIs, the type format must be "{service}/{kind}", such as + * "pubsub.googleapis.com/Topic". + * + * Generated from protobuf field string type = 3; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * The labels or tags on the resource, such as AWS resource tags and + * Kubernetes resource labels. + * + * Generated from protobuf field map labels = 4; + * @return \Google\Protobuf\Internal\MapField + */ + public function getLabels() + { + return $this->labels; + } + + /** + * The labels or tags on the resource, such as AWS resource tags and + * Kubernetes resource labels. + * + * Generated from protobuf field map labels = 4; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setLabels($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->labels = $arr; + + return $this; + } + + /** + * The unique identifier of the resource. UID is unique in the time + * and space for this resource within the scope of the service. It is + * typically generated by the server on successful creation of a resource + * and must not be changed. UID is used to uniquely identify resources + * with resource name reuses. This should be a UUID4. + * + * Generated from protobuf field string uid = 5; + * @return string + */ + public function getUid() + { + return $this->uid; + } + + /** + * The unique identifier of the resource. UID is unique in the time + * and space for this resource within the scope of the service. It is + * typically generated by the server on successful creation of a resource + * and must not be changed. UID is used to uniquely identify resources + * with resource name reuses. This should be a UUID4. + * + * Generated from protobuf field string uid = 5; + * @param string $var + * @return $this + */ + public function setUid($var) + { + GPBUtil::checkString($var, True); + $this->uid = $var; + + return $this; + } + + /** + * Annotations is an unstructured key-value map stored with a resource that + * may be set by external tools to store and retrieve arbitrary metadata. + * They are not queryable and should be preserved when modifying objects. + * More info: https://kubernetes.io/docs/user-guide/annotations + * + * Generated from protobuf field map annotations = 6; + * @return \Google\Protobuf\Internal\MapField + */ + public function getAnnotations() + { + return $this->annotations; + } + + /** + * Annotations is an unstructured key-value map stored with a resource that + * may be set by external tools to store and retrieve arbitrary metadata. + * They are not queryable and should be preserved when modifying objects. + * More info: https://kubernetes.io/docs/user-guide/annotations + * + * Generated from protobuf field map annotations = 6; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setAnnotations($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->annotations = $arr; + + return $this; + } + + /** + * Mutable. The display name set by clients. Must be <= 63 characters. + * + * Generated from protobuf field string display_name = 7; + * @return string + */ + public function getDisplayName() + { + return $this->display_name; + } + + /** + * Mutable. The display name set by clients. Must be <= 63 characters. + * + * Generated from protobuf field string display_name = 7; + * @param string $var + * @return $this + */ + public function setDisplayName($var) + { + GPBUtil::checkString($var, True); + $this->display_name = $var; + + return $this; + } + + /** + * Output only. The timestamp when the resource was created. This may + * be either the time creation was initiated or when it was completed. + * + * Generated from protobuf field .google.protobuf.Timestamp create_time = 8; + * @return \Google\Protobuf\Timestamp|null + */ + public function getCreateTime() + { + return $this->create_time; + } + + public function hasCreateTime() + { + return isset($this->create_time); + } + + public function clearCreateTime() + { + unset($this->create_time); + } + + /** + * Output only. The timestamp when the resource was created. This may + * be either the time creation was initiated or when it was completed. + * + * Generated from protobuf field .google.protobuf.Timestamp create_time = 8; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setCreateTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->create_time = $var; + + return $this; + } + + /** + * Output only. The timestamp when the resource was last updated. Any + * change to the resource made by users must refresh this value. + * Changes to a resource made by the service should refresh this value. + * + * Generated from protobuf field .google.protobuf.Timestamp update_time = 9; + * @return \Google\Protobuf\Timestamp|null + */ + public function getUpdateTime() + { + return $this->update_time; + } + + public function hasUpdateTime() + { + return isset($this->update_time); + } + + public function clearUpdateTime() + { + unset($this->update_time); + } + + /** + * Output only. The timestamp when the resource was last updated. Any + * change to the resource made by users must refresh this value. + * Changes to a resource made by the service should refresh this value. + * + * Generated from protobuf field .google.protobuf.Timestamp update_time = 9; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setUpdateTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->update_time = $var; + + return $this; + } + + /** + * Output only. The timestamp when the resource was deleted. + * If the resource is not deleted, this must be empty. + * + * Generated from protobuf field .google.protobuf.Timestamp delete_time = 10; + * @return \Google\Protobuf\Timestamp|null + */ + public function getDeleteTime() + { + return $this->delete_time; + } + + public function hasDeleteTime() + { + return isset($this->delete_time); + } + + public function clearDeleteTime() + { + unset($this->delete_time); + } + + /** + * Output only. The timestamp when the resource was deleted. + * If the resource is not deleted, this must be empty. + * + * Generated from protobuf field .google.protobuf.Timestamp delete_time = 10; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setDeleteTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->delete_time = $var; + + return $this; + } + + /** + * Output only. An opaque value that uniquely identifies a version or + * generation of a resource. It can be used to confirm that the client + * and server agree on the ordering of a resource being written. + * + * Generated from protobuf field string etag = 11; + * @return string + */ + public function getEtag() + { + return $this->etag; + } + + /** + * Output only. An opaque value that uniquely identifies a version or + * generation of a resource. It can be used to confirm that the client + * and server agree on the ordering of a resource being written. + * + * Generated from protobuf field string etag = 11; + * @param string $var + * @return $this + */ + public function setEtag($var) + { + GPBUtil::checkString($var, True); + $this->etag = $var; + + return $this; + } + + /** + * Immutable. The location of the resource. The location encoding is + * specific to the service provider, and new encoding may be introduced + * as the service evolves. + * For Google Cloud products, the encoding is what is used by Google Cloud + * APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The + * semantics of `location` is identical to the + * `cloud.googleapis.com/location` label used by some Google Cloud APIs. + * + * Generated from protobuf field string location = 12; + * @return string + */ + public function getLocation() + { + return $this->location; + } + + /** + * Immutable. The location of the resource. The location encoding is + * specific to the service provider, and new encoding may be introduced + * as the service evolves. + * For Google Cloud products, the encoding is what is used by Google Cloud + * APIs, such as `us-east1`, `aws-us-east-1`, and `azure-eastus2`. The + * semantics of `location` is identical to the + * `cloud.googleapis.com/location` label used by some Google Cloud APIs. + * + * Generated from protobuf field string location = 12; + * @param string $var + * @return $this + */ + public function setLocation($var) + { + GPBUtil::checkString($var, True); + $this->location = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Response.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Response.php new file mode 100644 index 000000000..c632cf444 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AttributeContext/Response.php @@ -0,0 +1,249 @@ +google.rpc.context.AttributeContext.Response + */ +class Response extends \Google\Protobuf\Internal\Message +{ + /** + * The HTTP response status code, such as `200` and `404`. + * + * Generated from protobuf field int64 code = 1; + */ + protected $code = 0; + /** + * The HTTP response size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 2; + */ + protected $size = 0; + /** + * The HTTP response headers. If multiple headers share the same key, they + * must be merged according to HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + */ + private $headers; + /** + * The timestamp when the `destination` service sends the last byte of + * the response. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 4; + */ + protected $time = null; + /** + * The amount of time it takes the backend service to fully respond to a + * request. Measured from when the destination service starts to send the + * request to the backend until when the destination service receives the + * complete response from the backend. + * + * Generated from protobuf field .google.protobuf.Duration backend_latency = 5; + */ + protected $backend_latency = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $code + * The HTTP response status code, such as `200` and `404`. + * @type int|string $size + * The HTTP response size in bytes. If unknown, it must be -1. + * @type array|\Google\Protobuf\Internal\MapField $headers + * The HTTP response headers. If multiple headers share the same key, they + * must be merged according to HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * @type \Google\Protobuf\Timestamp $time + * The timestamp when the `destination` service sends the last byte of + * the response. + * @type \Google\Protobuf\Duration $backend_latency + * The amount of time it takes the backend service to fully respond to a + * request. Measured from when the destination service starts to send the + * request to the backend until when the destination service receives the + * complete response from the backend. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AttributeContext::initOnce(); + parent::__construct($data); + } + + /** + * The HTTP response status code, such as `200` and `404`. + * + * Generated from protobuf field int64 code = 1; + * @return int|string + */ + public function getCode() + { + return $this->code; + } + + /** + * The HTTP response status code, such as `200` and `404`. + * + * Generated from protobuf field int64 code = 1; + * @param int|string $var + * @return $this + */ + public function setCode($var) + { + GPBUtil::checkInt64($var); + $this->code = $var; + + return $this; + } + + /** + * The HTTP response size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 2; + * @return int|string + */ + public function getSize() + { + return $this->size; + } + + /** + * The HTTP response size in bytes. If unknown, it must be -1. + * + * Generated from protobuf field int64 size = 2; + * @param int|string $var + * @return $this + */ + public function setSize($var) + { + GPBUtil::checkInt64($var); + $this->size = $var; + + return $this; + } + + /** + * The HTTP response headers. If multiple headers share the same key, they + * must be merged according to HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + * @return \Google\Protobuf\Internal\MapField + */ + public function getHeaders() + { + return $this->headers; + } + + /** + * The HTTP response headers. If multiple headers share the same key, they + * must be merged according to HTTP spec. All header keys must be + * lowercased, because HTTP header keys are case-insensitive. + * + * Generated from protobuf field map headers = 3; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setHeaders($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->headers = $arr; + + return $this; + } + + /** + * The timestamp when the `destination` service sends the last byte of + * the response. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 4; + * @return \Google\Protobuf\Timestamp|null + */ + public function getTime() + { + return $this->time; + } + + public function hasTime() + { + return isset($this->time); + } + + public function clearTime() + { + unset($this->time); + } + + /** + * The timestamp when the `destination` service sends the last byte of + * the response. + * + * Generated from protobuf field .google.protobuf.Timestamp time = 4; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->time = $var; + + return $this; + } + + /** + * The amount of time it takes the backend service to fully respond to a + * request. Measured from when the destination service starts to send the + * request to the backend until when the destination service receives the + * complete response from the backend. + * + * Generated from protobuf field .google.protobuf.Duration backend_latency = 5; + * @return \Google\Protobuf\Duration|null + */ + public function getBackendLatency() + { + return $this->backend_latency; + } + + public function hasBackendLatency() + { + return isset($this->backend_latency); + } + + public function clearBackendLatency() + { + unset($this->backend_latency); + } + + /** + * The amount of time it takes the backend service to fully respond to a + * request. Measured from when the destination service starts to send the + * request to the backend until when the destination service receives the + * complete response from the backend. + * + * Generated from protobuf field .google.protobuf.Duration backend_latency = 5; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setBackendLatency($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->backend_latency = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Context/AuditContext.php b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AuditContext.php new file mode 100644 index 000000000..3e9588a31 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Context/AuditContext.php @@ -0,0 +1,247 @@ +google.rpc.context.AuditContext + */ +class AuditContext extends \Google\Protobuf\Internal\Message +{ + /** + * Serialized audit log. + * + * Generated from protobuf field bytes audit_log = 1; + */ + protected $audit_log = ''; + /** + * An API request message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_request = 2; + */ + protected $scrubbed_request = null; + /** + * An API response message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_response = 3; + */ + protected $scrubbed_response = null; + /** + * Number of scrubbed response items. + * + * Generated from protobuf field int32 scrubbed_response_item_count = 4; + */ + protected $scrubbed_response_item_count = 0; + /** + * Audit resource name which is scrubbed. + * + * Generated from protobuf field string target_resource = 5; + */ + protected $target_resource = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $audit_log + * Serialized audit log. + * @type \Google\Protobuf\Struct $scrubbed_request + * An API request message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * @type \Google\Protobuf\Struct $scrubbed_response + * An API response message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * @type int $scrubbed_response_item_count + * Number of scrubbed response items. + * @type string $target_resource + * Audit resource name which is scrubbed. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Context\AuditContext::initOnce(); + parent::__construct($data); + } + + /** + * Serialized audit log. + * + * Generated from protobuf field bytes audit_log = 1; + * @return string + */ + public function getAuditLog() + { + return $this->audit_log; + } + + /** + * Serialized audit log. + * + * Generated from protobuf field bytes audit_log = 1; + * @param string $var + * @return $this + */ + public function setAuditLog($var) + { + GPBUtil::checkString($var, False); + $this->audit_log = $var; + + return $this; + } + + /** + * An API request message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_request = 2; + * @return \Google\Protobuf\Struct|null + */ + public function getScrubbedRequest() + { + return $this->scrubbed_request; + } + + public function hasScrubbedRequest() + { + return isset($this->scrubbed_request); + } + + public function clearScrubbedRequest() + { + unset($this->scrubbed_request); + } + + /** + * An API request message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_request = 2; + * @param \Google\Protobuf\Struct $var + * @return $this + */ + public function setScrubbedRequest($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class); + $this->scrubbed_request = $var; + + return $this; + } + + /** + * An API response message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_response = 3; + * @return \Google\Protobuf\Struct|null + */ + public function getScrubbedResponse() + { + return $this->scrubbed_response; + } + + public function hasScrubbedResponse() + { + return isset($this->scrubbed_response); + } + + public function clearScrubbedResponse() + { + unset($this->scrubbed_response); + } + + /** + * An API response message that is scrubbed based on the method annotation. + * This field should only be filled if audit_log field is present. + * Service Control will use this to assemble a complete log for Cloud Audit + * Logs and Google internal audit logs. + * + * Generated from protobuf field .google.protobuf.Struct scrubbed_response = 3; + * @param \Google\Protobuf\Struct $var + * @return $this + */ + public function setScrubbedResponse($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class); + $this->scrubbed_response = $var; + + return $this; + } + + /** + * Number of scrubbed response items. + * + * Generated from protobuf field int32 scrubbed_response_item_count = 4; + * @return int + */ + public function getScrubbedResponseItemCount() + { + return $this->scrubbed_response_item_count; + } + + /** + * Number of scrubbed response items. + * + * Generated from protobuf field int32 scrubbed_response_item_count = 4; + * @param int $var + * @return $this + */ + public function setScrubbedResponseItemCount($var) + { + GPBUtil::checkInt32($var); + $this->scrubbed_response_item_count = $var; + + return $this; + } + + /** + * Audit resource name which is scrubbed. + * + * Generated from protobuf field string target_resource = 5; + * @return string + */ + public function getTargetResource() + { + return $this->target_resource; + } + + /** + * Audit resource name which is scrubbed. + * + * Generated from protobuf field string target_resource = 5; + * @param string $var + * @return $this + */ + public function setTargetResource($var) + { + GPBUtil::checkString($var, True); + $this->target_resource = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/DebugInfo.php b/lib/Google/vendor/google/common-protos/src/Rpc/DebugInfo.php new file mode 100644 index 000000000..648967387 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/DebugInfo.php @@ -0,0 +1,101 @@ +google.rpc.DebugInfo + */ +class DebugInfo extends \Google\Protobuf\Internal\Message +{ + /** + * The stack trace entries indicating where the error occurred. + * + * Generated from protobuf field repeated string stack_entries = 1; + */ + private $stack_entries; + /** + * Additional debugging information provided by the server. + * + * Generated from protobuf field string detail = 2; + */ + protected $detail = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array|\Google\Protobuf\Internal\RepeatedField $stack_entries + * The stack trace entries indicating where the error occurred. + * @type string $detail + * Additional debugging information provided by the server. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * The stack trace entries indicating where the error occurred. + * + * Generated from protobuf field repeated string stack_entries = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getStackEntries() + { + return $this->stack_entries; + } + + /** + * The stack trace entries indicating where the error occurred. + * + * Generated from protobuf field repeated string stack_entries = 1; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setStackEntries($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->stack_entries = $arr; + + return $this; + } + + /** + * Additional debugging information provided by the server. + * + * Generated from protobuf field string detail = 2; + * @return string + */ + public function getDetail() + { + return $this->detail; + } + + /** + * Additional debugging information provided by the server. + * + * Generated from protobuf field string detail = 2; + * @param string $var + * @return $this + */ + public function setDetail($var) + { + GPBUtil::checkString($var, True); + $this->detail = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/ErrorInfo.php b/lib/Google/vendor/google/common-protos/src/Rpc/ErrorInfo.php new file mode 100644 index 000000000..8c2e0ec0b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/ErrorInfo.php @@ -0,0 +1,213 @@ +google.rpc.ErrorInfo + */ +class ErrorInfo extends \Google\Protobuf\Internal\Message +{ + /** + * The reason of the error. This is a constant value that identifies the + * proximate cause of the error. Error reasons are unique within a particular + * domain of errors. This should be at most 63 characters and match a + * regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + * UPPER_SNAKE_CASE. + * + * Generated from protobuf field string reason = 1; + */ + protected $reason = ''; + /** + * The logical grouping to which the "reason" belongs. The error domain + * is typically the registered service name of the tool or product that + * generates the error. Example: "pubsub.googleapis.com". If the error is + * generated by some common infrastructure, the error domain must be a + * globally unique value that identifies the infrastructure. For Google API + * infrastructure, the error domain is "googleapis.com". + * + * Generated from protobuf field string domain = 2; + */ + protected $domain = ''; + /** + * Additional structured details about this error. + * Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + * length. When identifying the current value of an exceeded limit, the units + * should be contained in the key, not the value. For example, rather than + * {"instanceLimit": "100/request"}, should be returned as, + * {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + * instances that can be created in a single (batch) request. + * + * Generated from protobuf field map metadata = 3; + */ + private $metadata; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $reason + * The reason of the error. This is a constant value that identifies the + * proximate cause of the error. Error reasons are unique within a particular + * domain of errors. This should be at most 63 characters and match a + * regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + * UPPER_SNAKE_CASE. + * @type string $domain + * The logical grouping to which the "reason" belongs. The error domain + * is typically the registered service name of the tool or product that + * generates the error. Example: "pubsub.googleapis.com". If the error is + * generated by some common infrastructure, the error domain must be a + * globally unique value that identifies the infrastructure. For Google API + * infrastructure, the error domain is "googleapis.com". + * @type array|\Google\Protobuf\Internal\MapField $metadata + * Additional structured details about this error. + * Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + * length. When identifying the current value of an exceeded limit, the units + * should be contained in the key, not the value. For example, rather than + * {"instanceLimit": "100/request"}, should be returned as, + * {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + * instances that can be created in a single (batch) request. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * The reason of the error. This is a constant value that identifies the + * proximate cause of the error. Error reasons are unique within a particular + * domain of errors. This should be at most 63 characters and match a + * regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + * UPPER_SNAKE_CASE. + * + * Generated from protobuf field string reason = 1; + * @return string + */ + public function getReason() + { + return $this->reason; + } + + /** + * The reason of the error. This is a constant value that identifies the + * proximate cause of the error. Error reasons are unique within a particular + * domain of errors. This should be at most 63 characters and match a + * regular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents + * UPPER_SNAKE_CASE. + * + * Generated from protobuf field string reason = 1; + * @param string $var + * @return $this + */ + public function setReason($var) + { + GPBUtil::checkString($var, True); + $this->reason = $var; + + return $this; + } + + /** + * The logical grouping to which the "reason" belongs. The error domain + * is typically the registered service name of the tool or product that + * generates the error. Example: "pubsub.googleapis.com". If the error is + * generated by some common infrastructure, the error domain must be a + * globally unique value that identifies the infrastructure. For Google API + * infrastructure, the error domain is "googleapis.com". + * + * Generated from protobuf field string domain = 2; + * @return string + */ + public function getDomain() + { + return $this->domain; + } + + /** + * The logical grouping to which the "reason" belongs. The error domain + * is typically the registered service name of the tool or product that + * generates the error. Example: "pubsub.googleapis.com". If the error is + * generated by some common infrastructure, the error domain must be a + * globally unique value that identifies the infrastructure. For Google API + * infrastructure, the error domain is "googleapis.com". + * + * Generated from protobuf field string domain = 2; + * @param string $var + * @return $this + */ + public function setDomain($var) + { + GPBUtil::checkString($var, True); + $this->domain = $var; + + return $this; + } + + /** + * Additional structured details about this error. + * Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + * length. When identifying the current value of an exceeded limit, the units + * should be contained in the key, not the value. For example, rather than + * {"instanceLimit": "100/request"}, should be returned as, + * {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + * instances that can be created in a single (batch) request. + * + * Generated from protobuf field map metadata = 3; + * @return \Google\Protobuf\Internal\MapField + */ + public function getMetadata() + { + return $this->metadata; + } + + /** + * Additional structured details about this error. + * Keys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in + * length. When identifying the current value of an exceeded limit, the units + * should be contained in the key, not the value. For example, rather than + * {"instanceLimit": "100/request"}, should be returned as, + * {"instanceLimitPerRequest": "100"}, if the client exceeds the number of + * instances that can be created in a single (batch) request. + * + * Generated from protobuf field map metadata = 3; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setMetadata($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->metadata = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Help.php b/lib/Google/vendor/google/common-protos/src/Rpc/Help.php new file mode 100644 index 000000000..e01c5b26f --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Help.php @@ -0,0 +1,70 @@ +google.rpc.Help + */ +class Help extends \Google\Protobuf\Internal\Message +{ + /** + * URL(s) pointing to additional information on handling the current error. + * + * Generated from protobuf field repeated .google.rpc.Help.Link links = 1; + */ + private $links; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Rpc\Help\Link>|\Google\Protobuf\Internal\RepeatedField $links + * URL(s) pointing to additional information on handling the current error. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * URL(s) pointing to additional information on handling the current error. + * + * Generated from protobuf field repeated .google.rpc.Help.Link links = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getLinks() + { + return $this->links; + } + + /** + * URL(s) pointing to additional information on handling the current error. + * + * Generated from protobuf field repeated .google.rpc.Help.Link links = 1; + * @param array<\Google\Rpc\Help\Link>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setLinks($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Rpc\Help\Link::class); + $this->links = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Help/Link.php b/lib/Google/vendor/google/common-protos/src/Rpc/Help/Link.php new file mode 100644 index 000000000..1786b3fb0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Help/Link.php @@ -0,0 +1,102 @@ +google.rpc.Help.Link + */ +class Link extends \Google\Protobuf\Internal\Message +{ + /** + * Describes what the link offers. + * + * Generated from protobuf field string description = 1; + */ + protected $description = ''; + /** + * The URL of the link. + * + * Generated from protobuf field string url = 2; + */ + protected $url = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $description + * Describes what the link offers. + * @type string $url + * The URL of the link. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * Describes what the link offers. + * + * Generated from protobuf field string description = 1; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Describes what the link offers. + * + * Generated from protobuf field string description = 1; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * The URL of the link. + * + * Generated from protobuf field string url = 2; + * @return string + */ + public function getUrl() + { + return $this->url; + } + + /** + * The URL of the link. + * + * Generated from protobuf field string url = 2; + * @param string $var + * @return $this + */ + public function setUrl($var) + { + GPBUtil::checkString($var, True); + $this->url = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/LocalizedMessage.php b/lib/Google/vendor/google/common-protos/src/Rpc/LocalizedMessage.php new file mode 100644 index 000000000..e4fa20aba --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/LocalizedMessage.php @@ -0,0 +1,110 @@ +google.rpc.LocalizedMessage + */ +class LocalizedMessage extends \Google\Protobuf\Internal\Message +{ + /** + * The locale used following the specification defined at + * https://www.rfc-editor.org/rfc/bcp/bcp47.txt. + * Examples are: "en-US", "fr-CH", "es-MX" + * + * Generated from protobuf field string locale = 1; + */ + protected $locale = ''; + /** + * The localized error message in the above locale. + * + * Generated from protobuf field string message = 2; + */ + protected $message = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $locale + * The locale used following the specification defined at + * https://www.rfc-editor.org/rfc/bcp/bcp47.txt. + * Examples are: "en-US", "fr-CH", "es-MX" + * @type string $message + * The localized error message in the above locale. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * The locale used following the specification defined at + * https://www.rfc-editor.org/rfc/bcp/bcp47.txt. + * Examples are: "en-US", "fr-CH", "es-MX" + * + * Generated from protobuf field string locale = 1; + * @return string + */ + public function getLocale() + { + return $this->locale; + } + + /** + * The locale used following the specification defined at + * https://www.rfc-editor.org/rfc/bcp/bcp47.txt. + * Examples are: "en-US", "fr-CH", "es-MX" + * + * Generated from protobuf field string locale = 1; + * @param string $var + * @return $this + */ + public function setLocale($var) + { + GPBUtil::checkString($var, True); + $this->locale = $var; + + return $this; + } + + /** + * The localized error message in the above locale. + * + * Generated from protobuf field string message = 2; + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * The localized error message in the above locale. + * + * Generated from protobuf field string message = 2; + * @param string $var + * @return $this + */ + public function setMessage($var) + { + GPBUtil::checkString($var, True); + $this->message = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure.php b/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure.php new file mode 100644 index 000000000..cc82e7361 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure.php @@ -0,0 +1,70 @@ +google.rpc.PreconditionFailure + */ +class PreconditionFailure extends \Google\Protobuf\Internal\Message +{ + /** + * Describes all precondition violations. + * + * Generated from protobuf field repeated .google.rpc.PreconditionFailure.Violation violations = 1; + */ + private $violations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Rpc\PreconditionFailure\Violation>|\Google\Protobuf\Internal\RepeatedField $violations + * Describes all precondition violations. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * Describes all precondition violations. + * + * Generated from protobuf field repeated .google.rpc.PreconditionFailure.Violation violations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getViolations() + { + return $this->violations; + } + + /** + * Describes all precondition violations. + * + * Generated from protobuf field repeated .google.rpc.PreconditionFailure.Violation violations = 1; + * @param array<\Google\Rpc\PreconditionFailure\Violation>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setViolations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Rpc\PreconditionFailure\Violation::class); + $this->violations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure/Violation.php b/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure/Violation.php new file mode 100644 index 000000000..df35be296 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/PreconditionFailure/Violation.php @@ -0,0 +1,160 @@ +google.rpc.PreconditionFailure.Violation + */ +class Violation extends \Google\Protobuf\Internal\Message +{ + /** + * The type of PreconditionFailure. We recommend using a service-specific + * enum type to define the supported precondition violation subjects. For + * example, "TOS" for "Terms of Service violation". + * + * Generated from protobuf field string type = 1; + */ + protected $type = ''; + /** + * The subject, relative to the type, that failed. + * For example, "google.com/cloud" relative to the "TOS" type would indicate + * which terms of service is being referenced. + * + * Generated from protobuf field string subject = 2; + */ + protected $subject = ''; + /** + * A description of how the precondition failed. Developers can use this + * description to understand how to fix the failure. + * For example: "Terms of service not accepted". + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $type + * The type of PreconditionFailure. We recommend using a service-specific + * enum type to define the supported precondition violation subjects. For + * example, "TOS" for "Terms of Service violation". + * @type string $subject + * The subject, relative to the type, that failed. + * For example, "google.com/cloud" relative to the "TOS" type would indicate + * which terms of service is being referenced. + * @type string $description + * A description of how the precondition failed. Developers can use this + * description to understand how to fix the failure. + * For example: "Terms of service not accepted". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * The type of PreconditionFailure. We recommend using a service-specific + * enum type to define the supported precondition violation subjects. For + * example, "TOS" for "Terms of Service violation". + * + * Generated from protobuf field string type = 1; + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * The type of PreconditionFailure. We recommend using a service-specific + * enum type to define the supported precondition violation subjects. For + * example, "TOS" for "Terms of Service violation". + * + * Generated from protobuf field string type = 1; + * @param string $var + * @return $this + */ + public function setType($var) + { + GPBUtil::checkString($var, True); + $this->type = $var; + + return $this; + } + + /** + * The subject, relative to the type, that failed. + * For example, "google.com/cloud" relative to the "TOS" type would indicate + * which terms of service is being referenced. + * + * Generated from protobuf field string subject = 2; + * @return string + */ + public function getSubject() + { + return $this->subject; + } + + /** + * The subject, relative to the type, that failed. + * For example, "google.com/cloud" relative to the "TOS" type would indicate + * which terms of service is being referenced. + * + * Generated from protobuf field string subject = 2; + * @param string $var + * @return $this + */ + public function setSubject($var) + { + GPBUtil::checkString($var, True); + $this->subject = $var; + + return $this; + } + + /** + * A description of how the precondition failed. Developers can use this + * description to understand how to fix the failure. + * For example: "Terms of service not accepted". + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A description of how the precondition failed. Developers can use this + * description to understand how to fix the failure. + * For example: "Terms of service not accepted". + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure.php b/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure.php new file mode 100644 index 000000000..7bb656174 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure.php @@ -0,0 +1,75 @@ +google.rpc.QuotaFailure + */ +class QuotaFailure extends \Google\Protobuf\Internal\Message +{ + /** + * Describes all quota violations. + * + * Generated from protobuf field repeated .google.rpc.QuotaFailure.Violation violations = 1; + */ + private $violations; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type array<\Google\Rpc\QuotaFailure\Violation>|\Google\Protobuf\Internal\RepeatedField $violations + * Describes all quota violations. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * Describes all quota violations. + * + * Generated from protobuf field repeated .google.rpc.QuotaFailure.Violation violations = 1; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getViolations() + { + return $this->violations; + } + + /** + * Describes all quota violations. + * + * Generated from protobuf field repeated .google.rpc.QuotaFailure.Violation violations = 1; + * @param array<\Google\Rpc\QuotaFailure\Violation>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setViolations($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Rpc\QuotaFailure\Violation::class); + $this->violations = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure/Violation.php b/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure/Violation.php new file mode 100644 index 000000000..3a7cc9f92 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/QuotaFailure/Violation.php @@ -0,0 +1,131 @@ +google.rpc.QuotaFailure.Violation + */ +class Violation extends \Google\Protobuf\Internal\Message +{ + /** + * The subject on which the quota check failed. + * For example, "clientip:" or "project:". + * + * Generated from protobuf field string subject = 1; + */ + protected $subject = ''; + /** + * A description of how the quota check failed. Clients can use this + * description to find more about the quota configuration in the service's + * public documentation, or find the relevant quota limit to adjust through + * developer console. + * For example: "Service disabled" or "Daily Limit for read operations + * exceeded". + * + * Generated from protobuf field string description = 2; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $subject + * The subject on which the quota check failed. + * For example, "clientip:" or "project:". + * @type string $description + * A description of how the quota check failed. Clients can use this + * description to find more about the quota configuration in the service's + * public documentation, or find the relevant quota limit to adjust through + * developer console. + * For example: "Service disabled" or "Daily Limit for read operations + * exceeded". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * The subject on which the quota check failed. + * For example, "clientip:" or "project:". + * + * Generated from protobuf field string subject = 1; + * @return string + */ + public function getSubject() + { + return $this->subject; + } + + /** + * The subject on which the quota check failed. + * For example, "clientip:" or "project:". + * + * Generated from protobuf field string subject = 1; + * @param string $var + * @return $this + */ + public function setSubject($var) + { + GPBUtil::checkString($var, True); + $this->subject = $var; + + return $this; + } + + /** + * A description of how the quota check failed. Clients can use this + * description to find more about the quota configuration in the service's + * public documentation, or find the relevant quota limit to adjust through + * developer console. + * For example: "Service disabled" or "Daily Limit for read operations + * exceeded". + * + * Generated from protobuf field string description = 2; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * A description of how the quota check failed. Clients can use this + * description to find more about the quota configuration in the service's + * public documentation, or find the relevant quota limit to adjust through + * developer console. + * For example: "Service disabled" or "Daily Limit for read operations + * exceeded". + * + * Generated from protobuf field string description = 2; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/RequestInfo.php b/lib/Google/vendor/google/common-protos/src/Rpc/RequestInfo.php new file mode 100644 index 000000000..effe01ddf --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/RequestInfo.php @@ -0,0 +1,110 @@ +google.rpc.RequestInfo + */ +class RequestInfo extends \Google\Protobuf\Internal\Message +{ + /** + * An opaque string that should only be interpreted by the service generating + * it. For example, it can be used to identify requests in the service's logs. + * + * Generated from protobuf field string request_id = 1; + */ + protected $request_id = ''; + /** + * Any data that was used to serve this request. For example, an encrypted + * stack trace that can be sent back to the service provider for debugging. + * + * Generated from protobuf field string serving_data = 2; + */ + protected $serving_data = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $request_id + * An opaque string that should only be interpreted by the service generating + * it. For example, it can be used to identify requests in the service's logs. + * @type string $serving_data + * Any data that was used to serve this request. For example, an encrypted + * stack trace that can be sent back to the service provider for debugging. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * An opaque string that should only be interpreted by the service generating + * it. For example, it can be used to identify requests in the service's logs. + * + * Generated from protobuf field string request_id = 1; + * @return string + */ + public function getRequestId() + { + return $this->request_id; + } + + /** + * An opaque string that should only be interpreted by the service generating + * it. For example, it can be used to identify requests in the service's logs. + * + * Generated from protobuf field string request_id = 1; + * @param string $var + * @return $this + */ + public function setRequestId($var) + { + GPBUtil::checkString($var, True); + $this->request_id = $var; + + return $this; + } + + /** + * Any data that was used to serve this request. For example, an encrypted + * stack trace that can be sent back to the service provider for debugging. + * + * Generated from protobuf field string serving_data = 2; + * @return string + */ + public function getServingData() + { + return $this->serving_data; + } + + /** + * Any data that was used to serve this request. For example, an encrypted + * stack trace that can be sent back to the service provider for debugging. + * + * Generated from protobuf field string serving_data = 2; + * @param string $var + * @return $this + */ + public function setServingData($var) + { + GPBUtil::checkString($var, True); + $this->serving_data = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/ResourceInfo.php b/lib/Google/vendor/google/common-protos/src/Rpc/ResourceInfo.php new file mode 100644 index 000000000..3a7859ccd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/ResourceInfo.php @@ -0,0 +1,205 @@ +google.rpc.ResourceInfo + */ +class ResourceInfo extends \Google\Protobuf\Internal\Message +{ + /** + * A name for the type of resource being accessed, e.g. "sql table", + * "cloud storage bucket", "file", "Google calendar"; or the type URL + * of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + * + * Generated from protobuf field string resource_type = 1; + */ + protected $resource_type = ''; + /** + * The name of the resource being accessed. For example, a shared calendar + * name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + * error is + * [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + * + * Generated from protobuf field string resource_name = 2; + */ + protected $resource_name = ''; + /** + * The owner of the resource (optional). + * For example, "user:" or "project:". + * + * Generated from protobuf field string owner = 3; + */ + protected $owner = ''; + /** + * Describes what error is encountered when accessing this resource. + * For example, updating a cloud project may require the `writer` permission + * on the developer console project. + * + * Generated from protobuf field string description = 4; + */ + protected $description = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $resource_type + * A name for the type of resource being accessed, e.g. "sql table", + * "cloud storage bucket", "file", "Google calendar"; or the type URL + * of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + * @type string $resource_name + * The name of the resource being accessed. For example, a shared calendar + * name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + * error is + * [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + * @type string $owner + * The owner of the resource (optional). + * For example, "user:" or "project:". + * @type string $description + * Describes what error is encountered when accessing this resource. + * For example, updating a cloud project may require the `writer` permission + * on the developer console project. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * A name for the type of resource being accessed, e.g. "sql table", + * "cloud storage bucket", "file", "Google calendar"; or the type URL + * of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + * + * Generated from protobuf field string resource_type = 1; + * @return string + */ + public function getResourceType() + { + return $this->resource_type; + } + + /** + * A name for the type of resource being accessed, e.g. "sql table", + * "cloud storage bucket", "file", "Google calendar"; or the type URL + * of the resource: e.g. "type.googleapis.com/google.pubsub.v1.Topic". + * + * Generated from protobuf field string resource_type = 1; + * @param string $var + * @return $this + */ + public function setResourceType($var) + { + GPBUtil::checkString($var, True); + $this->resource_type = $var; + + return $this; + } + + /** + * The name of the resource being accessed. For example, a shared calendar + * name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + * error is + * [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + * + * Generated from protobuf field string resource_name = 2; + * @return string + */ + public function getResourceName() + { + return $this->resource_name; + } + + /** + * The name of the resource being accessed. For example, a shared calendar + * name: "example.com_4fghdhgsrgh@group.calendar.google.com", if the current + * error is + * [google.rpc.Code.PERMISSION_DENIED][google.rpc.Code.PERMISSION_DENIED]. + * + * Generated from protobuf field string resource_name = 2; + * @param string $var + * @return $this + */ + public function setResourceName($var) + { + GPBUtil::checkString($var, True); + $this->resource_name = $var; + + return $this; + } + + /** + * The owner of the resource (optional). + * For example, "user:" or "project:". + * + * Generated from protobuf field string owner = 3; + * @return string + */ + public function getOwner() + { + return $this->owner; + } + + /** + * The owner of the resource (optional). + * For example, "user:" or "project:". + * + * Generated from protobuf field string owner = 3; + * @param string $var + * @return $this + */ + public function setOwner($var) + { + GPBUtil::checkString($var, True); + $this->owner = $var; + + return $this; + } + + /** + * Describes what error is encountered when accessing this resource. + * For example, updating a cloud project may require the `writer` permission + * on the developer console project. + * + * Generated from protobuf field string description = 4; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Describes what error is encountered when accessing this resource. + * For example, updating a cloud project may require the `writer` permission + * on the developer console project. + * + * Generated from protobuf field string description = 4; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/RetryInfo.php b/lib/Google/vendor/google/common-protos/src/Rpc/RetryInfo.php new file mode 100644 index 000000000..3d391bae0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/RetryInfo.php @@ -0,0 +1,87 @@ +google.rpc.RetryInfo + */ +class RetryInfo extends \Google\Protobuf\Internal\Message +{ + /** + * Clients should wait at least this long between retrying the same request. + * + * Generated from protobuf field .google.protobuf.Duration retry_delay = 1; + */ + protected $retry_delay = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Protobuf\Duration $retry_delay + * Clients should wait at least this long between retrying the same request. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\ErrorDetails::initOnce(); + parent::__construct($data); + } + + /** + * Clients should wait at least this long between retrying the same request. + * + * Generated from protobuf field .google.protobuf.Duration retry_delay = 1; + * @return \Google\Protobuf\Duration|null + */ + public function getRetryDelay() + { + return $this->retry_delay; + } + + public function hasRetryDelay() + { + return isset($this->retry_delay); + } + + public function clearRetryDelay() + { + unset($this->retry_delay); + } + + /** + * Clients should wait at least this long between retrying the same request. + * + * Generated from protobuf field .google.protobuf.Duration retry_delay = 1; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setRetryDelay($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->retry_delay = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Rpc/Status.php b/lib/Google/vendor/google/common-protos/src/Rpc/Status.php new file mode 100644 index 000000000..55b303898 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Rpc/Status.php @@ -0,0 +1,160 @@ +google.rpc.Status + */ +class Status extends \Google\Protobuf\Internal\Message +{ + /** + * The status code, which should be an enum value of + * [google.rpc.Code][google.rpc.Code]. + * + * Generated from protobuf field int32 code = 1; + */ + protected $code = 0; + /** + * A developer-facing error message, which should be in English. Any + * user-facing error message should be localized and sent in the + * [google.rpc.Status.details][google.rpc.Status.details] field, or localized + * by the client. + * + * Generated from protobuf field string message = 2; + */ + protected $message = ''; + /** + * A list of messages that carry the error details. There is a common set of + * message types for APIs to use. + * + * Generated from protobuf field repeated .google.protobuf.Any details = 3; + */ + private $details; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $code + * The status code, which should be an enum value of + * [google.rpc.Code][google.rpc.Code]. + * @type string $message + * A developer-facing error message, which should be in English. Any + * user-facing error message should be localized and sent in the + * [google.rpc.Status.details][google.rpc.Status.details] field, or localized + * by the client. + * @type array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $details + * A list of messages that carry the error details. There is a common set of + * message types for APIs to use. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Rpc\Status::initOnce(); + parent::__construct($data); + } + + /** + * The status code, which should be an enum value of + * [google.rpc.Code][google.rpc.Code]. + * + * Generated from protobuf field int32 code = 1; + * @return int + */ + public function getCode() + { + return $this->code; + } + + /** + * The status code, which should be an enum value of + * [google.rpc.Code][google.rpc.Code]. + * + * Generated from protobuf field int32 code = 1; + * @param int $var + * @return $this + */ + public function setCode($var) + { + GPBUtil::checkInt32($var); + $this->code = $var; + + return $this; + } + + /** + * A developer-facing error message, which should be in English. Any + * user-facing error message should be localized and sent in the + * [google.rpc.Status.details][google.rpc.Status.details] field, or localized + * by the client. + * + * Generated from protobuf field string message = 2; + * @return string + */ + public function getMessage() + { + return $this->message; + } + + /** + * A developer-facing error message, which should be in English. Any + * user-facing error message should be localized and sent in the + * [google.rpc.Status.details][google.rpc.Status.details] field, or localized + * by the client. + * + * Generated from protobuf field string message = 2; + * @param string $var + * @return $this + */ + public function setMessage($var) + { + GPBUtil::checkString($var, True); + $this->message = $var; + + return $this; + } + + /** + * A list of messages that carry the error details. There is a common set of + * message types for APIs to use. + * + * Generated from protobuf field repeated .google.protobuf.Any details = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getDetails() + { + return $this->details; + } + + /** + * A list of messages that carry the error details. There is a common set of + * message types for APIs to use. + * + * Generated from protobuf field repeated .google.protobuf.Any details = 3; + * @param array<\Google\Protobuf\Any>|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setDetails($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::MESSAGE, \Google\Protobuf\Any::class); + $this->details = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/CalendarPeriod.php b/lib/Google/vendor/google/common-protos/src/Type/CalendarPeriod.php new file mode 100644 index 000000000..e4807c079 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/CalendarPeriod.php @@ -0,0 +1,102 @@ +google.type.CalendarPeriod + */ +class CalendarPeriod +{ + /** + * Undefined period, raises an error. + * + * Generated from protobuf enum CALENDAR_PERIOD_UNSPECIFIED = 0; + */ + const CALENDAR_PERIOD_UNSPECIFIED = 0; + /** + * A day. + * + * Generated from protobuf enum DAY = 1; + */ + const DAY = 1; + /** + * A week. Weeks begin on Monday, following + * [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + * + * Generated from protobuf enum WEEK = 2; + */ + const WEEK = 2; + /** + * A fortnight. The first calendar fortnight of the year begins at the start + * of week 1 according to + * [ISO 8601](https://en.wikipedia.org/wiki/ISO_week_date). + * + * Generated from protobuf enum FORTNIGHT = 3; + */ + const FORTNIGHT = 3; + /** + * A month. + * + * Generated from protobuf enum MONTH = 4; + */ + const MONTH = 4; + /** + * A quarter. Quarters start on dates 1-Jan, 1-Apr, 1-Jul, and 1-Oct of each + * year. + * + * Generated from protobuf enum QUARTER = 5; + */ + const QUARTER = 5; + /** + * A half-year. Half-years start on dates 1-Jan and 1-Jul. + * + * Generated from protobuf enum HALF = 6; + */ + const HALF = 6; + /** + * A year. + * + * Generated from protobuf enum YEAR = 7; + */ + const YEAR = 7; + + private static $valueToName = [ + self::CALENDAR_PERIOD_UNSPECIFIED => 'CALENDAR_PERIOD_UNSPECIFIED', + self::DAY => 'DAY', + self::WEEK => 'WEEK', + self::FORTNIGHT => 'FORTNIGHT', + self::MONTH => 'MONTH', + self::QUARTER => 'QUARTER', + self::HALF => 'HALF', + self::YEAR => 'YEAR', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Color.php b/lib/Google/vendor/google/common-protos/src/Type/Color.php new file mode 100644 index 000000000..31c1a6e00 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Color.php @@ -0,0 +1,360 @@ +google.type.Color + */ +class Color extends \Google\Protobuf\Internal\Message +{ + /** + * The amount of red in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float red = 1; + */ + protected $red = 0.0; + /** + * The amount of green in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float green = 2; + */ + protected $green = 0.0; + /** + * The amount of blue in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float blue = 3; + */ + protected $blue = 0.0; + /** + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * Generated from protobuf field .google.protobuf.FloatValue alpha = 4; + */ + protected $alpha = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $red + * The amount of red in the color as a value in the interval [0, 1]. + * @type float $green + * The amount of green in the color as a value in the interval [0, 1]. + * @type float $blue + * The amount of blue in the color as a value in the interval [0, 1]. + * @type \Google\Protobuf\FloatValue $alpha + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Color::initOnce(); + parent::__construct($data); + } + + /** + * The amount of red in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float red = 1; + * @return float + */ + public function getRed() + { + return $this->red; + } + + /** + * The amount of red in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float red = 1; + * @param float $var + * @return $this + */ + public function setRed($var) + { + GPBUtil::checkFloat($var); + $this->red = $var; + + return $this; + } + + /** + * The amount of green in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float green = 2; + * @return float + */ + public function getGreen() + { + return $this->green; + } + + /** + * The amount of green in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float green = 2; + * @param float $var + * @return $this + */ + public function setGreen($var) + { + GPBUtil::checkFloat($var); + $this->green = $var; + + return $this; + } + + /** + * The amount of blue in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float blue = 3; + * @return float + */ + public function getBlue() + { + return $this->blue; + } + + /** + * The amount of blue in the color as a value in the interval [0, 1]. + * + * Generated from protobuf field float blue = 3; + * @param float $var + * @return $this + */ + public function setBlue($var) + { + GPBUtil::checkFloat($var); + $this->blue = $var; + + return $this; + } + + /** + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * Generated from protobuf field .google.protobuf.FloatValue alpha = 4; + * @return \Google\Protobuf\FloatValue|null + */ + public function getAlpha() + { + return $this->alpha; + } + + public function hasAlpha() + { + return isset($this->alpha); + } + + public function clearAlpha() + { + unset($this->alpha); + } + + /** + * Returns the unboxed value from getAlpha() + + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * Generated from protobuf field .google.protobuf.FloatValue alpha = 4; + * @return float|null + */ + public function getAlphaUnwrapped() + { + return $this->readWrapperValue("alpha"); + } + + /** + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * Generated from protobuf field .google.protobuf.FloatValue alpha = 4; + * @param \Google\Protobuf\FloatValue $var + * @return $this + */ + public function setAlpha($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\FloatValue::class); + $this->alpha = $var; + + return $this; + } + + /** + * Sets the field by wrapping a primitive type in a Google\Protobuf\FloatValue object. + + * The fraction of this color that should be applied to the pixel. That is, + * the final pixel color is defined by the equation: + * `pixel color = alpha * (this color) + (1.0 - alpha) * (background color)` + * This means that a value of 1.0 corresponds to a solid color, whereas + * a value of 0.0 corresponds to a completely transparent color. This + * uses a wrapper message rather than a simple float scalar so that it is + * possible to distinguish between a default value and the value being unset. + * If omitted, this color object is rendered as a solid color + * (as if the alpha value had been explicitly given a value of 1.0). + * + * Generated from protobuf field .google.protobuf.FloatValue alpha = 4; + * @param float|null $var + * @return $this + */ + public function setAlphaUnwrapped($var) + { + $this->writeWrapperValue("alpha", $var); + return $this;} + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Date.php b/lib/Google/vendor/google/common-protos/src/Type/Date.php new file mode 100644 index 000000000..ba03e77a0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Date.php @@ -0,0 +1,161 @@ +google.type.Date + */ +class Date extends \Google\Protobuf\Internal\Message +{ + /** + * Year of the date. Must be from 1 to 9999, or 0 to specify a date without + * a year. + * + * Generated from protobuf field int32 year = 1; + */ + protected $year = 0; + /** + * Month of a year. Must be from 1 to 12, or 0 to specify a year without a + * month and day. + * + * Generated from protobuf field int32 month = 2; + */ + protected $month = 0; + /** + * Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + * to specify a year by itself or a year and month where the day isn't + * significant. + * + * Generated from protobuf field int32 day = 3; + */ + protected $day = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $year + * Year of the date. Must be from 1 to 9999, or 0 to specify a date without + * a year. + * @type int $month + * Month of a year. Must be from 1 to 12, or 0 to specify a year without a + * month and day. + * @type int $day + * Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + * to specify a year by itself or a year and month where the day isn't + * significant. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Date::initOnce(); + parent::__construct($data); + } + + /** + * Year of the date. Must be from 1 to 9999, or 0 to specify a date without + * a year. + * + * Generated from protobuf field int32 year = 1; + * @return int + */ + public function getYear() + { + return $this->year; + } + + /** + * Year of the date. Must be from 1 to 9999, or 0 to specify a date without + * a year. + * + * Generated from protobuf field int32 year = 1; + * @param int $var + * @return $this + */ + public function setYear($var) + { + GPBUtil::checkInt32($var); + $this->year = $var; + + return $this; + } + + /** + * Month of a year. Must be from 1 to 12, or 0 to specify a year without a + * month and day. + * + * Generated from protobuf field int32 month = 2; + * @return int + */ + public function getMonth() + { + return $this->month; + } + + /** + * Month of a year. Must be from 1 to 12, or 0 to specify a year without a + * month and day. + * + * Generated from protobuf field int32 month = 2; + * @param int $var + * @return $this + */ + public function setMonth($var) + { + GPBUtil::checkInt32($var); + $this->month = $var; + + return $this; + } + + /** + * Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + * to specify a year by itself or a year and month where the day isn't + * significant. + * + * Generated from protobuf field int32 day = 3; + * @return int + */ + public function getDay() + { + return $this->day; + } + + /** + * Day of a month. Must be from 1 to 31 and valid for the year and month, or 0 + * to specify a year by itself or a year and month where the day isn't + * significant. + * + * Generated from protobuf field int32 day = 3; + * @param int $var + * @return $this + */ + public function setDay($var) + { + GPBUtil::checkInt32($var); + $this->day = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/DateTime.php b/lib/Google/vendor/google/common-protos/src/Type/DateTime.php new file mode 100644 index 000000000..ed211b677 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/DateTime.php @@ -0,0 +1,393 @@ +google.type.DateTime + */ +class DateTime extends \Google\Protobuf\Internal\Message +{ + /** + * Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + * datetime without a year. + * + * Generated from protobuf field int32 year = 1; + */ + protected $year = 0; + /** + * Required. Month of year. Must be from 1 to 12. + * + * Generated from protobuf field int32 month = 2; + */ + protected $month = 0; + /** + * Required. Day of month. Must be from 1 to 31 and valid for the year and + * month. + * + * Generated from protobuf field int32 day = 3; + */ + protected $day = 0; + /** + * Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + * may choose to allow the value "24:00:00" for scenarios like business + * closing time. + * + * Generated from protobuf field int32 hours = 4; + */ + protected $hours = 0; + /** + * Required. Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 5; + */ + protected $minutes = 0; + /** + * Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + * API may allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 6; + */ + protected $seconds = 0; + /** + * Required. Fractions of seconds in nanoseconds. Must be from 0 to + * 999,999,999. + * + * Generated from protobuf field int32 nanos = 7; + */ + protected $nanos = 0; + protected $time_offset; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $year + * Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + * datetime without a year. + * @type int $month + * Required. Month of year. Must be from 1 to 12. + * @type int $day + * Required. Day of month. Must be from 1 to 31 and valid for the year and + * month. + * @type int $hours + * Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + * may choose to allow the value "24:00:00" for scenarios like business + * closing time. + * @type int $minutes + * Required. Minutes of hour of day. Must be from 0 to 59. + * @type int $seconds + * Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + * API may allow the value 60 if it allows leap-seconds. + * @type int $nanos + * Required. Fractions of seconds in nanoseconds. Must be from 0 to + * 999,999,999. + * @type \Google\Protobuf\Duration $utc_offset + * UTC offset. Must be whole seconds, between -18 hours and +18 hours. + * For example, a UTC offset of -4:00 would be represented as + * { seconds: -14400 }. + * @type \Google\Type\TimeZone $time_zone + * Time zone. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Datetime::initOnce(); + parent::__construct($data); + } + + /** + * Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + * datetime without a year. + * + * Generated from protobuf field int32 year = 1; + * @return int + */ + public function getYear() + { + return $this->year; + } + + /** + * Optional. Year of date. Must be from 1 to 9999, or 0 if specifying a + * datetime without a year. + * + * Generated from protobuf field int32 year = 1; + * @param int $var + * @return $this + */ + public function setYear($var) + { + GPBUtil::checkInt32($var); + $this->year = $var; + + return $this; + } + + /** + * Required. Month of year. Must be from 1 to 12. + * + * Generated from protobuf field int32 month = 2; + * @return int + */ + public function getMonth() + { + return $this->month; + } + + /** + * Required. Month of year. Must be from 1 to 12. + * + * Generated from protobuf field int32 month = 2; + * @param int $var + * @return $this + */ + public function setMonth($var) + { + GPBUtil::checkInt32($var); + $this->month = $var; + + return $this; + } + + /** + * Required. Day of month. Must be from 1 to 31 and valid for the year and + * month. + * + * Generated from protobuf field int32 day = 3; + * @return int + */ + public function getDay() + { + return $this->day; + } + + /** + * Required. Day of month. Must be from 1 to 31 and valid for the year and + * month. + * + * Generated from protobuf field int32 day = 3; + * @param int $var + * @return $this + */ + public function setDay($var) + { + GPBUtil::checkInt32($var); + $this->day = $var; + + return $this; + } + + /** + * Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + * may choose to allow the value "24:00:00" for scenarios like business + * closing time. + * + * Generated from protobuf field int32 hours = 4; + * @return int + */ + public function getHours() + { + return $this->hours; + } + + /** + * Required. Hours of day in 24 hour format. Should be from 0 to 23. An API + * may choose to allow the value "24:00:00" for scenarios like business + * closing time. + * + * Generated from protobuf field int32 hours = 4; + * @param int $var + * @return $this + */ + public function setHours($var) + { + GPBUtil::checkInt32($var); + $this->hours = $var; + + return $this; + } + + /** + * Required. Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 5; + * @return int + */ + public function getMinutes() + { + return $this->minutes; + } + + /** + * Required. Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 5; + * @param int $var + * @return $this + */ + public function setMinutes($var) + { + GPBUtil::checkInt32($var); + $this->minutes = $var; + + return $this; + } + + /** + * Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + * API may allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 6; + * @return int + */ + public function getSeconds() + { + return $this->seconds; + } + + /** + * Required. Seconds of minutes of the time. Must normally be from 0 to 59. An + * API may allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 6; + * @param int $var + * @return $this + */ + public function setSeconds($var) + { + GPBUtil::checkInt32($var); + $this->seconds = $var; + + return $this; + } + + /** + * Required. Fractions of seconds in nanoseconds. Must be from 0 to + * 999,999,999. + * + * Generated from protobuf field int32 nanos = 7; + * @return int + */ + public function getNanos() + { + return $this->nanos; + } + + /** + * Required. Fractions of seconds in nanoseconds. Must be from 0 to + * 999,999,999. + * + * Generated from protobuf field int32 nanos = 7; + * @param int $var + * @return $this + */ + public function setNanos($var) + { + GPBUtil::checkInt32($var); + $this->nanos = $var; + + return $this; + } + + /** + * UTC offset. Must be whole seconds, between -18 hours and +18 hours. + * For example, a UTC offset of -4:00 would be represented as + * { seconds: -14400 }. + * + * Generated from protobuf field .google.protobuf.Duration utc_offset = 8; + * @return \Google\Protobuf\Duration|null + */ + public function getUtcOffset() + { + return $this->readOneof(8); + } + + public function hasUtcOffset() + { + return $this->hasOneof(8); + } + + /** + * UTC offset. Must be whole seconds, between -18 hours and +18 hours. + * For example, a UTC offset of -4:00 would be represented as + * { seconds: -14400 }. + * + * Generated from protobuf field .google.protobuf.Duration utc_offset = 8; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setUtcOffset($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->writeOneof(8, $var); + + return $this; + } + + /** + * Time zone. + * + * Generated from protobuf field .google.type.TimeZone time_zone = 9; + * @return \Google\Type\TimeZone|null + */ + public function getTimeZone() + { + return $this->readOneof(9); + } + + public function hasTimeZone() + { + return $this->hasOneof(9); + } + + /** + * Time zone. + * + * Generated from protobuf field .google.type.TimeZone time_zone = 9; + * @param \Google\Type\TimeZone $var + * @return $this + */ + public function setTimeZone($var) + { + GPBUtil::checkMessage($var, \Google\Type\TimeZone::class); + $this->writeOneof(9, $var); + + return $this; + } + + /** + * @return string + */ + public function getTimeOffset() + { + return $this->whichOneof("time_offset"); + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/DayOfWeek.php b/lib/Google/vendor/google/common-protos/src/Type/DayOfWeek.php new file mode 100644 index 000000000..56219ffe1 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/DayOfWeek.php @@ -0,0 +1,96 @@ +google.type.DayOfWeek + */ +class DayOfWeek +{ + /** + * The day of the week is unspecified. + * + * Generated from protobuf enum DAY_OF_WEEK_UNSPECIFIED = 0; + */ + const DAY_OF_WEEK_UNSPECIFIED = 0; + /** + * Monday + * + * Generated from protobuf enum MONDAY = 1; + */ + const MONDAY = 1; + /** + * Tuesday + * + * Generated from protobuf enum TUESDAY = 2; + */ + const TUESDAY = 2; + /** + * Wednesday + * + * Generated from protobuf enum WEDNESDAY = 3; + */ + const WEDNESDAY = 3; + /** + * Thursday + * + * Generated from protobuf enum THURSDAY = 4; + */ + const THURSDAY = 4; + /** + * Friday + * + * Generated from protobuf enum FRIDAY = 5; + */ + const FRIDAY = 5; + /** + * Saturday + * + * Generated from protobuf enum SATURDAY = 6; + */ + const SATURDAY = 6; + /** + * Sunday + * + * Generated from protobuf enum SUNDAY = 7; + */ + const SUNDAY = 7; + + private static $valueToName = [ + self::DAY_OF_WEEK_UNSPECIFIED => 'DAY_OF_WEEK_UNSPECIFIED', + self::MONDAY => 'MONDAY', + self::TUESDAY => 'TUESDAY', + self::WEDNESDAY => 'WEDNESDAY', + self::THURSDAY => 'THURSDAY', + self::FRIDAY => 'FRIDAY', + self::SATURDAY => 'SATURDAY', + self::SUNDAY => 'SUNDAY', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Decimal.php b/lib/Google/vendor/google/common-protos/src/Type/Decimal.php new file mode 100644 index 000000000..84e0fec48 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Decimal.php @@ -0,0 +1,244 @@ +google.type.Decimal + */ +class Decimal extends \Google\Protobuf\Internal\Message +{ + /** + * The decimal value, as a string. + * The string representation consists of an optional sign, `+` (`U+002B`) + * or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + * ("the integer"), optionally followed by a fraction, optionally followed + * by an exponent. + * The fraction consists of a decimal point followed by zero or more decimal + * digits. The string must contain at least one digit in either the integer + * or the fraction. The number formed by the sign, the integer and the + * fraction is referred to as the significand. + * The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + * followed by one or more decimal digits. + * Services **should** normalize decimal values before storing them by: + * - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + * - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + * - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + * - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + * Services **may** perform additional normalization based on its own needs + * and the internal decimal implementation selected, such as shifting the + * decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + * Additionally, services **may** preserve trailing zeroes in the fraction + * to indicate increased precision, but are not required to do so. + * Note that only the `.` character is supported to divide the integer + * and the fraction; `,` **should not** be supported regardless of locale. + * Additionally, thousand separators **should not** be supported. If a + * service does support them, values **must** be normalized. + * The ENBF grammar is: + * DecimalString = + * [Sign] Significand [Exponent]; + * Sign = '+' | '-'; + * Significand = + * Digits ['.'] [Digits] | [Digits] '.' Digits; + * Exponent = ('e' | 'E') [Sign] Digits; + * Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + * Services **should** clearly document the range of supported values, the + * maximum supported precision (total number of digits), and, if applicable, + * the scale (number of digits after the decimal point), as well as how it + * behaves when receiving out-of-bounds values. + * Services **may** choose to accept values passed as input even when the + * value has a higher precision or scale than the service supports, and + * **should** round the value to fit the supported scale. Alternatively, the + * service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + * if precision would be lost. + * Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + * gRPC) if the service receives a value outside of the supported range. + * + * Generated from protobuf field string value = 1; + */ + protected $value = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $value + * The decimal value, as a string. + * The string representation consists of an optional sign, `+` (`U+002B`) + * or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + * ("the integer"), optionally followed by a fraction, optionally followed + * by an exponent. + * The fraction consists of a decimal point followed by zero or more decimal + * digits. The string must contain at least one digit in either the integer + * or the fraction. The number formed by the sign, the integer and the + * fraction is referred to as the significand. + * The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + * followed by one or more decimal digits. + * Services **should** normalize decimal values before storing them by: + * - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + * - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + * - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + * - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + * Services **may** perform additional normalization based on its own needs + * and the internal decimal implementation selected, such as shifting the + * decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + * Additionally, services **may** preserve trailing zeroes in the fraction + * to indicate increased precision, but are not required to do so. + * Note that only the `.` character is supported to divide the integer + * and the fraction; `,` **should not** be supported regardless of locale. + * Additionally, thousand separators **should not** be supported. If a + * service does support them, values **must** be normalized. + * The ENBF grammar is: + * DecimalString = + * [Sign] Significand [Exponent]; + * Sign = '+' | '-'; + * Significand = + * Digits ['.'] [Digits] | [Digits] '.' Digits; + * Exponent = ('e' | 'E') [Sign] Digits; + * Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + * Services **should** clearly document the range of supported values, the + * maximum supported precision (total number of digits), and, if applicable, + * the scale (number of digits after the decimal point), as well as how it + * behaves when receiving out-of-bounds values. + * Services **may** choose to accept values passed as input even when the + * value has a higher precision or scale than the service supports, and + * **should** round the value to fit the supported scale. Alternatively, the + * service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + * if precision would be lost. + * Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + * gRPC) if the service receives a value outside of the supported range. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Decimal::initOnce(); + parent::__construct($data); + } + + /** + * The decimal value, as a string. + * The string representation consists of an optional sign, `+` (`U+002B`) + * or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + * ("the integer"), optionally followed by a fraction, optionally followed + * by an exponent. + * The fraction consists of a decimal point followed by zero or more decimal + * digits. The string must contain at least one digit in either the integer + * or the fraction. The number formed by the sign, the integer and the + * fraction is referred to as the significand. + * The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + * followed by one or more decimal digits. + * Services **should** normalize decimal values before storing them by: + * - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + * - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + * - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + * - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + * Services **may** perform additional normalization based on its own needs + * and the internal decimal implementation selected, such as shifting the + * decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + * Additionally, services **may** preserve trailing zeroes in the fraction + * to indicate increased precision, but are not required to do so. + * Note that only the `.` character is supported to divide the integer + * and the fraction; `,` **should not** be supported regardless of locale. + * Additionally, thousand separators **should not** be supported. If a + * service does support them, values **must** be normalized. + * The ENBF grammar is: + * DecimalString = + * [Sign] Significand [Exponent]; + * Sign = '+' | '-'; + * Significand = + * Digits ['.'] [Digits] | [Digits] '.' Digits; + * Exponent = ('e' | 'E') [Sign] Digits; + * Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + * Services **should** clearly document the range of supported values, the + * maximum supported precision (total number of digits), and, if applicable, + * the scale (number of digits after the decimal point), as well as how it + * behaves when receiving out-of-bounds values. + * Services **may** choose to accept values passed as input even when the + * value has a higher precision or scale than the service supports, and + * **should** round the value to fit the supported scale. Alternatively, the + * service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + * if precision would be lost. + * Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + * gRPC) if the service receives a value outside of the supported range. + * + * Generated from protobuf field string value = 1; + * @return string + */ + public function getValue() + { + return $this->value; + } + + /** + * The decimal value, as a string. + * The string representation consists of an optional sign, `+` (`U+002B`) + * or `-` (`U+002D`), followed by a sequence of zero or more decimal digits + * ("the integer"), optionally followed by a fraction, optionally followed + * by an exponent. + * The fraction consists of a decimal point followed by zero or more decimal + * digits. The string must contain at least one digit in either the integer + * or the fraction. The number formed by the sign, the integer and the + * fraction is referred to as the significand. + * The exponent consists of the character `e` (`U+0065`) or `E` (`U+0045`) + * followed by one or more decimal digits. + * Services **should** normalize decimal values before storing them by: + * - Removing an explicitly-provided `+` sign (`+2.5` -> `2.5`). + * - Replacing a zero-length integer value with `0` (`.5` -> `0.5`). + * - Coercing the exponent character to lower-case (`2.5E8` -> `2.5e8`). + * - Removing an explicitly-provided zero exponent (`2.5e0` -> `2.5`). + * Services **may** perform additional normalization based on its own needs + * and the internal decimal implementation selected, such as shifting the + * decimal point and exponent value together (example: `2.5e-1` <-> `0.25`). + * Additionally, services **may** preserve trailing zeroes in the fraction + * to indicate increased precision, but are not required to do so. + * Note that only the `.` character is supported to divide the integer + * and the fraction; `,` **should not** be supported regardless of locale. + * Additionally, thousand separators **should not** be supported. If a + * service does support them, values **must** be normalized. + * The ENBF grammar is: + * DecimalString = + * [Sign] Significand [Exponent]; + * Sign = '+' | '-'; + * Significand = + * Digits ['.'] [Digits] | [Digits] '.' Digits; + * Exponent = ('e' | 'E') [Sign] Digits; + * Digits = { '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' }; + * Services **should** clearly document the range of supported values, the + * maximum supported precision (total number of digits), and, if applicable, + * the scale (number of digits after the decimal point), as well as how it + * behaves when receiving out-of-bounds values. + * Services **may** choose to accept values passed as input even when the + * value has a higher precision or scale than the service supports, and + * **should** round the value to fit the supported scale. Alternatively, the + * service **may** error with `400 Bad Request` (`INVALID_ARGUMENT` in gRPC) + * if precision would be lost. + * Services **should** error with `400 Bad Request` (`INVALID_ARGUMENT` in + * gRPC) if the service receives a value outside of the supported range. + * + * Generated from protobuf field string value = 1; + * @param string $var + * @return $this + */ + public function setValue($var) + { + GPBUtil::checkString($var, True); + $this->value = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Expr.php b/lib/Google/vendor/google/common-protos/src/Type/Expr.php new file mode 100644 index 000000000..e47299b96 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Expr.php @@ -0,0 +1,210 @@ +google.type.Expr + */ +class Expr extends \Google\Protobuf\Internal\Message +{ + /** + * Textual representation of an expression in Common Expression Language + * syntax. + * + * Generated from protobuf field string expression = 1; + */ + protected $expression = ''; + /** + * Optional. Title for the expression, i.e. a short string describing + * its purpose. This can be used e.g. in UIs which allow to enter the + * expression. + * + * Generated from protobuf field string title = 2; + */ + protected $title = ''; + /** + * Optional. Description of the expression. This is a longer text which + * describes the expression, e.g. when hovered over it in a UI. + * + * Generated from protobuf field string description = 3; + */ + protected $description = ''; + /** + * Optional. String indicating the location of the expression for error + * reporting, e.g. a file name and a position in the file. + * + * Generated from protobuf field string location = 4; + */ + protected $location = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $expression + * Textual representation of an expression in Common Expression Language + * syntax. + * @type string $title + * Optional. Title for the expression, i.e. a short string describing + * its purpose. This can be used e.g. in UIs which allow to enter the + * expression. + * @type string $description + * Optional. Description of the expression. This is a longer text which + * describes the expression, e.g. when hovered over it in a UI. + * @type string $location + * Optional. String indicating the location of the expression for error + * reporting, e.g. a file name and a position in the file. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Expr::initOnce(); + parent::__construct($data); + } + + /** + * Textual representation of an expression in Common Expression Language + * syntax. + * + * Generated from protobuf field string expression = 1; + * @return string + */ + public function getExpression() + { + return $this->expression; + } + + /** + * Textual representation of an expression in Common Expression Language + * syntax. + * + * Generated from protobuf field string expression = 1; + * @param string $var + * @return $this + */ + public function setExpression($var) + { + GPBUtil::checkString($var, True); + $this->expression = $var; + + return $this; + } + + /** + * Optional. Title for the expression, i.e. a short string describing + * its purpose. This can be used e.g. in UIs which allow to enter the + * expression. + * + * Generated from protobuf field string title = 2; + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Optional. Title for the expression, i.e. a short string describing + * its purpose. This can be used e.g. in UIs which allow to enter the + * expression. + * + * Generated from protobuf field string title = 2; + * @param string $var + * @return $this + */ + public function setTitle($var) + { + GPBUtil::checkString($var, True); + $this->title = $var; + + return $this; + } + + /** + * Optional. Description of the expression. This is a longer text which + * describes the expression, e.g. when hovered over it in a UI. + * + * Generated from protobuf field string description = 3; + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Optional. Description of the expression. This is a longer text which + * describes the expression, e.g. when hovered over it in a UI. + * + * Generated from protobuf field string description = 3; + * @param string $var + * @return $this + */ + public function setDescription($var) + { + GPBUtil::checkString($var, True); + $this->description = $var; + + return $this; + } + + /** + * Optional. String indicating the location of the expression for error + * reporting, e.g. a file name and a position in the file. + * + * Generated from protobuf field string location = 4; + * @return string + */ + public function getLocation() + { + return $this->location; + } + + /** + * Optional. String indicating the location of the expression for error + * reporting, e.g. a file name and a position in the file. + * + * Generated from protobuf field string location = 4; + * @param string $var + * @return $this + */ + public function setLocation($var) + { + GPBUtil::checkString($var, True); + $this->location = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Fraction.php b/lib/Google/vendor/google/common-protos/src/Type/Fraction.php new file mode 100644 index 000000000..f7aae2112 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Fraction.php @@ -0,0 +1,105 @@ +google.type.Fraction + */ +class Fraction extends \Google\Protobuf\Internal\Message +{ + /** + * The numerator in the fraction, e.g. 2 in 2/3. + * + * Generated from protobuf field int64 numerator = 1; + */ + protected $numerator = 0; + /** + * The value by which the numerator is divided, e.g. 3 in 2/3. Must be + * positive. + * + * Generated from protobuf field int64 denominator = 2; + */ + protected $denominator = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int|string $numerator + * The numerator in the fraction, e.g. 2 in 2/3. + * @type int|string $denominator + * The value by which the numerator is divided, e.g. 3 in 2/3. Must be + * positive. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Fraction::initOnce(); + parent::__construct($data); + } + + /** + * The numerator in the fraction, e.g. 2 in 2/3. + * + * Generated from protobuf field int64 numerator = 1; + * @return int|string + */ + public function getNumerator() + { + return $this->numerator; + } + + /** + * The numerator in the fraction, e.g. 2 in 2/3. + * + * Generated from protobuf field int64 numerator = 1; + * @param int|string $var + * @return $this + */ + public function setNumerator($var) + { + GPBUtil::checkInt64($var); + $this->numerator = $var; + + return $this; + } + + /** + * The value by which the numerator is divided, e.g. 3 in 2/3. Must be + * positive. + * + * Generated from protobuf field int64 denominator = 2; + * @return int|string + */ + public function getDenominator() + { + return $this->denominator; + } + + /** + * The value by which the numerator is divided, e.g. 3 in 2/3. Must be + * positive. + * + * Generated from protobuf field int64 denominator = 2; + * @param int|string $var + * @return $this + */ + public function setDenominator($var) + { + GPBUtil::checkInt64($var); + $this->denominator = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Interval.php b/lib/Google/vendor/google/common-protos/src/Type/Interval.php new file mode 100644 index 000000000..89fb028c9 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Interval.php @@ -0,0 +1,141 @@ +google.type.Interval + */ +class Interval extends \Google\Protobuf\Internal\Message +{ + /** + * Optional. Inclusive start of the interval. + * If specified, a Timestamp matching this interval will have to be the same + * or after the start. + * + * Generated from protobuf field .google.protobuf.Timestamp start_time = 1; + */ + protected $start_time = null; + /** + * Optional. Exclusive end of the interval. + * If specified, a Timestamp matching this interval will have to be before the + * end. + * + * Generated from protobuf field .google.protobuf.Timestamp end_time = 2; + */ + protected $end_time = null; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type \Google\Protobuf\Timestamp $start_time + * Optional. Inclusive start of the interval. + * If specified, a Timestamp matching this interval will have to be the same + * or after the start. + * @type \Google\Protobuf\Timestamp $end_time + * Optional. Exclusive end of the interval. + * If specified, a Timestamp matching this interval will have to be before the + * end. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Interval::initOnce(); + parent::__construct($data); + } + + /** + * Optional. Inclusive start of the interval. + * If specified, a Timestamp matching this interval will have to be the same + * or after the start. + * + * Generated from protobuf field .google.protobuf.Timestamp start_time = 1; + * @return \Google\Protobuf\Timestamp|null + */ + public function getStartTime() + { + return $this->start_time; + } + + public function hasStartTime() + { + return isset($this->start_time); + } + + public function clearStartTime() + { + unset($this->start_time); + } + + /** + * Optional. Inclusive start of the interval. + * If specified, a Timestamp matching this interval will have to be the same + * or after the start. + * + * Generated from protobuf field .google.protobuf.Timestamp start_time = 1; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setStartTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->start_time = $var; + + return $this; + } + + /** + * Optional. Exclusive end of the interval. + * If specified, a Timestamp matching this interval will have to be before the + * end. + * + * Generated from protobuf field .google.protobuf.Timestamp end_time = 2; + * @return \Google\Protobuf\Timestamp|null + */ + public function getEndTime() + { + return $this->end_time; + } + + public function hasEndTime() + { + return isset($this->end_time); + } + + public function clearEndTime() + { + unset($this->end_time); + } + + /** + * Optional. Exclusive end of the interval. + * If specified, a Timestamp matching this interval will have to be before the + * end. + * + * Generated from protobuf field .google.protobuf.Timestamp end_time = 2; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setEndTime($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->end_time = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/LatLng.php b/lib/Google/vendor/google/common-protos/src/Type/LatLng.php new file mode 100644 index 000000000..3725fafd0 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/LatLng.php @@ -0,0 +1,105 @@ +WGS84 + * standard. Values must be within normalized ranges. + * + * Generated from protobuf message google.type.LatLng + */ +class LatLng extends \Google\Protobuf\Internal\Message +{ + /** + * The latitude in degrees. It must be in the range [-90.0, +90.0]. + * + * Generated from protobuf field double latitude = 1; + */ + protected $latitude = 0.0; + /** + * The longitude in degrees. It must be in the range [-180.0, +180.0]. + * + * Generated from protobuf field double longitude = 2; + */ + protected $longitude = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $latitude + * The latitude in degrees. It must be in the range [-90.0, +90.0]. + * @type float $longitude + * The longitude in degrees. It must be in the range [-180.0, +180.0]. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Latlng::initOnce(); + parent::__construct($data); + } + + /** + * The latitude in degrees. It must be in the range [-90.0, +90.0]. + * + * Generated from protobuf field double latitude = 1; + * @return float + */ + public function getLatitude() + { + return $this->latitude; + } + + /** + * The latitude in degrees. It must be in the range [-90.0, +90.0]. + * + * Generated from protobuf field double latitude = 1; + * @param float $var + * @return $this + */ + public function setLatitude($var) + { + GPBUtil::checkDouble($var); + $this->latitude = $var; + + return $this; + } + + /** + * The longitude in degrees. It must be in the range [-180.0, +180.0]. + * + * Generated from protobuf field double longitude = 2; + * @return float + */ + public function getLongitude() + { + return $this->longitude; + } + + /** + * The longitude in degrees. It must be in the range [-180.0, +180.0]. + * + * Generated from protobuf field double longitude = 2; + * @param float $var + * @return $this + */ + public function setLongitude($var) + { + GPBUtil::checkDouble($var); + $this->longitude = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/LocalizedText.php b/lib/Google/vendor/google/common-protos/src/Type/LocalizedText.php new file mode 100644 index 000000000..00545c6c5 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/LocalizedText.php @@ -0,0 +1,109 @@ +google.type.LocalizedText + */ +class LocalizedText extends \Google\Protobuf\Internal\Message +{ + /** + * Localized string in the language corresponding to `language_code' below. + * + * Generated from protobuf field string text = 1; + */ + protected $text = ''; + /** + * The text's BCP-47 language code, such as "en-US" or "sr-Latn". + * For more information, see + * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + * + * Generated from protobuf field string language_code = 2; + */ + protected $language_code = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $text + * Localized string in the language corresponding to `language_code' below. + * @type string $language_code + * The text's BCP-47 language code, such as "en-US" or "sr-Latn". + * For more information, see + * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\LocalizedText::initOnce(); + parent::__construct($data); + } + + /** + * Localized string in the language corresponding to `language_code' below. + * + * Generated from protobuf field string text = 1; + * @return string + */ + public function getText() + { + return $this->text; + } + + /** + * Localized string in the language corresponding to `language_code' below. + * + * Generated from protobuf field string text = 1; + * @param string $var + * @return $this + */ + public function setText($var) + { + GPBUtil::checkString($var, True); + $this->text = $var; + + return $this; + } + + /** + * The text's BCP-47 language code, such as "en-US" or "sr-Latn". + * For more information, see + * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + * + * Generated from protobuf field string language_code = 2; + * @return string + */ + public function getLanguageCode() + { + return $this->language_code; + } + + /** + * The text's BCP-47 language code, such as "en-US" or "sr-Latn". + * For more information, see + * http://www.unicode.org/reports/tr35/#Unicode_locale_identifier. + * + * Generated from protobuf field string language_code = 2; + * @param string $var + * @return $this + */ + public function setLanguageCode($var) + { + GPBUtil::checkString($var, True); + $this->language_code = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Money.php b/lib/Google/vendor/google/common-protos/src/Type/Money.php new file mode 100644 index 000000000..826c9547d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Money.php @@ -0,0 +1,159 @@ +google.type.Money + */ +class Money extends \Google\Protobuf\Internal\Message +{ + /** + * The three-letter currency code defined in ISO 4217. + * + * Generated from protobuf field string currency_code = 1; + */ + protected $currency_code = ''; + /** + * The whole units of the amount. + * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + * + * Generated from protobuf field int64 units = 2; + */ + protected $units = 0; + /** + * Number of nano (10^-9) units of the amount. + * The value must be between -999,999,999 and +999,999,999 inclusive. + * If `units` is positive, `nanos` must be positive or zero. + * If `units` is zero, `nanos` can be positive, zero, or negative. + * If `units` is negative, `nanos` must be negative or zero. + * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + * + * Generated from protobuf field int32 nanos = 3; + */ + protected $nanos = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $currency_code + * The three-letter currency code defined in ISO 4217. + * @type int|string $units + * The whole units of the amount. + * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + * @type int $nanos + * Number of nano (10^-9) units of the amount. + * The value must be between -999,999,999 and +999,999,999 inclusive. + * If `units` is positive, `nanos` must be positive or zero. + * If `units` is zero, `nanos` can be positive, zero, or negative. + * If `units` is negative, `nanos` must be negative or zero. + * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Money::initOnce(); + parent::__construct($data); + } + + /** + * The three-letter currency code defined in ISO 4217. + * + * Generated from protobuf field string currency_code = 1; + * @return string + */ + public function getCurrencyCode() + { + return $this->currency_code; + } + + /** + * The three-letter currency code defined in ISO 4217. + * + * Generated from protobuf field string currency_code = 1; + * @param string $var + * @return $this + */ + public function setCurrencyCode($var) + { + GPBUtil::checkString($var, True); + $this->currency_code = $var; + + return $this; + } + + /** + * The whole units of the amount. + * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + * + * Generated from protobuf field int64 units = 2; + * @return int|string + */ + public function getUnits() + { + return $this->units; + } + + /** + * The whole units of the amount. + * For example if `currencyCode` is `"USD"`, then 1 unit is one US dollar. + * + * Generated from protobuf field int64 units = 2; + * @param int|string $var + * @return $this + */ + public function setUnits($var) + { + GPBUtil::checkInt64($var); + $this->units = $var; + + return $this; + } + + /** + * Number of nano (10^-9) units of the amount. + * The value must be between -999,999,999 and +999,999,999 inclusive. + * If `units` is positive, `nanos` must be positive or zero. + * If `units` is zero, `nanos` can be positive, zero, or negative. + * If `units` is negative, `nanos` must be negative or zero. + * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + * + * Generated from protobuf field int32 nanos = 3; + * @return int + */ + public function getNanos() + { + return $this->nanos; + } + + /** + * Number of nano (10^-9) units of the amount. + * The value must be between -999,999,999 and +999,999,999 inclusive. + * If `units` is positive, `nanos` must be positive or zero. + * If `units` is zero, `nanos` can be positive, zero, or negative. + * If `units` is negative, `nanos` must be negative or zero. + * For example $-1.75 is represented as `units`=-1 and `nanos`=-750,000,000. + * + * Generated from protobuf field int32 nanos = 3; + * @param int $var + * @return $this + */ + public function setNanos($var) + { + GPBUtil::checkInt32($var); + $this->nanos = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Month.php b/lib/Google/vendor/google/common-protos/src/Type/Month.php new file mode 100644 index 000000000..473d62ed3 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Month.php @@ -0,0 +1,131 @@ +google.type.Month + */ +class Month +{ + /** + * The unspecified month. + * + * Generated from protobuf enum MONTH_UNSPECIFIED = 0; + */ + const MONTH_UNSPECIFIED = 0; + /** + * The month of January. + * + * Generated from protobuf enum JANUARY = 1; + */ + const JANUARY = 1; + /** + * The month of February. + * + * Generated from protobuf enum FEBRUARY = 2; + */ + const FEBRUARY = 2; + /** + * The month of March. + * + * Generated from protobuf enum MARCH = 3; + */ + const MARCH = 3; + /** + * The month of April. + * + * Generated from protobuf enum APRIL = 4; + */ + const APRIL = 4; + /** + * The month of May. + * + * Generated from protobuf enum MAY = 5; + */ + const MAY = 5; + /** + * The month of June. + * + * Generated from protobuf enum JUNE = 6; + */ + const JUNE = 6; + /** + * The month of July. + * + * Generated from protobuf enum JULY = 7; + */ + const JULY = 7; + /** + * The month of August. + * + * Generated from protobuf enum AUGUST = 8; + */ + const AUGUST = 8; + /** + * The month of September. + * + * Generated from protobuf enum SEPTEMBER = 9; + */ + const SEPTEMBER = 9; + /** + * The month of October. + * + * Generated from protobuf enum OCTOBER = 10; + */ + const OCTOBER = 10; + /** + * The month of November. + * + * Generated from protobuf enum NOVEMBER = 11; + */ + const NOVEMBER = 11; + /** + * The month of December. + * + * Generated from protobuf enum DECEMBER = 12; + */ + const DECEMBER = 12; + + private static $valueToName = [ + self::MONTH_UNSPECIFIED => 'MONTH_UNSPECIFIED', + self::JANUARY => 'JANUARY', + self::FEBRUARY => 'FEBRUARY', + self::MARCH => 'MARCH', + self::APRIL => 'APRIL', + self::MAY => 'MAY', + self::JUNE => 'JUNE', + self::JULY => 'JULY', + self::AUGUST => 'AUGUST', + self::SEPTEMBER => 'SEPTEMBER', + self::OCTOBER => 'OCTOBER', + self::NOVEMBER => 'NOVEMBER', + self::DECEMBER => 'DECEMBER', + ]; + + public static function name($value) + { + if (!isset(self::$valueToName[$value])) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no name defined for value %s', __CLASS__, $value)); + } + return self::$valueToName[$value]; + } + + + public static function value($name) + { + $const = __CLASS__ . '::' . strtoupper($name); + if (!defined($const)) { + throw new UnexpectedValueException(sprintf( + 'Enum %s has no value defined for name %s', __CLASS__, $name)); + } + return constant($const); + } +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber.php b/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber.php new file mode 100644 index 000000000..8f4289d67 --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber.php @@ -0,0 +1,230 @@ +google.type.PhoneNumber + */ +class PhoneNumber extends \Google\Protobuf\Internal\Message +{ + /** + * The phone number's extension. The extension is not standardized in ITU + * recommendations, except for being defined as a series of numbers with a + * maximum length of 40 digits. Other than digits, some other dialing + * characters such as ',' (indicating a wait) or '#' may be stored here. + * Note that no regions currently use extensions with short codes, so this + * field is normally only set in conjunction with an E.164 number. It is held + * separately from the E.164 number to allow for short code extensions in the + * future. + * + * Generated from protobuf field string extension = 3; + */ + protected $extension = ''; + protected $kind; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $e164_number + * The phone number, represented as a leading plus sign ('+'), followed by a + * phone number that uses a relaxed ITU E.164 format consisting of the + * country calling code (1 to 3 digits) and the subscriber number, with no + * additional spaces or formatting, e.g.: + * - correct: "+15552220123" + * - incorrect: "+1 (555) 222-01234 x123". + * The ITU E.164 format limits the latter to 12 digits, but in practice not + * all countries respect that, so we relax that restriction here. + * National-only numbers are not allowed. + * References: + * - https://www.itu.int/rec/T-REC-E.164-201011-I + * - https://en.wikipedia.org/wiki/E.164. + * - https://en.wikipedia.org/wiki/List_of_country_calling_codes + * @type \Google\Type\PhoneNumber\ShortCode $short_code + * A short code. + * Reference(s): + * - https://en.wikipedia.org/wiki/Short_code + * @type string $extension + * The phone number's extension. The extension is not standardized in ITU + * recommendations, except for being defined as a series of numbers with a + * maximum length of 40 digits. Other than digits, some other dialing + * characters such as ',' (indicating a wait) or '#' may be stored here. + * Note that no regions currently use extensions with short codes, so this + * field is normally only set in conjunction with an E.164 number. It is held + * separately from the E.164 number to allow for short code extensions in the + * future. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\PhoneNumber::initOnce(); + parent::__construct($data); + } + + /** + * The phone number, represented as a leading plus sign ('+'), followed by a + * phone number that uses a relaxed ITU E.164 format consisting of the + * country calling code (1 to 3 digits) and the subscriber number, with no + * additional spaces or formatting, e.g.: + * - correct: "+15552220123" + * - incorrect: "+1 (555) 222-01234 x123". + * The ITU E.164 format limits the latter to 12 digits, but in practice not + * all countries respect that, so we relax that restriction here. + * National-only numbers are not allowed. + * References: + * - https://www.itu.int/rec/T-REC-E.164-201011-I + * - https://en.wikipedia.org/wiki/E.164. + * - https://en.wikipedia.org/wiki/List_of_country_calling_codes + * + * Generated from protobuf field string e164_number = 1; + * @return string + */ + public function getE164Number() + { + return $this->readOneof(1); + } + + public function hasE164Number() + { + return $this->hasOneof(1); + } + + /** + * The phone number, represented as a leading plus sign ('+'), followed by a + * phone number that uses a relaxed ITU E.164 format consisting of the + * country calling code (1 to 3 digits) and the subscriber number, with no + * additional spaces or formatting, e.g.: + * - correct: "+15552220123" + * - incorrect: "+1 (555) 222-01234 x123". + * The ITU E.164 format limits the latter to 12 digits, but in practice not + * all countries respect that, so we relax that restriction here. + * National-only numbers are not allowed. + * References: + * - https://www.itu.int/rec/T-REC-E.164-201011-I + * - https://en.wikipedia.org/wiki/E.164. + * - https://en.wikipedia.org/wiki/List_of_country_calling_codes + * + * Generated from protobuf field string e164_number = 1; + * @param string $var + * @return $this + */ + public function setE164Number($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(1, $var); + + return $this; + } + + /** + * A short code. + * Reference(s): + * - https://en.wikipedia.org/wiki/Short_code + * + * Generated from protobuf field .google.type.PhoneNumber.ShortCode short_code = 2; + * @return \Google\Type\PhoneNumber\ShortCode|null + */ + public function getShortCode() + { + return $this->readOneof(2); + } + + public function hasShortCode() + { + return $this->hasOneof(2); + } + + /** + * A short code. + * Reference(s): + * - https://en.wikipedia.org/wiki/Short_code + * + * Generated from protobuf field .google.type.PhoneNumber.ShortCode short_code = 2; + * @param \Google\Type\PhoneNumber\ShortCode $var + * @return $this + */ + public function setShortCode($var) + { + GPBUtil::checkMessage($var, \Google\Type\PhoneNumber\ShortCode::class); + $this->writeOneof(2, $var); + + return $this; + } + + /** + * The phone number's extension. The extension is not standardized in ITU + * recommendations, except for being defined as a series of numbers with a + * maximum length of 40 digits. Other than digits, some other dialing + * characters such as ',' (indicating a wait) or '#' may be stored here. + * Note that no regions currently use extensions with short codes, so this + * field is normally only set in conjunction with an E.164 number. It is held + * separately from the E.164 number to allow for short code extensions in the + * future. + * + * Generated from protobuf field string extension = 3; + * @return string + */ + public function getExtension() + { + return $this->extension; + } + + /** + * The phone number's extension. The extension is not standardized in ITU + * recommendations, except for being defined as a series of numbers with a + * maximum length of 40 digits. Other than digits, some other dialing + * characters such as ',' (indicating a wait) or '#' may be stored here. + * Note that no regions currently use extensions with short codes, so this + * field is normally only set in conjunction with an E.164 number. It is held + * separately from the E.164 number to allow for short code extensions in the + * future. + * + * Generated from protobuf field string extension = 3; + * @param string $var + * @return $this + */ + public function setExtension($var) + { + GPBUtil::checkString($var, True); + $this->extension = $var; + + return $this; + } + + /** + * @return string + */ + public function getKind() + { + return $this->whichOneof("kind"); + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber/ShortCode.php b/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber/ShortCode.php new file mode 100644 index 000000000..1ac9de2dd --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/PhoneNumber/ShortCode.php @@ -0,0 +1,125 @@ +google.type.PhoneNumber.ShortCode + */ +class ShortCode extends \Google\Protobuf\Internal\Message +{ + /** + * Required. The BCP-47 region code of the location where calls to this + * short code can be made, such as "US" and "BB". + * Reference(s): + * - http://www.unicode.org/reports/tr35/#unicode_region_subtag + * + * Generated from protobuf field string region_code = 1; + */ + protected $region_code = ''; + /** + * Required. The short code digits, without a leading plus ('+') or country + * calling code, e.g. "611". + * + * Generated from protobuf field string number = 2; + */ + protected $number = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $region_code + * Required. The BCP-47 region code of the location where calls to this + * short code can be made, such as "US" and "BB". + * Reference(s): + * - http://www.unicode.org/reports/tr35/#unicode_region_subtag + * @type string $number + * Required. The short code digits, without a leading plus ('+') or country + * calling code, e.g. "611". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\PhoneNumber::initOnce(); + parent::__construct($data); + } + + /** + * Required. The BCP-47 region code of the location where calls to this + * short code can be made, such as "US" and "BB". + * Reference(s): + * - http://www.unicode.org/reports/tr35/#unicode_region_subtag + * + * Generated from protobuf field string region_code = 1; + * @return string + */ + public function getRegionCode() + { + return $this->region_code; + } + + /** + * Required. The BCP-47 region code of the location where calls to this + * short code can be made, such as "US" and "BB". + * Reference(s): + * - http://www.unicode.org/reports/tr35/#unicode_region_subtag + * + * Generated from protobuf field string region_code = 1; + * @param string $var + * @return $this + */ + public function setRegionCode($var) + { + GPBUtil::checkString($var, True); + $this->region_code = $var; + + return $this; + } + + /** + * Required. The short code digits, without a leading plus ('+') or country + * calling code, e.g. "611". + * + * Generated from protobuf field string number = 2; + * @return string + */ + public function getNumber() + { + return $this->number; + } + + /** + * Required. The short code digits, without a leading plus ('+') or country + * calling code, e.g. "611". + * + * Generated from protobuf field string number = 2; + * @param string $var + * @return $this + */ + public function setNumber($var) + { + GPBUtil::checkString($var, True); + $this->number = $var; + + return $this; + } + +} + + diff --git a/lib/Google/vendor/google/common-protos/src/Type/PostalAddress.php b/lib/Google/vendor/google/common-protos/src/Type/PostalAddress.php new file mode 100644 index 000000000..1fdaf265d --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/PostalAddress.php @@ -0,0 +1,628 @@ +google.type.PostalAddress + */ +class PostalAddress extends \Google\Protobuf\Internal\Message +{ + /** + * The schema revision of the `PostalAddress`. This must be set to 0, which is + * the latest revision. + * All new revisions **must** be backward compatible with old revisions. + * + * Generated from protobuf field int32 revision = 1; + */ + protected $revision = 0; + /** + * Required. CLDR region code of the country/region of the address. This + * is never inferred and it is up to the user to ensure the value is + * correct. See http://cldr.unicode.org/ and + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + * for details. Example: "CH" for Switzerland. + * + * Generated from protobuf field string region_code = 2; + */ + protected $region_code = ''; + /** + * Optional. BCP-47 language code of the contents of this address (if + * known). This is often the UI language of the input form or is expected + * to match one of the languages used in the address' country/region, or their + * transliterated equivalents. + * This can affect formatting in certain countries, but is not critical + * to the correctness of the data and will never affect any validation or + * other non-formatting related operations. + * If this value is not known, it should be omitted (rather than specifying a + * possibly incorrect default). + * Examples: "zh-Hant", "ja", "ja-Latn", "en". + * + * Generated from protobuf field string language_code = 3; + */ + protected $language_code = ''; + /** + * Optional. Postal code of the address. Not all countries use or require + * postal codes to be present, but where they are used, they may trigger + * additional validation with other parts of the address (e.g. state/zip + * validation in the U.S.A.). + * + * Generated from protobuf field string postal_code = 4; + */ + protected $postal_code = ''; + /** + * Optional. Additional, country-specific, sorting code. This is not used + * in most regions. Where it is used, the value is either a string like + * "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + * alone, representing the "sector code" (Jamaica), "delivery area indicator" + * (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + * + * Generated from protobuf field string sorting_code = 5; + */ + protected $sorting_code = ''; + /** + * Optional. Highest administrative subdivision which is used for postal + * addresses of a country or region. + * For example, this can be a state, a province, an oblast, or a prefecture. + * Specifically, for Spain this is the province and not the autonomous + * community (e.g. "Barcelona" and not "Catalonia"). + * Many countries don't use an administrative area in postal addresses. E.g. + * in Switzerland this should be left unpopulated. + * + * Generated from protobuf field string administrative_area = 6; + */ + protected $administrative_area = ''; + /** + * Optional. Generally refers to the city/town portion of the address. + * Examples: US city, IT comune, UK post town. + * In regions of the world where localities are not well defined or do not fit + * into this structure well, leave locality empty and use address_lines. + * + * Generated from protobuf field string locality = 7; + */ + protected $locality = ''; + /** + * Optional. Sublocality of the address. + * For example, this can be neighborhoods, boroughs, districts. + * + * Generated from protobuf field string sublocality = 8; + */ + protected $sublocality = ''; + /** + * Unstructured address lines describing the lower levels of an address. + * Because values in address_lines do not have type information and may + * sometimes contain multiple values in a single field (e.g. + * "Austin, TX"), it is important that the line order is clear. The order of + * address lines should be "envelope order" for the country/region of the + * address. In places where this can vary (e.g. Japan), address_language is + * used to make it explicit (e.g. "ja" for large-to-small ordering and + * "ja-Latn" or "en" for small-to-large). This way, the most specific line of + * an address can be selected based on the language. + * The minimum permitted structural representation of an address consists + * of a region_code with all remaining information placed in the + * address_lines. It would be possible to format such an address very + * approximately without geocoding, but no semantic reasoning could be + * made about any of the address components until it was at least + * partially resolved. + * Creating an address only containing a region_code and address_lines, and + * then geocoding is the recommended way to handle completely unstructured + * addresses (as opposed to guessing which parts of the address should be + * localities or administrative areas). + * + * Generated from protobuf field repeated string address_lines = 9; + */ + private $address_lines; + /** + * Optional. The recipient at the address. + * This field may, under certain circumstances, contain multiline information. + * For example, it might contain "care of" information. + * + * Generated from protobuf field repeated string recipients = 10; + */ + private $recipients; + /** + * Optional. The name of the organization at the address. + * + * Generated from protobuf field string organization = 11; + */ + protected $organization = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $revision + * The schema revision of the `PostalAddress`. This must be set to 0, which is + * the latest revision. + * All new revisions **must** be backward compatible with old revisions. + * @type string $region_code + * Required. CLDR region code of the country/region of the address. This + * is never inferred and it is up to the user to ensure the value is + * correct. See http://cldr.unicode.org/ and + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + * for details. Example: "CH" for Switzerland. + * @type string $language_code + * Optional. BCP-47 language code of the contents of this address (if + * known). This is often the UI language of the input form or is expected + * to match one of the languages used in the address' country/region, or their + * transliterated equivalents. + * This can affect formatting in certain countries, but is not critical + * to the correctness of the data and will never affect any validation or + * other non-formatting related operations. + * If this value is not known, it should be omitted (rather than specifying a + * possibly incorrect default). + * Examples: "zh-Hant", "ja", "ja-Latn", "en". + * @type string $postal_code + * Optional. Postal code of the address. Not all countries use or require + * postal codes to be present, but where they are used, they may trigger + * additional validation with other parts of the address (e.g. state/zip + * validation in the U.S.A.). + * @type string $sorting_code + * Optional. Additional, country-specific, sorting code. This is not used + * in most regions. Where it is used, the value is either a string like + * "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + * alone, representing the "sector code" (Jamaica), "delivery area indicator" + * (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + * @type string $administrative_area + * Optional. Highest administrative subdivision which is used for postal + * addresses of a country or region. + * For example, this can be a state, a province, an oblast, or a prefecture. + * Specifically, for Spain this is the province and not the autonomous + * community (e.g. "Barcelona" and not "Catalonia"). + * Many countries don't use an administrative area in postal addresses. E.g. + * in Switzerland this should be left unpopulated. + * @type string $locality + * Optional. Generally refers to the city/town portion of the address. + * Examples: US city, IT comune, UK post town. + * In regions of the world where localities are not well defined or do not fit + * into this structure well, leave locality empty and use address_lines. + * @type string $sublocality + * Optional. Sublocality of the address. + * For example, this can be neighborhoods, boroughs, districts. + * @type array|\Google\Protobuf\Internal\RepeatedField $address_lines + * Unstructured address lines describing the lower levels of an address. + * Because values in address_lines do not have type information and may + * sometimes contain multiple values in a single field (e.g. + * "Austin, TX"), it is important that the line order is clear. The order of + * address lines should be "envelope order" for the country/region of the + * address. In places where this can vary (e.g. Japan), address_language is + * used to make it explicit (e.g. "ja" for large-to-small ordering and + * "ja-Latn" or "en" for small-to-large). This way, the most specific line of + * an address can be selected based on the language. + * The minimum permitted structural representation of an address consists + * of a region_code with all remaining information placed in the + * address_lines. It would be possible to format such an address very + * approximately without geocoding, but no semantic reasoning could be + * made about any of the address components until it was at least + * partially resolved. + * Creating an address only containing a region_code and address_lines, and + * then geocoding is the recommended way to handle completely unstructured + * addresses (as opposed to guessing which parts of the address should be + * localities or administrative areas). + * @type array|\Google\Protobuf\Internal\RepeatedField $recipients + * Optional. The recipient at the address. + * This field may, under certain circumstances, contain multiline information. + * For example, it might contain "care of" information. + * @type string $organization + * Optional. The name of the organization at the address. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\PostalAddress::initOnce(); + parent::__construct($data); + } + + /** + * The schema revision of the `PostalAddress`. This must be set to 0, which is + * the latest revision. + * All new revisions **must** be backward compatible with old revisions. + * + * Generated from protobuf field int32 revision = 1; + * @return int + */ + public function getRevision() + { + return $this->revision; + } + + /** + * The schema revision of the `PostalAddress`. This must be set to 0, which is + * the latest revision. + * All new revisions **must** be backward compatible with old revisions. + * + * Generated from protobuf field int32 revision = 1; + * @param int $var + * @return $this + */ + public function setRevision($var) + { + GPBUtil::checkInt32($var); + $this->revision = $var; + + return $this; + } + + /** + * Required. CLDR region code of the country/region of the address. This + * is never inferred and it is up to the user to ensure the value is + * correct. See http://cldr.unicode.org/ and + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + * for details. Example: "CH" for Switzerland. + * + * Generated from protobuf field string region_code = 2; + * @return string + */ + public function getRegionCode() + { + return $this->region_code; + } + + /** + * Required. CLDR region code of the country/region of the address. This + * is never inferred and it is up to the user to ensure the value is + * correct. See http://cldr.unicode.org/ and + * http://www.unicode.org/cldr/charts/30/supplemental/territory_information.html + * for details. Example: "CH" for Switzerland. + * + * Generated from protobuf field string region_code = 2; + * @param string $var + * @return $this + */ + public function setRegionCode($var) + { + GPBUtil::checkString($var, True); + $this->region_code = $var; + + return $this; + } + + /** + * Optional. BCP-47 language code of the contents of this address (if + * known). This is often the UI language of the input form or is expected + * to match one of the languages used in the address' country/region, or their + * transliterated equivalents. + * This can affect formatting in certain countries, but is not critical + * to the correctness of the data and will never affect any validation or + * other non-formatting related operations. + * If this value is not known, it should be omitted (rather than specifying a + * possibly incorrect default). + * Examples: "zh-Hant", "ja", "ja-Latn", "en". + * + * Generated from protobuf field string language_code = 3; + * @return string + */ + public function getLanguageCode() + { + return $this->language_code; + } + + /** + * Optional. BCP-47 language code of the contents of this address (if + * known). This is often the UI language of the input form or is expected + * to match one of the languages used in the address' country/region, or their + * transliterated equivalents. + * This can affect formatting in certain countries, but is not critical + * to the correctness of the data and will never affect any validation or + * other non-formatting related operations. + * If this value is not known, it should be omitted (rather than specifying a + * possibly incorrect default). + * Examples: "zh-Hant", "ja", "ja-Latn", "en". + * + * Generated from protobuf field string language_code = 3; + * @param string $var + * @return $this + */ + public function setLanguageCode($var) + { + GPBUtil::checkString($var, True); + $this->language_code = $var; + + return $this; + } + + /** + * Optional. Postal code of the address. Not all countries use or require + * postal codes to be present, but where they are used, they may trigger + * additional validation with other parts of the address (e.g. state/zip + * validation in the U.S.A.). + * + * Generated from protobuf field string postal_code = 4; + * @return string + */ + public function getPostalCode() + { + return $this->postal_code; + } + + /** + * Optional. Postal code of the address. Not all countries use or require + * postal codes to be present, but where they are used, they may trigger + * additional validation with other parts of the address (e.g. state/zip + * validation in the U.S.A.). + * + * Generated from protobuf field string postal_code = 4; + * @param string $var + * @return $this + */ + public function setPostalCode($var) + { + GPBUtil::checkString($var, True); + $this->postal_code = $var; + + return $this; + } + + /** + * Optional. Additional, country-specific, sorting code. This is not used + * in most regions. Where it is used, the value is either a string like + * "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + * alone, representing the "sector code" (Jamaica), "delivery area indicator" + * (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + * + * Generated from protobuf field string sorting_code = 5; + * @return string + */ + public function getSortingCode() + { + return $this->sorting_code; + } + + /** + * Optional. Additional, country-specific, sorting code. This is not used + * in most regions. Where it is used, the value is either a string like + * "CEDEX", optionally followed by a number (e.g. "CEDEX 7"), or just a number + * alone, representing the "sector code" (Jamaica), "delivery area indicator" + * (Malawi) or "post office indicator" (e.g. Côte d'Ivoire). + * + * Generated from protobuf field string sorting_code = 5; + * @param string $var + * @return $this + */ + public function setSortingCode($var) + { + GPBUtil::checkString($var, True); + $this->sorting_code = $var; + + return $this; + } + + /** + * Optional. Highest administrative subdivision which is used for postal + * addresses of a country or region. + * For example, this can be a state, a province, an oblast, or a prefecture. + * Specifically, for Spain this is the province and not the autonomous + * community (e.g. "Barcelona" and not "Catalonia"). + * Many countries don't use an administrative area in postal addresses. E.g. + * in Switzerland this should be left unpopulated. + * + * Generated from protobuf field string administrative_area = 6; + * @return string + */ + public function getAdministrativeArea() + { + return $this->administrative_area; + } + + /** + * Optional. Highest administrative subdivision which is used for postal + * addresses of a country or region. + * For example, this can be a state, a province, an oblast, or a prefecture. + * Specifically, for Spain this is the province and not the autonomous + * community (e.g. "Barcelona" and not "Catalonia"). + * Many countries don't use an administrative area in postal addresses. E.g. + * in Switzerland this should be left unpopulated. + * + * Generated from protobuf field string administrative_area = 6; + * @param string $var + * @return $this + */ + public function setAdministrativeArea($var) + { + GPBUtil::checkString($var, True); + $this->administrative_area = $var; + + return $this; + } + + /** + * Optional. Generally refers to the city/town portion of the address. + * Examples: US city, IT comune, UK post town. + * In regions of the world where localities are not well defined or do not fit + * into this structure well, leave locality empty and use address_lines. + * + * Generated from protobuf field string locality = 7; + * @return string + */ + public function getLocality() + { + return $this->locality; + } + + /** + * Optional. Generally refers to the city/town portion of the address. + * Examples: US city, IT comune, UK post town. + * In regions of the world where localities are not well defined or do not fit + * into this structure well, leave locality empty and use address_lines. + * + * Generated from protobuf field string locality = 7; + * @param string $var + * @return $this + */ + public function setLocality($var) + { + GPBUtil::checkString($var, True); + $this->locality = $var; + + return $this; + } + + /** + * Optional. Sublocality of the address. + * For example, this can be neighborhoods, boroughs, districts. + * + * Generated from protobuf field string sublocality = 8; + * @return string + */ + public function getSublocality() + { + return $this->sublocality; + } + + /** + * Optional. Sublocality of the address. + * For example, this can be neighborhoods, boroughs, districts. + * + * Generated from protobuf field string sublocality = 8; + * @param string $var + * @return $this + */ + public function setSublocality($var) + { + GPBUtil::checkString($var, True); + $this->sublocality = $var; + + return $this; + } + + /** + * Unstructured address lines describing the lower levels of an address. + * Because values in address_lines do not have type information and may + * sometimes contain multiple values in a single field (e.g. + * "Austin, TX"), it is important that the line order is clear. The order of + * address lines should be "envelope order" for the country/region of the + * address. In places where this can vary (e.g. Japan), address_language is + * used to make it explicit (e.g. "ja" for large-to-small ordering and + * "ja-Latn" or "en" for small-to-large). This way, the most specific line of + * an address can be selected based on the language. + * The minimum permitted structural representation of an address consists + * of a region_code with all remaining information placed in the + * address_lines. It would be possible to format such an address very + * approximately without geocoding, but no semantic reasoning could be + * made about any of the address components until it was at least + * partially resolved. + * Creating an address only containing a region_code and address_lines, and + * then geocoding is the recommended way to handle completely unstructured + * addresses (as opposed to guessing which parts of the address should be + * localities or administrative areas). + * + * Generated from protobuf field repeated string address_lines = 9; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getAddressLines() + { + return $this->address_lines; + } + + /** + * Unstructured address lines describing the lower levels of an address. + * Because values in address_lines do not have type information and may + * sometimes contain multiple values in a single field (e.g. + * "Austin, TX"), it is important that the line order is clear. The order of + * address lines should be "envelope order" for the country/region of the + * address. In places where this can vary (e.g. Japan), address_language is + * used to make it explicit (e.g. "ja" for large-to-small ordering and + * "ja-Latn" or "en" for small-to-large). This way, the most specific line of + * an address can be selected based on the language. + * The minimum permitted structural representation of an address consists + * of a region_code with all remaining information placed in the + * address_lines. It would be possible to format such an address very + * approximately without geocoding, but no semantic reasoning could be + * made about any of the address components until it was at least + * partially resolved. + * Creating an address only containing a region_code and address_lines, and + * then geocoding is the recommended way to handle completely unstructured + * addresses (as opposed to guessing which parts of the address should be + * localities or administrative areas). + * + * Generated from protobuf field repeated string address_lines = 9; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setAddressLines($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->address_lines = $arr; + + return $this; + } + + /** + * Optional. The recipient at the address. + * This field may, under certain circumstances, contain multiline information. + * For example, it might contain "care of" information. + * + * Generated from protobuf field repeated string recipients = 10; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRecipients() + { + return $this->recipients; + } + + /** + * Optional. The recipient at the address. + * This field may, under certain circumstances, contain multiline information. + * For example, it might contain "care of" information. + * + * Generated from protobuf field repeated string recipients = 10; + * @param array|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRecipients($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->recipients = $arr; + + return $this; + } + + /** + * Optional. The name of the organization at the address. + * + * Generated from protobuf field string organization = 11; + * @return string + */ + public function getOrganization() + { + return $this->organization; + } + + /** + * Optional. The name of the organization at the address. + * + * Generated from protobuf field string organization = 11; + * @param string $var + * @return $this + */ + public function setOrganization($var) + { + GPBUtil::checkString($var, True); + $this->organization = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/Quaternion.php b/lib/Google/vendor/google/common-protos/src/Type/Quaternion.php new file mode 100644 index 000000000..f3c316d6b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/Quaternion.php @@ -0,0 +1,211 @@ +google.type.Quaternion + */ +class Quaternion extends \Google\Protobuf\Internal\Message +{ + /** + * The x component. + * + * Generated from protobuf field double x = 1; + */ + protected $x = 0.0; + /** + * The y component. + * + * Generated from protobuf field double y = 2; + */ + protected $y = 0.0; + /** + * The z component. + * + * Generated from protobuf field double z = 3; + */ + protected $z = 0.0; + /** + * The scalar component. + * + * Generated from protobuf field double w = 4; + */ + protected $w = 0.0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type float $x + * The x component. + * @type float $y + * The y component. + * @type float $z + * The z component. + * @type float $w + * The scalar component. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Quaternion::initOnce(); + parent::__construct($data); + } + + /** + * The x component. + * + * Generated from protobuf field double x = 1; + * @return float + */ + public function getX() + { + return $this->x; + } + + /** + * The x component. + * + * Generated from protobuf field double x = 1; + * @param float $var + * @return $this + */ + public function setX($var) + { + GPBUtil::checkDouble($var); + $this->x = $var; + + return $this; + } + + /** + * The y component. + * + * Generated from protobuf field double y = 2; + * @return float + */ + public function getY() + { + return $this->y; + } + + /** + * The y component. + * + * Generated from protobuf field double y = 2; + * @param float $var + * @return $this + */ + public function setY($var) + { + GPBUtil::checkDouble($var); + $this->y = $var; + + return $this; + } + + /** + * The z component. + * + * Generated from protobuf field double z = 3; + * @return float + */ + public function getZ() + { + return $this->z; + } + + /** + * The z component. + * + * Generated from protobuf field double z = 3; + * @param float $var + * @return $this + */ + public function setZ($var) + { + GPBUtil::checkDouble($var); + $this->z = $var; + + return $this; + } + + /** + * The scalar component. + * + * Generated from protobuf field double w = 4; + * @return float + */ + public function getW() + { + return $this->w; + } + + /** + * The scalar component. + * + * Generated from protobuf field double w = 4; + * @param float $var + * @return $this + */ + public function setW($var) + { + GPBUtil::checkDouble($var); + $this->w = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/TimeOfDay.php b/lib/Google/vendor/google/common-protos/src/Type/TimeOfDay.php new file mode 100644 index 000000000..4ab91e00b --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/TimeOfDay.php @@ -0,0 +1,180 @@ +google.type.TimeOfDay + */ +class TimeOfDay extends \Google\Protobuf\Internal\Message +{ + /** + * Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + * to allow the value "24:00:00" for scenarios like business closing time. + * + * Generated from protobuf field int32 hours = 1; + */ + protected $hours = 0; + /** + * Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 2; + */ + protected $minutes = 0; + /** + * Seconds of minutes of the time. Must normally be from 0 to 59. An API may + * allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 3; + */ + protected $seconds = 0; + /** + * Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + * + * Generated from protobuf field int32 nanos = 4; + */ + protected $nanos = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type int $hours + * Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + * to allow the value "24:00:00" for scenarios like business closing time. + * @type int $minutes + * Minutes of hour of day. Must be from 0 to 59. + * @type int $seconds + * Seconds of minutes of the time. Must normally be from 0 to 59. An API may + * allow the value 60 if it allows leap-seconds. + * @type int $nanos + * Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Timeofday::initOnce(); + parent::__construct($data); + } + + /** + * Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + * to allow the value "24:00:00" for scenarios like business closing time. + * + * Generated from protobuf field int32 hours = 1; + * @return int + */ + public function getHours() + { + return $this->hours; + } + + /** + * Hours of day in 24 hour format. Should be from 0 to 23. An API may choose + * to allow the value "24:00:00" for scenarios like business closing time. + * + * Generated from protobuf field int32 hours = 1; + * @param int $var + * @return $this + */ + public function setHours($var) + { + GPBUtil::checkInt32($var); + $this->hours = $var; + + return $this; + } + + /** + * Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 2; + * @return int + */ + public function getMinutes() + { + return $this->minutes; + } + + /** + * Minutes of hour of day. Must be from 0 to 59. + * + * Generated from protobuf field int32 minutes = 2; + * @param int $var + * @return $this + */ + public function setMinutes($var) + { + GPBUtil::checkInt32($var); + $this->minutes = $var; + + return $this; + } + + /** + * Seconds of minutes of the time. Must normally be from 0 to 59. An API may + * allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 3; + * @return int + */ + public function getSeconds() + { + return $this->seconds; + } + + /** + * Seconds of minutes of the time. Must normally be from 0 to 59. An API may + * allow the value 60 if it allows leap-seconds. + * + * Generated from protobuf field int32 seconds = 3; + * @param int $var + * @return $this + */ + public function setSeconds($var) + { + GPBUtil::checkInt32($var); + $this->seconds = $var; + + return $this; + } + + /** + * Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + * + * Generated from protobuf field int32 nanos = 4; + * @return int + */ + public function getNanos() + { + return $this->nanos; + } + + /** + * Fractions of seconds in nanoseconds. Must be from 0 to 999,999,999. + * + * Generated from protobuf field int32 nanos = 4; + * @param int $var + * @return $this + */ + public function setNanos($var) + { + GPBUtil::checkInt32($var); + $this->nanos = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/common-protos/src/Type/TimeZone.php b/lib/Google/vendor/google/common-protos/src/Type/TimeZone.php new file mode 100644 index 000000000..064bc32ce --- /dev/null +++ b/lib/Google/vendor/google/common-protos/src/Type/TimeZone.php @@ -0,0 +1,102 @@ +google.type.TimeZone + */ +class TimeZone extends \Google\Protobuf\Internal\Message +{ + /** + * IANA Time Zone Database time zone, e.g. "America/New_York". + * + * Generated from protobuf field string id = 1; + */ + protected $id = ''; + /** + * Optional. IANA Time Zone Database version number, e.g. "2019a". + * + * Generated from protobuf field string version = 2; + */ + protected $version = ''; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $id + * IANA Time Zone Database time zone, e.g. "America/New_York". + * @type string $version + * Optional. IANA Time Zone Database version number, e.g. "2019a". + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\Google\Type\Datetime::initOnce(); + parent::__construct($data); + } + + /** + * IANA Time Zone Database time zone, e.g. "America/New_York". + * + * Generated from protobuf field string id = 1; + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * IANA Time Zone Database time zone, e.g. "America/New_York". + * + * Generated from protobuf field string id = 1; + * @param string $var + * @return $this + */ + public function setId($var) + { + GPBUtil::checkString($var, True); + $this->id = $var; + + return $this; + } + + /** + * Optional. IANA Time Zone Database version number, e.g. "2019a". + * + * Generated from protobuf field string version = 2; + * @return string + */ + public function getVersion() + { + return $this->version; + } + + /** + * Optional. IANA Time Zone Database version number, e.g. "2019a". + * + * Generated from protobuf field string version = 2; + * @param string $var + * @return $this + */ + public function setVersion($var) + { + GPBUtil::checkString($var, True); + $this->version = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/gax/CHANGELOG.md b/lib/Google/vendor/google/gax/CHANGELOG.md new file mode 100644 index 000000000..700724313 --- /dev/null +++ b/lib/Google/vendor/google/gax/CHANGELOG.md @@ -0,0 +1,310 @@ +# Changelog + +## [1.34.1](https://github.com/googleapis/gax-php/compare/v1.34.0...v1.34.1) (2024-08-13) + + +### Bug Fixes + +* Disable universe domain check for MDS ([#575](https://github.com/googleapis/gax-php/issues/575)) ([a47a469](https://github.com/googleapis/gax-php/commit/a47a469d9ef76613c5d320539646323a5e7b978d)) + +## [1.34.0](https://github.com/googleapis/gax-php/compare/v1.33.0...v1.34.0) (2024-05-29) + + +### Features + +* Support new surface operations clients ([#569](https://github.com/googleapis/gax-php/issues/569)) ([fa06e73](https://github.com/googleapis/gax-php/commit/fa06e738fc63a3b9f70a26e6d20f30c582ef1870)) + +## [1.33.0](https://github.com/googleapis/gax-php/compare/v1.32.0...v1.33.0) (2024-05-10) + + +### Features + +* Support V2 OperationsClient in OperationResponse ([#564](https://github.com/googleapis/gax-php/issues/564)) ([7f8bb13](https://github.com/googleapis/gax-php/commit/7f8bb13f78463b1e7f2289ce5514763992806e5e)) + +## [1.32.0](https://github.com/googleapis/gax-php/compare/v1.31.0...v1.32.0) (2024-04-24) + + +### Features + +* Add a custom encoder in Serializer ([#554](https://github.com/googleapis/gax-php/issues/554)) ([be28b5a](https://github.com/googleapis/gax-php/commit/be28b5a859b674a3d398bdaab7ed86b93dd7a593)) + +## [1.31.0](https://github.com/googleapis/gax-php/compare/v1.30.1...v1.31.0) (2024-04-22) + + +### Features + +* Add the api header to the GapicClientTrait ([#553](https://github.com/googleapis/gax-php/issues/553)) ([cc102eb](https://github.com/googleapis/gax-php/commit/cc102ebdfd63019b1e6bcd51515be2a2cb13534d)) + + +### Bug Fixes + +* Add caching and micro optimizations in Serializer ([5a5d8a7](https://github.com/googleapis/gax-php/commit/5a5d8a763d8e2d470a6d960b788e7d2a938cd64f)) +* Pass auth http handler to update metadata call ([#557](https://github.com/googleapis/gax-php/issues/557)) ([6e04a50](https://github.com/googleapis/gax-php/commit/6e04a50d013f5686ec5e66c457b9b440b9bcde9e)) + +## [1.30.0](https://github.com/googleapis/gax-php/compare/v1.29.1...v1.30.0) (2024-02-28) + + +### Features + +* Auto Populate fields configured for auto population in Rpc Request Message ([#543](https://github.com/googleapis/gax-php/issues/543)) ([99d6b89](https://github.com/googleapis/gax-php/commit/99d6b899ddf55d51fab976844c1e0f8fe9918a52)) +* Make the default authHttpHandler in CredentialsWrapper null ([#544](https://github.com/googleapis/gax-php/issues/544)) ([2a25eea](https://github.com/googleapis/gax-php/commit/2a25eeacadf2f783f64b4eca4f94e067ddef3eaa)) + +## [1.29.1](https://github.com/googleapis/gax-php/compare/v1.29.0...v1.29.1) (2024-02-26) + + +### Bug Fixes + +* Allow InsecureCredentialsWrapper::getAuthorizationHeaderCallback to return null ([#541](https://github.com/googleapis/gax-php/issues/541)) ([676f4f7](https://github.com/googleapis/gax-php/commit/676f4f7e3d8925d8aba00285616fdf89440b45f9)) + +## [1.29.0](https://github.com/googleapis/gax-php/compare/v1.28.1...v1.29.0) (2024-02-26) + + +### Features + +* Add InsecureCredentialsWrapper for Emulator connection ([#538](https://github.com/googleapis/gax-php/issues/538)) ([b5dbeaf](https://github.com/googleapis/gax-php/commit/b5dbeaf33594b300a0c678ffc6a6946b09fce7dd)) + +## [1.28.1](https://github.com/googleapis/gax-php/compare/v1.28.0...v1.28.1) (2024-02-20) + + +### Bug Fixes + +* Universe domain check for grpc transport ([#534](https://github.com/googleapis/gax-php/issues/534)) ([1026d8a](https://github.com/googleapis/gax-php/commit/1026d8aec73e0aad8949a86ee7575e3edb3d56be)) + +## [1.28.0](https://github.com/googleapis/gax-php/compare/v1.27.2...v1.28.0) (2024-02-15) + + +### Features + +* Allow setting of universe domain in environment variable ([#520](https://github.com/googleapis/gax-php/issues/520)) ([6e6603b](https://github.com/googleapis/gax-php/commit/6e6603b03285f3f8d1072776cd206720e3990f50)) + +## [1.27.2](https://github.com/googleapis/gax-php/compare/v1.27.1...v1.27.2) (2024-02-14) + + +### Bug Fixes + +* Typo in TransportOptions option name ([#530](https://github.com/googleapis/gax-php/issues/530)) ([6914fe0](https://github.com/googleapis/gax-php/commit/6914fe04554867bd827be6596fafc751a3d7621a)) + +## [1.27.1](https://github.com/googleapis/gax-php/compare/v1.27.0...v1.27.1) (2024-02-14) + + +### Bug Fixes + +* Issues in Options classes ([#528](https://github.com/googleapis/gax-php/issues/528)) ([aa9ba3a](https://github.com/googleapis/gax-php/commit/aa9ba3a6bac9324ad894d9677da0e897497ebab2)) + +## [1.27.0](https://github.com/googleapis/gax-php/compare/v1.26.3...v1.27.0) (2024-02-07) + + +### Features + +* Create ClientOptionsTrait ([#527](https://github.com/googleapis/gax-php/issues/527)) ([cfe2c60](https://github.com/googleapis/gax-php/commit/cfe2c60a36233f74259c96a6799d8492ed7c45d0)) +* Implement ProjectIdProviderInterface in CredentialsWrapper ([#523](https://github.com/googleapis/gax-php/issues/523)) ([b56a463](https://github.com/googleapis/gax-php/commit/b56a4635abfeeec08895202da8218e9ba915413e)) +* Update ArrayTrait to be consistent with Core ([#526](https://github.com/googleapis/gax-php/issues/526)) ([8e44185](https://github.com/googleapis/gax-php/commit/8e44185dd6f8f8f9ef5b136776cba61ec7a8b8f6)) + + +### Bug Fixes + +* Correct exception type for Guzzle promise ([#521](https://github.com/googleapis/gax-php/issues/521)) ([7129373](https://github.com/googleapis/gax-php/commit/712937339c134e1d92cab5fa736cfe1bbcd7f343)) + +## [1.26.3](https://github.com/googleapis/gax-php/compare/v1.26.2...v1.26.3) (2024-01-18) + + +### Bug Fixes + +* CallOptions should use transportOptions ([#513](https://github.com/googleapis/gax-php/issues/513)) ([2d45ee1](https://github.com/googleapis/gax-php/commit/2d45ee187cdc3619b30c51b653b508718baf3af4)) + +## [1.26.2](https://github.com/googleapis/gax-php/compare/v1.26.1...v1.26.2) (2024-01-09) + + +### Bug Fixes + +* Ensure modifyClientOptions is called for new surface clients ([#515](https://github.com/googleapis/gax-php/issues/515)) ([68231b8](https://github.com/googleapis/gax-php/commit/68231b896dec8efb86f8986aefba3d247d2a2d1c)) + +## [1.26.1](https://github.com/googleapis/gax-php/compare/v1.26.0...v1.26.1) (2024-01-04) + + +### Bug Fixes + +* Widen google/longrunning version ([#511](https://github.com/googleapis/gax-php/issues/511)) ([b93096d](https://github.com/googleapis/gax-php/commit/b93096d0e10bde14c50480ea9f0423c292fbd5a6)) + +## [1.26.0](https://github.com/googleapis/gax-php/compare/v1.25.0...v1.26.0) (2024-01-03) + + +### Features + +* Add support for universe domain ([#502](https://github.com/googleapis/gax-php/issues/502)) ([5a26fac](https://github.com/googleapis/gax-php/commit/5a26facad5c2e5c30945987c422bb78a3fffb9b1)) +* Interface and methods for middleware stack ([#473](https://github.com/googleapis/gax-php/issues/473)) ([766da7b](https://github.com/googleapis/gax-php/commit/766da7b369409ec1b29376b533e7f22ee7f745f4)) + + +### Bug Fixes + +* Accept throwable for retry settings ([#509](https://github.com/googleapis/gax-php/issues/509)) ([5af9c3c](https://github.com/googleapis/gax-php/commit/5af9c3c650419c8f1a590783e954cd11dc1f0d56)) + +## [1.25.0](https://github.com/googleapis/gax-php/compare/v1.24.0...v1.25.0) (2023-11-02) + + +### Features + +* Add custom retries ([#489](https://github.com/googleapis/gax-php/issues/489)) ([ef0789b](https://github.com/googleapis/gax-php/commit/ef0789b73ef28d79a08c354d1361a9ccc6206088)) + +## [1.24.0](https://github.com/googleapis/gax-php/compare/v1.23.0...v1.24.0) (2023-10-10) + + +### Features + +* Ensure NewClientSurface works for consoldiated v2 clients ([#493](https://github.com/googleapis/gax-php/issues/493)) ([cb8706e](https://github.com/googleapis/gax-php/commit/cb8706ef9211a1e43f733d2c8f272a330c2fa792)) + +## [1.23.0](https://github.com/googleapis/gax-php/compare/v1.22.1...v1.23.0) (2023-09-14) + + +### Features + +* Typesafety for new surface client options ([#450](https://github.com/googleapis/gax-php/issues/450)) ([21550c5](https://github.com/googleapis/gax-php/commit/21550c5bf07f178f2043b0630f3ac34fcc3a05e0)) + +## [1.22.1](https://github.com/googleapis/gax-php/compare/v1.22.0...v1.22.1) (2023-08-04) + + +### Bug Fixes + +* Deprecation notice while GapicClientTrait->setClientOptions ([#483](https://github.com/googleapis/gax-php/issues/483)) ([1c66d34](https://github.com/googleapis/gax-php/commit/1c66d3445dca4d43831a2f4e26e59b9bd1cb76dd)) + +## [1.22.0](https://github.com/googleapis/gax-php/compare/v1.21.1...v1.22.0) (2023-07-31) + + +### Features + +* Sets api headers for "gcloud-php-new" and "gcloud-php-legacy" surface versions ([#470](https://github.com/googleapis/gax-php/issues/470)) ([2d8ccff](https://github.com/googleapis/gax-php/commit/2d8ccff419a076ee2fe9d3dc7ecd5509c74afb4c)) + +## [1.21.1](https://github.com/googleapis/gax-php/compare/v1.21.0...v1.21.1) (2023-06-28) + + +### Bug Fixes + +* Revert "chore: remove unnecessary api endpoint check" ([#476](https://github.com/googleapis/gax-php/issues/476)) ([13e773f](https://github.com/googleapis/gax-php/commit/13e773f5b09f9a99b8425835815746d37e9c1da3)) + +## [1.21.0](https://github.com/googleapis/gax-php/compare/v1.20.2...v1.21.0) (2023-06-09) + + +### Features + +* Support guzzle/promises:v2 ([753eae9](https://github.com/googleapis/gax-php/commit/753eae9acf638f3356f8149acf84444eb399a699)) + +## [1.20.2](https://github.com/googleapis/gax-php/compare/v1.20.1...v1.20.2) (2023-05-12) + + +### Bug Fixes + +* Ensure timeout set by RetryMiddleware is int not float ([#462](https://github.com/googleapis/gax-php/issues/462)) ([9d4c7fa](https://github.com/googleapis/gax-php/commit/9d4c7fa89445c63ec0bf4745ed9d98fd185ef51f)) + +## [1.20.1](https://github.com/googleapis/gax-php/compare/v1.20.0...v1.20.1) (2023-05-12) + + +### Bug Fixes + +* Default value for error message in createFromRequestException ([#463](https://github.com/googleapis/gax-php/issues/463)) ([7552d22](https://github.com/googleapis/gax-php/commit/7552d22241c2f488606e9546efdd6edea356ee9a)) + +## [1.20.0](https://github.com/googleapis/gax-php/compare/v1.19.1...v1.20.0) (2023-05-01) + + +### Features + +* **deps:** Support google/common-protos 4.0 ([af1db80](https://github.com/googleapis/gax-php/commit/af1db80c22307597f0dfcb9fafa86caf466588ba)) +* **deps:** Support google/grpc-gcp 0.3 ([18edc2c](https://github.com/googleapis/gax-php/commit/18edc2ce6a1a615e3ea7c00ede313c32cec4b799)) + +## [1.19.1](https://github.com/googleapis/gax-php/compare/v1.19.0...v1.19.1) (2023-03-16) + + +### Bug Fixes + +* Simplify ResourceHelperTrait registration ([#447](https://github.com/googleapis/gax-php/issues/447)) ([4949dc0](https://github.com/googleapis/gax-php/commit/4949dc0c4cd5e58af7933a1d2ecab90832c0b036)) + +## [1.19.0](https://github.com/googleapis/gax-php/compare/v1.18.2...v1.19.0) (2023-01-27) + + +### Features + +* Ensure cache is used in calls to ADC::onGCE ([#441](https://github.com/googleapis/gax-php/issues/441)) ([64a4184](https://github.com/googleapis/gax-php/commit/64a4184ab69d13104d269b15a55d4b8b2515b5a6)) + +## [1.18.2](https://github.com/googleapis/gax-php/compare/v1.18.1...v1.18.2) (2023-01-06) + + +### Bug Fixes + +* Ensure metadata return type is loaded into descriptor pool ([#439](https://github.com/googleapis/gax-php/issues/439)) ([a40cf8d](https://github.com/googleapis/gax-php/commit/a40cf8d87ac9aa45d18239456e2e4c96653f1a6c)) +* Implicit conversion from float to int warning ([#438](https://github.com/googleapis/gax-php/issues/438)) ([1cb62ad](https://github.com/googleapis/gax-php/commit/1cb62ad3d92ace0518017abc972e912b339f1b56)) + +## [1.18.1](https://github.com/googleapis/gax-php/compare/v1.18.0...v1.18.1) (2022-12-06) + + +### Bug Fixes + +* Message parameters in required querystring ([#430](https://github.com/googleapis/gax-php/issues/430)) ([77bc5e1](https://github.com/googleapis/gax-php/commit/77bc5e1cb8f347601d9237bf5164cf8b8ad8aa0f)) + +## [1.18.0](https://github.com/googleapis/gax-php/compare/v1.17.0...v1.18.0) (2022-12-05) + + +### Features + +* Add ResourceHelperTrait ([#428](https://github.com/googleapis/gax-php/issues/428)) ([0439efa](https://github.com/googleapis/gax-php/commit/0439efa926865be5fea25b699469b0c1f8c1c768)) + +## [1.17.0](https://github.com/googleapis/gax-php/compare/v1.16.4...v1.17.0) (2022-09-08) + + +### Features + +* Add startAsyncCall support ([#418](https://github.com/googleapis/gax-php/issues/418)) ([fc90693](https://github.com/googleapis/gax-php/commit/fc9069373c329183e07f8d174084c305b2308209)) + +## [1.16.4](https://github.com/googleapis/gax-php/compare/v1.16.3...v1.16.4) (2022-08-25) + + +### Bug Fixes + +* use interfaceOverride instead of param ([#419](https://github.com/googleapis/gax-php/issues/419)) ([9dd5bc9](https://github.com/googleapis/gax-php/commit/9dd5bc91c4becfd2a0832288ab2406c3d224618e)) + +## [1.16.3](https://github.com/googleapis/gax-php/compare/v1.16.2...v1.16.3) (2022-08-23) + + +### Bug Fixes + +* add eager threshold ([#416](https://github.com/googleapis/gax-php/issues/416)) ([99eb172](https://github.com/googleapis/gax-php/commit/99eb172280f301b117fde9dcc92079ca03aa28bd)) + +## [1.16.2](https://github.com/googleapis/gax-php/compare/v1.16.1...v1.16.2) (2022-08-16) + + +### Bug Fixes + +* use responseType for custom operations ([#413](https://github.com/googleapis/gax-php/issues/413)) ([b643adf](https://github.com/googleapis/gax-php/commit/b643adfc44dd9fe82b0919e5b34edd00c7cdbb1f)) + +## [1.16.1](https://github.com/googleapis/gax-php/compare/v1.16.0...v1.16.1) (2022-08-11) + + +### Bug Fixes + +* remove typehint from extended method ([#411](https://github.com/googleapis/gax-php/issues/411)) ([fb37f73](https://github.com/googleapis/gax-php/commit/fb37f7365e888465d84fca304ca83360ddbae6c3)) + +## [1.16.0](https://github.com/googleapis/gax-php/compare/v1.15.0...v1.16.0) (2022-08-10) + + +### Features + +* additional typehinting ([#403](https://github.com/googleapis/gax-php/issues/403)) ([6597a07](https://github.com/googleapis/gax-php/commit/6597a07019665d91e07ea0a016c7d99c8a099cd2)) +* drop support for PHP 5.6 ([#397](https://github.com/googleapis/gax-php/issues/397)) ([b888b24](https://github.com/googleapis/gax-php/commit/b888b24e0e223784e22dbbbe27fe0284cdcdfc35)) +* introduce startApiCall ([#406](https://github.com/googleapis/gax-php/issues/406)) ([1cfeb62](https://github.com/googleapis/gax-php/commit/1cfeb628070c9c6e57b2dde854b0a973a888a2bc)) + + +### Bug Fixes + +* **deps:** update dependency google/longrunning to ^0.2 ([#407](https://github.com/googleapis/gax-php/issues/407)) ([54d4f32](https://github.com/googleapis/gax-php/commit/54d4f32ba5464d1f5da33e1c99a020174cae367c)) + +## [1.15.0](https://github.com/googleapis/gax-php/compare/v1.14.0...v1.15.0) (2022-08-02) + + +### Features + +* move LongRunning classes to a standalone package ([#401](https://github.com/googleapis/gax-php/issues/401)) ([1747125](https://github.com/googleapis/gax-php/commit/1747125c84dcc6d42390de7e78d2e326884e1073)) + +## [1.14.0](https://github.com/googleapis/gax-php/compare/v1.13.0...v1.14.0) (2022-07-26) + + +### Features + +* support requesting numeric enum rest encoding ([#395](https://github.com/googleapis/gax-php/issues/395)) ([0d74a48](https://github.com/googleapis/gax-php/commit/0d74a4877c5198cfaf534c4e55d7e418b50bc6ab)) diff --git a/lib/Google/vendor/google/gax/CODE_OF_CONDUCT.md b/lib/Google/vendor/google/gax/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..46b2a08ea --- /dev/null +++ b/lib/Google/vendor/google/gax/CODE_OF_CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, +and in the interest of fostering an open and welcoming community, +we pledge to respect all people who contribute through reporting issues, +posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project +a harassment-free experience for everyone, +regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, +such as physical or electronic +addresses, without explicit permission +* Other unethical or unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. +By adopting this Code of Conduct, +project maintainers commit themselves to fairly and consistently +applying these principles to every aspect of managing this project. +Project maintainers who do not follow or enforce the Code of Conduct +may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue +or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) diff --git a/lib/Google/vendor/google/gax/LICENSE b/lib/Google/vendor/google/gax/LICENSE new file mode 100644 index 000000000..1839ff93e --- /dev/null +++ b/lib/Google/vendor/google/gax/LICENSE @@ -0,0 +1,25 @@ +Copyright 2016, Google Inc. +All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/Google/vendor/google/gax/README.md b/lib/Google/vendor/google/gax/README.md new file mode 100644 index 000000000..c5da66423 --- /dev/null +++ b/lib/Google/vendor/google/gax/README.md @@ -0,0 +1,97 @@ +# Google API Core for PHP + +![Build Status](https://github.com/googleapis/gax-php/actions/workflows/tests.yml/badge.svg) + +- [Documentation](https://googleapis.github.io/gax-php) + +Google API Core for PHP (gax-php) is a set of modules which aids the development +of APIs for clients based on [gRPC][] and Google API conventions. + +Application code will rarely need to use most of the classes within this library +directly, but code generated automatically from the API definition files in +[Google APIs][] can use services such as page streaming and retry to provide a +more convenient and idiomatic API surface to callers. + +[gRPC]: http://grpc.io +[Google APIs]: https://github.com/googleapis/googleapis/ + +## PHP Versions + +gax-php currently requires PHP 5.6 or higher. + +## Contributing + +Contributions to this library are always welcome and highly encouraged. + +See the [CONTRIBUTING][] documentation for more information on how to get +started. + +[CONTRIBUTING]: https://github.com/googleapis/gax-php/blob/main/.github/CONTRIBUTING.md + +## Versioning + +This library follows [Semantic Versioning][]. + +This library is considered GA (generally available). As such, it will not +introduce backwards-incompatible changes in any minor or patch releases. We will +address issues and requests with the highest priority. + +[Semantic Versioning]: http://semver.org/ + +## Repository Structure + +All code lives under the src/ directory. Handwritten code lives in the +src/ApiCore directory and is contained in the `Google\ApiCore` namespace. + +Generated classes for protobuf common types and LongRunning client live under +the src/ directory, in the appropriate directory and namespace. + +Code in the metadata/ directory is provided to support generated protobuf +classes, and should not be used directly. + +## Development Set-Up + +These steps describe the dependencies to install for Linux, and equivalents can +be found for Mac or Windows. + +1. Install dependencies. + + ```sh + > cd ~/ + > sudo apt-get install php php-dev libcurl3-openssl-dev php-pear php-bcmath php-xml + > curl -sS https://getcomposer.org/installer | php + > sudo pecl install protobuf + ``` + +2. Set up this repo. + + ```sh + > cd /path/to/gax-php + > composer install + ``` + +3. Run tests. + + ```sh + > composer test + ``` + +4. Updating dependencies after changing `composer.json`: + + ```sh + > composer update + ` + ``` + +5. Formatting source: + + ```sh + > composer cs-lint + > composer cs-fix + ``` + +## License + +BSD - See [LICENSE][] for more information. + +[LICENSE]: https://github.com/googleapis/gax-php/blob/main/LICENSE diff --git a/lib/Google/vendor/google/gax/SECURITY.md b/lib/Google/vendor/google/gax/SECURITY.md new file mode 100644 index 000000000..8b58ae9c0 --- /dev/null +++ b/lib/Google/vendor/google/gax/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +To report a security issue, please use [g.co/vulnz](https://g.co/vulnz). + +The Google Security Team will respond within 5 working days of your report on g.co/vulnz. + +We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue. diff --git a/lib/Google/vendor/google/gax/VERSION b/lib/Google/vendor/google/gax/VERSION new file mode 100644 index 000000000..a95a46d9f --- /dev/null +++ b/lib/Google/vendor/google/gax/VERSION @@ -0,0 +1 @@ +1.34.1 diff --git a/lib/Google/vendor/google/gax/composer.json b/lib/Google/vendor/google/gax/composer.json new file mode 100644 index 000000000..2806aeb22 --- /dev/null +++ b/lib/Google/vendor/google/gax/composer.json @@ -0,0 +1,48 @@ +{ + "name": "google/gax", + "type": "library", + "description": "Google API Core for PHP", + "keywords": ["google"], + "homepage": "https://github.com/googleapis/gax-php", + "license": "BSD-3-Clause", + "require": { + "php": "^8.0", + "google/auth": "^1.34.0", + "google/grpc-gcp": "^0.4", + "grpc/grpc": "^1.13", + "google/protobuf": "^v3.25.3||^4.26.1", + "guzzlehttp/promises": "^2.0", + "guzzlehttp/psr7": "^2.0", + "google/common-protos": "^4.4", + "google/longrunning": "~0.4", + "ramsey/uuid": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*", + "phpspec/prophecy-phpunit": "^2.1", + "phpstan/phpstan": "^1.10" + }, + "conflict": { + "ext-protobuf": "<3.7.0" + }, + "autoload": { + "psr-4": { + "Google\\ApiCore\\": "src", + "GPBMetadata\\ApiCore\\": "metadata/ApiCore" + } + }, + "autoload-dev": { + "psr-4": { + "Google\\ApiCore\\Dev\\": "dev/src", + "Google\\ApiCore\\": "tests", + "GPBMetadata\\Google\\": "metadata/Google" + } + }, + "scripts": { + "regenerate-test-protos": "dev/sh/regenerate-test-protos.sh", + "test": "./vendor/bin/phpunit", + "cs-lint": "vendor/bin/phpcs --standard=./ruleset.xml", + "cs-fix": "vendor/bin/phpcbf --standard=./ruleset.xml" + } +} diff --git a/lib/Google/vendor/google/gax/metadata/ApiCore/Testing/Mocks.php b/lib/Google/vendor/google/gax/metadata/ApiCore/Testing/Mocks.php new file mode 100644 index 0000000000000000000000000000000000000000..5dcb11f0c8c9ac1ccf4a99ae4fd82abdd745bc90 GIT binary patch literal 1988 zcmbW2ZEqVz5XZ@5>v7_cLrRadf+bXnE7}W9qJUgNRg*TYgh^B)cw@<0pV#gx=iTk? zUW-Bb2E67&@h#w!F#F((6~`4y-Z+|@-_Cz#XJ)^9s@^F0k{mO^a%xzQbVtOzVMOK9 z$W&&eTlD)ZC#f7Np0PY3wOPn#`fXpb7&ex~>jGH308JOM~Esx@g@6#f8$f2!zaJSEytgFpAV?r^~kry2hp zRUVQ)%``)D+P7bb)NmJNxN)B4_560hnh9GOf!~KFFSNyaYps>IUplfo*}syaD<%CZC!cfWPKcDVFQ&QFnol zzUSe(p7na=?YzJat(Wz*)!l}_D)7lQtr=|$-2Eq1@f3S8F}{5_Klk<>*TC2pJ7!!x z-_x6)U3KV%5{2*gu72094zuX@AzA-@Yagn13SP6f1qzBH07VC^W8^s#@f?|}SE6;O zIGe^vi09F?xb@E*tawZ-DKv{#V9}0VAZoBIieZ=K-aXoYTF(63>Q2VBi5JKMo_q(^ z1pCc&CPFT{kS$of1cp?_OXy$SJxH!EVlt^Ec|8u*qUyOY`Dk+w)~Ae76&B9fC@5Zq zrFS$de14V2{I_#ke=fn=L}{9`H~K$mDrVPOr*G#cr1=zT0*i}QoC}TRjcu0I-S+l} z^Kn<=;(iU)?g%@k<3%nx{O*_@w@%WuKEK#JqQ_7h_ep@39rWoGG@iI90dT52Lmd0~ zmUG{naxWJ{graaL4)(+Ow`YjLJ$JD0MPUSc`vIuTi0~u2c>i5k!DhxK9|&;7y(vvN z`RL@CM~=Zo5SXfC?p(*9Q?v(b<-i4EWrnVDtwmo!^_{J909GBaF%`lKT8CS{tdHXw zI#ynOgcB7^yYbpp(_Z|sH#JwGDg~2$-%HJJ{+{1B_HRh}pp9R&f9LN`F7v7H-DTG! ad)wu*dgz~uiI-*OtKvNU>c4;sfd2r@333$x literal 0 HcmV?d00001 diff --git a/lib/Google/vendor/google/gax/metadata/Google/ApiCore/Tests/Unit/Example.php b/lib/Google/vendor/google/gax/metadata/Google/ApiCore/Tests/Unit/Example.php new file mode 100644 index 000000000..d958e2b52 --- /dev/null +++ b/lib/Google/vendor/google/gax/metadata/Google/ApiCore/Tests/Unit/Example.php @@ -0,0 +1,28 @@ +internalAddGeneratedFile(hex2bin( + "0a85010a0d6578616d706c652e70726f746f1219676f6f676c652e617069" . + "636f72652e74657374732e756e6974220b0a094d794d6573736167654244" . + "ca0219476f6f676c655c417069436f72655c54657374735c556e6974e202" . + "254750424d657461646174615c476f6f676c655c417069436f72655c5465" . + "7374735c556e6974620670726f746f33" + )); + + static::$is_initialized = true; + } +} + diff --git a/lib/Google/vendor/google/gax/metadata/README.md b/lib/Google/vendor/google/gax/metadata/README.md new file mode 100644 index 000000000..1bd41550e --- /dev/null +++ b/lib/Google/vendor/google/gax/metadata/README.md @@ -0,0 +1,6 @@ +# Google Protobuf Metadata Classes + +## WARNING! + +These classes are not intended for direct use - they exist only to support +the generated protobuf classes in src/ diff --git a/lib/Google/vendor/google/gax/phpstan.neon.dist b/lib/Google/vendor/google/gax/phpstan.neon.dist new file mode 100644 index 000000000..dcef11342 --- /dev/null +++ b/lib/Google/vendor/google/gax/phpstan.neon.dist @@ -0,0 +1,5 @@ +parameters: + treatPhpDocTypesAsCertain: false + level: 5 + paths: + - src diff --git a/lib/Google/vendor/google/gax/phpunit.xml.dist b/lib/Google/vendor/google/gax/phpunit.xml.dist new file mode 100644 index 000000000..3112d3d95 --- /dev/null +++ b/lib/Google/vendor/google/gax/phpunit.xml.dist @@ -0,0 +1,16 @@ + + + + + + + + src/ApiCore + + + + + tests/Tests/Unit + + + diff --git a/lib/Google/vendor/google/gax/renovate.json b/lib/Google/vendor/google/gax/renovate.json new file mode 100644 index 000000000..6d8121323 --- /dev/null +++ b/lib/Google/vendor/google/gax/renovate.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "config:base", + ":preserveSemverRanges", + ":disableDependencyDashboard" + ] +} diff --git a/lib/Google/vendor/google/gax/src/AgentHeader.php b/lib/Google/vendor/google/gax/src/AgentHeader.php new file mode 100644 index 000000000..9afd4969d --- /dev/null +++ b/lib/Google/vendor/google/gax/src/AgentHeader.php @@ -0,0 +1,132 @@ + $value) { + $metricsList[] = $key . "/" . $value; + } + return [self::AGENT_HEADER_KEY => [implode(" ", $metricsList)]]; + } + + /** + * Reads the gapic version string from a VERSION file. In order to determine the file + * location, this method follows this procedure: + * - accepts a class name $callingClass + * - identifies the file defining that class + * - searches up the directory structure for the 'src' directory + * - looks in the directory above 'src' for a file named VERSION + * + * @param string $callingClass + * @return string the gapic version + * @throws \ReflectionException + */ + public static function readGapicVersionFromFile(string $callingClass) + { + $callingClassFile = (new \ReflectionClass($callingClass))->getFileName(); + $versionFile = substr( + $callingClassFile, + 0, + strrpos($callingClassFile, DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR) + ) . DIRECTORY_SEPARATOR . 'VERSION'; + + return Version::readVersionFile($versionFile); + } +} diff --git a/lib/Google/vendor/google/gax/src/ApiException.php b/lib/Google/vendor/google/gax/src/ApiException.php new file mode 100644 index 000000000..7385f8b43 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ApiException.php @@ -0,0 +1,346 @@ + null, + 'metadata' => null, + 'basicMessage' => $message, + ]; + parent::__construct($message, $code, $optionalArgs['previous']); + $this->status = $status; + $this->metadata = $optionalArgs['metadata']; + $this->basicMessage = $optionalArgs['basicMessage']; + if ($this->metadata) { + $this->decodedMetadataErrorInfo = self::decodeMetadataErrorInfo($this->metadata); + } + } + + public function getStatus() + { + return $this->status; + } + + /** + * Returns null if metadata does not contain error info, or returns containsErrorInfo() array + * if the metadata does contain error info. + * @param array $metadata + * @return array $details { + * @type string|null $reason + * @type string|null $domain + * @type array|null $errorInfoMetadata + * } + */ + private static function decodeMetadataErrorInfo(array $metadata) + { + $details = []; + // ApiExceptions created from RPC status have metadata that is an array of objects. + if (is_object(reset($metadata))) { + $metadataRpcStatus = Serializer::decodeAnyMessages($metadata); + $details = self::containsErrorInfo($metadataRpcStatus); + } elseif (self::containsErrorInfo($metadata)) { + $details = self::containsErrorInfo($metadata); + } else { + // For GRPC-based responses, the $metadata needs to be decoded. + $metadataGrpc = Serializer::decodeMetadata($metadata); + $details = self::containsErrorInfo($metadataGrpc); + } + return $details; + } + + /** + * Returns the `reason` in ErrorInfo for an exception, or null if there is no ErrorInfo. + * @return string|null $reason + */ + public function getReason() + { + return ($this->decodedMetadataErrorInfo) ? $this->decodedMetadataErrorInfo['reason'] : null; + } + + /** + * Returns the `domain` in ErrorInfo for an exception, or null if there is no ErrorInfo. + * @return string|null $domain + */ + public function getDomain() + { + return ($this->decodedMetadataErrorInfo) ? $this->decodedMetadataErrorInfo['domain'] : null; + } + + /** + * Returns the `metadata` in ErrorInfo for an exception, or null if there is no ErrorInfo. + * @return array|null $errorInfoMetadata + */ + public function getErrorInfoMetadata() + { + return ($this->decodedMetadataErrorInfo) ? $this->decodedMetadataErrorInfo['errorInfoMetadata'] : null; + } + + /** + * @param stdClass $status + * @return ApiException + */ + public static function createFromStdClass(stdClass $status) + { + $metadata = property_exists($status, 'metadata') ? $status->metadata : null; + return self::create( + $status->details, + $status->code, + $metadata, + Serializer::decodeMetadata((array) $metadata) + ); + } + + /** + * @param string $basicMessage + * @param int $rpcCode + * @param array|null $metadata + * @param Exception $previous + * @return ApiException + */ + public static function createFromApiResponse( + $basicMessage, + $rpcCode, + array $metadata = null, + Exception $previous = null + ) { + return self::create( + $basicMessage, + $rpcCode, + $metadata, + Serializer::decodeMetadata((array) $metadata), + $previous + ); + } + + /** + * For REST-based responses, the metadata does not need to be decoded. + * + * @param string $basicMessage + * @param int $rpcCode + * @param array|null $metadata + * @param Exception $previous + * @return ApiException + */ + public static function createFromRestApiResponse( + $basicMessage, + $rpcCode, + array $metadata = null, + Exception $previous = null + ) { + return self::create( + $basicMessage, + $rpcCode, + $metadata, + is_null($metadata) ? [] : $metadata, + $previous + ); + } + + /** + * Checks if decoded metadata includes errorInfo message. + * If errorInfo is set, it will always contain `reason`, `domain`, and `metadata` keys. + * @param array $decodedMetadata + * @return array { + * @type string $reason + * @type string $domain + * @type array $errorInfoMetadata + * } + */ + private static function containsErrorInfo(array $decodedMetadata) + { + if (empty($decodedMetadata)) { + return []; + } + foreach ($decodedMetadata as $value) { + $isErrorInfoArray = isset($value['reason']) && isset($value['domain']) && isset($value['metadata']); + if ($isErrorInfoArray) { + return [ + 'reason' => $value['reason'], + 'domain' => $value['domain'], + 'errorInfoMetadata' => $value['metadata'], + ]; + } + } + return []; + } + + /** + * Construct an ApiException with a useful message, including decoded metadata. + * If the decoded metadata includes an errorInfo message, then the domain, reason, + * and metadata fields from that message are hoisted directly into the error. + * + * @param string $basicMessage + * @param int $rpcCode + * @param iterable|null $metadata + * @param array $decodedMetadata + * @param Exception|null $previous + * @return ApiException + */ + private static function create( + string $basicMessage, + int $rpcCode, + $metadata, + array $decodedMetadata, + Exception $previous = null + ) { + $containsErrorInfo = self::containsErrorInfo($decodedMetadata); + $rpcStatus = ApiStatus::statusFromRpcCode($rpcCode); + $messageData = [ + 'message' => $basicMessage, + 'code' => $rpcCode, + 'status' => $rpcStatus, + 'details' => $decodedMetadata + ]; + if ($containsErrorInfo) { + $messageData = array_merge($containsErrorInfo, $messageData); + } + + $message = json_encode($messageData, JSON_PRETTY_PRINT); + + if ($metadata instanceof RepeatedField) { + $metadata = iterator_to_array($metadata); + } + + return new ApiException($message, $rpcCode, $rpcStatus, [ + 'previous' => $previous, + 'metadata' => $metadata, + 'basicMessage' => $basicMessage, + ]); + } + + /** + * @param Status $status + * @return ApiException + */ + public static function createFromRpcStatus(Status $status) + { + return self::create( + $status->getMessage(), + $status->getCode(), + $status->getDetails(), + Serializer::decodeAnyMessages($status->getDetails()) + ); + } + + /** + * Creates an ApiException from a GuzzleHttp RequestException. + * + * @param RequestException $ex + * @param boolean $isStream + * @return ApiException + * @throws ValidationException + */ + public static function createFromRequestException(RequestException $ex, bool $isStream = false) + { + $res = $ex->getResponse(); + $body = (string) $res->getBody(); + $decoded = json_decode($body, true); + + // A streaming response body will return one error in an array. Parse + // that first (and only) error message, if provided. + if ($isStream && isset($decoded[0])) { + $decoded = $decoded[0]; + } + + if (isset($decoded['error']) && $decoded['error']) { + $error = $decoded['error']; + $basicMessage = $error['message'] ?? ''; + $code = isset($error['status']) + ? ApiStatus::rpcCodeFromStatus($error['status']) + : $ex->getCode(); + $metadata = $error['details'] ?? null; + return static::createFromRestApiResponse($basicMessage, $code, $metadata); + } + // Use the RPC code instead of the HTTP Status Code. + $code = ApiStatus::rpcCodeFromHttpStatusCode($res->getStatusCode()); + return static::createFromApiResponse($body, $code); + } + + /** + * @return null|string + */ + public function getBasicMessage() + { + return $this->basicMessage; + } + + /** + * @return mixed[] + */ + public function getMetadata() + { + return $this->metadata; + } + + /** + * String representation of ApiException + * @return string + */ + public function __toString() + { + return __CLASS__ . ": $this->message\n"; + } +} diff --git a/lib/Google/vendor/google/gax/src/ApiStatus.php b/lib/Google/vendor/google/gax/src/ApiStatus.php new file mode 100644 index 000000000..aa6adcfc1 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ApiStatus.php @@ -0,0 +1,171 @@ + Code::OK, + ApiStatus::CANCELLED => Code::CANCELLED, + ApiStatus::UNKNOWN => Code::UNKNOWN, + ApiStatus::INVALID_ARGUMENT => Code::INVALID_ARGUMENT, + ApiStatus::DEADLINE_EXCEEDED => Code::DEADLINE_EXCEEDED, + ApiStatus::NOT_FOUND => Code::NOT_FOUND, + ApiStatus::ALREADY_EXISTS => Code::ALREADY_EXISTS, + ApiStatus::PERMISSION_DENIED => Code::PERMISSION_DENIED, + ApiStatus::RESOURCE_EXHAUSTED => Code::RESOURCE_EXHAUSTED, + ApiStatus::FAILED_PRECONDITION => Code::FAILED_PRECONDITION, + ApiStatus::ABORTED => Code::ABORTED, + ApiStatus::OUT_OF_RANGE => Code::OUT_OF_RANGE, + ApiStatus::UNIMPLEMENTED => Code::UNIMPLEMENTED, + ApiStatus::INTERNAL => Code::INTERNAL, + ApiStatus::UNAVAILABLE => Code::UNAVAILABLE, + ApiStatus::DATA_LOSS => Code::DATA_LOSS, + ApiStatus::UNAUTHENTICATED => Code::UNAUTHENTICATED, + ]; + private static $codeToApiStatusMap = [ + Code::OK => ApiStatus::OK, + Code::CANCELLED => ApiStatus::CANCELLED, + Code::UNKNOWN => ApiStatus::UNKNOWN, + Code::INVALID_ARGUMENT => ApiStatus::INVALID_ARGUMENT, + Code::DEADLINE_EXCEEDED => ApiStatus::DEADLINE_EXCEEDED, + Code::NOT_FOUND => ApiStatus::NOT_FOUND, + Code::ALREADY_EXISTS => ApiStatus::ALREADY_EXISTS, + Code::PERMISSION_DENIED => ApiStatus::PERMISSION_DENIED, + Code::RESOURCE_EXHAUSTED => ApiStatus::RESOURCE_EXHAUSTED, + Code::FAILED_PRECONDITION => ApiStatus::FAILED_PRECONDITION, + Code::ABORTED => ApiStatus::ABORTED, + Code::OUT_OF_RANGE => ApiStatus::OUT_OF_RANGE, + Code::UNIMPLEMENTED => ApiStatus::UNIMPLEMENTED, + Code::INTERNAL => ApiStatus::INTERNAL, + Code::UNAVAILABLE => ApiStatus::UNAVAILABLE, + Code::DATA_LOSS => ApiStatus::DATA_LOSS, + Code::UNAUTHENTICATED => ApiStatus::UNAUTHENTICATED, + ]; + private static $httpStatusCodeToRpcCodeMap = [ + 400 => Code::INVALID_ARGUMENT, + 401 => Code::UNAUTHENTICATED, + 403 => Code::PERMISSION_DENIED, + 404 => Code::NOT_FOUND, + 409 => Code::ABORTED, + 416 => Code::OUT_OF_RANGE, + 429 => Code::RESOURCE_EXHAUSTED, + 499 => Code::CANCELLED, + 501 => Code::UNIMPLEMENTED, + 503 => Code::UNAVAILABLE, + 504 => Code::DEADLINE_EXCEEDED, + ]; + + /** + * @param string $status + * @return bool + */ + public static function isValidStatus(string $status) + { + return array_key_exists($status, self::$apiStatusToCodeMap); + } + + /** + * @param int $code + * @return string + */ + public static function statusFromRpcCode(int $code) + { + if (array_key_exists($code, self::$codeToApiStatusMap)) { + return self::$codeToApiStatusMap[$code]; + } + return ApiStatus::UNRECOGNIZED_STATUS; + } + + /** + * @param string $status + * @return int + */ + public static function rpcCodeFromStatus(string $status) + { + if (array_key_exists($status, self::$apiStatusToCodeMap)) { + return self::$apiStatusToCodeMap[$status]; + } + return ApiStatus::UNRECOGNIZED_CODE; + } + + /** + * Maps HTTP status codes to Google\Rpc\Code codes. + * Some codes are left out because they map to multiple gRPC codes (e.g. 500). + * + * @param int $httpStatusCode + * @return int + */ + public static function rpcCodeFromHttpStatusCode(int $httpStatusCode) + { + if (array_key_exists($httpStatusCode, self::$httpStatusCodeToRpcCodeMap)) { + return self::$httpStatusCodeToRpcCodeMap[$httpStatusCode]; + } + // All 2xx + if ($httpStatusCode >= 200 && $httpStatusCode < 300) { + return Code::OK; + } + // All 4xx + if ($httpStatusCode >= 400 && $httpStatusCode < 500) { + return Code::FAILED_PRECONDITION; + } + // All 5xx + if ($httpStatusCode >= 500 && $httpStatusCode < 600) { + return Code::INTERNAL; + } + // Everything else (We cannot change this to Code::UNKNOWN because it would break BC) + return ApiStatus::UNRECOGNIZED_CODE; + } +} diff --git a/lib/Google/vendor/google/gax/src/ArrayTrait.php b/lib/Google/vendor/google/gax/src/ArrayTrait.php new file mode 100644 index 000000000..02638be0c --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ArrayTrait.php @@ -0,0 +1,156 @@ +pluck($key, $arr, false); + } + } + + return $values; + } + + /** + * Determine whether given array is associative. + * + * @param array $arr + * @return bool + */ + private function isAssoc(array $arr) + { + return array_keys($arr) !== range(0, count($arr) - 1); + } + + /** + * Just like array_filter(), but preserves falsey values except null. + * + * @param array $arr + * @return array + */ + private function arrayFilterRemoveNull(array $arr) + { + return array_filter($arr, function ($element) { + if (!is_null($element)) { + return true; + } + + return false; + }); + } + + /** + * Return a subset of an array, like pluckArray, without modifying the original array. + * + * @param array $keys + * @param array $arr + * @return array + */ + private function subsetArray(array $keys, array $arr) + { + return array_intersect_key( + $arr, + array_flip($keys) + ); + } + + /** + * A method, similar to PHP's `array_merge_recursive`, with two differences. + * + * 1. Keys in $array2 take precedence over keys in $array1. + * 2. Non-array keys found in both inputs are not transformed into an array + * and appended. Rather, the value in $array2 is used. + * + * @param array $array1 + * @param array $array2 + * @return array + */ + private function arrayMergeRecursive(array $array1, array $array2) + { + foreach ($array2 as $key => $value) { + if (array_key_exists($key, $array1) && is_array($array1[$key]) && is_array($value)) { + $array1[$key] = ($this->isAssoc($array1[$key]) && $this->isAssoc($value)) + ? $this->arrayMergeRecursive($array1[$key], $value) + : array_merge($array1[$key], $value); + } else { + $array1[$key] = $value; + } + } + + return $array1; + } +} diff --git a/lib/Google/vendor/google/gax/src/BidiStream.php b/lib/Google/vendor/google/gax/src/BidiStream.php new file mode 100644 index 000000000..83490da18 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/BidiStream.php @@ -0,0 +1,177 @@ +call = $bidiStreamingCall; + if (array_key_exists('resourcesGetMethod', $streamingDescriptor)) { + $this->resourcesGetMethod = $streamingDescriptor['resourcesGetMethod']; + } + } + + /** + * Write request to the server. + * + * @param mixed $request The request to write + * @throws ValidationException + */ + public function write($request) + { + if ($this->isComplete) { + throw new ValidationException("Cannot call write() after streaming call is complete."); + } + if ($this->writesClosed) { + throw new ValidationException("Cannot call write() after calling closeWrite()."); + } + $this->call->write($request); + } + + /** + * Write all requests in $requests. + * + * @param iterable $requests An Iterable of request objects to write to the server + * + * @throws ValidationException + */ + public function writeAll($requests = []) + { + foreach ($requests as $request) { + $this->write($request); + } + } + + /** + * Inform the server that no more requests will be written. The write() function cannot be + * called after closeWrite() is called. + * @throws ValidationException + */ + public function closeWrite() + { + if ($this->isComplete) { + throw new ValidationException( + "Cannot call closeWrite() after streaming call is complete." + ); + } + if (!$this->writesClosed) { + $this->call->writesDone(); + $this->writesClosed = true; + } + } + + /** + * Read the next response from the server. Returns null if the streaming call completed + * successfully. Throws an ApiException if the streaming call failed. + * + * @throws ValidationException + * @throws ApiException + * @return mixed + */ + public function read() + { + if ($this->isComplete) { + throw new ValidationException("Cannot call read() after streaming call is complete."); + } + $resourcesGetMethod = $this->resourcesGetMethod; + if (!is_null($resourcesGetMethod)) { + if (count($this->pendingResources) === 0) { + $response = $this->call->read(); + if (!is_null($response)) { + $pendingResources = []; + foreach ($response->$resourcesGetMethod() as $resource) { + $pendingResources[] = $resource; + } + $this->pendingResources = array_reverse($pendingResources); + } + } + $result = array_pop($this->pendingResources); + } else { + $result = $this->call->read(); + } + if (is_null($result)) { + $status = $this->call->getStatus(); + $this->isComplete = true; + if (!($status->code == Code::OK)) { + throw ApiException::createFromStdClass($status); + } + } + return $result; + } + + /** + * Call closeWrite(), and read all responses from the server, until the streaming call is + * completed. Throws an ApiException if the streaming call failed. + * + * @throws ValidationException + * @throws ApiException + * @return \Generator|mixed[] + */ + public function closeWriteAndReadAll() + { + $this->closeWrite(); + $response = $this->read(); + while (!is_null($response)) { + yield $response; + $response = $this->read(); + } + } + + /** + * Return the underlying gRPC call object + * + * @return \Grpc\BidiStreamingCall|mixed + */ + public function getBidiStreamingCall() + { + return $this->call; + } +} diff --git a/lib/Google/vendor/google/gax/src/Call.php b/lib/Google/vendor/google/gax/src/Call.php new file mode 100644 index 000000000..b4c403579 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Call.php @@ -0,0 +1,131 @@ +method = $method; + $this->decodeType = $decodeType; + $this->message = $message; + $this->descriptor = $descriptor; + $this->callType = $callType; + } + + /** + * @return string + */ + public function getMethod() + { + return $this->method; + } + + /** + * @return int + */ + public function getCallType() + { + return $this->callType; + } + + /** + * @return string + */ + public function getDecodeType() + { + return $this->decodeType; + } + + /** + * @return mixed|Message + */ + public function getMessage() + { + return $this->message; + } + + /** + * @return array|null + */ + public function getDescriptor() + { + return $this->descriptor; + } + + /** + * @param mixed|Message $message + * @return Call + */ + public function withMessage($message) + { + // @phpstan-ignore-next-line + return new static( + $this->method, + $this->decodeType, + $message, + $this->descriptor, + $this->callType + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/ClientOptionsTrait.php b/lib/Google/vendor/google/gax/src/ClientOptionsTrait.php new file mode 100644 index 000000000..43deaef7c --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ClientOptionsTrait.php @@ -0,0 +1,313 @@ +mergeFromJsonString(file_get_contents($confPath)); + $config = new Config($hostName, $apiConfig); + return $config; + } + + /** + * Get default options. This function should be "overridden" by clients using late static + * binding to provide default options to the client. + * + * @return array + * @access private + */ + private static function getClientDefaults() + { + return []; + } + + private function buildClientOptions(array $options) + { + // Build $defaultOptions starting from top level + // variables, then going into deeper nesting, so that + // we will not encounter missing keys + $defaultOptions = self::getClientDefaults(); + $defaultOptions += [ + 'disableRetries' => false, + 'credentials' => null, + 'credentialsConfig' => [], + 'transport' => null, + 'transportConfig' => [], + 'gapicVersion' => self::getGapicVersion($options), + 'libName' => null, + 'libVersion' => null, + 'apiEndpoint' => null, + 'clientCertSource' => null, + 'universeDomain' => null, + ]; + + $supportedTransports = $this->supportedTransports(); + foreach ($supportedTransports as $transportName) { + if (!array_key_exists($transportName, $defaultOptions['transportConfig'])) { + $defaultOptions['transportConfig'][$transportName] = []; + } + } + if (in_array('grpc', $supportedTransports)) { + $defaultOptions['transportConfig']['grpc'] = [ + 'stubOpts' => ['grpc.service_config_disable_resolution' => 1] + ]; + } + + // Keep track of the API Endpoint + $apiEndpoint = $options['apiEndpoint'] ?? null; + + // Merge defaults into $options starting from top level + // variables, then going into deeper nesting, so that + // we will not encounter missing keys + $options += $defaultOptions; + $options['credentialsConfig'] += $defaultOptions['credentialsConfig']; + $options['transportConfig'] += $defaultOptions['transportConfig']; // @phpstan-ignore-line + if (isset($options['transportConfig']['grpc'])) { + $options['transportConfig']['grpc'] += $defaultOptions['transportConfig']['grpc']; + $options['transportConfig']['grpc']['stubOpts'] += $defaultOptions['transportConfig']['grpc']['stubOpts']; + } + if (isset($options['transportConfig']['rest'])) { + $options['transportConfig']['rest'] += $defaultOptions['transportConfig']['rest']; + } + + // These calls do not apply to "New Surface" clients. + if ($this->isBackwardsCompatibilityMode()) { + $preModifiedOptions = $options; + $this->modifyClientOptions($options); + // NOTE: this is required to ensure backwards compatiblity with $options['apiEndpoint'] + if ($options['apiEndpoint'] !== $preModifiedOptions['apiEndpoint']) { + $apiEndpoint = $options['apiEndpoint']; + } + + // serviceAddress is now deprecated and acts as an alias for apiEndpoint + if (isset($options['serviceAddress'])) { + $apiEndpoint = $this->pluck('serviceAddress', $options, false); + } + } else { + // Ads is using this method in their new surface clients, so we need to call it. + // However, this method is not used anywhere else for the new surface clients + // @TODO: Remove this in GAX V2 + $this->modifyClientOptions($options); + } + // If an API endpoint is different form the default, ensure the "audience" does not conflict + // with the custom endpoint by setting "user defined" scopes. + if ($apiEndpoint + && $apiEndpoint != $defaultOptions['apiEndpoint'] + && empty($options['credentialsConfig']['scopes']) + && !empty($options['credentialsConfig']['defaultScopes']) + ) { + $options['credentialsConfig']['scopes'] = $options['credentialsConfig']['defaultScopes']; + } + + // mTLS: detect and load the default clientCertSource if the environment variable + // "GOOGLE_API_USE_CLIENT_CERTIFICATE" is true, and the cert source is available + if (empty($options['clientCertSource']) && CredentialsLoader::shouldLoadClientCertSource()) { + if ($defaultCertSource = CredentialsLoader::getDefaultClientCertSource()) { + $options['clientCertSource'] = function () use ($defaultCertSource) { + $cert = call_user_func($defaultCertSource); + + // the key and the cert are returned in one string + return [$cert, $cert]; + }; + } + } + + // mTLS: If no apiEndpoint has been supplied by the user, and either + // GOOGLE_API_USE_MTLS_ENDPOINT tells us to, or mTLS is available, use the mTLS endpoint. + if (is_null($apiEndpoint) && $this->shouldUseMtlsEndpoint($options)) { + $apiEndpoint = self::determineMtlsEndpoint($options['apiEndpoint']); + } + + // If the user has not supplied a universe domain, use the environment variable if set. + // Otherwise, use the default ("googleapis.com"). + $options['universeDomain'] ??= getenv('GOOGLE_CLOUD_UNIVERSE_DOMAIN') + ?: GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN; + + // mTLS: It is not valid to configure mTLS outside of "googleapis.com" (yet) + if (isset($options['clientCertSource']) + && $options['universeDomain'] !== GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN + ) { + throw new ValidationException( + 'mTLS is not supported outside the "googleapis.com" universe' + ); + } + + if (is_null($apiEndpoint)) { + if (defined('self::SERVICE_ADDRESS_TEMPLATE')) { + // Derive the endpoint from the service address template and the universe domain + $apiEndpoint = str_replace( + 'UNIVERSE_DOMAIN', + $options['universeDomain'], + self::SERVICE_ADDRESS_TEMPLATE + ); + } else { + // For older clients, the service address template does not exist. Use the default + // endpoint instead. + $apiEndpoint = $defaultOptions['apiEndpoint']; + } + } + + if (extension_loaded('sysvshm') + && isset($options['gcpApiConfigPath']) + && file_exists($options['gcpApiConfigPath']) + && !empty($apiEndpoint) + ) { + $grpcGcpConfig = self::initGrpcGcpConfig( + $apiEndpoint, + $options['gcpApiConfigPath'] + ); + + if (!array_key_exists('stubOpts', $options['transportConfig']['grpc'])) { + $options['transportConfig']['grpc']['stubOpts'] = []; + } + + $options['transportConfig']['grpc']['stubOpts'] += [ + 'grpc_call_invoker' => $grpcGcpConfig->callInvoker() + ]; + } + + $options['apiEndpoint'] = $apiEndpoint; + + return $options; + } + + private function shouldUseMtlsEndpoint(array $options) + { + $mtlsEndpointEnvVar = getenv('GOOGLE_API_USE_MTLS_ENDPOINT'); + if ('always' === $mtlsEndpointEnvVar) { + return true; + } + if ('never' === $mtlsEndpointEnvVar) { + return false; + } + // For all other cases, assume "auto" and return true if clientCertSource exists + return !empty($options['clientCertSource']); + } + + private static function determineMtlsEndpoint(string $apiEndpoint) + { + $parts = explode('.', $apiEndpoint); + if (count($parts) < 3) { + return $apiEndpoint; // invalid endpoint! + } + return sprintf('%s.mtls.%s', array_shift($parts), implode('.', $parts)); + } + + /** + * @param mixed $credentials + * @param array $credentialsConfig + * @return CredentialsWrapper + * @throws ValidationException + */ + private function createCredentialsWrapper($credentials, array $credentialsConfig, string $universeDomain) + { + if (is_null($credentials)) { + return CredentialsWrapper::build($credentialsConfig, $universeDomain); + } elseif (is_string($credentials) || is_array($credentials)) { + return CredentialsWrapper::build(['keyFile' => $credentials] + $credentialsConfig, $universeDomain); + } elseif ($credentials instanceof FetchAuthTokenInterface) { + $authHttpHandler = $credentialsConfig['authHttpHandler'] ?? null; + return new CredentialsWrapper($credentials, $authHttpHandler, $universeDomain); + } elseif ($credentials instanceof CredentialsWrapper) { + return $credentials; + } else { + throw new ValidationException( + 'Unexpected value in $auth option, got: ' . + print_r($credentials, true) + ); + } + } + + /** + * This defaults to all three transports, which One-Platform supports. + * Discovery clients should define this function and only return ['rest']. + */ + private static function supportedTransports() + { + return ['grpc', 'grpc-fallback', 'rest']; + } + + // Gapic Client Extension Points + // The methods below provide extension points that can be used to customize client + // functionality. These extension points are currently considered + // private and may change at any time. + + /** + * Modify options passed to the client before calling setClientOptions. + * + * @param array $options + * @access private + * @internal + */ + protected function modifyClientOptions(array &$options) + { + // Do nothing - this method exists to allow option modification by partial veneers. + } + + /** + * @internal + */ + private function isBackwardsCompatibilityMode(): bool + { + return false; + } +} diff --git a/lib/Google/vendor/google/gax/src/ClientStream.php b/lib/Google/vendor/google/gax/src/ClientStream.php new file mode 100644 index 000000000..cdaaaf0a8 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ClientStream.php @@ -0,0 +1,107 @@ +call = $clientStreamingCall; + } + + /** + * Write request to the server. + * + * @param mixed $request The request to write + */ + public function write($request) + { + $this->call->write($request); + } + + /** + * Read the response from the server, completing the streaming call. + * + * @throws ApiException + * @return mixed The response object from the server + */ + public function readResponse() + { + list($response, $status) = $this->call->wait(); + if ($status->code == Code::OK) { + return $response; + } else { + throw ApiException::createFromStdClass($status); + } + } + + /** + * Write all data in $dataArray and read the response from the server, completing the streaming + * call. + * + * @param mixed[] $requests An iterator of request objects to write to the server + * @return mixed The response object from the server + */ + public function writeAllAndReadResponse(array $requests) + { + foreach ($requests as $request) { + $this->write($request); + } + return $this->readResponse(); + } + + /** + * Return the underlying gRPC call object + * + * @return \Grpc\ClientStreamingCall|mixed + */ + public function getClientStreamingCall() + { + return $this->call; + } +} diff --git a/lib/Google/vendor/google/gax/src/CredentialsWrapper.php b/lib/Google/vendor/google/gax/src/CredentialsWrapper.php new file mode 100644 index 000000000..9ffef8435 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/CredentialsWrapper.php @@ -0,0 +1,360 @@ +credentialsFetcher = $credentialsFetcher; + $this->authHttpHandler = $authHttpHandler; + if (empty($universeDomain)) { + throw new ValidationException('The universe domain cannot be empty'); + } + $this->universeDomain = $universeDomain; + } + + /** + * Factory method to create a CredentialsWrapper from an array of options. + * + * @param array $args { + * An array of optional arguments. + * + * @type string|array $keyFile + * Credentials to be used. Accepts either a path to a credentials file, or a decoded + * credentials file as a PHP array. If this is not specified, application default + * credentials will be used. + * @type string[] $scopes + * A string array of scopes to use when acquiring credentials. + * @type callable $authHttpHandler + * A handler used to deliver PSR-7 requests specifically + * for authentication. Should match a signature of + * `function (RequestInterface $request, array $options) : ResponseInterface`. + * @type bool $enableCaching + * Enable caching of access tokens. Defaults to true. + * @type CacheItemPoolInterface $authCache + * A cache for storing access tokens. Defaults to a simple in memory implementation. + * @type array $authCacheOptions + * Cache configuration options. + * @type string $quotaProject + * Specifies a user project to bill for access charges associated with the request. + * @type string[] $defaultScopes + * A string array of default scopes to use when acquiring + * credentials. + * @type bool $useJwtAccessWithScope + * Ensures service account credentials use JWT Access (also known as self-signed + * JWTs), even when user-defined scopes are supplied. + * } + * @param string $universeDomain The expected universe of the credentials. Defaults to + * "googleapis.com" + * @return CredentialsWrapper + * @throws ValidationException + */ + public static function build( + array $args = [], + string $universeDomain = GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN + ) { + $args += [ + 'keyFile' => null, + 'scopes' => null, + 'authHttpHandler' => null, + 'enableCaching' => true, + 'authCache' => null, + 'authCacheOptions' => [], + 'quotaProject' => null, + 'defaultScopes' => null, + 'useJwtAccessWithScope' => true, + ]; + + $keyFile = $args['keyFile']; + + if (is_null($keyFile)) { + $loader = self::buildApplicationDefaultCredentials( + $args['scopes'], + $args['authHttpHandler'], + $args['authCacheOptions'], + $args['authCache'], + $args['quotaProject'], + $args['defaultScopes'] + ); + if ($loader instanceof FetchAuthTokenCache) { + $loader = $loader->getFetcher(); + } + } else { + if (is_string($keyFile)) { + if (!file_exists($keyFile)) { + throw new ValidationException("Could not find keyfile: $keyFile"); + } + $keyFile = json_decode(file_get_contents($keyFile), true); + } + + if (isset($args['quotaProject'])) { + $keyFile['quota_project_id'] = $args['quotaProject']; + } + + $loader = CredentialsLoader::makeCredentials( + $args['scopes'], + $keyFile, + $args['defaultScopes'] + ); + } + + if ($loader instanceof ServiceAccountCredentials && $args['useJwtAccessWithScope']) { + // Ensures the ServiceAccountCredentials uses JWT Access, also known + // as self-signed JWTs, even when user-defined scopes are supplied. + $loader->useJwtAccessWithScope(); + } + + if ($args['enableCaching']) { + $authCache = $args['authCache'] ?: new MemoryCacheItemPool(); + $loader = new FetchAuthTokenCache( + $loader, + $args['authCacheOptions'], + $authCache + ); + } + + return new CredentialsWrapper($loader, $args['authHttpHandler'], $universeDomain); + } + + /** + * @return string|null The quota project associated with the credentials. + */ + public function getQuotaProject() + { + if ($this->credentialsFetcher instanceof GetQuotaProjectInterface) { + return $this->credentialsFetcher->getQuotaProject(); + } + return null; + } + + public function getProjectId(callable $httpHandler = null): ?string + { + // Ensure that FetchAuthTokenCache does not throw an exception + if ($this->credentialsFetcher instanceof FetchAuthTokenCache + && !$this->credentialsFetcher->getFetcher() instanceof ProjectIdProviderInterface) { + return null; + } + + if ($this->credentialsFetcher instanceof ProjectIdProviderInterface) { + return $this->credentialsFetcher->getProjectId($httpHandler); + } + return null; + } + + /** + * @deprecated + * @return string Bearer string containing access token. + */ + public function getBearerString() + { + $token = $this->credentialsFetcher->getLastReceivedToken(); + if (self::isExpired($token)) { + $this->checkUniverseDomain(); + + $token = $this->credentialsFetcher->fetchAuthToken($this->authHttpHandler); + if (!self::isValid($token)) { + return ''; + } + } + return empty($token['access_token']) ? '' : 'Bearer ' . $token['access_token']; + } + + /** + * @param string $audience optional audience for self-signed JWTs. + * @return callable Callable function that returns an authorization header. + */ + public function getAuthorizationHeaderCallback($audience = null) + { + // NOTE: changes to this function should be treated carefully and tested thoroughly. It will + // be passed into the gRPC c extension, and changes have the potential to trigger very + // difficult-to-diagnose segmentation faults. + return function () use ($audience) { + $token = $this->credentialsFetcher->getLastReceivedToken(); + if (self::isExpired($token)) { + $this->checkUniverseDomain(); + + // Call updateMetadata to take advantage of self-signed JWTs + if ($this->credentialsFetcher instanceof UpdateMetadataInterface) { + return $this->credentialsFetcher->updateMetadata([], $audience, $this->authHttpHandler); + } + + // In case a custom fetcher is provided (unlikely) which doesn't + // implement UpdateMetadataInterface + $token = $this->credentialsFetcher->fetchAuthToken($this->authHttpHandler); + if (!self::isValid($token)) { + return []; + } + } + $tokenString = $token['access_token']; + if (!empty($tokenString)) { + return ['authorization' => ["Bearer $tokenString"]]; + } + return []; + }; + } + + /** + * Verify that the expected universe domain matches the universe domain from the credentials. + */ + public function checkUniverseDomain() + { + if (false === $this->hasCheckedUniverse && $this->shouldCheckUniverseDomain()) { + $credentialsUniverse = $this->credentialsFetcher instanceof GetUniverseDomainInterface + ? $this->credentialsFetcher->getUniverseDomain() + : GetUniverseDomainInterface::DEFAULT_UNIVERSE_DOMAIN; + if ($credentialsUniverse !== $this->universeDomain) { + throw new ValidationException(sprintf( + 'The configured universe domain (%s) does not match the credential universe domain (%s)', + $this->universeDomain, + $credentialsUniverse + )); + } + $this->hasCheckedUniverse = true; + } + } + + /** + * Skip universe domain check for Metadata server (e.g. GCE) credentials. + * + * @return bool + */ + private function shouldCheckUniverseDomain(): bool + { + $fetcher = $this->credentialsFetcher instanceof FetchAuthTokenCache + ? $this->credentialsFetcher->getFetcher() + : $this->credentialsFetcher; + + if ($fetcher instanceof GCECredentials) { + return false; + } + + return true; + } + + /** + * @param array $scopes + * @param callable $authHttpHandler + * @param array $authCacheOptions + * @param CacheItemPoolInterface $authCache + * @param string $quotaProject + * @param array $defaultScopes + * @return FetchAuthTokenInterface + * @throws ValidationException + */ + private static function buildApplicationDefaultCredentials( + array $scopes = null, + callable $authHttpHandler = null, + array $authCacheOptions = null, + CacheItemPoolInterface $authCache = null, + $quotaProject = null, + array $defaultScopes = null + ) { + try { + return ApplicationDefaultCredentials::getCredentials( + $scopes, + $authHttpHandler, + $authCacheOptions, + $authCache, + $quotaProject, + $defaultScopes + ); + } catch (DomainException $ex) { + throw new ValidationException("Could not construct ApplicationDefaultCredentials", $ex->getCode(), $ex); + } + } + + /** + * @param mixed $token + */ + private static function isValid($token) + { + return is_array($token) + && array_key_exists('access_token', $token); + } + + /** + * @param mixed $token + */ + private static function isExpired($token) + { + return !(self::isValid($token) + && array_key_exists('expires_at', $token) + && $token['expires_at'] > time() + self::$eagerRefreshThresholdSeconds); + } +} diff --git a/lib/Google/vendor/google/gax/src/FixedSizeCollection.php b/lib/Google/vendor/google/gax/src/FixedSizeCollection.php new file mode 100644 index 000000000..eecd74408 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/FixedSizeCollection.php @@ -0,0 +1,190 @@ + 0. collectionSize: $collectionSize" + ); + } + if ($collectionSize < $initialPage->getPageElementCount()) { + $ipc = $initialPage->getPageElementCount(); + throw new InvalidArgumentException( + "collectionSize must be greater than or equal to the number of " . + "elements in initialPage. collectionSize: $collectionSize, " . + "initialPage size: $ipc" + ); + } + $this->collectionSize = $collectionSize; + + $this->pageList = FixedSizeCollection::createPageArray($initialPage, $collectionSize); + } + + /** + * Returns the number of elements in the collection. This will be + * equal to the collectionSize parameter used at construction + * unless there are no elements remaining to be retrieved. + * + * @return int + */ + public function getCollectionSize() + { + $size = 0; + foreach ($this->pageList as $page) { + $size += $page->getPageElementCount(); + } + return $size; + } + + /** + * Returns true if there are more elements that can be retrieved + * from the API. + * + * @return bool + */ + public function hasNextCollection() + { + return $this->getLastPage()->hasNextPage(); + } + + /** + * Returns a page token that can be passed into the API list + * method to retrieve additional elements. + * + * @return string + */ + public function getNextPageToken() + { + return $this->getLastPage()->getNextPageToken(); + } + + /** + * Retrieves the next FixedSizeCollection using one or more API calls. + * + * @return FixedSizeCollection + */ + public function getNextCollection() + { + $lastPage = $this->getLastPage(); + $nextPage = $lastPage->getNextPage($this->collectionSize); + return new FixedSizeCollection($nextPage, $this->collectionSize); + } + + /** + * Returns an iterator over the elements of the collection. + * + * @return Generator + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + foreach ($this->pageList as $page) { + foreach ($page as $element) { + yield $element; + } + } + } + + /** + * Returns an iterator over FixedSizeCollections, starting with this + * and making API calls as required until all of the elements have + * been retrieved. + * + * @return Generator|FixedSizeCollection[] + */ + public function iterateCollections() + { + $currentCollection = $this; + yield $this; + while ($currentCollection->hasNextCollection()) { + $currentCollection = $currentCollection->getNextCollection(); + yield $currentCollection; + } + } + + private function getLastPage() + { + $pageList = $this->pageList; + // Get last element in array... + $lastPage = end($pageList); + reset($pageList); + return $lastPage; + } + + /** + * @param Page $initialPage + * @param int $collectionSize + * @return Page[] + */ + private static function createPageArray(Page $initialPage, int $collectionSize) + { + $pageList = [$initialPage]; + $currentPage = $initialPage; + $itemCount = $currentPage->getPageElementCount(); + while ($itemCount < $collectionSize && $currentPage->hasNextPage()) { + $remainingCount = $collectionSize - $itemCount; + $currentPage = $currentPage->getNextPage($remainingCount); + $rxElementCount = $currentPage->getPageElementCount(); + if ($rxElementCount > $remainingCount) { + throw new LengthException("API returned a number of elements " . + "exceeding the specified page size limit. page size: " . + "$remainingCount, elements received: $rxElementCount"); + } + array_push($pageList, $currentPage); + $itemCount += $rxElementCount; + } + return $pageList; + } +} diff --git a/lib/Google/vendor/google/gax/src/GPBLabel.php b/lib/Google/vendor/google/gax/src/GPBLabel.php new file mode 100644 index 000000000..18208cd64 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/GPBLabel.php @@ -0,0 +1,43 @@ + $middlewareCallables */ + private array $middlewareCallables = []; + private array $transportCallMethods = [ + Call::UNARY_CALL => 'startUnaryCall', + Call::BIDI_STREAMING_CALL => 'startBidiStreamingCall', + Call::CLIENT_STREAMING_CALL => 'startClientStreamingCall', + Call::SERVER_STREAMING_CALL => 'startServerStreamingCall', + ]; + private bool $backwardsCompatibilityMode; + + /** + * Add a middleware to the call stack by providing a callable which will be + * invoked at the start of each call, and will return an instance of + * {@see MiddlewareInterface} when invoked. + * + * The callable must have the following method signature: + * + * callable(MiddlewareInterface): MiddlewareInterface + * + * An implementation may look something like this: + * ``` + * $client->addMiddleware(function (MiddlewareInterface $handler) { + * return new class ($handler) implements MiddlewareInterface { + * public function __construct(private MiddlewareInterface $handler) { + * } + * + * public function __invoke(Call $call, array $options) { + * // modify call and options (pre-request) + * $response = ($this->handler)($call, $options); + * // modify the response (post-request) + * return $response; + * } + * }; + * }); + * ``` + * + * @param callable $middlewareCallable A callable which returns an instance + * of {@see MiddlewareInterface} when invoked with a + * MiddlewareInterface instance as its first argument. + * @return void + */ + public function addMiddleware(callable $middlewareCallable): void + { + $this->middlewareCallables[] = $middlewareCallable; + } + + /** + * Initiates an orderly shutdown in which preexisting calls continue but new + * calls are immediately cancelled. + * + * @experimental + */ + public function close() + { + $this->transport->close(); + } + + /** + * Get the transport for the client. This method is protected to support + * use by customized clients. + * + * @access private + * @return TransportInterface + */ + protected function getTransport() + { + return $this->transport; + } + + /** + * Get the credentials for the client. This method is protected to support + * use by customized clients. + * + * @access private + * @return CredentialsWrapper + */ + protected function getCredentialsWrapper() + { + return $this->credentialsWrapper; + } + + /** + * Configures the GAPIC client based on an array of options. + * + * @param array $options { + * An array of required and optional arguments. + * + * @type string $apiEndpoint + * The address of the API remote host, for example "example.googleapis.com. May also + * include the port, for example "example.googleapis.com:443" + * @type bool $disableRetries + * Determines whether or not retries defined by the client configuration should be + * disabled. Defaults to `false`. + * @type string|array $clientConfig + * Client method configuration, including retry settings. This option can be either a + * path to a JSON file, or a PHP array containing the decoded JSON data. + * By default this settings points to the default client config file, which is provided + * in the resources folder. + * @type string|array|FetchAuthTokenInterface|CredentialsWrapper $credentials + * The credentials to be used by the client to authorize API calls. This option + * accepts either a path to a credentials file, or a decoded credentials file as a + * PHP array. + * *Advanced usage*: In addition, this option can also accept a pre-constructed + * \Google\Auth\FetchAuthTokenInterface object or \Google\ApiCore\CredentialsWrapper + * object. Note that when one of these objects are provided, any settings in + * $authConfig will be ignored. + * @type array $credentialsConfig + * Options used to configure credentials, including auth token caching, for the client. + * For a full list of supporting configuration options, see + * \Google\ApiCore\CredentialsWrapper::build. + * @type string|TransportInterface $transport + * The transport used for executing network requests. May be either the string `rest`, + * `grpc`, or 'grpc-fallback'. Defaults to `grpc` if gRPC support is detected on the system. + * *Advanced usage*: Additionally, it is possible to pass in an already instantiated + * TransportInterface object. Note that when this objects is provided, any settings in + * $transportConfig, and any `$apiEndpoint` setting, will be ignored. + * @type array $transportConfig + * Configuration options that will be used to construct the transport. Options for + * each supported transport type should be passed in a key for that transport. For + * example: + * $transportConfig = [ + * 'grpc' => [...], + * 'rest' => [...], + * 'grpc-fallback' => [...], + * ]; + * See the GrpcTransport::build and RestTransport::build + * methods for the supported options. + * @type string $versionFile + * The path to a file which contains the current version of the client. + * @type string $descriptorsConfigPath + * The path to a descriptor configuration file. + * @type string $serviceName + * The name of the service. + * @type string $libName + * The name of the client application. + * @type string $libVersion + * The version of the client application. + * @type string $gapicVersion + * The code generator version of the GAPIC library. + * @type callable $clientCertSource + * A callable which returns the client cert as a string. + * } + * @throws ValidationException + */ + private function setClientOptions(array $options) + { + // serviceAddress is now deprecated and acts as an alias for apiEndpoint + if (isset($options['serviceAddress'])) { + $options['apiEndpoint'] = $this->pluck('serviceAddress', $options, false); + } + $this->validateNotNull($options, [ + 'apiEndpoint', + 'serviceName', + 'descriptorsConfigPath', + 'clientConfig', + 'disableRetries', + 'credentialsConfig', + 'transportConfig', + ]); + $this->traitValidate($options, [ + 'credentials', + 'transport', + 'gapicVersion', + 'libName', + 'libVersion', + ]); + if ($this->isBackwardsCompatibilityMode()) { + if (is_string($options['clientConfig'])) { + // perform validation for V1 surfaces which is done in the + // ClientOptions class for v2 surfaces. + $options['clientConfig'] = json_decode( + file_get_contents($options['clientConfig']), + true + ); + self::validateFileExists($options['descriptorsConfigPath']); + } + } else { + // cast to ClientOptions for new surfaces only + $options = new ClientOptions($options); + } + $this->serviceName = $options['serviceName']; + $this->retrySettings = RetrySettings::load( + $this->serviceName, + $options['clientConfig'], + $options['disableRetries'] + ); + + $headerInfo = [ + 'libName' => $options['libName'], + 'libVersion' => $options['libVersion'], + 'gapicVersion' => $options['gapicVersion'], + ]; + // Edge case: If the client has the gRPC extension installed, but is + // a REST-only library, then the grpcVersion header should not be set. + if ($this->transport instanceof GrpcTransport) { + $headerInfo['grpcVersion'] = phpversion('grpc'); + } elseif ($this->transport instanceof RestTransport + || $this->transport instanceof GrpcFallbackTransport) { + $headerInfo['restVersion'] = Version::getApiCoreVersion(); + } + $this->agentHeader = AgentHeader::buildAgentHeader($headerInfo); + + // Set "client_library_name" depending on client library surface being used + $userAgentHeader = sprintf( + 'gcloud-php-%s/%s', + $this->isBackwardsCompatibilityMode() ? 'legacy' : 'new', + $options['gapicVersion'] + ); + $this->agentHeader['User-Agent'] = [$userAgentHeader]; + + self::validateFileExists($options['descriptorsConfigPath']); + + $descriptors = require($options['descriptorsConfigPath']); + $this->descriptors = $descriptors['interfaces'][$this->serviceName]; + + $this->credentialsWrapper = $this->createCredentialsWrapper( + $options['credentials'], + $options['credentialsConfig'], + $options['universeDomain'] + ); + + $transport = $options['transport'] ?: self::defaultTransport(); + $this->transport = $transport instanceof TransportInterface + ? $transport + : $this->createTransport( + $options['apiEndpoint'], + $transport, + $options['transportConfig'], + $options['clientCertSource'] + ); + } + + /** + * @param string $apiEndpoint + * @param string $transport + * @param TransportOptions|array $transportConfig + * @param callable $clientCertSource + * @return TransportInterface + * @throws ValidationException + */ + private function createTransport( + string $apiEndpoint, + $transport, + $transportConfig, + callable $clientCertSource = null + ) { + if (!is_string($transport)) { + throw new ValidationException( + "'transport' must be a string, instead got:" . + print_r($transport, true) + ); + } + $supportedTransports = self::supportedTransports(); + if (!in_array($transport, $supportedTransports)) { + throw new ValidationException(sprintf( + 'Unexpected transport option "%s". Supported transports: %s', + $transport, + implode(', ', $supportedTransports) + )); + } + $configForSpecifiedTransport = $transportConfig[$transport] ?? []; + if (is_array($configForSpecifiedTransport)) { + $configForSpecifiedTransport['clientCertSource'] = $clientCertSource; + } else { + $configForSpecifiedTransport->setClientCertSource($clientCertSource); + $configForSpecifiedTransport = $configForSpecifiedTransport->toArray(); + } + switch ($transport) { + case 'grpc': + // Setting the user agent for gRPC requires special handling + if (isset($this->agentHeader['User-Agent'])) { + if ($configForSpecifiedTransport['stubOpts']['grpc.primary_user_agent'] ??= '') { + $configForSpecifiedTransport['stubOpts']['grpc.primary_user_agent'] .= ' '; + } + $configForSpecifiedTransport['stubOpts']['grpc.primary_user_agent'] .= + $this->agentHeader['User-Agent'][0]; + } + return GrpcTransport::build($apiEndpoint, $configForSpecifiedTransport); + case 'grpc-fallback': + return GrpcFallbackTransport::build($apiEndpoint, $configForSpecifiedTransport); + case 'rest': + if (!isset($configForSpecifiedTransport['restClientConfigPath'])) { + throw new ValidationException( + "The 'restClientConfigPath' config is required for 'rest' transport." + ); + } + $restConfigPath = $configForSpecifiedTransport['restClientConfigPath']; + return RestTransport::build($apiEndpoint, $restConfigPath, $configForSpecifiedTransport); + default: + throw new ValidationException( + "Unexpected 'transport' option: $transport. " . + "Supported values: ['grpc', 'rest', 'grpc-fallback']" + ); + } + } + + /** + * @param array $options + * @return OperationsClient + */ + private function createOperationsClient(array $options) + { + $this->pluckArray([ + 'serviceName', + 'clientConfig', + 'descriptorsConfigPath', + ], $options); + + // User-supplied operations client + if ($operationsClient = $this->pluck('operationsClient', $options, false)) { + return $operationsClient; + } + + // operationsClientClass option + $operationsClientClass = $this->pluck('operationsClientClass', $options, false) + ?: OperationsCLient::class; + return new $operationsClientClass($options); + } + + /** + * @return string + */ + private static function defaultTransport() + { + return self::getGrpcDependencyStatus() + ? 'grpc' + : 'rest'; + } + + private function validateCallConfig(string $methodName) + { + // Ensure a method descriptor exists for the target method. + if (!isset($this->descriptors[$methodName])) { + throw new ValidationException("Requested method '$methodName' does not exist in descriptor configuration."); + } + $methodDescriptors = $this->descriptors[$methodName]; + + // Ensure required descriptor configuration exists. + if (!isset($methodDescriptors['callType'])) { + throw new ValidationException("Requested method '$methodName' does not have a callType " . + 'in descriptor configuration.'); + } + $callType = $methodDescriptors['callType']; + + // Validate various callType specific configurations. + if ($callType == Call::LONGRUNNING_CALL) { + if (!isset($methodDescriptors['longRunning'])) { + throw new ValidationException("Requested method '$methodName' does not have a longRunning config " . + 'in descriptor configuration.'); + } + // @TODO: check if the client implements `OperationsClientInterface` instead + if (!method_exists($this, 'getOperationsClient')) { + throw new ValidationException('Client missing required getOperationsClient ' . + "for longrunning call '$methodName'"); + } + } elseif ($callType == Call::PAGINATED_CALL) { + if (!isset($methodDescriptors['pageStreaming'])) { + throw new ValidationException("Requested method '$methodName' with callType PAGINATED_CALL does not " . + 'have a pageStreaming in descriptor configuration.'); + } + } + + // LRO are either Standard LRO response type or custom, which are handled by + // startOperationCall, so no need to validate responseType for those callType. + if ($callType != Call::LONGRUNNING_CALL) { + if (!isset($methodDescriptors['responseType'])) { + throw new ValidationException("Requested method '$methodName' does not have a responseType " . + 'in descriptor configuration.'); + } + } + + return $methodDescriptors; + } + + /** + * @param string $methodName + * @param Message $request + * @param array $optionalArgs { + * Call Options + * + * @type array $headers [optional] key-value array containing headers + * @type int $timeoutMillis [optional] the timeout in milliseconds for the call + * @type array $transportOptions [optional] transport-specific call options + * @type RetrySettings|array $retrySettings [optional] A retry settings override for the call. + * } + * + * @experimental + * + * @return PromiseInterface + */ + private function startAsyncCall( + string $methodName, + Message $request, + array $optionalArgs = [] + ) { + // Convert method name to the UpperCamelCase of RPC names from lowerCamelCase of GAPIC method names + // in order to find the method in the descriptor config. + $methodName = ucfirst($methodName); + $methodDescriptors = $this->validateCallConfig($methodName); + + $callType = $methodDescriptors['callType']; + + switch ($callType) { + case Call::PAGINATED_CALL: + return $this->getPagedListResponseAsync( + $methodName, + $optionalArgs, + $methodDescriptors['responseType'], + $request, + $methodDescriptors['interfaceOverride'] ?? $this->serviceName + ); + case Call::SERVER_STREAMING_CALL: + case Call::CLIENT_STREAMING_CALL: + case Call::BIDI_STREAMING_CALL: + throw new ValidationException("Call type '$callType' of requested method " . + "'$methodName' is not supported for async execution."); + } + + return $this->startApiCall($methodName, $request, $optionalArgs); + } + + /** + * @param string $methodName + * @param Message $request + * @param array $optionalArgs { + * Call Options + * + * @type array $headers [optional] key-value array containing headers + * @type int $timeoutMillis [optional] the timeout in milliseconds for the call + * @type array $transportOptions [optional] transport-specific call options + * @type RetrySettings|array $retrySettings [optional] A retry settings + * override for the call. + * } + * + * @experimental + * + * @return PromiseInterface|PagedListResponse|BidiStream|ClientStream|ServerStream + */ + private function startApiCall( + string $methodName, + Message $request = null, + array $optionalArgs = [] + ) { + $methodDescriptors =$this->validateCallConfig($methodName); + $callType = $methodDescriptors['callType']; + + // Prepare request-based headers, merge with user-provided headers, + // which take precedence. + $headerParams = $methodDescriptors['headerParams'] ?? []; + $requestHeaders = $this->buildRequestParamsHeader($headerParams, $request); + $optionalArgs['headers'] = array_merge($requestHeaders, $optionalArgs['headers'] ?? []); + + // Default the interface name, if not set, to the client's protobuf service name. + $interfaceName = $methodDescriptors['interfaceOverride'] ?? $this->serviceName; + + // Handle call based on call type configured in the method descriptor config. + if ($callType == Call::LONGRUNNING_CALL) { + return $this->startOperationsCall( + $methodName, + $optionalArgs, + $request, + $this->getOperationsClient(), + $interfaceName, + // Custom operations will define their own operation response type, whereas standard + // LRO defaults to the same type. + $methodDescriptors['responseType'] ?? null + ); + } + + // Fully-qualified name of the response message PHP class. + $decodeType = $methodDescriptors['responseType']; + + if ($callType == Call::PAGINATED_CALL) { + return $this->getPagedListResponse($methodName, $optionalArgs, $decodeType, $request, $interfaceName); + } + + // Unary, and all Streaming types handled by startCall. + return $this->startCall($methodName, $decodeType, $optionalArgs, $request, $callType, $interfaceName); + } + + /** + * @param string $methodName + * @param string $decodeType + * @param array $optionalArgs { + * Call Options + * + * @type array $headers [optional] key-value array containing headers + * @type int $timeoutMillis [optional] the timeout in milliseconds for the call + * @type array $transportOptions [optional] transport-specific call options + * @type RetrySettings|array $retrySettings [optional] A retry settings + * override for the call. + * } + * @param Message $request + * @param int $callType + * @param string $interfaceName + * + * @return PromiseInterface|BidiStream|ClientStream|ServerStream + */ + private function startCall( + string $methodName, + string $decodeType, + array $optionalArgs = [], + Message $request = null, + int $callType = Call::UNARY_CALL, + string $interfaceName = null + ) { + $optionalArgs = $this->configureCallOptions($optionalArgs); + $callStack = $this->createCallStack( + $this->configureCallConstructionOptions($methodName, $optionalArgs) + ); + + $descriptor = $this->descriptors[$methodName]['grpcStreaming'] ?? null; + + $call = new Call( + $this->buildMethod($interfaceName, $methodName), + $decodeType, + $request, + $descriptor, + $callType + ); + switch ($callType) { + case Call::UNARY_CALL: + $this->modifyUnaryCallable($callStack); + break; + case Call::BIDI_STREAMING_CALL: + case Call::CLIENT_STREAMING_CALL: + case Call::SERVER_STREAMING_CALL: + $this->modifyStreamingCallable($callStack); + break; + } + + return $callStack($call, $optionalArgs + array_filter([ + 'audience' => self::getDefaultAudience() + ])); + } + + /** + * @param array $callConstructionOptions { + * Call Construction Options + * + * @type RetrySettings $retrySettings [optional] A retry settings override + * For the call. + * @type array $autoPopulationSettings Settings for + * auto population of particular request fields if unset. + * } + * + * @return callable + */ + private function createCallStack(array $callConstructionOptions) + { + $quotaProject = $this->credentialsWrapper->getQuotaProject(); + $fixedHeaders = $this->agentHeader; + if ($quotaProject) { + $fixedHeaders += [ + 'X-Goog-User-Project' => [$quotaProject] + ]; + } + + if (isset($this->apiVersion)) { + $fixedHeaders += [ + 'X-Goog-Api-Version' => [$this->apiVersion] + ]; + } + + $callStack = function (Call $call, array $options) { + $startCallMethod = $this->transportCallMethods[$call->getCallType()]; + return $this->transport->$startCallMethod($call, $options); + }; + $callStack = new CredentialsWrapperMiddleware($callStack, $this->credentialsWrapper); + $callStack = new FixedHeaderMiddleware($callStack, $fixedHeaders, true); + $callStack = new RetryMiddleware($callStack, $callConstructionOptions['retrySettings']); + $callStack = new RequestAutoPopulationMiddleware( + $callStack, + $callConstructionOptions['autoPopulationSettings'], + ); + $callStack = new OptionsFilterMiddleware($callStack, [ + 'headers', + 'timeoutMillis', + 'transportOptions', + 'metadataCallback', + 'audience', + 'metadataReturnType' + ]); + + foreach (\array_reverse($this->middlewareCallables) as $fn) { + /** @var MiddlewareInterface $callStack */ + $callStack = $fn($callStack); + } + + return $callStack; + } + + /** + * @param string $methodName + * @param array $optionalArgs { + * Optional arguments + * + * @type RetrySettings|array $retrySettings [optional] A retry settings + * override for the call. + * } + * + * @return array + */ + private function configureCallConstructionOptions(string $methodName, array $optionalArgs) + { + $retrySettings = $this->retrySettings[$methodName]; + $autoPopulatedFields = $this->descriptors[$methodName]['autoPopulatedFields'] ?? []; + // Allow for retry settings to be changed at call time + if (isset($optionalArgs['retrySettings'])) { + if ($optionalArgs['retrySettings'] instanceof RetrySettings) { + $retrySettings = $optionalArgs['retrySettings']; + } else { + $retrySettings = $retrySettings->with( + $optionalArgs['retrySettings'] + ); + } + } + return [ + 'retrySettings' => $retrySettings, + 'autoPopulationSettings' => $autoPopulatedFields, + ]; + } + + /** + * @return array + */ + private function configureCallOptions(array $optionalArgs): array + { + if ($this->isBackwardsCompatibilityMode()) { + return $optionalArgs; + } + // cast to CallOptions for new surfaces only + return (new CallOptions($optionalArgs))->toArray(); + } + + /** + * @param string $methodName + * @param array $optionalArgs { + * Call Options + * + * @type array $headers [optional] key-value array containing headers + * @type int $timeoutMillis [optional] the timeout in milliseconds for the call + * @type array $transportOptions [optional] transport-specific call options + * } + * @param Message $request + * @param OperationsClient|object $client + * @param string $interfaceName + * @param string $operationClass If provided, will be used instead of the default + * operation response class of {@see \Google\LongRunning\Operation}. + * + * @return PromiseInterface + */ + private function startOperationsCall( + string $methodName, + array $optionalArgs, + Message $request, + $client, + string $interfaceName = null, + string $operationClass = null + ) { + $optionalArgs = $this->configureCallOptions($optionalArgs); + $callStack = $this->createCallStack( + $this->configureCallConstructionOptions($methodName, $optionalArgs) + ); + $descriptor = $this->descriptors[$methodName]['longRunning']; + $metadataReturnType = null; + + // Call the methods supplied in "additionalArgumentMethods" on the request Message object + // to build the "additionalOperationArguments" option for the operation response. + if (isset($descriptor['additionalArgumentMethods'])) { + $additionalArgs = []; + foreach ($descriptor['additionalArgumentMethods'] as $additionalArgsMethodName) { + $additionalArgs[] = $request->$additionalArgsMethodName(); + } + $descriptor['additionalOperationArguments'] = $additionalArgs; + unset($descriptor['additionalArgumentMethods']); + } + + if (isset($descriptor['metadataReturnType'])) { + $metadataReturnType = $descriptor['metadataReturnType']; + } + + $callStack = new OperationsMiddleware($callStack, $client, $descriptor); + + $call = new Call( + $this->buildMethod($interfaceName, $methodName), + $operationClass ?: Operation::class, + $request, + [], + Call::UNARY_CALL + ); + + $this->modifyUnaryCallable($callStack); + return $callStack($call, $optionalArgs + array_filter([ + 'metadataReturnType' => $metadataReturnType, + 'audience' => self::getDefaultAudience() + ])); + } + + /** + * @param string $methodName + * @param array $optionalArgs + * @param string $decodeType + * @param Message $request + * @param string $interfaceName + * + * @return PagedListResponse + */ + private function getPagedListResponse( + string $methodName, + array $optionalArgs, + string $decodeType, + Message $request, + string $interfaceName = null + ) { + return $this->getPagedListResponseAsync( + $methodName, + $optionalArgs, + $decodeType, + $request, + $interfaceName + )->wait(); + } + + /** + * @param string $methodName + * @param array $optionalArgs + * @param string $decodeType + * @param Message $request + * @param string $interfaceName + * + * @return PromiseInterface + */ + private function getPagedListResponseAsync( + string $methodName, + array $optionalArgs, + string $decodeType, + Message $request, + string $interfaceName = null + ) { + $optionalArgs = $this->configureCallOptions($optionalArgs); + $callStack = $this->createCallStack( + $this->configureCallConstructionOptions($methodName, $optionalArgs) + ); + $descriptor = new PageStreamingDescriptor( + $this->descriptors[$methodName]['pageStreaming'] + ); + $callStack = new PagedMiddleware($callStack, $descriptor); + + $call = new Call( + $this->buildMethod($interfaceName, $methodName), + $decodeType, + $request, + [], + Call::UNARY_CALL + ); + + $this->modifyUnaryCallable($callStack); + return $callStack($call, $optionalArgs + array_filter([ + 'audience' => self::getDefaultAudience() + ])); + } + + /** + * @param string $interfaceName + * @param string $methodName + * + * @return string + */ + private function buildMethod(string $interfaceName = null, string $methodName = null) + { + return sprintf( + '%s/%s', + $interfaceName ?: $this->serviceName, + $methodName + ); + } + + /** + * @param array $headerParams + * @param Message|null $request + * + * @return array + */ + private function buildRequestParamsHeader(array $headerParams, Message $request = null) + { + $headers = []; + + // No request message means no request-based headers. + if (!$request) { + return $headers; + } + + foreach ($headerParams as $headerParam) { + $msg = $request; + $value = null; + foreach ($headerParam['fieldAccessors'] as $accessor) { + $value = $msg->$accessor(); + + // In case the field in question is nested in another message, + // skip the header param when the nested message field is unset. + $msg = $value; + if (is_null($msg)) { + break; + } + } + + $keyName = $headerParam['keyName']; + + // If there are value pattern matchers configured and the target + // field was set, evaluate the matchers in the order that they were + // annotated in with last one matching wins. + $original = $value; + $matchers = isset($headerParam['matchers']) && !is_null($value) ? + $headerParam['matchers'] : + []; + foreach ($matchers as $matcher) { + $matches = []; + if (preg_match($matcher, $original, $matches)) { + $value = $matches[$keyName]; + } + } + + // If there are no matches or the target field was unset, skip this + // header param. + if (!$value) { + continue; + } + + $headers[$keyName] = $value; + } + + $requestParams = new RequestParamsHeaderDescriptor($headers); + + return $requestParams->getHeader(); + } + + /** + * The SERVICE_ADDRESS constant is set by GAPIC clients + */ + private static function getDefaultAudience() + { + if (!defined('self::SERVICE_ADDRESS')) { + return null; + } + return 'https://' . self::SERVICE_ADDRESS . '/'; // @phpstan-ignore-line + } + + /** + * Modify the unary callable. + * + * @param callable $callable + * @access private + */ + protected function modifyUnaryCallable(callable &$callable) + { + // Do nothing - this method exists to allow callable modification by partial veneers. + } + + /** + * Modify the streaming callable. + * + * @param callable $callable + * @access private + */ + protected function modifyStreamingCallable(callable &$callable) + { + // Do nothing - this method exists to allow callable modification by partial veneers. + } + + /** + * @internal + */ + private function isBackwardsCompatibilityMode(): bool + { + return $this->backwardsCompatibilityMode + ?? $this->backwardsCompatibilityMode = substr(__CLASS__, -11) === 'GapicClient'; + } +} diff --git a/lib/Google/vendor/google/gax/src/GrpcSupportTrait.php b/lib/Google/vendor/google/gax/src/GrpcSupportTrait.php new file mode 100644 index 000000000..85251eeee --- /dev/null +++ b/lib/Google/vendor/google/gax/src/GrpcSupportTrait.php @@ -0,0 +1,63 @@ +nextHandler = $nextHandler; + $this->credentialsWrapper = $credentialsWrapper; + } + + public function __invoke(Call $call, array $options) + { + $next = $this->nextHandler; + return $next( + $call, + $options + ['credentialsWrapper' => $this->credentialsWrapper] + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/FixedHeaderMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/FixedHeaderMiddleware.php new file mode 100644 index 000000000..c8bb62d65 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/FixedHeaderMiddleware.php @@ -0,0 +1,73 @@ +nextHandler = $nextHandler; + $this->headers = $headers; + $this->overrideUserHeaders = $overrideUserHeaders; + } + + public function __invoke(Call $call, array $options) + { + $userHeaders = $options['headers'] ?? []; + if ($this->overrideUserHeaders) { + $options['headers'] = $this->headers + $userHeaders; + } else { + $options['headers'] = $userHeaders + $this->headers; + } + + $next = $this->nextHandler; + return $next( + $call, + $options + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/MiddlewareInterface.php b/lib/Google/vendor/google/gax/src/Middleware/MiddlewareInterface.php new file mode 100644 index 000000000..d3eb4f749 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/MiddlewareInterface.php @@ -0,0 +1,91 @@ +handler = $handler; + * } + * public function __invoke(Call $call, array $options) + * { + * echo "Logging info about the call: " . $call->getMethod(); + * return ($this->handler)($call, $options); + * } + * } + * ``` + * + * Next, add the middleware to any class implementing `GapicClientTrait` by passing in a + * callable which returns the new middleware: + * + * ``` + * $client = new ExampleGoogleApiServiceClient(); + * $client->addMiddleware(function (MiddlewareInterface $handler) { + * return new MyTestMiddleware($handler); + * }); + * ``` + */ +interface MiddlewareInterface +{ + /** + * Modify or observe the API call request and response. + * The returned value must include the result of the next MiddlewareInterface invocation in the + * chain. + * + * @param Call $call + * @param array $options + * @return PromiseInterface|ClientStream|ServerStream|BidiStream + */ + public function __invoke(Call $call, array $options); +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/OperationsMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/OperationsMiddleware.php new file mode 100644 index 000000000..ae186ee46 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/OperationsMiddleware.php @@ -0,0 +1,74 @@ +nextHandler = $nextHandler; + $this->operationsClient = $operationsClient; + $this->descriptor = $descriptor; + } + + public function __invoke(Call $call, array $options) + { + $next = $this->nextHandler; + return $next( + $call, + $options + )->then(function (Message $response) { + $options = $this->descriptor + [ + 'lastProtoResponse' => $response + ]; + $operationNameMethod = $options['operationNameMethod'] ?? 'getName'; + $operationName = call_user_func([$response, $operationNameMethod]); + return new OperationResponse($operationName, $this->operationsClient, $options); + }); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/OptionsFilterMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/OptionsFilterMiddleware.php new file mode 100644 index 000000000..f62a72122 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/OptionsFilterMiddleware.php @@ -0,0 +1,66 @@ +nextHandler = $nextHandler; + $this->permittedOptions = $permittedOptions; + } + + public function __invoke(Call $call, array $options) + { + $next = $this->nextHandler; + $filteredOptions = $this->pluckArray($this->permittedOptions, $options); + return $next( + $call, + $filteredOptions + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/PagedMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/PagedMiddleware.php new file mode 100644 index 000000000..0337ba80b --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/PagedMiddleware.php @@ -0,0 +1,79 @@ +nextHandler = $nextHandler; + $this->descriptor = $descriptor; + } + + public function __invoke(Call $call, array $options) + { + $next = $this->nextHandler; + $descriptor = $this->descriptor; + return $next($call, $options)->then( + function (Message $response) use ($call, $next, $options, $descriptor) { + $page = new Page( + $call, + $options, + $next, + $descriptor, + $response + ); + return new PagedListResponse($page); + } + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/RequestAutoPopulationMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/RequestAutoPopulationMiddleware.php new file mode 100644 index 000000000..874057a99 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/RequestAutoPopulationMiddleware.php @@ -0,0 +1,104 @@ + */ + private $autoPopulationSettings; + + public function __construct( + callable $nextHandler, + array $autoPopulationSettings + ) { + $this->nextHandler = $nextHandler; + $this->autoPopulationSettings = $autoPopulationSettings; + } + + /** + * @param Call $call + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(Call $call, array $options) + { + $next = $this->nextHandler; + + if (empty($this->autoPopulationSettings)) { + return $next($call, $options); + } + + $request = $call->getMessage(); + foreach ($this->autoPopulationSettings as $fieldName => $valueType) { + $getFieldName = 'get' . ucwords($fieldName); + // We use a getter instead of a hazzer here because there's no need to + // differentiate between isset and an empty default value. Even if a + // field is explicitly set to an empty string, we want to autopopulate it. + if (empty($request->$getFieldName())) { + $setFieldName = 'set' . ucwords($fieldName); + switch ($valueType) { + case Format::UUID4: + $request->$setFieldName(Uuid::uuid4()->toString()); + break; + default: + throw new \UnexpectedValueException(sprintf( + "Value type %s::%s not supported for auto population of the field %s", + Format::class, + Format::name($valueType), + $fieldName + )); + } + } + } + $call = $call->withMessage($request); + return $next( + $call, + $options + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/ResponseMetadataMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/ResponseMetadataMiddleware.php new file mode 100644 index 000000000..c8f16087d --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/ResponseMetadataMiddleware.php @@ -0,0 +1,71 @@ +nextHandler = $nextHandler; + } + + public function __invoke(Call $call, array $options) + { + $metadataReceiver = new Promise(); + $options['metadataCallback'] = function ($metadata) use ($metadataReceiver) { + $metadataReceiver->resolve($metadata); + }; + $next = $this->nextHandler; + return $next($call, $options)->then( + function ($response) use ($metadataReceiver) { + if ($metadataReceiver->getState() === PromiseInterface::FULFILLED) { + return [$response, $metadataReceiver->wait()]; + } else { + return [$response, []]; + } + } + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Middleware/RetryMiddleware.php b/lib/Google/vendor/google/gax/src/Middleware/RetryMiddleware.php new file mode 100644 index 000000000..4a791cd71 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Middleware/RetryMiddleware.php @@ -0,0 +1,194 @@ +nextHandler = $nextHandler; + $this->retrySettings = $retrySettings; + $this->deadlineMs = $deadlineMs; + $this->retryAttempts = $retryAttempts; + } + + /** + * @param Call $call + * @param array $options + * + * @return PromiseInterface + */ + public function __invoke(Call $call, array $options) + { + $nextHandler = $this->nextHandler; + + if (!isset($options['timeoutMillis'])) { + // default to "noRetriesRpcTimeoutMillis" when retries are disabled, otherwise use "initialRpcTimeoutMillis" + if (!$this->retrySettings->retriesEnabled() && $this->retrySettings->getNoRetriesRpcTimeoutMillis() > 0) { + $options['timeoutMillis'] = $this->retrySettings->getNoRetriesRpcTimeoutMillis(); + } elseif ($this->retrySettings->getInitialRpcTimeoutMillis() > 0) { + $options['timeoutMillis'] = $this->retrySettings->getInitialRpcTimeoutMillis(); + } + } + + // Call the handler immediately if retry settings are disabled. + if (!$this->retrySettings->retriesEnabled()) { + return $nextHandler($call, $options); + } + + return $nextHandler($call, $options)->then(null, function ($e) use ($call, $options) { + $retryFunction = $this->getRetryFunction(); + + // If the number of retries has surpassed the max allowed retries + // then throw the exception as we normally would. + // If the maxRetries is set to 0, then we don't check this condition. + if (0 !== $this->retrySettings->getMaxRetries() + && $this->retryAttempts >= $this->retrySettings->getMaxRetries() + ) { + throw $e; + } + // If the retry function returns false then throw the + // exception as we normally would. + if (!$retryFunction($e, $options)) { + throw $e; + } + + // Retry function returned true, so we attempt another retry + return $this->retry($call, $options, $e->getStatus()); + }); + } + + /** + * @param Call $call + * @param array $options + * @param string $status + * + * @return PromiseInterface + * @throws ApiException + */ + private function retry(Call $call, array $options, string $status) + { + $delayMult = $this->retrySettings->getRetryDelayMultiplier(); + $maxDelayMs = $this->retrySettings->getMaxRetryDelayMillis(); + $timeoutMult = $this->retrySettings->getRpcTimeoutMultiplier(); + $maxTimeoutMs = $this->retrySettings->getMaxRpcTimeoutMillis(); + $totalTimeoutMs = $this->retrySettings->getTotalTimeoutMillis(); + + $delayMs = $this->retrySettings->getInitialRetryDelayMillis(); + $timeoutMs = $options['timeoutMillis']; + $currentTimeMs = $this->getCurrentTimeMs(); + $deadlineMs = $this->deadlineMs ?: $currentTimeMs + $totalTimeoutMs; + + if ($currentTimeMs >= $deadlineMs) { + throw new ApiException( + 'Retry total timeout exceeded.', + \Google\Rpc\Code::DEADLINE_EXCEEDED, + ApiStatus::DEADLINE_EXCEEDED + ); + } + + $delayMs = min($delayMs * $delayMult, $maxDelayMs); + $timeoutMs = (int) min( + $timeoutMs * $timeoutMult, + $maxTimeoutMs, + $deadlineMs - $this->getCurrentTimeMs() + ); + + $nextHandler = new RetryMiddleware( + $this->nextHandler, + $this->retrySettings->with([ + 'initialRetryDelayMillis' => $delayMs, + ]), + $deadlineMs, + $this->retryAttempts + 1 + ); + + // Set the timeout for the call + $options['timeoutMillis'] = $timeoutMs; + + return $nextHandler( + $call, + $options + ); + } + + protected function getCurrentTimeMs() + { + return microtime(true) * 1000.0; + } + + /** + * This is the default retry behaviour. + */ + private function getRetryFunction() + { + return $this->retrySettings->getRetryFunction() ?? + function (\Throwable $e, array $options): bool { + // This is the default retry behaviour, i.e. we don't retry an ApiException + // and for other exception types, we only retry when the error code is in + // the list of retryable error codes. + if (!$e instanceof ApiException) { + return false; + } + + if (!in_array($e->getStatus(), $this->retrySettings->getRetryableCodes())) { + return false; + } + + return true; + }; + } +} diff --git a/lib/Google/vendor/google/gax/src/OperationResponse.php b/lib/Google/vendor/google/gax/src/OperationResponse.php new file mode 100644 index 000000000..436d97834 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/OperationResponse.php @@ -0,0 +1,524 @@ + self::DEFAULT_POLLING_INTERVAL, + 'pollDelayMultiplier' => self::DEFAULT_POLLING_MULTIPLIER, + 'maxPollDelayMillis' => self::DEFAULT_MAX_POLLING_INTERVAL, + 'totalPollTimeoutMillis' => self::DEFAULT_MAX_POLLING_DURATION, + ]; + + private ?object $lastProtoResponse; + private bool $deleted = false; + + private array $additionalArgs; + private string $getOperationMethod; + private ?string $cancelOperationMethod; + private ?string $deleteOperationMethod; + private string $getOperationRequest; + private ?string $cancelOperationRequest; + private ?string $deleteOperationRequest; + private string $operationStatusMethod; + /** @var mixed */ + private $operationStatusDoneValue; + private ?string $operationErrorCodeMethod; + private ?string $operationErrorMessageMethod; + + /** + * OperationResponse constructor. + * + * @param string $operationName + * @param object $operationsClient + * @param array $options { + * Optional. Options for configuring the operation response object. + * + * @type string $operationReturnType The return type of the longrunning operation. + * @type string $metadataReturnType The type of the metadata returned in the operation response. + * @type int $initialPollDelayMillis The initial polling interval to use, in milliseconds. + * @type int $pollDelayMultiplier Multiplier applied to the polling interval on each retry. + * @type int $maxPollDelayMillis The maximum polling interval to use, in milliseconds. + * @type int $totalPollTimeoutMillis The maximum amount of time to continue polling. + * @type object $lastProtoResponse A response already received from the server. + * @type string $getOperationMethod The method on $operationsClient to get the operation. + * @type string $cancelOperationMethod The method on $operationsClient to cancel the operation. + * @type string $deleteOperationMethod The method on $operationsClient to delete the operation. + * @type string $operationStatusMethod The method on the operation to get the status. + * @type string $operationStatusDoneValue The method on the operation to determine if the status is done. + * @type array $additionalOperationArguments Additional arguments to pass to $operationsClient methods. + * @type string $operationErrorCodeMethod The method on the operation to get the error code + * @type string $operationErrorMessageMethod The method on the operation to get the error status + * } + */ + public function __construct(string $operationName, $operationsClient, array $options = []) + { + $this->operationName = $operationName; + $this->operationsClient = $operationsClient; + $options += [ + 'operationReturnType' => null, + 'metadataReturnType' => null, + 'lastProtoResponse' => null, + 'getOperationMethod' => 'getOperation', + 'cancelOperationMethod' => 'cancelOperation', + 'deleteOperationMethod' => 'deleteOperation', + 'operationStatusMethod' => 'getDone', + 'operationStatusDoneValue' => true, + 'additionalOperationArguments' => [], + 'operationErrorCodeMethod' => null, + 'operationErrorMessageMethod' => null, + 'getOperationRequest' => GetOperationRequest::class, + 'cancelOperationRequest' => CancelOperationRequest::class, + 'deleteOperationRequest' => DeleteOperationRequest::class, + ]; + $this->operationReturnType = $options['operationReturnType']; + $this->metadataReturnType = $options['metadataReturnType']; + $this->lastProtoResponse = $options['lastProtoResponse']; + $this->getOperationMethod = $options['getOperationMethod']; + $this->cancelOperationMethod = $options['cancelOperationMethod']; + $this->deleteOperationMethod = $options['deleteOperationMethod']; + $this->additionalArgs = $options['additionalOperationArguments']; + $this->operationStatusMethod = $options['operationStatusMethod']; + $this->operationStatusDoneValue = $options['operationStatusDoneValue']; + $this->operationErrorCodeMethod = $options['operationErrorCodeMethod']; + $this->operationErrorMessageMethod = $options['operationErrorMessageMethod']; + $this->getOperationRequest = $options['getOperationRequest']; + $this->cancelOperationRequest = $options['cancelOperationRequest']; + $this->deleteOperationRequest = $options['deleteOperationRequest']; + + if (isset($options['initialPollDelayMillis'])) { + $this->defaultPollSettings['initialPollDelayMillis'] = $options['initialPollDelayMillis']; + } + if (isset($options['pollDelayMultiplier'])) { + $this->defaultPollSettings['pollDelayMultiplier'] = $options['pollDelayMultiplier']; + } + if (isset($options['maxPollDelayMillis'])) { + $this->defaultPollSettings['maxPollDelayMillis'] = $options['maxPollDelayMillis']; + } + if (isset($options['totalPollTimeoutMillis'])) { + $this->defaultPollSettings['totalPollTimeoutMillis'] = $options['totalPollTimeoutMillis']; + } + } + + /** + * Check whether the operation has completed. + * + * @return bool + */ + public function isDone() + { + if (!$this->hasProtoResponse()) { + return false; + } + + $status = call_user_func([$this->lastProtoResponse, $this->operationStatusMethod]); + if (is_null($status)) { + return false; + } + + return $status === $this->operationStatusDoneValue; + } + + /** + * Check whether the operation completed successfully. If the operation is not complete, or if the operation + * failed, return false. + * + * @return bool + */ + public function operationSucceeded() + { + if (!$this->hasProtoResponse()) { + return false; + } + + if (!$this->canHaveResult()) { + // For Operations which do not have a result, we consider a successful + // operation when the operation has completed without errors. + return $this->isDone() && !$this->hasErrors(); + } + + return !is_null($this->getResult()); + } + + /** + * Check whether the operation failed. If the operation is not complete, or if the operation + * succeeded, return false. + * + * @return bool + */ + public function operationFailed() + { + return $this->hasErrors(); + } + + /** + * Get the formatted name of the operation + * + * @return string The formatted name of the operation + */ + public function getName() + { + return $this->operationName; + } + + /** + * Poll the server in a loop until the operation is complete. + * + * Return true if the operation completed, otherwise return false. If the + * $options['totalPollTimeoutMillis'] setting is not set (or set <= 0) then + * pollUntilComplete will continue polling until the operation completes, + * and therefore will always return true. + * + * @param array $options { + * Options for configuring the polling behaviour. + * + * @type int $initialPollDelayMillis The initial polling interval to use, in milliseconds. + * @type int $pollDelayMultiplier Multiplier applied to the polling interval on each retry. + * @type int $maxPollDelayMillis The maximum polling interval to use, in milliseconds. + * @type int $totalPollTimeoutMillis The maximum amount of time to continue polling, in milliseconds. + * } + * @throws ApiException If an API call fails. + * @throws ValidationException + * @return bool Indicates if the operation completed. + */ + public function pollUntilComplete(array $options = []) + { + if ($this->isDone()) { + return true; + } + + $pollSettings = array_merge($this->defaultPollSettings, $options); + return $this->poll(function () { + $this->reload(); + return $this->isDone(); + }, $pollSettings); + } + + /** + * Reload the status of the operation with a request to the service. + * + * @throws ApiException If the API call fails. + * @throws ValidationException If called on a deleted operation. + */ + public function reload() + { + if ($this->deleted) { + throw new ValidationException("Cannot call reload() on a deleted operation"); + } + + $requestClass = $this->isNewSurfaceOperationsClient() ? $this->getOperationRequest : null; + $this->lastProtoResponse = $this->operationsCall($this->getOperationMethod, $requestClass); + } + + /** + * Return the result of the operation. If operationSucceeded() is false, return null. + * + * @return mixed|null The result of the operation, or null if operationSucceeded() is false + */ + public function getResult() + { + if (!$this->hasProtoResponse()) { + return null; + } + + if (!$this->canHaveResult()) { + return null; + } + + if (!$this->isDone()) { + return null; + } + + /** @var Any|null $anyResponse */ + $anyResponse = $this->lastProtoResponse->getResponse(); + if (is_null($anyResponse)) { + return null; + } + if (is_null($this->operationReturnType)) { + return $anyResponse; + } + $operationReturnType = $this->operationReturnType; + /** @var Message $response */ + $response = new $operationReturnType(); + $response->mergeFromString($anyResponse->getValue()); + return $response; + } + + /** + * If the operation failed, return the status. If operationFailed() is false, return null. + * + * @return Status|null The status of the operation in case of failure, or null if + * operationFailed() is false. + */ + public function getError() + { + if (!$this->hasProtoResponse() || !$this->isDone()) { + return null; + } + + if ($this->operationErrorCodeMethod || $this->operationErrorMessageMethod) { + $errorCode = $this->operationErrorCodeMethod + ? call_user_func([$this->lastProtoResponse, $this->operationErrorCodeMethod]) + : null; + $errorMessage = $this->operationErrorMessageMethod + ? call_user_func([$this->lastProtoResponse, $this->operationErrorMessageMethod]) + : null; + return (new Status()) + ->setCode(ApiStatus::rpcCodeFromHttpStatusCode($errorCode)) + ->setMessage($errorMessage); + } + + if (method_exists($this->lastProtoResponse, 'getError')) { + return $this->lastProtoResponse->getError(); + } + + return null; + } + + /** + * Get an array containing the values of 'operationReturnType', 'metadataReturnType', and + * the polling options `initialPollDelayMillis`, `pollDelayMultiplier`, `maxPollDelayMillis`, + * and `totalPollTimeoutMillis`. The array can be passed as the $options argument to the + * constructor when creating another OperationResponse object. + * + * @return array + */ + public function getDescriptorOptions() + { + return [ + 'operationReturnType' => $this->operationReturnType, + 'metadataReturnType' => $this->metadataReturnType, + ] + $this->defaultPollSettings; + } + + /** + * @return Operation|mixed|null The last Operation object received from the server. + */ + public function getLastProtoResponse() + { + return $this->lastProtoResponse; + } + + /** + * @return object The OperationsClient object used to make + * requests to the operations API. + */ + public function getOperationsClient() + { + return $this->operationsClient; + } + + /** + * Cancel the long-running operation. + * + * For operations of type Google\LongRunning\Operation, this method starts + * asynchronous cancellation on a long-running operation. The server + * makes a best effort to cancel the operation, but success is not + * guaranteed. If the server doesn't support this method, it will throw an + * ApiException with code \Google\Rpc\Code::UNIMPLEMENTED. Clients can continue + * to use reload and pollUntilComplete methods to check whether the cancellation + * succeeded or whether the operation completed despite cancellation. + * On successful cancellation, the operation is not deleted; instead, it becomes + * an operation with a getError() value with a \Google\Rpc\Status code of 1, + * corresponding to \Google\Rpc\Code::CANCELLED. + * + * @throws ApiException If the API call fails. + * @throws LogicException If the API call method has not been configured + */ + public function cancel() + { + if (is_null($this->cancelOperationMethod)) { + throw new LogicException('The cancel operation is not supported by this API'); + } + + $requestClass = $this->isNewSurfaceOperationsClient() ? $this->cancelOperationRequest : null; + $this->operationsCall($this->cancelOperationMethod, $requestClass); + } + + /** + * Delete the long-running operation. + * + * For operations of type Google\LongRunning\Operation, this method + * indicates that the client is no longer interested in the operation result. + * It does not cancel the operation. If the server doesn't support this method, + * it will throw an ApiException with code \Google\Rpc\Code::UNIMPLEMENTED. + * + * @throws ApiException If the API call fails. + * @throws LogicException If the API call method has not been configured + */ + public function delete() + { + if (is_null($this->deleteOperationMethod)) { + throw new LogicException('The delete operation is not supported by this API'); + } + + $requestClass = $this->isNewSurfaceOperationsClient() ? $this->deleteOperationRequest : null; + $this->operationsCall($this->deleteOperationMethod, $requestClass); + $this->deleted = true; + } + + /** + * Get the metadata returned with the last proto response. If a metadata type was provided, then + * the return value will be of that type - otherwise, the return value will be of type Any. If + * no metadata object is available, returns null. + * + * @return mixed The metadata returned from the server in the last response. + */ + public function getMetadata() + { + if (!$this->hasProtoResponse()) { + return null; + } + + if (!method_exists($this->lastProtoResponse, 'getMetadata')) { + // The call to getMetadata is only for OnePlatform LROs, and is not + // supported by other LRO GAPIC clients (e.g. Compute) + return null; + } + + /** @var Any|null $any */ + $any = $this->lastProtoResponse->getMetadata(); + if (is_null($this->metadataReturnType)) { + return $any; + } + if (is_null($any)) { + return null; + } + // @TODO: This is probably not doing anything and can be removed in the next release. + if (is_null($any->getValue())) { + return null; + } + $metadataReturnType = $this->metadataReturnType; + /** @var Message $metadata */ + $metadata = new $metadataReturnType(); + $metadata->mergeFromString($any->getValue()); + return $metadata; + } + + /** + * Call the operations client to perform an operation. + * + * @param string $method The method to call on the operations client. + * @param string|null $requestClass The request class to use for the call. + * Will be null for legacy operations clients. + */ + private function operationsCall(string $method, ?string $requestClass) + { + $args = array_merge([$this->getName()], array_values($this->additionalArgs)); + if ($requestClass) { + if (!method_exists($requestClass, 'build')) { + throw new LogicException('Request class must support the static build method'); + } + $request = call_user_func_array($requestClass . '::build', $args); + $args = [$request]; + } + + return call_user_func_array([$this->operationsClient, $method], $args); + } + + private function canHaveResult() + { + // The call to getResponse is only for OnePlatform LROs, and is not + // supported by other LRO GAPIC clients (e.g. Compute) + return method_exists($this->lastProtoResponse, 'getResponse'); + } + + private function hasErrors() + { + if (!$this->hasProtoResponse()) { + return false; + } + + if (method_exists($this->lastProtoResponse, 'getError')) { + return !empty($this->lastProtoResponse->getError()); + } + + if ($this->operationErrorCodeMethod) { + $errorCode = call_user_func([$this->lastProtoResponse, $this->operationErrorCodeMethod]); + return !empty($errorCode); + } + + // This should never happen unless an API is misconfigured + throw new LogicException('Unable to determine operation error status for this service'); + } + + private function hasProtoResponse() + { + return !is_null($this->lastProtoResponse); + } + + private function isNewSurfaceOperationsClient(): bool + { + return !$this->operationsClient instanceof LegacyOperationsClient + && false !== strpos(get_class($this->operationsClient), self::NEW_CLIENT_NAMESPACE); + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/CallOptions.php b/lib/Google/vendor/google/gax/src/Options/CallOptions.php new file mode 100644 index 000000000..f700fff53 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/CallOptions.php @@ -0,0 +1,148 @@ +> $headers + * Key-value array containing headers. + * @type int $timeoutMillis + * The timeout in milliseconds for the call. + * @type array $transportOptions + * Transport-specific call options. See {@see CallOptions::setTransportOptions}. + * @type RetrySettings|array $retrySettings + * A retry settings override for the call. If $retrySettings is an + * array, the settings will be merged with the method's default + * retry settings. If $retrySettings is a RetrySettings object, + * that object will be used instead of the method defaults. + * } + */ + public function __construct(array $options) + { + $this->fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setHeaders($arr['headers'] ?? []); + $this->setTimeoutMillis($arr['timeoutMillis'] ?? null); + $this->setTransportOptions($arr['transportOptions'] ?? []); + $this->setRetrySettings($arr['retrySettings'] ?? null); + } + + /** + * @param array $headers + */ + public function setHeaders(array $headers) + { + $this->headers = $headers; + } + + /** + * @param int|null $timeoutMillis + */ + public function setTimeoutMillis(?int $timeoutMillis) + { + $this->timeoutMillis = $timeoutMillis; + } + + /** + * @param array $transportOptions { + * Transport-specific call-time options. + * + * @type array $grpcOptions + * Key-value pairs for gRPC-specific options passed as the `$options` argument to {@see \Grpc\BaseStub} + * request methods. Current options are `call_credentials_callback` and `timeout`. + * **NOTE**: This library sets `call_credentials_callback` using {@see CredentialsWrapper}, and `timeout` + * using the `timeoutMillis` call option, so these options are not very useful. + * @type array $grpcFallbackOptions + * Key-value pairs for gRPC fallback specific options passed as the `$options` argument to the + * `$httpHandler` callable. By default these are passed to {@see \GuzzleHttp\Client} as request options. + * See {@link https://docs.guzzlephp.org/en/stable/request-options.html}. + * @type array $restOptions + * Key-value pairs for REST-specific options passed as the `$options` argument to the `$httpHandler` + * callable. By default these are passed to {@see \GuzzleHttp\Client} as request options. + * See {@link https://docs.guzzlephp.org/en/stable/request-options.html}. + * } + */ + public function setTransportOptions(array $transportOptions) + { + $this->transportOptions = $transportOptions; + } + + /** + * @deprecated use CallOptions::setTransportOptions + */ + public function setTransportSpecificOptions(array $transportSpecificOptions) + { + $this->setTransportOptions($transportSpecificOptions); + } + + /** + * @param RetrySettings|array|null $retrySettings + */ + public function setRetrySettings($retrySettings) + { + $this->retrySettings = $retrySettings; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/ClientOptions.php b/lib/Google/vendor/google/gax/src/Options/ClientOptions.php new file mode 100644 index 000000000..cd67c925f --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/ClientOptions.php @@ -0,0 +1,317 @@ + '/path/to/my/credentials.json' + * ]); + * $secretManager = new SecretManagerClient($options->toArray()); + * ``` + * + * Note: It's possible to pass an associative array to the API clients as well, + * as ClientOptions will still be used internally for validation. + */ +class ClientOptions implements ArrayAccess +{ + use OptionsTrait; + + private ?string $apiEndpoint; + + private bool $disableRetries; + + private array $clientConfig; + + /** @var string|array|FetchAuthTokenInterface|CredentialsWrapper|null */ + private $credentials; + + private array $credentialsConfig; + + /** @var string|TransportInterface|null $transport */ + private $transport; + + private TransportOptions $transportConfig; + + private ?string $versionFile; + + private ?string $descriptorsConfigPath; + + private ?string $serviceName; + + private ?string $libName; + + private ?string $libVersion; + + private ?string $gapicVersion; + + private ?Closure $clientCertSource; + + private ?string $universeDomain; + + /** + * @param array $options { + * @type string $apiEndpoint + * The address of the API remote host, for example "example.googleapis.com. May also + * include the port, for example "example.googleapis.com:443" + * @type bool $disableRetries + * Determines whether or not retries defined by the client configuration should be + * disabled. Defaults to `false`. + * @type string|array $clientConfig + * Client method configuration, including retry settings. This option can be either a + * path to a JSON file, or a PHP array containing the decoded JSON data. + * By default this settings points to the default client config file, which is provided + * in the resources folder. + * @type string|array|FetchAuthTokenInterface|CredentialsWrapper $credentials + * The credentials to be used by the client to authorize API calls. This option + * accepts either a path to a credentials file, or a decoded credentials file as a + * PHP array. + * *Advanced usage*: In addition, this option can also accept a pre-constructed + * \Google\Auth\FetchAuthTokenInterface object or \Google\ApiCore\CredentialsWrapper + * object. Note that when one of these objects are provided, any settings in + * $authConfig will be ignored. + * @type array $credentialsConfig + * Options used to configure credentials, including auth token caching, for the client. + * For a full list of supporting configuration options, see + * \Google\ApiCore\CredentialsWrapper::build. + * @type string|TransportInterface|null $transport + * The transport used for executing network requests. May be either the string `rest`, + * `grpc`, or 'grpc-fallback'. Defaults to `grpc` if gRPC support is detected on the system. + * *Advanced usage*: Additionally, it is possible to pass in an already instantiated + * TransportInterface object. Note that when this objects is provided, any settings in + * $transportConfig, and any `$apiEndpoint` setting, will be ignored. + * @type array $transportConfig + * Configuration options that will be used to construct the transport. Options for + * each supported transport type should be passed in a key for that transport. For + * example: + * $transportConfig = [ + * 'grpc' => [...], + * 'rest' => [...], + * 'grpc-fallback' => [...], + * ]; + * See the GrpcTransport::build and RestTransport::build + * methods for the supported options. + * @type string $versionFile + * The path to a file which contains the current version of the client. + * @type string $descriptorsConfigPath + * The path to a descriptor configuration file. + * @type string $serviceName + * The name of the service. + * @type string $libName + * The name of the client application. + * @type string $libVersion + * The version of the client application. + * @type string $gapicVersion + * The code generator version of the GAPIC library. + * @type callable $clientCertSource + * A callable which returns the client cert as a string. + * @type string $universeDomain + * The default service domain for a given Cloud universe. + * } + */ + public function __construct(array $options) + { + $this->fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setApiEndpoint($arr['apiEndpoint'] ?? null); + $this->setDisableRetries($arr['disableRetries'] ?? false); + $this->setClientConfig($arr['clientConfig'] ?? []); + $this->setCredentials($arr['credentials'] ?? null); + $this->setCredentialsConfig($arr['credentialsConfig'] ?? []); + $this->setTransport($arr['transport'] ?? null); + $this->setTransportConfig(new TransportOptions($arr['transportConfig'] ?? [])); + $this->setVersionFile($arr['versionFile'] ?? null); + $this->setDescriptorsConfigPath($arr['descriptorsConfigPath'] ?? null); + $this->setServiceName($arr['serviceName'] ?? null); + $this->setLibName($arr['libName'] ?? null); + $this->setLibVersion($arr['libVersion'] ?? null); + $this->setGapicVersion($arr['gapicVersion'] ?? null); + $this->setClientCertSource($arr['clientCertSource'] ?? null); + $this->setUniverseDomain($arr['universeDomain'] ?? null); + } + + /** + * @param ?string $apiEndpoint + */ + public function setApiEndpoint(?string $apiEndpoint): void + { + $this->apiEndpoint = $apiEndpoint; + } + + /** + * @param bool $disableRetries + */ + public function setDisableRetries(bool $disableRetries): void + { + $this->disableRetries = $disableRetries; + } + + /** + * @param string|array $clientConfig + * @throws InvalidArgumentException + */ + public function setClientConfig($clientConfig): void + { + if (is_string($clientConfig)) { + $this->clientConfig = json_decode(file_get_contents($clientConfig), true); + } elseif (is_array($clientConfig)) { + $this->clientConfig = $clientConfig; + } else { + throw new InvalidArgumentException('Invalid client config'); + } + } + + /** + * @param string|array|FetchAuthTokenInterface|CredentialsWrapper|null $credentials + */ + public function setCredentials($credentials): void + { + $this->credentials = $credentials; + } + + /** + * @param array $credentialsConfig + */ + public function setCredentialsConfig(array $credentialsConfig): void + { + $this->credentialsConfig = $credentialsConfig; + } + + /** + * @param string|TransportInterface|null $transport + */ + public function setTransport($transport): void + { + $this->transport = $transport; + } + + /** + * @param TransportOptions $transportConfig + */ + public function setTransportConfig(TransportOptions $transportConfig): void + { + $this->transportConfig = $transportConfig; + } + + /** + * @param ?string $versionFile + */ + public function setVersionFile(?string $versionFile): void + { + $this->versionFile = $versionFile; + } + + /** + * @param ?string $descriptorsConfigPath + */ + private function setDescriptorsConfigPath(?string $descriptorsConfigPath) + { + if (!is_null($descriptorsConfigPath)) { + self::validateFileExists($descriptorsConfigPath); + } + $this->descriptorsConfigPath = $descriptorsConfigPath; + } + + /** + * @param ?string $serviceName + */ + public function setServiceName(?string $serviceName): void + { + $this->serviceName = $serviceName; + } + + /** + * @param ?string $libName + */ + public function setLibName(?string $libName): void + { + $this->libName = $libName; + } + + /** + * @param ?string $libVersion + */ + public function setLibVersion(?string $libVersion): void + { + $this->libVersion = $libVersion; + } + + /** + * @param ?string $gapicVersion + */ + public function setGapicVersion(?string $gapicVersion): void + { + $this->gapicVersion = $gapicVersion; + } + + /** + * @param ?callable $clientCertSource + */ + public function setClientCertSource(?callable $clientCertSource) + { + if (!is_null($clientCertSource)) { + $clientCertSource = Closure::fromCallable($clientCertSource); + } + $this->clientCertSource = $clientCertSource; + } + + /** + * @param string $universeDomain + */ + public function setUniverseDomain(?string $universeDomain) + { + $this->universeDomain = $universeDomain; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/OptionsTrait.php b/lib/Google/vendor/google/gax/src/Options/OptionsTrait.php new file mode 100644 index 000000000..9c721f4ac --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/OptionsTrait.php @@ -0,0 +1,90 @@ +$offset); + } + + #[\ReturnTypeWillChange] + public function offsetGet($offset) + { + return $this->$offset; + } + + /** + * @throws BadMethodCallException + */ + public function offsetSet($offset, $value): void + { + throw new BadMethodCallException('Cannot set options through array access. Use the setters instead'); + } + + /** + * @throws BadMethodCallException + */ + public function offsetUnset($offset): void + { + throw new BadMethodCallException('Cannot unset options through array access. Use the setters instead'); + } + + public function toArray(): array + { + $arr = []; + foreach (get_object_vars($this) as $key => $value) { + $arr[$key] = $value; + } + return $arr; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/TransportOptions.php b/lib/Google/vendor/google/gax/src/Options/TransportOptions.php new file mode 100644 index 000000000..998d577d9 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/TransportOptions.php @@ -0,0 +1,90 @@ +fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setGrpc(new GrpcTransportOptions($arr['grpc'] ?? [])); + $this->setGrpcFallback(new GrpcFallbackTransportOptions($arr['grpc-fallback'] ?? [])); + $this->setRest(new RestTransportOptions($arr['rest'] ?? [])); + } + + public function setGrpc(GrpcTransportOptions $grpc): void + { + $this->grpc = $grpc; + } + + public function setGrpcFallback(GrpcFallbackTransportOptions $grpcFallback): void + { + $this->grpcFallback = $grpcFallback; + } + + public function setRest(RestTransportOptions $rest): void + { + $this->rest = $rest; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcFallbackTransportOptions.php b/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcFallbackTransportOptions.php new file mode 100644 index 000000000..73ac2267c --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcFallbackTransportOptions.php @@ -0,0 +1,95 @@ +fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setClientCertSource($arr['clientCertSource'] ?? null); + $this->setHttpHandler($arr['httpHandler'] ?? null); + } + + public function setHttpHandler(?callable $httpHandler) + { + if (!is_null($httpHandler)) { + $httpHandler = Closure::fromCallable($httpHandler); + } + $this->httpHandler = $httpHandler; + } + + /** + * @param ?callable $clientCertSource + */ + public function setClientCertSource(?callable $clientCertSource) + { + if (!is_null($clientCertSource)) { + $clientCertSource = Closure::fromCallable($clientCertSource); + } + $this->clientCertSource = $clientCertSource; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcTransportOptions.php b/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcTransportOptions.php new file mode 100644 index 000000000..bafab56e8 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/TransportOptions/GrpcTransportOptions.php @@ -0,0 +1,131 @@ +fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setStubOpts($arr['stubOpts'] ?? []); + $this->setChannel($arr['channel'] ?? null); + $this->setInterceptors($arr['interceptors'] ?? []); + $this->setClientCertSource($arr['clientCertSource'] ?? null); + } + + /** + * @param array $stubOpts + */ + public function setStubOpts(array $stubOpts) + { + $this->stubOpts = $stubOpts; + } + + /** + * @param ?Channel $channel + */ + public function setChannel(?Channel $channel) + { + $this->channel = $channel; + } + + /** + * @param Interceptor[]|UnaryInterceptorInterface[] $interceptors + */ + public function setInterceptors(array $interceptors) + { + $this->interceptors = $interceptors; + } + + /** + * @param ?callable $clientCertSource + */ + public function setClientCertSource(?callable $clientCertSource) + { + if (!is_null($clientCertSource)) { + $clientCertSource = Closure::fromCallable($clientCertSource); + } + $this->clientCertSource = $clientCertSource; + } +} diff --git a/lib/Google/vendor/google/gax/src/Options/TransportOptions/RestTransportOptions.php b/lib/Google/vendor/google/gax/src/Options/TransportOptions/RestTransportOptions.php new file mode 100644 index 000000000..4bb4b53f8 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Options/TransportOptions/RestTransportOptions.php @@ -0,0 +1,111 @@ +fromArray($options); + } + + /** + * Sets the array of options as class properites. + * + * @param array $arr See the constructor for the list of supported options. + */ + private function fromArray(array $arr): void + { + $this->setHttpHandler($arr['httpHandler'] ?? null); + $this->setClientCertSource($arr['clientCertSource'] ?? null); + $this->setRestClientConfigPath($arr['restClientConfigPath'] ?? null); + } + + /** + * @param ?callable $httpHandler + */ + public function setHttpHandler(?callable $httpHandler) + { + if (!is_null($httpHandler)) { + $httpHandler = Closure::fromCallable($httpHandler); + } + $this->httpHandler = $httpHandler; + } + + /** + * @param ?callable $clientCertSource + */ + public function setClientCertSource(?callable $clientCertSource) + { + if (!is_null($clientCertSource)) { + $clientCertSource = Closure::fromCallable($clientCertSource); + } + $this->clientCertSource = $clientCertSource; + } + + /** + * @param ?string $restClientConfigPath + */ + public function setRestClientConfigPath(?string $restClientConfigPath) + { + $this->restClientConfigPath = $restClientConfigPath; + } +} diff --git a/lib/Google/vendor/google/gax/src/Page.php b/lib/Google/vendor/google/gax/src/Page.php new file mode 100644 index 000000000..fded0dcca --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Page.php @@ -0,0 +1,271 @@ +call = $call; + $this->options = $options; + $this->callable = $callable; + $this->pageStreamingDescriptor = $pageStreamingDescriptor; + $this->response = $response; + + $requestPageTokenGetMethod = $this->pageStreamingDescriptor->getRequestPageTokenGetMethod(); + $this->pageToken = $this->call->getMessage()->$requestPageTokenGetMethod(); + } + + /** + * Returns true if there are more pages that can be retrieved from the + * API. + * + * @return bool + */ + public function hasNextPage() + { + return strcmp($this->getNextPageToken(), Page::FINAL_PAGE_TOKEN) != 0; + } + + /** + * Returns the next page token from the response. + * + * @return string + */ + public function getNextPageToken() + { + $responsePageTokenGetMethod = $this->pageStreamingDescriptor->getResponsePageTokenGetMethod(); + return $this->getResponseObject()->$responsePageTokenGetMethod(); + } + + /** + * Retrieves the next Page object using the next page token. + * + * @param int|null $pageSize + * @throws ValidationException if there are no pages remaining, or if pageSize is supplied but + * is not supported by the API + * @throws ApiException if the call to fetch the next page fails. + * @return Page + */ + public function getNextPage(int $pageSize = null) + { + if (!$this->hasNextPage()) { + throw new ValidationException( + 'Could not complete getNextPage operation: ' . + 'there are no more pages to retrieve.' + ); + } + + $oldRequest = $this->getRequestObject(); + $requestClass = get_class($oldRequest); + $newRequest = new $requestClass(); + $newRequest->mergeFrom($oldRequest); + + $requestPageTokenSetMethod = $this->pageStreamingDescriptor->getRequestPageTokenSetMethod(); + $newRequest->$requestPageTokenSetMethod($this->getNextPageToken()); + + if (isset($pageSize)) { + if (!$this->pageStreamingDescriptor->requestHasPageSizeField()) { + throw new ValidationException( + 'pageSize argument was defined, but the method does not ' . + 'support a page size parameter in the optional array argument' + ); + } + $requestPageSizeSetMethod = $this->pageStreamingDescriptor->getRequestPageSizeSetMethod(); + $newRequest->$requestPageSizeSetMethod($pageSize); + } + $this->call = $this->call->withMessage($newRequest); + + $callable = $this->callable; + $response = $callable( + $this->call, + $this->options + )->wait(); + + return new Page( + $this->call, + $this->options, + $this->callable, + $this->pageStreamingDescriptor, + $response + ); + } + + /** + * Return the number of elements in the response. + * + * @return int + */ + public function getPageElementCount() + { + $resourcesGetMethod = $this->pageStreamingDescriptor->getResourcesGetMethod(); + return count($this->getResponseObject()->$resourcesGetMethod()); + } + + /** + * Return an iterator over the elements in the response. + * + * @return Generator + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + $resourcesGetMethod = $this->pageStreamingDescriptor->getResourcesGetMethod(); + $items = $this->getResponseObject()->$resourcesGetMethod(); + foreach ($items as $key => $element) { + if ($items instanceof MapField) { + yield $key => $element; + } else { + yield $element; + } + } + } + + /** + * Return an iterator over Page objects, beginning with this object. + * Additional Page objects are retrieved lazily via API calls until + * all elements have been retrieved. + * + * @return Generator|array + * @throws ValidationException + * @throws ApiException + */ + public function iteratePages() + { + $currentPage = $this; + yield $this; + while ($currentPage->hasNextPage()) { + $currentPage = $currentPage->getNextPage(); + yield $currentPage; + } + } + + /** + * Gets the request object used to generate the Page. + * + * @return mixed|Message + */ + public function getRequestObject() + { + return $this->call->getMessage(); + } + + /** + * Gets the API response object. + * + * @return mixed|Message + */ + public function getResponseObject() + { + return $this->response; + } + + /** + * Returns a collection of elements with a fixed size set by + * the collectionSize parameter. The collection will only contain + * fewer than collectionSize elements if there are no more + * pages to be retrieved from the server. + * + * NOTE: it is an error to call this method if an optional parameter + * to set the page size is not supported or has not been set in the + * API call that was used to create this page. It is also an error + * if the collectionSize parameter is less than the page size that + * has been set. + * + * @param int $collectionSize + * @throws ValidationException if a FixedSizeCollection of the specified size cannot be constructed + * @return FixedSizeCollection + */ + public function expandToFixedSizeCollection($collectionSize) + { + if (!$this->pageStreamingDescriptor->requestHasPageSizeField()) { + throw new ValidationException( + "FixedSizeCollection is not supported for this method, because " . + "the method does not support an optional argument to set the " . + "page size." + ); + } + $request = $this->getRequestObject(); + $pageSizeGetMethod = $this->pageStreamingDescriptor->getRequestPageSizeGetMethod(); + $pageSize = $request->$pageSizeGetMethod(); + if (is_null($pageSize)) { + throw new ValidationException( + "Error while expanding Page to FixedSizeCollection: No page size " . + "parameter found. The page size parameter must be set in the API " . + "optional arguments array, and must be less than the collectionSize " . + "parameter, in order to create a FixedSizeCollection object." + ); + } + if ($pageSize > $collectionSize) { + throw new ValidationException( + "Error while expanding Page to FixedSizeCollection: collectionSize " . + "parameter is less than the page size optional argument specified in " . + "the API call. collectionSize: $collectionSize, page size: $pageSize" + ); + } + return new FixedSizeCollection($this, $collectionSize); + } +} diff --git a/lib/Google/vendor/google/gax/src/PageStreamingDescriptor.php b/lib/Google/vendor/google/gax/src/PageStreamingDescriptor.php new file mode 100644 index 000000000..351eaf7fc --- /dev/null +++ b/lib/Google/vendor/google/gax/src/PageStreamingDescriptor.php @@ -0,0 +1,178 @@ +descriptor = $descriptor; + } + + /** + * @param array $fields { + * Required. + * + * @type string $requestPageTokenField the page token field in the request object. + * @type string $responsePageTokenField the page token field in the response object. + * @type string $resourceField the resource field in the response object. + * + * Optional. + * @type string $requestPageSizeField the page size field in the request object. + * } + * @return PageStreamingDescriptor + */ + public static function createFromFields(array $fields) + { + $requestPageToken = $fields['requestPageTokenField']; + $responsePageToken = $fields['responsePageTokenField']; + $resources = $fields['resourceField']; + + $descriptor = [ + 'requestPageTokenGetMethod' => PageStreamingDescriptor::getMethod($requestPageToken), + 'requestPageTokenSetMethod' => PageStreamingDescriptor::setMethod($requestPageToken), + 'responsePageTokenGetMethod' => PageStreamingDescriptor::getMethod($responsePageToken), + 'resourcesGetMethod' => PageStreamingDescriptor::getMethod($resources), + ]; + + if (isset($fields['requestPageSizeField'])) { + $requestPageSize = $fields['requestPageSizeField']; + $descriptor['requestPageSizeGetMethod'] = PageStreamingDescriptor::getMethod($requestPageSize); + $descriptor['requestPageSizeSetMethod'] = PageStreamingDescriptor::setMethod($requestPageSize); + } + + return new PageStreamingDescriptor($descriptor); + } + + private static function getMethod(string $field) + { + return 'get' . ucfirst($field); + } + + private static function setMethod(string $field) + { + return 'set' . ucfirst($field); + } + + /** + * @return string The page token get method on the request object + */ + public function getRequestPageTokenGetMethod() + { + return $this->descriptor['requestPageTokenGetMethod']; + } + + /** + * @return string The page size get method on the request object + */ + public function getRequestPageSizeGetMethod() + { + return $this->descriptor['requestPageSizeGetMethod']; + } + + /** + * @return bool True if the request object has a page size field + */ + public function requestHasPageSizeField() + { + return array_key_exists('requestPageSizeGetMethod', $this->descriptor); + } + + /** + * @return string The page token get method on the response object + */ + public function getResponsePageTokenGetMethod() + { + return $this->descriptor['responsePageTokenGetMethod']; + } + + /** + * @return string The resources get method on the response object + */ + public function getResourcesGetMethod() + { + return $this->descriptor['resourcesGetMethod']; + } + + /** + * @return string The page token set method on the request object + */ + public function getRequestPageTokenSetMethod() + { + return $this->descriptor['requestPageTokenSetMethod']; + } + + /** + * @return string The page size set method on the request object + */ + public function getRequestPageSizeSetMethod() + { + return $this->descriptor['requestPageSizeSetMethod']; + } + + private static function validate(array $descriptor) + { + $requiredFields = [ + 'requestPageTokenGetMethod', + 'requestPageTokenSetMethod', + 'responsePageTokenGetMethod', + 'resourcesGetMethod', + ]; + foreach ($requiredFields as $field) { + if (empty($descriptor[$field])) { + throw new InvalidArgumentException( + "$field is required for PageStreamingDescriptor" + ); + } + } + } +} diff --git a/lib/Google/vendor/google/gax/src/PagedListResponse.php b/lib/Google/vendor/google/gax/src/PagedListResponse.php new file mode 100644 index 000000000..62e6511ee --- /dev/null +++ b/lib/Google/vendor/google/gax/src/PagedListResponse.php @@ -0,0 +1,197 @@ +getList(...); + * foreach ($pagedListResponse as $element) { + * // doSomethingWith($element); + * } + * ``` + * + * Example of iterating over each page of elements: + * ``` + * $pagedListResponse = $client->getList(...); + * foreach ($pagedListResponse->iteratePages() as $page) { + * foreach ($page as $element) { + * // doSomethingWith($element); + * } + * } + * ``` + * + * Example of accessing the current page, and manually iterating + * over pages: + * ``` + * $pagedListResponse = $client->getList(...); + * $page = $pagedListResponse->getPage(); + * // doSomethingWith($page); + * while ($page->hasNextPage()) { + * $page = $page->getNextPage(); + * // doSomethingWith($page); + * } + * ``` + */ +class PagedListResponse implements IteratorAggregate +{ + private $firstPage; + + /** + * PagedListResponse constructor. + * + * @param Page $firstPage A page containing response details. + */ + public function __construct( + Page $firstPage + ) { + $this->firstPage = $firstPage; + } + + /** + * Returns an iterator over the full list of elements. If the + * API response contains a (non-empty) next page token, then + * the PagedListResponse object will make calls to the underlying + * API to retrieve additional elements as required. + * + * NOTE: The result of this method is the same as getIterator(). + * Prefer using getIterator(), or iterate directly on the + * PagedListResponse object. + * + * @return Generator + * @throws ValidationException + */ + public function iterateAllElements() + { + return $this->getIterator(); + } + + /** + * Returns an iterator over the full list of elements. If the + * API response contains a (non-empty) next page token, then + * the PagedListResponse object will make calls to the underlying + * API to retrieve additional elements as required. + * + * @return Generator + * @throws ValidationException + */ + #[\ReturnTypeWillChange] + public function getIterator() + { + foreach ($this->iteratePages() as $page) { + foreach ($page as $key => $element) { + yield $key => $element; + } + } + } + + /** + * Return the current page of results. + * + * @return Page + */ + public function getPage() + { + return $this->firstPage; + } + + /** + * Returns an iterator over pages of results. The pages are + * retrieved lazily from the underlying API. + * + * @return Page[] + * @throws ValidationException + */ + public function iteratePages() + { + return $this->getPage()->iteratePages(); + } + + /** + * Returns a collection of elements with a fixed size set by + * the collectionSize parameter. The collection will only contain + * fewer than collectionSize elements if there are no more + * pages to be retrieved from the server. + * + * NOTE: it is an error to call this method if an optional parameter + * to set the page size is not supported or has not been set in the + * original API call. It is also an error if the collectionSize parameter + * is less than the page size that has been set. + * + * @param int $collectionSize + * @throws ValidationException if a FixedSizeCollection of the specified size cannot be constructed + * @return FixedSizeCollection + */ + public function expandToFixedSizeCollection(int $collectionSize) + { + return $this->getPage()->expandToFixedSizeCollection($collectionSize); + } + + /** + * Returns an iterator over fixed size collections of results. + * The collections are retrieved lazily from the underlying API. + * + * Each collection will have collectionSize elements, with the + * exception of the final collection which may contain fewer + * elements. + * + * NOTE: it is an error to call this method if an optional parameter + * to set the page size is not supported or has not been set in the + * original API call. It is also an error if the collectionSize parameter + * is less than the page size that has been set. + * + * @param int $collectionSize + * @throws ValidationException if a FixedSizeCollection of the specified size cannot be constructed + * @return Generator|FixedSizeCollection[] + */ + public function iterateFixedSizeCollections(int $collectionSize) + { + return $this->expandToFixedSizeCollection($collectionSize)->iterateCollections(); + } +} diff --git a/lib/Google/vendor/google/gax/src/PathTemplate.php b/lib/Google/vendor/google/gax/src/PathTemplate.php new file mode 100644 index 000000000..b7cd5aa2e --- /dev/null +++ b/lib/Google/vendor/google/gax/src/PathTemplate.php @@ -0,0 +1,113 @@ +resourceTemplate = new AbsoluteResourceTemplate($path); + } else { + $this->resourceTemplate = new RelativeResourceTemplate($path); + } + } + + /** + * @return string A string representation of the path template + */ + public function __toString() + { + return $this->resourceTemplate->__toString(); + } + + /** + * Renders a path template using the provided bindings. + * + * @param array $bindings An array matching var names to binding strings. + * @throws ValidationException if a key isn't provided or if a sub-template + * can't be parsed. + * @return string A rendered representation of this path template. + */ + public function render(array $bindings) + { + return $this->resourceTemplate->render($bindings); + } + + /** + * Check if $path matches a resource string. + * + * @param string $path A resource string. + * @return bool + */ + public function matches(string $path) + { + return $this->resourceTemplate->matches($path); + } + + /** + * Matches a fully qualified path template string. + * + * @param string $path A fully qualified path template string. + * @throws ValidationException if path can't be matched to the template. + * @return array Array matching var names to binding values. + */ + public function match(string $path) + { + return $this->resourceTemplate->match($path); + } +} diff --git a/lib/Google/vendor/google/gax/src/PollingTrait.php b/lib/Google/vendor/google/gax/src/PollingTrait.php new file mode 100644 index 000000000..526b01255 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/PollingTrait.php @@ -0,0 +1,97 @@ + 0.0; + $endTime = $this->getCurrentTimeMillis() + $totalPollTimeoutMillis; + + while (true) { + if ($hasTotalPollTimeout && $this->getCurrentTimeMillis() > $endTime) { + return false; + } + $this->sleepMillis($currentPollDelayMillis); + if ($pollCallable()) { + return true; + } + $currentPollDelayMillis = (int) min([ + $currentPollDelayMillis * $pollDelayMultiplier, + $maxPollDelayMillis + ]); + } + } + + /** + * Protected to allow overriding for tests + * + * @return float Current time in milliseconds + */ + protected function getCurrentTimeMillis() + { + return microtime(true) * 1000.0; + } + + /** + * Protected to allow overriding for tests + * + * @param int $millis + */ + protected function sleepMillis(int $millis) + { + usleep($millis * 1000); + } +} diff --git a/lib/Google/vendor/google/gax/src/RequestBuilder.php b/lib/Google/vendor/google/gax/src/RequestBuilder.php new file mode 100644 index 000000000..c32f8fd97 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/RequestBuilder.php @@ -0,0 +1,290 @@ +baseUri = $baseUri; + $this->restConfig = require($restConfigPath); + } + + /** + * @param string $path + * @return bool + */ + public function pathExists(string $path) + { + list($interface, $method) = explode('/', $path); + return isset($this->restConfig['interfaces'][$interface][$method]); + } + + /** + * @param string $path + * @param Message $message + * @param array $headers + * @return RequestInterface + * @throws ValidationException + */ + public function build(string $path, Message $message, array $headers = []) + { + list($interface, $method) = explode('/', $path); + + if (!isset($this->restConfig['interfaces'][$interface][$method])) { + throw new ValidationException( + "Failed to build request, as the provided path ($path) was not found in the configuration." + ); + } + + $numericEnums = isset($this->restConfig['numericEnums']) && $this->restConfig['numericEnums']; + $methodConfig = $this->restConfig['interfaces'][$interface][$method] + [ + 'placeholders' => [], + 'body' => null, + 'additionalBindings' => null, + ]; + $bindings = $this->buildBindings($methodConfig['placeholders'], $message); + $uriTemplateConfigs = $this->getConfigsForUriTemplates($methodConfig); + + foreach ($uriTemplateConfigs as $config) { + $pathTemplate = $this->tryRenderPathTemplate($config['uriTemplate'], $bindings); + + if ($pathTemplate) { + // We found a valid uriTemplate - now build and return the Request + + list($body, $queryParams) = $this->constructBodyAndQueryParameters($message, $config); + + // Request enum fields will be encoded as numbers rather than strings (in the response). + if ($numericEnums) { + $queryParams['$alt'] = "json;enum-encoding=int"; + } + + $uri = $this->buildUri($pathTemplate, $queryParams); + + return new Request( + $config['method'], + $uri, + ['Content-Type' => 'application/json'] + $headers, + $body + ); + } + } + + // No valid uriTemplate found - construct an exception + $uriTemplates = []; + foreach ($uriTemplateConfigs as $config) { + $uriTemplates[] = $config['uriTemplate']; + } + + throw new ValidationException("Could not map bindings for $path to any Uri template.\n" . + "Bindings: " . print_r($bindings, true) . + "UriTemplates: " . print_r($uriTemplates, true)); + } + + /** + * Create a list of all possible configs using the additionalBindings + * + * @param array $config + * @return array[] An array of configs + */ + private function getConfigsForUriTemplates(array $config) + { + $configs = [$config]; + + if ($config['additionalBindings']) { + foreach ($config['additionalBindings'] as $additionalBinding) { + $configs[] = $additionalBinding + $config; + } + } + + return $configs; + } + + /** + * @param Message $message + * @param array $config + * @return array Tuple [$body, $queryParams] + */ + private function constructBodyAndQueryParameters(Message $message, array $config) + { + $messageDataJson = $message->serializeToJsonString(); + + if ($config['body'] === '*') { + return [$messageDataJson, []]; + } + + $body = null; + $queryParams = []; + $messageData = json_decode($messageDataJson, true); + foreach ($messageData as $name => $value) { + if (array_key_exists($name, $config['placeholders'])) { + continue; + } + + if (Serializer::toSnakeCase($name) === $config['body']) { + if (($bodyMessage = $message->{"get$name"}()) instanceof Message) { + $body = $bodyMessage->serializeToJsonString(); + } else { + $body = json_encode($value); + } + continue; + } + + if (is_array($value) && $this->isAssoc($value)) { + foreach ($value as $key => $value2) { + $queryParams[$name . '.' . $key] = $value2; + } + } else { + $queryParams[$name] = $value; + } + } + + // Ensures required query params with default values are always sent + // over the wire. + if (isset($config['queryParams'])) { + foreach ($config['queryParams'] as $requiredQueryParam) { + $requiredQueryParam = Serializer::toCamelCase($requiredQueryParam); + if (!array_key_exists($requiredQueryParam, $queryParams)) { + $getter = Serializer::getGetter($requiredQueryParam); + $queryParamValue = $message->$getter(); + if ($queryParamValue instanceof Message) { + // Decode message for the query parameter. + $queryParamValue = json_decode($queryParamValue->serializeToJsonString(), true); + } + if (is_array($queryParamValue)) { + // If the message has properties, add them as nested querystring values. + // NOTE: This only supports nesting at one level of depth. + foreach ($queryParamValue as $key => $value) { + $queryParams[$requiredQueryParam . '.' . $key] = $value; + } + } else { + $queryParams[$requiredQueryParam] = $queryParamValue; + } + } + } + } + + return [$body, $queryParams]; + } + + /** + * @param array $placeholders + * @param Message $message + * @return array Bindings from path template fields to values from message + */ + private function buildBindings(array $placeholders, Message $message) + { + $bindings = []; + foreach ($placeholders as $placeholder => $metadata) { + $value = array_reduce( + $metadata['getters'], + function (Message $result = null, $getter) { + if ($result) { + return $result->$getter(); + } + }, + $message + ); + + $bindings[$placeholder] = $value; + } + return $bindings; + } + + /** + * Try to render the resource name. The rendered resource name will always contain a leading '/' + * + * @param string $uriTemplate + * @param array $bindings + * @return null|string + * @throws ValidationException + */ + private function tryRenderPathTemplate(string $uriTemplate, array $bindings) + { + $template = new AbsoluteResourceTemplate($uriTemplate); + + try { + return $template->render($bindings); + } catch (ValidationException $e) { + return null; + } + } + + /** + * @param string $path + * @param array $queryParams + * @return UriInterface + */ + private function buildUri(string $path, array $queryParams) + { + $uri = Utils::uriFor( + sprintf( + 'https://%s%s', + $this->baseUri, + $path + ) + ); + if ($queryParams) { + $uri = $this->buildUriWithQuery( + $uri, + $queryParams + ); + } + return $uri; + } +} diff --git a/lib/Google/vendor/google/gax/src/RequestParamsHeaderDescriptor.php b/lib/Google/vendor/google/gax/src/RequestParamsHeaderDescriptor.php new file mode 100644 index 000000000..73e9af331 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/RequestParamsHeaderDescriptor.php @@ -0,0 +1,78 @@ + value]. + */ + public function __construct(array $requestParams) + { + $headerKey = self::HEADER_KEY; + + $headerValue = ''; + foreach ($requestParams as $key => $value) { + if ('' !== $headerValue) { + $headerValue .= '&'; + } + + $headerValue .= $key . '=' . urlencode(strval($value)); + } + + $this->header = [$headerKey => [$headerValue]]; + } + + /** + * Returns an associative array that contains request params header metadata. + * + * @return array + */ + public function getHeader() + { + return $this->header; + } +} diff --git a/lib/Google/vendor/google/gax/src/ResourceHelperTrait.php b/lib/Google/vendor/google/gax/src/ResourceHelperTrait.php new file mode 100644 index 000000000..7eafa99be --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceHelperTrait.php @@ -0,0 +1,110 @@ + $template) { + self::$templateMap[$name] = new PathTemplate($template); + } + } + + private static function getPathTemplate(string $key) + { + // TODO: Add nullable return type reference once PHP 7.1 is minimum. + if (is_null(self::$templateMap)) { + self::registerPathTemplates(); + } + return self::$templateMap[$key] ?? null; + } + + private static function parseFormattedName(string $formattedName, string $template = null): array + { + if (is_null(self::$templateMap)) { + self::registerPathTemplates(); + } + if ($template) { + if (!isset(self::$templateMap[$template])) { + throw new ValidationException("Template name $template does not exist"); + } + + return self::$templateMap[$template]->match($formattedName); + } + + foreach (self::$templateMap as $templateName => $pathTemplate) { + try { + return $pathTemplate->match($formattedName); + } catch (ValidationException $ex) { + // Swallow the exception to continue trying other path templates + } + } + + throw new ValidationException("Input did not match any known format. Input: $formattedName"); + } +} diff --git a/lib/Google/vendor/google/gax/src/ResourceTemplate/AbsoluteResourceTemplate.php b/lib/Google/vendor/google/gax/src/ResourceTemplate/AbsoluteResourceTemplate.php new file mode 100644 index 000000000..1373b027b --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceTemplate/AbsoluteResourceTemplate.php @@ -0,0 +1,146 @@ +"). + * + * Examples: + * /projects + * /projects/{project} + * /foo/{bar=**}/fizz/*:action + * + * Templates use the syntax of the API platform; see + * https://github.com/googleapis/api-common-protos/blob/master/google/api/http.proto + * for details. A template consists of a sequence of literals, wildcards, and variable bindings, + * where each binding can have a sub-path. A string representation can be parsed into an + * instance of AbsoluteResourceTemplate, which can then be used to perform matching and instantiation. + * + * @internal + */ +class AbsoluteResourceTemplate implements ResourceTemplateInterface +{ + private RelativeResourceTemplate $resourceTemplate; + /** @var string|bool */ + private $verb; + + /** + * AbsoluteResourceTemplate constructor. + * @param string $path + * @throws ValidationException + */ + public function __construct(string $path) + { + if (empty($path)) { + throw new ValidationException('Cannot construct AbsoluteResourceTemplate from empty string'); + } + if ($path[0] !== '/') { + throw new ValidationException( + "Could not construct AbsoluteResourceTemplate from '$path': must begin with '/'" + ); + } + $verbSeparatorPos = $this->verbSeparatorPos($path); + $this->resourceTemplate = new RelativeResourceTemplate(substr($path, 1, $verbSeparatorPos - 1)); + $this->verb = substr($path, $verbSeparatorPos + 1); + } + + /** + * @inheritdoc + */ + public function __toString() + { + return sprintf("/%s%s", $this->resourceTemplate, $this->renderVerb()); + } + + /** + * @inheritdoc + */ + public function render(array $bindings) + { + return sprintf("/%s%s", $this->resourceTemplate->render($bindings), $this->renderVerb()); + } + + /** + * @inheritdoc + */ + public function matches(string $path) + { + try { + $this->match($path); + return true; + } catch (ValidationException $ex) { + return false; + } + } + + /** + * @inheritdoc + */ + public function match(string $path) + { + if (empty($path)) { + throw $this->matchException($path, "path cannot be empty"); + } + if ($path[0] !== '/') { + throw $this->matchException($path, "missing leading '/'"); + } + $verbSeparatorPos = $this->verbSeparatorPos($path); + if (substr($path, $verbSeparatorPos + 1) !== $this->verb) { + throw $this->matchException($path, "trailing verb did not match '{$this->verb}'"); + } + return $this->resourceTemplate->match(substr($path, 1, $verbSeparatorPos - 1)); + } + + private function matchException(string $path, string $reason) + { + return new ValidationException("Could not match path '$path' to template '$this': $reason"); + } + + private function renderVerb() + { + return $this->verb ? ':' . $this->verb : ''; + } + + private function verbSeparatorPos(string $path) + { + $finalSeparatorPos = strrpos($path, '/'); + $verbSeparatorPos = strrpos($path, ':', $finalSeparatorPos); + if ($verbSeparatorPos === false) { + $verbSeparatorPos = strlen($path); + } + return $verbSeparatorPos; + } +} diff --git a/lib/Google/vendor/google/gax/src/ResourceTemplate/Parser.php b/lib/Google/vendor/google/gax/src/ResourceTemplate/Parser.php new file mode 100644 index 000000000..9431aecdd --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceTemplate/Parser.php @@ -0,0 +1,227 @@ += strlen($path)) { + // A trailing '/' has caused the index to exceed the bounds + // of the string - provide a helpful error message. + throw self::parseError($path, strlen($path) - 1, "invalid trailing '/'"); + } + if ($path[$index] === '{') { + // Validate that the { has a matching } + $closingBraceIndex = strpos($path, '}', $index); + if ($closingBraceIndex === false) { + throw self::parseError( + $path, + strlen($path), + "Expected '}' to match '{' at index $index, got end of string" + ); + } + + $segmentStringLengthWithoutBraces = $closingBraceIndex - $index - 1; + $segmentStringWithoutBraces = substr($path, $index + 1, $segmentStringLengthWithoutBraces); + $index = $closingBraceIndex + 1; + + $nextLiteral = '/'; + $remainingPath = substr($path, $index); + if (!empty($remainingPath)) { + // Find the firstnon-slash separator seen, if any. + $nextSlashIndex = strpos($remainingPath, '/', 0); + $nonSlashSeparators = ['-', '_', '~', '.']; + foreach ($nonSlashSeparators as $nonSlashSeparator) { + $nonSlashSeparatorIndex = strpos($remainingPath, $nonSlashSeparator, 0); + $nextOpenBraceIndex = strpos($remainingPath, '{', 0); + if ($nonSlashSeparatorIndex !== false && $nonSlashSeparatorIndex === $nextOpenBraceIndex - 1) { + $index += $nonSlashSeparatorIndex; + $nextLiteral = $nonSlashSeparator; + break; + } + } + } + + return self::parseVariableSegment($segmentStringWithoutBraces, $nextLiteral); + } else { + $nextSlash = strpos($path, '/', $index); + if ($nextSlash === false) { + $nextSlash = strlen($path); + } + $segmentString = substr($path, $index, $nextSlash - $index); + $nextLiteral = '/'; + $index = $nextSlash; + return self::parse($segmentString, $path, $index); + } + } + + /** + * @param string $segmentString + * @param string $path + * @param int $index + * @return Segment + * @throws ValidationException + */ + private static function parse(string $segmentString, string $path, int $index) + { + if ($segmentString === '*') { + return new Segment(Segment::WILDCARD_SEGMENT); + } elseif ($segmentString === '**') { + return new Segment(Segment::DOUBLE_WILDCARD_SEGMENT); + } else { + if (!self::isValidLiteral($segmentString)) { + if (empty($segmentString)) { + // Create user friendly message in case of empty segment + throw self::parseError($path, $index, "Unexpected empty segment (consecutive '/'s are invalid)"); + } else { + throw self::parseError($path, $index, "Unexpected characters in literal segment $segmentString"); + } + } + return new Segment(Segment::LITERAL_SEGMENT, $segmentString); + } + } + + /** + * @param string $segmentStringWithoutBraces + * @param string $separatorLiteral + * @return Segment + * @throws ValidationException + */ + private static function parseVariableSegment(string $segmentStringWithoutBraces, string $separatorLiteral) + { + // Validate there are no nested braces + $nestedOpenBracket = strpos($segmentStringWithoutBraces, '{'); + if ($nestedOpenBracket !== false) { + throw new ValidationException( + "Unexpected '{' parsing segment $segmentStringWithoutBraces at index $nestedOpenBracket" + ); + } + + $equalsIndex = strpos($segmentStringWithoutBraces, '='); + if ($equalsIndex === false) { + // If the variable does not contain '=', we assume the pattern is '*' as per google.rpc.Http + $variableKey = $segmentStringWithoutBraces; + $nestedResource = new RelativeResourceTemplate("*"); + } else { + $variableKey = substr($segmentStringWithoutBraces, 0, $equalsIndex); + $nestedResourceString = substr($segmentStringWithoutBraces, $equalsIndex + 1); + $nestedResource = new RelativeResourceTemplate($nestedResourceString); + } + + if (!self::isValidLiteral($variableKey)) { + throw new ValidationException( + "Unexpected characters in variable name $variableKey" + ); + } + return new Segment(Segment::VARIABLE_SEGMENT, null, $variableKey, $nestedResource, $separatorLiteral); + } + + /** + * @param string $literal + * @param string $path + * @param int $index + * @return string + * @throws ValidationException + */ + private static function parseLiteralFromPath(string $literal, string $path, int &$index) + { + $literalLength = strlen($literal); + if (strlen($path) < ($index + $literalLength)) { + throw self::parseError($path, $index, "expected '$literal'"); + } + $consumedLiteral = substr($path, $index, $literalLength); + if ($consumedLiteral !== $literal) { + throw self::parseError($path, $index, "expected '$literal'"); + } + $index += $literalLength; + return $consumedLiteral; + } + + private static function parseError(string $path, int $index, string $reason) + { + return new ValidationException("Error parsing '$path' at index $index: $reason"); + } + + /** + * Check if $literal is a valid segment literal. Segment literals may only contain numbers, + * letters, and any of the following: .-~_ + * + * @param string $literal + * @return bool + */ + private static function isValidLiteral(string $literal) + { + return preg_match("/^[0-9a-zA-Z\\.\\-~_]+$/", $literal) === 1; + } +} diff --git a/lib/Google/vendor/google/gax/src/ResourceTemplate/RelativeResourceTemplate.php b/lib/Google/vendor/google/gax/src/ResourceTemplate/RelativeResourceTemplate.php new file mode 100644 index 000000000..6bc745103 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceTemplate/RelativeResourceTemplate.php @@ -0,0 +1,390 @@ +"). + * + * Examples: + * projects + * projects/{project} + * foo/{bar=**}/fizz/* + * + * Templates use the syntax of the API platform; see + * https://github.com/googleapis/api-common-protos/blob/master/google/api/http.proto + * for details. A template consists of a sequence of literals, wildcards, and variable bindings, + * where each binding can have a sub-path. A string representation can be parsed into an + * instance of AbsoluteResourceTemplate, which can then be used to perform matching and instantiation. + * + * @internal + */ +class RelativeResourceTemplate implements ResourceTemplateInterface +{ + /** @var Segment[] */ + private array $segments; + + /** + * RelativeResourceTemplate constructor. + * + * @param string $path + * @throws ValidationException + */ + public function __construct(string $path) + { + if (empty($path)) { + throw new ValidationException('Cannot construct RelativeResourceTemplate from empty string'); + } + $this->segments = Parser::parseSegments($path); + + $doubleWildcardCount = self::countDoubleWildcards($this->segments); + if ($doubleWildcardCount > 1) { + throw new ValidationException( + "Cannot parse '$path': cannot contain more than one path wildcard" + ); + } + + // Check for duplicate keys + $keys = []; + foreach ($this->segments as $segment) { + if ($segment->getSegmentType() === Segment::VARIABLE_SEGMENT) { + if (isset($keys[$segment->getKey()])) { + throw new ValidationException( + "Duplicate key '{$segment->getKey()}' in path $path" + ); + } + $keys[$segment->getKey()] = true; + } + } + } + + /** + * @inheritdoc + */ + public function __toString() + { + return self::renderSegments($this->segments); + } + + /** + * @inheritdoc + */ + public function render(array $bindings) + { + $literalSegments = []; + $keySegmentTuples = self::buildKeySegmentTuples($this->segments); + foreach ($keySegmentTuples as list($key, $segment)) { + /** @var Segment $segment */ + if ($segment->getSegmentType() === Segment::LITERAL_SEGMENT) { + $literalSegments[] = $segment; + continue; + } + if (!array_key_exists($key, $bindings)) { + throw $this->renderingException($bindings, "missing required binding '$key' for segment '$segment'"); + } + $value = $bindings[$key]; + if (!is_null($value) && $segment->matches($value)) { + $literalSegments[] = new Segment( + Segment::LITERAL_SEGMENT, + $value, + $segment->getValue(), + $segment->getTemplate(), + $segment->getSeparator() + ); + } else { + $valueString = is_null($value) ? "null" : "'$value'"; + throw $this->renderingException( + $bindings, + "expected binding '$key' to match segment '$segment', instead got $valueString" + ); + } + } + return self::renderSegments($literalSegments); + } + + /** + * @inheritdoc + */ + public function matches(string $path) + { + try { + $this->match($path); + return true; + } catch (ValidationException $ex) { + return false; + } + } + + /** + * @inheritdoc + */ + public function match(string $path) + { + // High level strategy for matching: + // - Build a list of Segments from our template, where any variable segments are + // flattened into a single, non-nested list + // - Break $path into pieces based on '/'. + // - Use the segments to further subdivide the pieces using any applicable non-slash separators. + // - Match pieces of the path with Segments in the flattened list + + // In order to build correct bindings after we match the $path against our template, we + // need to (a) calculate the correct positional keys for our wildcards, and (b) maintain + // information about the variable identifier of any flattened segments. To do this, we + // build a list of [string, Segment] tuples, where the string component is the appropriate + // key. + $keySegmentTuples = self::buildKeySegmentTuples($this->segments); + + $flattenedKeySegmentTuples = self::flattenKeySegmentTuples($keySegmentTuples); + $flattenedKeySegmentTuplesCount = count($flattenedKeySegmentTuples); + assert($flattenedKeySegmentTuplesCount > 0); + + $slashPathPieces = explode('/', $path); + $pathPieces = []; + $pathPiecesIndex = 0; + $startIndex = 0; + $slashPathPiecesCount = count($slashPathPieces); + $doubleWildcardPieceCount = $slashPathPiecesCount - $flattenedKeySegmentTuplesCount + 1; + + for ($i = 0; $i < count($flattenedKeySegmentTuples); $i++) { + $segmentKey = $flattenedKeySegmentTuples[$i][0]; + $segment = $flattenedKeySegmentTuples[$i][1]; + // In our flattened list of segments, we should never encounter a variable segment + assert($segment->getSegmentType() !== Segment::VARIABLE_SEGMENT); + + if ($segment->getSegmentType() == Segment::DOUBLE_WILDCARD_SEGMENT) { + $pathPiecesForSegment = array_slice($slashPathPieces, $pathPiecesIndex, $doubleWildcardPieceCount); + $pathPiece = implode('/', $pathPiecesForSegment); + $pathPiecesIndex += $doubleWildcardPieceCount; + $pathPieces[] = $pathPiece; + continue; + } + + if ($segment->getSegmentType() == Segment::WILDCARD_SEGMENT) { + if ($pathPiecesIndex >= $slashPathPiecesCount) { + break; + } + } + if ($segment->getSeparator() === '/') { + if ($pathPiecesIndex >= $slashPathPiecesCount) { + throw $this->matchException($path, "segment and path length mismatch"); + } + $pathPiece = substr($slashPathPieces[$pathPiecesIndex++], $startIndex); + $startIndex = 0; + } else { + $rawPiece = substr($slashPathPieces[$pathPiecesIndex], $startIndex); + $pathPieceLength = strpos($rawPiece, $segment->getSeparator()); + $pathPiece = substr($rawPiece, 0, $pathPieceLength); + $startIndex += $pathPieceLength + 1; + } + $pathPieces[] = $pathPiece; + } + + if ($flattenedKeySegmentTuples[$i - 1][1]->getSegmentType() !== Segment::DOUBLE_WILDCARD_SEGMENT) { + // Process any remaining pieces. The binding logic will throw exceptions for any invalid paths. + for (; $pathPiecesIndex < count($slashPathPieces); $pathPiecesIndex++) { + $pathPieces[] = $slashPathPieces[$pathPiecesIndex]; + } + } + $pathPiecesCount = count($pathPieces); + + // We would like to match pieces of our path 1:1 with the segments of our template. However, + // this is confounded by the presence of double wildcards ('**') in the template, which can + // match multiple segments in the path. + // Because there can only be one '**' present, we can determine how many segments it must + // match by examining the difference in count between the template segments and the + // path pieces. + + if ($pathPiecesCount < $flattenedKeySegmentTuplesCount) { + // Each segment in $flattenedKeyedSegments must consume at least one + // segment in $pathSegments, so matching must fail. + throw $this->matchException($path, "path does not contain enough segments to be matched"); + } + + $doubleWildcardPieceCount = $pathPiecesCount - $flattenedKeySegmentTuplesCount + 1; + + $bindings = []; + $pathPiecesIndex = 0; + /** @var Segment $segment */ + foreach ($flattenedKeySegmentTuples as list($segmentKey, $segment)) { + $pathPiece = $pathPieces[$pathPiecesIndex++]; + if (!$segment->matches($pathPiece)) { + throw $this->matchException($path, "expected path element matching '$segment', got '$pathPiece'"); + } + + // If we have a valid key, add our $pathPiece to the $bindings array. Note that there + // may be multiple copies of the same $segmentKey. This is because a flattened variable + // segment can match multiple pieces from the path. We can add these to an array and + // collapse them all once the bindings are complete. + if (isset($segmentKey)) { + $bindings += [$segmentKey => []]; + $bindings[$segmentKey][] = $pathPiece; + } + } + + // It is possible that we have left over path pieces, which can occur if our template does + // not have a double wildcard. In that case, the match should fail. + if ($pathPiecesIndex !== $pathPiecesCount) { + throw $this->matchException($path, "expected end of path, got '$pathPieces[$pathPiecesIndex]'"); + } + + // Collapse the bindings from lists into strings + $collapsedBindings = []; + foreach ($bindings as $key => $boundPieces) { + $collapsedBindings[$key] = implode('/', $boundPieces); + } + + return $collapsedBindings; + } + + private function matchException(string $path, string $reason) + { + return new ValidationException("Could not match path '$path' to template '$this': $reason"); + } + + private function renderingException(array $bindings, string $reason) + { + $bindingsString = print_r($bindings, true); + return new ValidationException( + "Error rendering '$this': $reason\n" . + "Provided bindings: $bindingsString" + ); + } + + /** + * @param Segment[] $segments + * @param string|null $separator An optional string separator + * @return array[] A list of [string, Segment] tuples + */ + private static function buildKeySegmentTuples(array $segments, string $separator = null) + { + $keySegmentTuples = []; + $positionalArgumentCounter = 0; + foreach ($segments as $segment) { + switch ($segment->getSegmentType()) { + case Segment::WILDCARD_SEGMENT: + case Segment::DOUBLE_WILDCARD_SEGMENT: + $positionalKey = "\$$positionalArgumentCounter"; + $positionalArgumentCounter++; + $newSegment = $segment; + if ($separator !== null) { + $newSegment = new Segment( + $segment->getSegmentType(), + $segment->getValue(), + $segment->getKey(), + $segment->getTemplate(), + $separator + ); + } + $keySegmentTuples[] = [$positionalKey, $newSegment]; + break; + default: + $keySegmentTuples[] = [$segment->getKey(), $segment]; + } + } + return $keySegmentTuples; + } + + /** + * @param array[] $keySegmentTuples A list of [string, Segment] tuples + * @return array[] A list of [string, Segment] tuples + */ + private static function flattenKeySegmentTuples(array $keySegmentTuples) + { + $flattenedKeySegmentTuples = []; + foreach ($keySegmentTuples as list($key, $segment)) { + /** @var Segment $segment */ + switch ($segment->getSegmentType()) { + case Segment::VARIABLE_SEGMENT: + // For segment variables, replace the segment with the segments of its children + $template = $segment->getTemplate(); + $nestedKeySegmentTuples = self::buildKeySegmentTuples( + $template->segments, + $segment->getSeparator() + ); + foreach ($nestedKeySegmentTuples as list($nestedKey, $nestedSegment)) { + /** @var Segment $nestedSegment */ + // Nested variables are not allowed + assert($nestedSegment->getSegmentType() !== Segment::VARIABLE_SEGMENT); + // Insert the nested segment with key set to the outer key of the + // parent variable segment + $flattenedKeySegmentTuples[] = [$key, $nestedSegment]; + } + break; + default: + // For all other segments, don't change the key or segment + $flattenedKeySegmentTuples[] = [$key, $segment]; + } + } + return $flattenedKeySegmentTuples; + } + + /** + * @param Segment[] $segments + * @return int + */ + private static function countDoubleWildcards(array $segments) + { + $doubleWildcardCount = 0; + foreach ($segments as $segment) { + switch ($segment->getSegmentType()) { + case Segment::DOUBLE_WILDCARD_SEGMENT: + $doubleWildcardCount++; + break; + case Segment::VARIABLE_SEGMENT: + $doubleWildcardCount += self::countDoubleWildcards($segment->getTemplate()->segments); + break; + } + } + return $doubleWildcardCount; + } + + /** + * Joins segments using their separators. + * @param array $segmentsToRender + * @return string + */ + private static function renderSegments(array $segmentsToRender) + { + $renderResult = ""; + for ($i = 0; $i < count($segmentsToRender); $i++) { + $segment = $segmentsToRender[$i]; + $renderResult .= $segment; + if ($i < count($segmentsToRender) - 1) { + $renderResult .= $segment->getSeparator(); + } + } + return $renderResult; + } +} diff --git a/lib/Google/vendor/google/gax/src/ResourceTemplate/ResourceTemplateInterface.php b/lib/Google/vendor/google/gax/src/ResourceTemplate/ResourceTemplateInterface.php new file mode 100644 index 000000000..ffa3c8138 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceTemplate/ResourceTemplateInterface.php @@ -0,0 +1,91 @@ +"). (Note that a trailing verb without a + * leading slash is not permitted). + * + * Examples: + * projects + * /projects + * foo/{bar=**}/fizz/* + * /foo/{bar=**}/fizz/*:action + * + * Templates use the syntax of the API platform; see + * https://github.com/googleapis/api-common-protos/blob/master/google/api/http.proto + * for details. A template consists of a sequence of literals, wildcards, and variable bindings, + * where each binding can have a sub-path. A string representation can be parsed into an + * instance of AbsoluteResourceTemplate, which can then be used to perform matching and instantiation. + * + * @internal + */ +interface ResourceTemplateInterface +{ + /** + * @return string A string representation of the resource template + */ + public function __toString(); + + /** + * Renders a resource template using the provided bindings. + * + * @param array $bindings An array matching var names to binding strings. + * @return string A rendered representation of this resource template. + * @throws ValidationException If $bindings does not contain all required keys + * or if a sub-template can't be parsed. + */ + public function render(array $bindings); + + /** + * Check if $path matches a resource string. + * + * @param string $path A resource string. + * @return bool + */ + public function matches(string $path); + + /** + * Matches a given $path to a resource template, and returns an array of bindings between + * wildcards / variables in the template and values in the path. If $path does not match the + * template, then a ValidationException is thrown. + * + * @param string $path A resource string. + * @throws ValidationException if path can't be matched to the template. + * @return array Array matching var names to binding values. + */ + public function match(string $path); +} diff --git a/lib/Google/vendor/google/gax/src/ResourceTemplate/Segment.php b/lib/Google/vendor/google/gax/src/ResourceTemplate/Segment.php new file mode 100644 index 000000000..b9ae4fbff --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ResourceTemplate/Segment.php @@ -0,0 +1,195 @@ +segmentType = $segmentType; + $this->value = $value; + $this->key = $key; + $this->template = $template; + $this->separator = $separator; + + switch ($this->segmentType) { + case Segment::LITERAL_SEGMENT: + $this->stringRepr = "{$this->value}"; + break; + case Segment::WILDCARD_SEGMENT: + $this->stringRepr = "*"; + break; + case Segment::DOUBLE_WILDCARD_SEGMENT: + $this->stringRepr = "**"; + break; + case Segment::VARIABLE_SEGMENT: + $this->stringRepr = "{{$this->key}={$this->template}}"; + break; + default: + throw new ValidationException( + "Unexpected Segment type: {$this->segmentType}" + ); + } + } + + /** + * @return string A string representation of the segment. + */ + public function __toString() + { + return $this->stringRepr; + } + + /** + * Checks if $value matches this Segment. + * + * @param string $value + * @return bool + * @throws ValidationException + */ + public function matches(string $value) + { + switch ($this->segmentType) { + case Segment::LITERAL_SEGMENT: + return $this->value === $value; + case Segment::WILDCARD_SEGMENT: + return self::isValidBinding($value); + case Segment::DOUBLE_WILDCARD_SEGMENT: + return self::isValidDoubleWildcardBinding($value); + case Segment::VARIABLE_SEGMENT: + return $this->template->matches($value); + default: + throw new ValidationException( + "Unexpected Segment type: {$this->segmentType}" + ); + } + } + + /** + * @return int + */ + public function getSegmentType() + { + return $this->segmentType; + } + + /** + * @return string|null + */ + public function getKey() + { + return $this->key; + } + + /** + * @return string|null + */ + public function getValue() + { + return $this->value; + } + + /** + * @return RelativeResourceTemplate|null + */ + public function getTemplate() + { + return $this->template; + } + + /** + * @return string + */ + public function getSeparator() + { + return $this->separator; + } + + /** + * Check if $binding is a valid segment binding. Segment bindings may contain any characters + * except a forward slash ('/'), and may not be empty. + * + * @param string $binding + * @return bool + */ + private static function isValidBinding(string $binding) + { + return preg_match("-^[^/]+$-", $binding) === 1; + } + + /** + * Check if $binding is a valid double wildcard binding. Segment bindings may contain any + * characters, but may not be empty. + * + * @param string $binding + * @return bool + */ + private static function isValidDoubleWildcardBinding(string $binding) + { + return preg_match("-^.+$-", $binding) === 1; + } +} diff --git a/lib/Google/vendor/google/gax/src/RetrySettings.php b/lib/Google/vendor/google/gax/src/RetrySettings.php new file mode 100644 index 000000000..94bb6f189 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/RetrySettings.php @@ -0,0 +1,547 @@ + 100, + * 'retryDelayMultiplier' => 1.3, + * 'maxRetryDelayMillis' => 60000, + * 'initialRpcTimeoutMillis' => 20000, + * 'rpcTimeoutMultiplier' => 1.0, + * 'maxRpcTimeoutMillis' => 20000, + * 'totalTimeoutMillis' => 600000, + * 'retryableCodes' => [ApiStatus::DEADLINE_EXCEEDED, ApiStatus::UNAVAILABLE], + * ]); + * ``` + * + * It is also possible to create a new RetrySettings object from an existing + * object using the {@see \Google\ApiCore\RetrySettings::with()} method. + * + * Example modifying an existing RetrySettings object using `with()`: + * ``` + * $newRetrySettings = $retrySettings->with([ + * 'totalTimeoutMillis' => 700000, + * ]); + * ``` + * + * Modifying the retry behavior of an RPC method + * --------------------------------------------- + * + * RetrySettings objects can be used to control retries for many RPC methods in + * [google-cloud-php](https://github.com/googleapis/google-cloud-php). + * The examples below make use of the + * [GroupServiceClient](https://googleapis.github.io/google-cloud-php/#/docs/google-cloud/monitoring/v3/groupserviceclient) + * from the [Monitoring V3 API](https://github.com/googleapis/google-cloud-php/tree/master/src/Monitoring/V3), + * but they can be applied to other APIs in the + * [google-cloud-php](https://github.com/googleapis/google-cloud-php) repository. + * + * It is possible to specify the retry behavior to be used by an RPC via the + * `retrySettings` field in the `optionalArgs` parameter. The `retrySettings` + * field can contain either a RetrySettings object, or a PHP array containing + * the particular retry parameters to be updated. + * + * Example of disabling retries for a single call to the + * [listGroups](https://googleapis.github.io/google-cloud-php/#/docs/google-cloud/monitoring/v3/groupserviceclient?method=listGroups) + * method, and setting a custom timeout: + * ``` + * $result = $client->listGroups($name, [ + * 'retrySettings' => [ + * 'retriesEnabled' => false, + * 'noRetriesRpcTimeoutMillis' => 5000, + * ] + * ]); + * ``` + * + * Example of creating a new RetrySettings object and using it to override + * the retry settings for a call to the + * [listGroups](https://googleapis.github.io/google-cloud-php/#/docs/google-cloud/monitoring/v3/groupserviceclient?method=listGroups) + * method: + * ``` + * $customRetrySettings = new RetrySettings([ + * 'initialRetryDelayMillis' => 100, + * 'retryDelayMultiplier' => 1.3, + * 'maxRetryDelayMillis' => 60000, + * 'initialRpcTimeoutMillis' => 20000, + * 'rpcTimeoutMultiplier' => 1.0, + * 'maxRpcTimeoutMillis' => 20000, + * 'totalTimeoutMillis' => 600000, + * 'retryableCodes' => [ApiStatus::DEADLINE_EXCEEDED, ApiStatus::UNAVAILABLE], + * ]); + * + * $result = $client->listGroups($name, [ + * 'retrySettings' => $customRetrySettings + * ]); + * ``` + * + * Modifying the default retry behavior for RPC methods on a Client object + * ----------------------------------------------------------------------- + * + * It is also possible to specify the retry behavior for RPC methods when + * constructing a client object using the 'retrySettingsArray'. The examples + * below again make use of the + * [GroupServiceClient](https://googleapis.github.io/google-cloud-php/#/docs/google-cloud/monitoring/v3/groupserviceclient) + * from the [Monitoring V3 API](https://github.com/googleapis/google-cloud-php/tree/master/src/Monitoring/V3), + * but they can be applied to other APIs in the + * [google-cloud-php](https://github.com/googleapis/google-cloud-php) repository. + * + * The GroupServiceClient object accepts an optional `retrySettingsArray` + * parameter, which can be used to specify retry behavior for RPC methods + * on the client. The `retrySettingsArray` accepts a PHP array in which keys + * are the names of RPC methods on the client, and values are either a + * RetrySettings object or a PHP array containing the particular retry + * parameters to be updated. + * + * Example updating the retry settings for four methods of GroupServiceClient: + * ``` + * use Google\Cloud\Monitoring\V3\GroupServiceClient; + * + * $customRetrySettings = new RetrySettings([ + * 'initialRetryDelayMillis' => 100, + * 'retryDelayMultiplier' => 1.3, + * 'maxRetryDelayMillis' => 60000, + * 'initialRpcTimeoutMillis' => 20000, + * 'rpcTimeoutMultiplier' => 1.0, + * 'maxRpcTimeoutMillis' => 20000, + * 'totalTimeoutMillis' => 600000, + * 'retryableCodes' => [ApiStatus::DEADLINE_EXCEEDED, ApiStatus::UNAVAILABLE], + * ]); + * + * $updatedCustomRetrySettings = $customRetrySettings->with([ + * 'totalTimeoutMillis' => 700000 + * ]); + * + * $client = new GroupServiceClient([ + * 'retrySettingsArray' => [ + * 'listGroups' => ['retriesEnabled' => false], + * 'getGroup' => [ + * 'initialRpcTimeoutMillis' => 10000, + * 'maxRpcTimeoutMillis' => 30000, + * 'totalTimeoutMillis' => 60000, + * ], + * 'deleteGroup' => $customRetrySettings, + * 'updateGroup' => $updatedCustomRetrySettings + * ], + * ]); + * ``` + * + * Configure the use of logical timeout + * ------------------------------------ + * + * To configure the use of a logical timeout, where a logical timeout is the + * duration a method is given to complete one or more RPC attempts, with each + * attempt using only the time remaining in the logical timeout, use + * {@see \Google\ApiCore\RetrySettings::logicalTimeout()} combined with + * {@see \Google\ApiCore\RetrySettings::with()}. + * + * ``` + * $timeoutSettings = RetrySettings::logicalTimeout(30000); + * + * $customRetrySettings = $customRetrySettings->with($timeoutSettings); + * + * $result = $client->listGroups($name, [ + * 'retrySettings' => $customRetrySettings + * ]); + * ``` + * + * {@see \Google\ApiCore\RetrySettings::logicalTimeout()} can also be used on a + * method call independent of a RetrySettings instance. + * + * ``` + * $timeoutSettings = RetrySettings::logicalTimeout(30000); + * + * $result = $client->listGroups($name, [ + * 'retrySettings' => $timeoutSettings + * ]); + * ``` + */ +class RetrySettings +{ + use ValidationTrait; + + const DEFAULT_MAX_RETRIES = 0; + + private $retriesEnabled; + + private $retryableCodes; + + private $initialRetryDelayMillis; + private $retryDelayMultiplier; + private $maxRetryDelayMillis; + private $initialRpcTimeoutMillis; + private $rpcTimeoutMultiplier; + private $maxRpcTimeoutMillis; + private $totalTimeoutMillis; + + private $noRetriesRpcTimeoutMillis; + + /** + * The number of maximum retries an operation can do. + * This doesn't include the original API call. + * Setting this to 0 means no limit. + */ + private int $maxRetries; + + /** + * When set, this function will be used to evaluate if the retry should + * take place or not. The callable will have the following signature: + * function (Exception $e, array $options): bool + */ + private ?Closure $retryFunction; + + /** + * Constructs an instance. + * + * @param array $settings { + * Required. Settings for configuring the retry behavior. All parameters are required except + * $retriesEnabled and $noRetriesRpcTimeoutMillis, which are optional and have defaults + * determined based on the other settings provided. + * + * @type bool $retriesEnabled Optional. Enables retries. If not specified, the value is + * determined using the $retryableCodes setting. If $retryableCodes is empty, + * then $retriesEnabled is set to false; otherwise, it is set to true. + * @type int $noRetriesRpcTimeoutMillis Optional. The timeout of the rpc call to be used + * if $retriesEnabled is false, in milliseconds. It not specified, the value + * of $initialRpcTimeoutMillis is used. + * @type array $retryableCodes The Status codes that are retryable. Each status should be + * either one of the string constants defined on {@see \Google\ApiCore\ApiStatus} + * or an integer constant defined on {@see \Google\Rpc\Code}. + * @type int $initialRetryDelayMillis The initial delay of retry in milliseconds. + * @type int $retryDelayMultiplier The exponential multiplier of retry delay. + * @type int $maxRetryDelayMillis The max delay of retry in milliseconds. + * @type int $initialRpcTimeoutMillis The initial timeout of rpc call in milliseconds. + * @type int $rpcTimeoutMultiplier The exponential multiplier of rpc timeout. + * @type int $maxRpcTimeoutMillis The max timeout of rpc call in milliseconds. + * @type int $totalTimeoutMillis The max accumulative timeout in total. + * @type int $maxRetries The max retries allowed for an operation. + * Defaults to the value of the DEFAULT_MAX_RETRIES constant. + * This option is experimental. + * @type callable $retryFunction This function will be used to decide if we should retry or not. + * Callable signature: `function (Exception $e, array $options): bool` + * This option is experimental. + * } + */ + public function __construct(array $settings) + { + $this->validateNotNull($settings, [ + 'initialRetryDelayMillis', + 'retryDelayMultiplier', + 'maxRetryDelayMillis', + 'initialRpcTimeoutMillis', + 'rpcTimeoutMultiplier', + 'maxRpcTimeoutMillis', + 'totalTimeoutMillis', + 'retryableCodes' + ]); + $this->initialRetryDelayMillis = $settings['initialRetryDelayMillis']; + $this->retryDelayMultiplier = $settings['retryDelayMultiplier']; + $this->maxRetryDelayMillis = $settings['maxRetryDelayMillis']; + $this->initialRpcTimeoutMillis = $settings['initialRpcTimeoutMillis']; + $this->rpcTimeoutMultiplier = $settings['rpcTimeoutMultiplier']; + $this->maxRpcTimeoutMillis = $settings['maxRpcTimeoutMillis']; + $this->totalTimeoutMillis = $settings['totalTimeoutMillis']; + $this->retryableCodes = $settings['retryableCodes']; + $this->retriesEnabled = array_key_exists('retriesEnabled', $settings) + ? $settings['retriesEnabled'] + : (count($this->retryableCodes) > 0); + $this->noRetriesRpcTimeoutMillis = array_key_exists('noRetriesRpcTimeoutMillis', $settings) + ? $settings['noRetriesRpcTimeoutMillis'] + : $this->initialRpcTimeoutMillis; + $this->maxRetries = $settings['maxRetries'] ?? self::DEFAULT_MAX_RETRIES; + $this->retryFunction = $settings['retryFunction'] ?? null; + } + + /** + * Constructs an array mapping method names to CallSettings. + * + * @param string $serviceName + * The fully-qualified name of this service, used as a key into + * the client config file. + * @param array $clientConfig + * An array parsed from the standard API client config file. + * @param bool $disableRetries + * Disable retries in all loaded RetrySettings objects. Defaults to false. + * @throws ValidationException + * @return RetrySettings[] $retrySettings + */ + public static function load( + string $serviceName, + array $clientConfig, + bool $disableRetries = false + ) { + $serviceRetrySettings = []; + + $serviceConfig = $clientConfig['interfaces'][$serviceName]; + $retryCodes = $serviceConfig['retry_codes']; + $retryParams = $serviceConfig['retry_params']; + foreach ($serviceConfig['methods'] as $methodName => $methodConfig) { + $timeoutMillis = $methodConfig['timeout_millis']; + + if (empty($methodConfig['retry_codes_name']) || empty($methodConfig['retry_params_name'])) { + // Construct a RetrySettings object with retries disabled + $retrySettings = self::constructDefault()->with([ + 'noRetriesRpcTimeoutMillis' => $timeoutMillis, + ]); + } else { + $retryCodesName = $methodConfig['retry_codes_name']; + $retryParamsName = $methodConfig['retry_params_name']; + + if (!array_key_exists($retryCodesName, $retryCodes)) { + throw new ValidationException("Invalid retry_codes_name setting: '$retryCodesName'"); + } + if (!array_key_exists($retryParamsName, $retryParams)) { + throw new ValidationException("Invalid retry_params_name setting: '$retryParamsName'"); + } + + foreach ($retryCodes[$retryCodesName] as $status) { + if (!ApiStatus::isValidStatus($status)) { + throw new ValidationException("Invalid status code: '$status'"); + } + } + + $retryParameters = self::convertArrayFromSnakeCase($retryParams[$retryParamsName]) + [ + 'retryableCodes' => $retryCodes[$retryCodesName], + 'noRetriesRpcTimeoutMillis' => $timeoutMillis, + ]; + if ($disableRetries) { + $retryParameters['retriesEnabled'] = false; + } + + $retrySettings = new RetrySettings($retryParameters); + } + + $serviceRetrySettings[$methodName] = $retrySettings; + } + + return $serviceRetrySettings; + } + + public static function constructDefault() + { + return new RetrySettings([ + 'retriesEnabled' => false, + 'noRetriesRpcTimeoutMillis' => 30000, + 'initialRetryDelayMillis' => 100, + 'retryDelayMultiplier' => 1.3, + 'maxRetryDelayMillis' => 60000, + 'initialRpcTimeoutMillis' => 20000, + 'rpcTimeoutMultiplier' => 1, + 'maxRpcTimeoutMillis' => 20000, + 'totalTimeoutMillis' => 600000, + 'retryableCodes' => [], + 'maxRetries' => self::DEFAULT_MAX_RETRIES, + 'retryFunction' => null]); + } + + /** + * Creates a new instance of RetrySettings that updates the settings in the existing instance + * with the settings specified in the $settings parameter. + * + * @param array $settings { + * Settings for configuring the retry behavior. Supports all of the options supported by + * the constructor; see {@see \Google\ApiCore\RetrySettings::__construct()}. All parameters + * are optional - all unset parameters will default to the value in the existing instance. + * } + * @return RetrySettings + */ + public function with(array $settings) + { + $existingSettings = [ + 'initialRetryDelayMillis' => $this->getInitialRetryDelayMillis(), + 'retryDelayMultiplier' => $this->getRetryDelayMultiplier(), + 'maxRetryDelayMillis' => $this->getMaxRetryDelayMillis(), + 'initialRpcTimeoutMillis' => $this->getInitialRpcTimeoutMillis(), + 'rpcTimeoutMultiplier' => $this->getRpcTimeoutMultiplier(), + 'maxRpcTimeoutMillis' => $this->getMaxRpcTimeoutMillis(), + 'totalTimeoutMillis' => $this->getTotalTimeoutMillis(), + 'retryableCodes' => $this->getRetryableCodes(), + 'retriesEnabled' => $this->retriesEnabled(), + 'noRetriesRpcTimeoutMillis' => $this->getNoRetriesRpcTimeoutMillis(), + 'maxRetries' => $this->getMaxRetries(), + 'retryFunction' => $this->getRetryFunction(), + ]; + return new RetrySettings($settings + $existingSettings); + } + + /** + * Creates an associative array of the {@see \Google\ApiCore\RetrySettings} timeout fields configured + * with the given timeout specified in the $timeout parameter interpreted as a logical timeout. + * + * @param int $timeout The timeout in milliseconds to be used as a logical call timeout. + * @return array + */ + public static function logicalTimeout(int $timeout) + { + return [ + 'initialRpcTimeoutMillis' => $timeout, + 'maxRpcTimeoutMillis' => $timeout, + 'totalTimeoutMillis' => $timeout, + 'noRetriesRpcTimeoutMillis' => $timeout, + 'rpcTimeoutMultiplier' => 1.0 + ]; + } + + /** + * @return bool Returns true if retries are enabled, otherwise returns false. + */ + public function retriesEnabled() + { + return $this->retriesEnabled; + } + + /** + * @return int The timeout of the rpc call to be used if $retriesEnabled is false, + * in milliseconds. + */ + public function getNoRetriesRpcTimeoutMillis() + { + return $this->noRetriesRpcTimeoutMillis; + } + + /** + * @return int[] Status codes to retry + */ + public function getRetryableCodes() + { + return $this->retryableCodes; + } + + /** + * @return int The initial retry delay in milliseconds. If $this->retriesEnabled() + * is false, this setting is unused. + */ + public function getInitialRetryDelayMillis() + { + return $this->initialRetryDelayMillis; + } + + /** + * @return float The retry delay multiplier. If $this->retriesEnabled() + * is false, this setting is unused. + */ + public function getRetryDelayMultiplier() + { + return $this->retryDelayMultiplier; + } + + /** + * @return int The maximum retry delay in milliseconds. If $this->retriesEnabled() + * is false, this setting is unused. + */ + public function getMaxRetryDelayMillis() + { + return $this->maxRetryDelayMillis; + } + + /** + * @return int The initial rpc timeout in milliseconds. If $this->retriesEnabled() + * is false, this setting is unused - use noRetriesRpcTimeoutMillis to + * set the timeout in that case. + */ + public function getInitialRpcTimeoutMillis() + { + return $this->initialRpcTimeoutMillis; + } + + /** + * @return float The rpc timeout multiplier. If $this->retriesEnabled() + * is false, this setting is unused. + */ + public function getRpcTimeoutMultiplier() + { + return $this->rpcTimeoutMultiplier; + } + + /** + * @return int The maximum rpc timeout in milliseconds. If $this->retriesEnabled() + * is false, this setting is unused - use noRetriesRpcTimeoutMillis to + * set the timeout in that case. + */ + public function getMaxRpcTimeoutMillis() + { + return $this->maxRpcTimeoutMillis; + } + + /** + * @return int The total time in milliseconds to spend on the call, including all + * retry attempts and delays between attempts. If $this->retriesEnabled() + * is false, this setting is unused - use noRetriesRpcTimeoutMillis to + * set the timeout in that case. + */ + public function getTotalTimeoutMillis() + { + return $this->totalTimeoutMillis; + } + + /** + * @experimental + */ + public function getMaxRetries() + { + return $this->maxRetries; + } + + /** + * @experimental + */ + public function getRetryFunction() + { + return $this->retryFunction; + } + + private static function convertArrayFromSnakeCase(array $settings) + { + $camelCaseSettings = []; + foreach ($settings as $key => $value) { + $camelCaseKey = str_replace(' ', '', ucwords(str_replace('_', ' ', $key))); + $camelCaseSettings[lcfirst($camelCaseKey)] = $value; + } + return $camelCaseSettings; + } +} diff --git a/lib/Google/vendor/google/gax/src/Serializer.php b/lib/Google/vendor/google/gax/src/Serializer.php new file mode 100644 index 000000000..1c39ced47 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Serializer.php @@ -0,0 +1,530 @@ + \Google\Rpc\RetryInfo::class, + 'google.rpc.debuginfo-bin' => \Google\Rpc\DebugInfo::class, + 'google.rpc.quotafailure-bin' => \Google\Rpc\QuotaFailure::class, + 'google.rpc.badrequest-bin' => \Google\Rpc\BadRequest::class, + 'google.rpc.requestinfo-bin' => \Google\Rpc\RequestInfo::class, + 'google.rpc.resourceinfo-bin' => \Google\Rpc\ResourceInfo::class, + 'google.rpc.errorinfo-bin' => \Google\Rpc\ErrorInfo::class, + 'google.rpc.help-bin' => \Google\Rpc\Help::class, + 'google.rpc.localizedmessage-bin' => \Google\Rpc\LocalizedMessage::class, + ]; + + private $fieldTransformers; + private $messageTypeTransformers; + private $decodeFieldTransformers; + private $decodeMessageTypeTransformers; + // Array of key-value pairs which specify a custom encoding function. + // The key is the proto class and the value is the function + // which will be used to convert the proto instead of the + // encodeMessage method from the Serializer class. + private $customEncoders; + + private $descriptorMaps = []; + + /** + * Serializer constructor. + * + * @param array $fieldTransformers An array mapping field names to transformation functions + * @param array $messageTypeTransformers An array mapping message names to transformation functions + * @param array $decodeFieldTransformers An array mapping field names to transformation functions + * @param array $decodeMessageTypeTransformers An array mapping message names to transformation functions + */ + public function __construct( + $fieldTransformers = [], + $messageTypeTransformers = [], + $decodeFieldTransformers = [], + $decodeMessageTypeTransformers = [], + $customEncoders = [], + ) { + $this->fieldTransformers = $fieldTransformers; + $this->messageTypeTransformers = $messageTypeTransformers; + $this->decodeFieldTransformers = $decodeFieldTransformers; + $this->decodeMessageTypeTransformers = $decodeMessageTypeTransformers; + $this->customEncoders = $customEncoders; + } + + /** + * Encode protobuf message as a PHP array + * + * @param mixed $message + * @return array + * @throws ValidationException + */ + public function encodeMessage($message) + { + $cls = get_class($message); + + // If we have supplied a customEncoder for this class type, + // then we use that instead of the general encodeMessage definition. + if (array_key_exists($cls, $this->customEncoders)) { + $func = $this->customEncoders[$cls]; + return call_user_func($func, $message); + } + // Get message descriptor + $pool = DescriptorPool::getGeneratedPool(); + $messageType = $pool->getDescriptorByClassName(get_class($message)); + try { + return $this->encodeMessageImpl($message, $messageType); + } catch (\Exception $e) { + throw new ValidationException( + "Error encoding message: " . $e->getMessage(), + $e->getCode(), + $e + ); + } + } + + /** + * Decode PHP array into the specified protobuf message + * + * @param mixed $message + * @param array $data + * @return mixed + * @throws ValidationException + */ + public function decodeMessage($message, array $data) + { + // Get message descriptor + $pool = DescriptorPool::getGeneratedPool(); + $messageType = $pool->getDescriptorByClassName(get_class($message)); + try { + return $this->decodeMessageImpl($message, $messageType, $data); + } catch (\Exception $e) { + throw new ValidationException( + "Error decoding message: " . $e->getMessage(), + $e->getCode(), + $e + ); + } + } + + /** + * @param Message $message + * @return string Json representation of $message + * @throws ValidationException + */ + public static function serializeToJson(Message $message) + { + return json_encode(self::serializeToPhpArray($message), JSON_PRETTY_PRINT); + } + + /** + * @param Message $message + * @return array PHP array representation of $message + * @throws ValidationException + */ + public static function serializeToPhpArray(Message $message) + { + return self::getPhpArraySerializer()->encodeMessage($message); + } + + /** + * Decode metadata received from gRPC status object + * + * @param array $metadata + * @return array + */ + public static function decodeMetadata(array $metadata) + { + if (count($metadata) == 0) { + return []; + } + $result = []; + foreach ($metadata as $key => $values) { + foreach ($values as $value) { + $decodedValue = [ + '@type' => $key, + ]; + if (self::hasBinaryHeaderSuffix($key)) { + if (isset(self::$metadataKnownTypes[$key])) { + $class = self::$metadataKnownTypes[$key]; + /** @var Message $message */ + $message = new $class(); + try { + $message->mergeFromString($value); + $decodedValue += self::serializeToPhpArray($message); + } catch (\Exception $e) { + // We encountered an error trying to deserialize the data + $decodedValue += [ + 'data' => '', + ]; + } + } else { + // The metadata contains an unexpected binary type + $decodedValue += [ + 'data' => '', + ]; + } + } else { + $decodedValue += [ + 'data' => $value, + ]; + } + $result[] = $decodedValue; + } + } + return $result; + } + + /** + * Decode an array of Any messages into a printable PHP array. + * + * @param iterable $anyArray + * @return array + */ + public static function decodeAnyMessages($anyArray) + { + $results = []; + foreach ($anyArray as $any) { + try { + /** @var Any $any */ + /** @var Message $unpacked */ + $unpacked = $any->unpack(); + $results[] = self::serializeToPhpArray($unpacked); + } catch (\Exception $ex) { + echo "$ex\n"; + // failed to unpack the $any object - show as unknown binary data + $results[] = [ + 'typeUrl' => $any->getTypeUrl(), + 'value' => '', + ]; + } + } + return $results; + } + + /** + * @param FieldDescriptor $field + * @param Message|array|string $data + * @return mixed + * @throws \Exception + */ + private function encodeElement(FieldDescriptor $field, $data) + { + switch ($field->getType()) { + case GPBType::MESSAGE: + if (is_array($data)) { + $result = $data; + } else { + $result = $this->encodeMessageImpl($data, $field->getMessageType()); + } + $messageType = $field->getMessageType()->getFullName(); + if (isset($this->messageTypeTransformers[$messageType])) { + $result = $this->messageTypeTransformers[$messageType]($result); + } + break; + default: + $result = $data; + break; + } + + if (isset($this->fieldTransformers[$field->getName()])) { + $result = $this->fieldTransformers[$field->getName()]($result); + } + return $result; + } + + private function getDescriptorMaps(Descriptor $descriptor) + { + if (!isset($this->descriptorMaps[$descriptor->getFullName()])) { + $fieldsByName = []; + $fieldCount = $descriptor->getFieldCount(); + for ($i = 0; $i < $fieldCount; $i++) { + $field = $descriptor->getField($i); + $fieldsByName[$field->getName()] = $field; + } + $fieldToOneof = []; + $oneofCount = $descriptor->getOneofDeclCount(); + for ($i = 0; $i < $oneofCount; $i++) { + $oneof = $descriptor->getOneofDecl($i); + $oneofFieldCount = $oneof->getFieldCount(); + for ($j = 0; $j < $oneofFieldCount; $j++) { + $field = $oneof->getField($j); + $fieldToOneof[$field->getName()] = $oneof->getName(); + } + } + $this->descriptorMaps[$descriptor->getFullName()] = [$fieldsByName, $fieldToOneof]; + } + return $this->descriptorMaps[$descriptor->getFullName()]; + } + + /** + * @param Message $message + * @param Descriptor $messageType + * @return array + * @throws \Exception + */ + private function encodeMessageImpl(Message $message, Descriptor $messageType) + { + $data = []; + + // Call the getDescriptorMaps outside of the loop to save processing. + // Use the same set of fields to loop over, instead of using field count. + list($fields, $fieldsToOneof) = $this->getDescriptorMaps($messageType); + foreach ($fields as $field) { + $key = $field->getName(); + $getter = $this->getGetter($key); + $v = $message->$getter(); + + if (is_null($v)) { + continue; + } + + // Check and skip unset fields inside oneofs + if (isset($fieldsToOneof[$key])) { + $oneofName = $fieldsToOneof[$key]; + $oneofGetter = $this->getGetter($oneofName); + if ($message->$oneofGetter() !== $key) { + continue; + } + } + + if ($field->isMap()) { + list($mapFieldsByName, $_) = $this->getDescriptorMaps($field->getMessageType()); + $keyField = $mapFieldsByName[self::MAP_KEY_FIELD_NAME]; + $valueField = $mapFieldsByName[self::MAP_VALUE_FIELD_NAME]; + $arr = []; + foreach ($v as $k => $vv) { + $arr[$this->encodeElement($keyField, $k)] = $this->encodeElement($valueField, $vv); + } + $v = $arr; + } elseif ($field->getLabel() === GPBLabel::REPEATED) { + $arr = []; + foreach ($v as $k => $vv) { + $arr[$k] = $this->encodeElement($field, $vv); + } + $v = $arr; + } else { + $v = $this->encodeElement($field, $v); + } + + $key = self::toCamelCase($key); + $data[$key] = $v; + } + + return $data; + } + + /** + * @param FieldDescriptor $field + * @param mixed $data + * @return mixed + * @throws \Exception + */ + private function decodeElement(FieldDescriptor $field, $data) + { + if (isset($this->decodeFieldTransformers[$field->getName()])) { + $data = $this->decodeFieldTransformers[$field->getName()]($data); + } + + switch ($field->getType()) { + case GPBType::MESSAGE: + if ($data instanceof Message) { + return $data; + } + $messageType = $field->getMessageType(); + $messageTypeName = $messageType->getFullName(); + $klass = $messageType->getClass(); + $msg = new $klass(); + if (isset($this->decodeMessageTypeTransformers[$messageTypeName])) { + $data = $this->decodeMessageTypeTransformers[$messageTypeName]($data); + } + + return $this->decodeMessageImpl($msg, $messageType, $data); + default: + return $data; + } + } + + /** + * @param Message $message + * @param Descriptor $messageType + * @param array $data + * @return mixed + * @throws \Exception + */ + private function decodeMessageImpl(Message $message, Descriptor $messageType, array $data) + { + list($fieldsByName, $_) = $this->getDescriptorMaps($messageType); + foreach ($data as $key => $v) { + // Get the field by tag number or name + $fieldName = self::toSnakeCase($key); + + // Unknown field found + if (!isset($fieldsByName[$fieldName])) { + throw new RuntimeException(sprintf( + "cannot handle unknown field %s on message %s", + $fieldName, + $messageType->getFullName() + )); + } + + /** @var FieldDescriptor $field */ + $field = $fieldsByName[$fieldName]; + + if ($field->isMap()) { + list($mapFieldsByName, $_) = $this->getDescriptorMaps($field->getMessageType()); + $keyField = $mapFieldsByName[self::MAP_KEY_FIELD_NAME]; + $valueField = $mapFieldsByName[self::MAP_VALUE_FIELD_NAME]; + $arr = []; + foreach ($v as $k => $vv) { + $arr[$this->decodeElement($keyField, $k)] = $this->decodeElement($valueField, $vv); + } + $value = $arr; + } elseif ($field->getLabel() === GPBLabel::REPEATED) { + $arr = []; + foreach ($v as $k => $vv) { + $arr[$k] = $this->decodeElement($field, $vv); + } + $value = $arr; + } else { + $value = $this->decodeElement($field, $v); + } + + $setter = $this->getSetter($field->getName()); + $message->$setter($value); + + // We must unset $value here, otherwise the protobuf c extension will mix up the references + // and setting one value will change all others + unset($value); + } + return $message; + } + + /** + * @param string $name + * @return string Getter function + */ + public static function getGetter(string $name) + { + if (!isset(self::$getterMap[$name])) { + self::$getterMap[$name] = 'get' . ucfirst(self::toCamelCase($name)); + } + return self::$getterMap[$name]; + } + + /** + * @param string $name + * @return string Setter function + */ + public static function getSetter(string $name) + { + if (!isset(self::$setterMap[$name])) { + self::$setterMap[$name] = 'set' . ucfirst(self::toCamelCase($name)); + } + return self::$setterMap[$name]; + } + + /** + * Convert string from camelCase to snake_case + * + * @param string $key + * @return string + */ + public static function toSnakeCase(string $key) + { + if (!isset(self::$snakeCaseMap[$key])) { + self::$snakeCaseMap[$key] = strtolower( + preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $key) + ); + } + return self::$snakeCaseMap[$key]; + } + + /** + * Convert string from snake_case to camelCase + * + * @param string $key + * @return string + */ + public static function toCamelCase(string $key) + { + if (!isset(self::$camelCaseMap[$key])) { + self::$camelCaseMap[$key] = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $key)))); + } + return self::$camelCaseMap[$key]; + } + + private static function hasBinaryHeaderSuffix(string $key) + { + return substr_compare($key, "-bin", strlen($key) - 4) === 0; + } + + private static function getPhpArraySerializer() + { + if (is_null(self::$phpArraySerializer)) { + self::$phpArraySerializer = new Serializer(); + } + return self::$phpArraySerializer; + } + + public static function loadKnownMetadataTypes() + { + foreach (self::$metadataKnownTypes as $key => $class) { + new $class; + } + } +} + +// It is necessary to call this when this file is included. Otherwise we cannot be +// guaranteed that the relevant classes will be loaded into the protobuf descriptor +// pool when we try to unpack an Any object containing that class. +// phpcs:disable PSR1.Files.SideEffects +Serializer::loadKnownMetadataTypes(); +// phpcs:enable diff --git a/lib/Google/vendor/google/gax/src/ServerStream.php b/lib/Google/vendor/google/gax/src/ServerStream.php new file mode 100644 index 000000000..b9c632591 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ServerStream.php @@ -0,0 +1,97 @@ +call = $serverStreamingCall; + if (array_key_exists('resourcesGetMethod', $streamingDescriptor)) { + $this->resourcesGetMethod = $streamingDescriptor['resourcesGetMethod']; + } + } + + /** + * A generator which yields results from the server until the streaming call + * completes. Throws an ApiException if the streaming call failed. + * + * @throws ApiException + * @return \Generator|mixed + */ + public function readAll() + { + $resourcesGetMethod = $this->resourcesGetMethod; + if (!is_null($resourcesGetMethod)) { + foreach ($this->call->responses() as $response) { + foreach ($response->$resourcesGetMethod() as $resource) { + yield $resource; + } + } + } else { + foreach ($this->call->responses() as $response) { + yield $response; + } + } + + // Errors in the REST transport will be thrown from there and not reach + // this handling. Successful REST server-streams will have an OK status. + $status = $this->call->getStatus(); + if ($status->code !== Code::OK) { + throw ApiException::createFromStdClass($status); + } + } + + /** + * Return the underlying call object. + * + * @return ServerStreamingCallInterface + */ + public function getServerStreamingCall() + { + return $this->call; + } +} diff --git a/lib/Google/vendor/google/gax/src/ServerStreamingCallInterface.php b/lib/Google/vendor/google/gax/src/ServerStreamingCallInterface.php new file mode 100644 index 000000000..a78ff275e --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ServerStreamingCallInterface.php @@ -0,0 +1,95 @@ + $metadata Metadata to send with the call, if applicable + * (optional) + * @param array $options An array of options, possible keys: + * 'flags' => a number (optional) + * @return void + */ + public function start($data, array $metadata = [], array $options = []); + + /** + * @return mixed An iterator of response values. + */ + public function responses(); + + /** + * Return the status of the server stream. + * + * @return \stdClass The API status. + */ + public function getStatus(); + + /** + * @return mixed The metadata sent by the server. + */ + public function getMetadata(); + + /** + * @return mixed The trailing metadata sent by the server. + */ + public function getTrailingMetadata(); + + /** + * @return string The URI of the endpoint. + */ + public function getPeer(); + + /** + * Cancels the call. + * + * @return void + */ + public function cancel(); + + /** + * Set the CallCredentials for the underlying Call. + * + * @param mixed $call_credentials The CallCredentials object + * + * @return void + */ + public function setCallCredentials($call_credentials); +} diff --git a/lib/Google/vendor/google/gax/src/ServiceAddressTrait.php b/lib/Google/vendor/google/gax/src/ServiceAddressTrait.php new file mode 100644 index 000000000..1343a233c --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ServiceAddressTrait.php @@ -0,0 +1,64 @@ +assertSame($expected, $actual); + + return; + } + + if (is_array($expected) || $expected instanceof RepeatedField) { + if (is_array($expected) === is_array($actual)) { + $this->assertEquals($expected, $actual); + } + + $this->assertCount(count($expected), $actual); + + $expectedValues = $this->getValues($expected); + $actualValues = $this->getValues($actual); + + for ($i = 0; $i < count($expectedValues); $i++) { + $expectedElement = $expectedValues[$i]; + $actualElement = $actualValues[$i]; + $this->assertProtobufEquals($expectedElement, $actualElement); + } + } else { + $this->assertEquals($expected, $actual); + if ($expected instanceof Message) { + $pool = DescriptorPool::getGeneratedPool(); + $descriptor = $pool->getDescriptorByClassName(get_class($expected)); + + $fieldCount = $descriptor->getFieldCount(); + for ($i = 0; $i < $fieldCount; $i++) { + $field = $descriptor->getField($i); + $getter = Serializer::getGetter($field->getName()); + $expectedFieldValue = $expected->$getter(); + $actualFieldValue = $actual->$getter(); + $this->assertProtobufEquals($expectedFieldValue, $actualFieldValue); + } + } + } + } + + /** + * @param iterable $field + */ + private function getValues($field) + { + return array_values( + is_array($field) + ? $field + : iterator_to_array($field) + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MessageAwareArrayComparator.php b/lib/Google/vendor/google/gax/src/Testing/MessageAwareArrayComparator.php new file mode 100644 index 000000000..9feedb0ef --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MessageAwareArrayComparator.php @@ -0,0 +1,32 @@ +exporter = new MessageAwareExporter(); + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MessageAwareExporter.php b/lib/Google/vendor/google/gax/src/Testing/MessageAwareExporter.php new file mode 100644 index 000000000..2aeb29cb0 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MessageAwareExporter.php @@ -0,0 +1,47 @@ +responses = $responses; + $this->deserialize = $deserialize; + if (is_null($status)) { + $status = new MockStatus(Code::OK); + } + $this->status = $status; + } + + /** + * @return mixed|null + * @throws ApiException + */ + public function read() + { + if (count($this->responses) > 0) { + $resp = array_shift($this->responses); + if (is_null($resp)) { + // Null was added to the responses list to simulate a failed stream + // To ensure that getStatus can now be called, we clear the remaining + // responses and set writesDone to true + $this->responses = []; + $this->writesDone(); + return null; + } + $obj = $this->deserializeMessage($resp, $this->deserialize); + return $obj; + } elseif ($this->writesDone) { + return null; + } else { + throw new ApiException( + "No more responses to read, but closeWrite() not called - " + . "this would be blocking", + Grpc\STATUS_INTERNAL, + null + ); + } + } + + /** + * @return stdClass|null + * @throws ApiException + */ + public function getStatus() + { + if (count($this->responses) > 0) { + throw new ApiException( + "Calls to getStatus() will block if all responses are not read", + Grpc\STATUS_INTERNAL, + null + ); + } + if (!$this->writesDone) { + throw new ApiException( + "Calls to getStatus() will block if closeWrite() not called", + Grpc\STATUS_INTERNAL, + null + ); + } + return $this->status; + } + + /** + * Save the request object, to be retrieved via getReceivedCalls() + * @param Message|mixed $request The request object + * @param array $options An array of options. + * @throws ApiException + */ + public function write($request, array $options = []) + { + if ($this->writesDone) { + throw new ApiException( + "Cannot call write() after writesDone()", + Grpc\STATUS_INTERNAL, + null + ); + } + if (is_a($request, '\Google\Protobuf\Internal\Message')) { + /** @var Message $newRequest */ + $newRequest = new $request(); + $newRequest->mergeFromString($request->serializeToString()); + $request = $newRequest; + } + $this->receivedWrites[] = $request; + } + + /** + * Set writesDone to true + */ + public function writesDone() + { + $this->writesDone = true; + } + + /** + * Return a list of calls made to write(), and clear $receivedFuncCalls. + * + * @return mixed[] An array of received requests + */ + public function popReceivedCalls() + { + $receivedFuncCallsTemp = $this->receivedWrites; + $this->receivedWrites = []; + return $receivedFuncCallsTemp; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockClientStreamingCall.php b/lib/Google/vendor/google/gax/src/Testing/MockClientStreamingCall.php new file mode 100644 index 000000000..6bf35c685 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockClientStreamingCall.php @@ -0,0 +1,111 @@ +mockUnaryCall = new MockUnaryCall($response, $deserialize, $status); + } + + /** + * Immediately return the preset response object and status. + * @return array The response object and status. + */ + public function wait() + { + $this->waitCalled = true; + return $this->mockUnaryCall->wait(); + } + + /** + * Save the request object, to be retrieved via getReceivedCalls() + * @param Message|mixed $request The request object + * @param array $options An array of options + * @throws ApiException + */ + public function write($request, array $options = []) + { + if ($this->waitCalled) { + throw new ApiException("Cannot call write() after wait()", Code::INTERNAL, ApiStatus::INTERNAL); + } + if (is_a($request, '\Google\Protobuf\Internal\Message')) { + /** @var Message $newRequest */ + $newRequest = new $request(); + $newRequest->mergeFromString($request->serializeToString()); + $request = $newRequest; + } + $this->receivedWrites[] = $request; + } + + /** + * Return a list of calls made to write(), and clear $receivedFuncCalls. + * + * @return mixed[] An array of received requests + */ + public function popReceivedCalls() + { + $receivedFuncCallsTemp = $this->receivedWrites; + $this->receivedWrites = []; + return $receivedFuncCallsTemp; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockGrpcTransport.php b/lib/Google/vendor/google/gax/src/Testing/MockGrpcTransport.php new file mode 100644 index 000000000..6e5c4fa59 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockGrpcTransport.php @@ -0,0 +1,141 @@ +mockCall = $mockCall; + $opts = ['credentials' => ChannelCredentials::createSsl()]; + parent::__construct('', $opts); + } + + /** + * @param string $method + * @param array $arguments + * @param callable $deserialize + */ + protected function _simpleRequest( + $method, + $arguments, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->logCall($method, $deserialize, $metadata, $options, $arguments); + return $this->mockCall; + } + + /** + * @param string $method + * @param callable $deserialize + */ + protected function _clientStreamRequest( + $method, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->logCall($method, $deserialize, $metadata, $options); + return $this->mockCall; + } + + /** + * @param string $method + * @param array $arguments + * @param callable $deserialize + */ + protected function _serverStreamRequest( + $method, + $arguments, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->logCall($method, $deserialize, $metadata, $options, $arguments); + return $this->mockCall; + } + + /** + * @param string $method + * @param callable $deserialize + */ + protected function _bidiRequest( + $method, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->logCall($method, $deserialize, $metadata, $options); + return $this->mockCall; + } + + /** + * @param string $method + * @param callable $deserialize + * @param array $arguments + */ + private function logCall( + $method, + $deserialize, + array $metadata = [], + array $options = [], + $arguments = null + ) { + $this->requestArguments = [ + 'method' => $method, + 'arguments' => $arguments, + 'deserialize' => $deserialize, + 'metadata' => $metadata, + 'options' => $options, + ]; + } + + public function getRequestArguments() + { + return $this->requestArguments; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockRequest.php b/lib/Google/vendor/google/gax/src/Testing/MockRequest.php new file mode 100644 index 000000000..df4bd4045 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockRequest.php @@ -0,0 +1,86 @@ +google.apicore.testing.MockRequest + * + * @internal + */ +class MockRequest extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field string page_token = 1; + */ + protected $page_token = ''; + /** + * Generated from protobuf field uint64 page_size = 2; + */ + protected $page_size = 0; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $page_token + * @type int|string $page_size + * } + */ + public function __construct($data = NULL) { + Mocks::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field string page_token = 1; + * @return string + */ + public function getPageToken() + { + return $this->page_token; + } + + /** + * Generated from protobuf field string page_token = 1; + * @param string $var + * @return $this + */ + public function setPageToken($var) + { + GPBUtil::checkString($var, True); + $this->page_token = $var; + + return $this; + } + + /** + * Generated from protobuf field uint64 page_size = 2; + * @return int|string + */ + public function getPageSize() + { + return $this->page_size; + } + + /** + * Generated from protobuf field uint64 page_size = 2; + * @param int|string $var + * @return $this + */ + public function setPageSize($var) + { + GPBUtil::checkUint64($var); + $this->page_size = $var; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/gax/src/Testing/MockRequestBody.php b/lib/Google/vendor/google/gax/src/Testing/MockRequestBody.php new file mode 100644 index 000000000..c7b805c9f --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockRequestBody.php @@ -0,0 +1,644 @@ +google.apicore.testing.MockRequestBody + * + * @internal + */ +class MockRequestBody extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * Generated from protobuf field uint64 number = 2; + */ + protected $number = 0; + /** + * Generated from protobuf field repeated string repeated_field = 3; + */ + private $repeated_field; + /** + * Generated from protobuf field .google.apicore.testing.MockRequestBody nested_message = 4; + */ + protected $nested_message = null; + /** + * Generated from protobuf field .google.protobuf.BytesValue bytes_value = 5; + */ + protected $bytes_value = null; + /** + * Generated from protobuf field .google.protobuf.Duration duration_value = 6; + */ + protected $duration_value = null; + /** + * Generated from protobuf field .google.protobuf.FieldMask field_mask = 7; + */ + protected $field_mask = null; + /** + * Generated from protobuf field .google.protobuf.Int64Value int64_value = 8; + */ + protected $int64_value = null; + /** + * Generated from protobuf field .google.protobuf.ListValue list_value = 9; + */ + protected $list_value = null; + /** + * Generated from protobuf field .google.protobuf.StringValue string_value = 10; + */ + protected $string_value = null; + /** + * Generated from protobuf field .google.protobuf.Struct struct_value = 11; + */ + protected $struct_value = null; + /** + * Generated from protobuf field .google.protobuf.Timestamp timestamp_value = 12; + */ + protected $timestamp_value = null; + /** + * Generated from protobuf field .google.protobuf.Value value_value = 13; + */ + protected $value_value = null; + protected $oneof_field; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * @type int|string $number + * @type string[]|\Google\Protobuf\Internal\RepeatedField $repeated_field + * @type \Google\ApiCore\Testing\MockRequestBody $nested_message + * @type \Google\Protobuf\BytesValue $bytes_value + * @type \Google\Protobuf\Duration $duration_value + * @type \Google\Protobuf\FieldMask $field_mask + * @type \Google\Protobuf\Int64Value $int64_value + * @type \Google\Protobuf\ListValue $list_value + * @type \Google\Protobuf\StringValue $string_value + * @type \Google\Protobuf\Struct $struct_value + * @type \Google\Protobuf\Timestamp $timestamp_value + * @type \Google\Protobuf\Value $value_value + * @type string $field_1 + * @type string $field_2 + * @type string $field_3 + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\ApiCore\Testing\Mocks::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Generated from protobuf field uint64 number = 2; + * @return int|string + */ + public function getNumber() + { + return $this->number; + } + + /** + * Generated from protobuf field uint64 number = 2; + * @param int|string $var + * @return $this + */ + public function setNumber($var) + { + GPBUtil::checkUint64($var); + $this->number = $var; + + return $this; + } + + /** + * Generated from protobuf field repeated string repeated_field = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getRepeatedField() + { + return $this->repeated_field; + } + + /** + * Generated from protobuf field repeated string repeated_field = 3; + * @param string[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setRepeatedField($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->repeated_field = $arr; + + return $this; + } + + /** + * Generated from protobuf field .google.apicore.testing.MockRequestBody nested_message = 4; + * @return \Google\ApiCore\Testing\MockRequestBody + */ + public function getNestedMessage() + { + return isset($this->nested_message) ? $this->nested_message : null; + } + + public function hasNestedMessage() + { + return isset($this->nested_message); + } + + public function clearNestedMessage() + { + unset($this->nested_message); + } + + /** + * Generated from protobuf field .google.apicore.testing.MockRequestBody nested_message = 4; + * @param \Google\ApiCore\Testing\MockRequestBody $var + * @return $this + */ + public function setNestedMessage($var) + { + GPBUtil::checkMessage($var, \Google\ApiCore\Testing\MockRequestBody::class); + $this->nested_message = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.BytesValue bytes_value = 5; + * @return \Google\Protobuf\BytesValue + */ + public function getBytesValue() + { + return isset($this->bytes_value) ? $this->bytes_value : null; + } + + public function hasBytesValue() + { + return isset($this->bytes_value); + } + + public function clearBytesValue() + { + unset($this->bytes_value); + } + + /** + * Returns the unboxed value from getBytesValue() + + * Generated from protobuf field .google.protobuf.BytesValue bytes_value = 5; + * @return string|null + */ + public function getBytesValueUnwrapped() + { + return $this->readWrapperValue("bytes_value"); + } + + /** + * Generated from protobuf field .google.protobuf.BytesValue bytes_value = 5; + * @param \Google\Protobuf\BytesValue $var + * @return $this + */ + public function setBytesValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\BytesValue::class); + $this->bytes_value = $var; + + return $this; + } + + /** + * Sets the field by wrapping a primitive type in a Google\Protobuf\BytesValue object. + + * Generated from protobuf field .google.protobuf.BytesValue bytes_value = 5; + * @param string|null $var + * @return $this + */ + public function setBytesValueUnwrapped($var) + { + $this->writeWrapperValue("bytes_value", $var); + return $this;} + + /** + * Generated from protobuf field .google.protobuf.Duration duration_value = 6; + * @return \Google\Protobuf\Duration + */ + public function getDurationValue() + { + return isset($this->duration_value) ? $this->duration_value : null; + } + + public function hasDurationValue() + { + return isset($this->duration_value); + } + + public function clearDurationValue() + { + unset($this->duration_value); + } + + /** + * Generated from protobuf field .google.protobuf.Duration duration_value = 6; + * @param \Google\Protobuf\Duration $var + * @return $this + */ + public function setDurationValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Duration::class); + $this->duration_value = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.FieldMask field_mask = 7; + * @return \Google\Protobuf\FieldMask + */ + public function getFieldMask() + { + return isset($this->field_mask) ? $this->field_mask : null; + } + + public function hasFieldMask() + { + return isset($this->field_mask); + } + + public function clearFieldMask() + { + unset($this->field_mask); + } + + /** + * Generated from protobuf field .google.protobuf.FieldMask field_mask = 7; + * @param \Google\Protobuf\FieldMask $var + * @return $this + */ + public function setFieldMask($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\FieldMask::class); + $this->field_mask = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.Int64Value int64_value = 8; + * @return \Google\Protobuf\Int64Value + */ + public function getInt64Value() + { + return isset($this->int64_value) ? $this->int64_value : null; + } + + public function hasInt64Value() + { + return isset($this->int64_value); + } + + public function clearInt64Value() + { + unset($this->int64_value); + } + + /** + * Returns the unboxed value from getInt64Value() + + * Generated from protobuf field .google.protobuf.Int64Value int64_value = 8; + * @return int|string|null + */ + public function getInt64ValueUnwrapped() + { + return $this->readWrapperValue("int64_value"); + } + + /** + * Generated from protobuf field .google.protobuf.Int64Value int64_value = 8; + * @param \Google\Protobuf\Int64Value $var + * @return $this + */ + public function setInt64Value($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Int64Value::class); + $this->int64_value = $var; + + return $this; + } + + /** + * Sets the field by wrapping a primitive type in a Google\Protobuf\Int64Value object. + + * Generated from protobuf field .google.protobuf.Int64Value int64_value = 8; + * @param int|string|null $var + * @return $this + */ + public function setInt64ValueUnwrapped($var) + { + $this->writeWrapperValue("int64_value", $var); + return $this;} + + /** + * Generated from protobuf field .google.protobuf.ListValue list_value = 9; + * @return \Google\Protobuf\ListValue + */ + public function getListValue() + { + return isset($this->list_value) ? $this->list_value : null; + } + + public function hasListValue() + { + return isset($this->list_value); + } + + public function clearListValue() + { + unset($this->list_value); + } + + /** + * Generated from protobuf field .google.protobuf.ListValue list_value = 9; + * @param \Google\Protobuf\ListValue $var + * @return $this + */ + public function setListValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\ListValue::class); + $this->list_value = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.StringValue string_value = 10; + * @return \Google\Protobuf\StringValue + */ + public function getStringValue() + { + return isset($this->string_value) ? $this->string_value : null; + } + + public function hasStringValue() + { + return isset($this->string_value); + } + + public function clearStringValue() + { + unset($this->string_value); + } + + /** + * Returns the unboxed value from getStringValue() + + * Generated from protobuf field .google.protobuf.StringValue string_value = 10; + * @return string|null + */ + public function getStringValueUnwrapped() + { + return $this->readWrapperValue("string_value"); + } + + /** + * Generated from protobuf field .google.protobuf.StringValue string_value = 10; + * @param \Google\Protobuf\StringValue $var + * @return $this + */ + public function setStringValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\StringValue::class); + $this->string_value = $var; + + return $this; + } + + /** + * Sets the field by wrapping a primitive type in a Google\Protobuf\StringValue object. + + * Generated from protobuf field .google.protobuf.StringValue string_value = 10; + * @param string|null $var + * @return $this + */ + public function setStringValueUnwrapped($var) + { + $this->writeWrapperValue("string_value", $var); + return $this;} + + /** + * Generated from protobuf field .google.protobuf.Struct struct_value = 11; + * @return \Google\Protobuf\Struct + */ + public function getStructValue() + { + return isset($this->struct_value) ? $this->struct_value : null; + } + + public function hasStructValue() + { + return isset($this->struct_value); + } + + public function clearStructValue() + { + unset($this->struct_value); + } + + /** + * Generated from protobuf field .google.protobuf.Struct struct_value = 11; + * @param \Google\Protobuf\Struct $var + * @return $this + */ + public function setStructValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Struct::class); + $this->struct_value = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.Timestamp timestamp_value = 12; + * @return \Google\Protobuf\Timestamp + */ + public function getTimestampValue() + { + return isset($this->timestamp_value) ? $this->timestamp_value : null; + } + + public function hasTimestampValue() + { + return isset($this->timestamp_value); + } + + public function clearTimestampValue() + { + unset($this->timestamp_value); + } + + /** + * Generated from protobuf field .google.protobuf.Timestamp timestamp_value = 12; + * @param \Google\Protobuf\Timestamp $var + * @return $this + */ + public function setTimestampValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Timestamp::class); + $this->timestamp_value = $var; + + return $this; + } + + /** + * Generated from protobuf field .google.protobuf.Value value_value = 13; + * @return \Google\Protobuf\Value + */ + public function getValueValue() + { + return isset($this->value_value) ? $this->value_value : null; + } + + public function hasValueValue() + { + return isset($this->value_value); + } + + public function clearValueValue() + { + unset($this->value_value); + } + + /** + * Generated from protobuf field .google.protobuf.Value value_value = 13; + * @param \Google\Protobuf\Value $var + * @return $this + */ + public function setValueValue($var) + { + GPBUtil::checkMessage($var, \Google\Protobuf\Value::class); + $this->value_value = $var; + + return $this; + } + + /** + * Generated from protobuf field string field_1 = 14; + * @return string + */ + public function getField1() + { + return $this->readOneof(14); + } + + public function hasField1() + { + return $this->hasOneof(14); + } + + /** + * Generated from protobuf field string field_1 = 14; + * @param string $var + * @return $this + */ + public function setField1($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(14, $var); + + return $this; + } + + /** + * Generated from protobuf field string field_2 = 15; + * @return string + */ + public function getField2() + { + return $this->readOneof(15); + } + + public function hasField2() + { + return $this->hasOneof(15); + } + + /** + * Generated from protobuf field string field_2 = 15; + * @param string $var + * @return $this + */ + public function setField2($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(15, $var); + + return $this; + } + + /** + * Generated from protobuf field string field_3 = 16; + * @return string + */ + public function getField3() + { + return $this->readOneof(16); + } + + public function hasField3() + { + return $this->hasOneof(16); + } + + /** + * Generated from protobuf field string field_3 = 16; + * @param string $var + * @return $this + */ + public function setField3($var) + { + GPBUtil::checkString($var, True); + $this->writeOneof(16, $var); + + return $this; + } + + /** + * @return string + */ + public function getOneofField() + { + return $this->whichOneof("oneof_field"); + } + +} + diff --git a/lib/Google/vendor/google/gax/src/Testing/MockResponse.php b/lib/Google/vendor/google/gax/src/Testing/MockResponse.php new file mode 100644 index 000000000..fa9c75570 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockResponse.php @@ -0,0 +1,166 @@ +google.apicore.testing.MockResponse + * + * @internal + */ +class MockResponse extends \Google\Protobuf\Internal\Message +{ + /** + * Generated from protobuf field string name = 1; + */ + protected $name = ''; + /** + * Generated from protobuf field uint64 number = 2; + */ + protected $number = 0; + /** + * Generated from protobuf field repeated string resources_list = 3; + */ + private $resources_list; + /** + * Generated from protobuf field string next_page_token = 4; + */ + protected $next_page_token = ''; + /** + * Generated from protobuf field map resources_map = 5; + */ + private $resources_map; + + /** + * Constructor. + * + * @param array $data { + * Optional. Data for populating the Message object. + * + * @type string $name + * @type int|string $number + * @type string[]|\Google\Protobuf\Internal\RepeatedField $resources_list + * @type string $next_page_token + * @type array|\Google\Protobuf\Internal\MapField $resources_map + * } + */ + public function __construct($data = NULL) { + \GPBMetadata\ApiCore\Testing\Mocks::initOnce(); + parent::__construct($data); + } + + /** + * Generated from protobuf field string name = 1; + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Generated from protobuf field string name = 1; + * @param string $var + * @return $this + */ + public function setName($var) + { + GPBUtil::checkString($var, True); + $this->name = $var; + + return $this; + } + + /** + * Generated from protobuf field uint64 number = 2; + * @return int|string + */ + public function getNumber() + { + return $this->number; + } + + /** + * Generated from protobuf field uint64 number = 2; + * @param int|string $var + * @return $this + */ + public function setNumber($var) + { + GPBUtil::checkUint64($var); + $this->number = $var; + + return $this; + } + + /** + * Generated from protobuf field repeated string resources_list = 3; + * @return \Google\Protobuf\Internal\RepeatedField + */ + public function getResourcesList() + { + return $this->resources_list; + } + + /** + * Generated from protobuf field repeated string resources_list = 3; + * @param string[]|\Google\Protobuf\Internal\RepeatedField $var + * @return $this + */ + public function setResourcesList($var) + { + $arr = GPBUtil::checkRepeatedField($var, \Google\Protobuf\Internal\GPBType::STRING); + $this->resources_list = $arr; + + return $this; + } + + /** + * Generated from protobuf field string next_page_token = 4; + * @return string + */ + public function getNextPageToken() + { + return $this->next_page_token; + } + + /** + * Generated from protobuf field string next_page_token = 4; + * @param string $var + * @return $this + */ + public function setNextPageToken($var) + { + GPBUtil::checkString($var, True); + $this->next_page_token = $var; + + return $this; + } + + /** + * Generated from protobuf field map resources_map = 5; + * @return \Google\Protobuf\Internal\MapField + */ + public function getResourcesMap() + { + return $this->resources_map; + } + + /** + * Generated from protobuf field map resources_map = 5; + * @param array|\Google\Protobuf\Internal\MapField $var + * @return $this + */ + public function setResourcesMap($var) + { + $arr = GPBUtil::checkMapField($var, \Google\Protobuf\Internal\GPBType::STRING, \Google\Protobuf\Internal\GPBType::STRING); + $this->resources_map = $arr; + + return $this; + } + +} + diff --git a/lib/Google/vendor/google/gax/src/Testing/MockServerStreamingCall.php b/lib/Google/vendor/google/gax/src/Testing/MockServerStreamingCall.php new file mode 100644 index 000000000..dd6378bef --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockServerStreamingCall.php @@ -0,0 +1,98 @@ +responses = $responses; + $this->deserialize = $deserialize; + if (is_null($status)) { + $status = new MockStatus(Code::OK, 'OK', []); + } elseif ($status instanceof stdClass) { + if (!property_exists($status, 'metadata')) { + $status->metadata = []; + } + } + $this->status = $status; + } + + public function responses() + { + while (count($this->responses) > 0) { + $resp = array_shift($this->responses); + $obj = $this->deserializeMessage($resp, $this->deserialize); + yield $obj; + } + } + + /** + * @return stdClass|null + * @throws ApiException + */ + public function getStatus() + { + if (count($this->responses) > 0) { + throw new ApiException( + "Calls to getStatus() will block if all responses are not read", + Code::INTERNAL, + ApiStatus::INTERNAL + ); + } + return $this->status; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockStatus.php b/lib/Google/vendor/google/gax/src/Testing/MockStatus.php new file mode 100644 index 000000000..fb5ea340e --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockStatus.php @@ -0,0 +1,53 @@ +code = $code; + $this->details = $details; + $this->metadata = $metadata; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockStubTrait.php b/lib/Google/vendor/google/gax/src/Testing/MockStubTrait.php new file mode 100644 index 000000000..7d7e58ae0 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockStubTrait.php @@ -0,0 +1,296 @@ +deserialize = $deserialize; + } + + /** + * Overrides the _simpleRequest method in \Grpc\BaseStub + * (https://github.com/grpc/grpc/blob/master/src/php/lib/Grpc/BaseStub.php) + * Returns a MockUnaryCall object that will return the first item from $responses + * @param string $method The API method name to be called + * @param \Google\Protobuf\Internal\Message $argument The request object to the API method + * @param callable $deserialize A function to deserialize the response object + * @param array $metadata + * @param array $options + * @return MockUnaryCall + */ + public function _simpleRequest( + $method, + $argument, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->receivedFuncCalls[] = new ReceivedRequest($method, $argument, $deserialize, $metadata, $options); + if (count($this->responses) < 1) { + throw new UnderflowException("ran out of responses"); + } + list($response, $status) = array_shift($this->responses); + $call = new MockUnaryCall($response, $deserialize, $status); + $this->callObjects[] = $call; + return $call; + } + + /** + * Overrides the _clientStreamRequest method in \Grpc\BaseStub + * (https://github.com/grpc/grpc/blob/master/src/php/lib/Grpc/BaseStub.php) + * Returns a MockClientStreamingCall object that will return the first item from $responses + * + * @param string $method The name of the method to call + * @param callable $deserialize A function that deserializes the responses + * @param array $metadata A metadata map to send to the server + * (optional) + * @param array $options An array of options (optional) + * + * @return MockClientStreamingCall The active call object + */ + public function _clientStreamRequest( + $method, + $deserialize, + array $metadata = [], + array $options = [] + ) { + $this->receivedFuncCalls[] = new ReceivedRequest($method, null, $deserialize, $metadata, $options); + if (count($this->responses) < 1) { + throw new UnderflowException("ran out of responses"); + } + list($response, $status) = array_shift($this->responses); + $call = new MockClientStreamingCall($response, $deserialize, $status); + $this->callObjects[] = $call; + return $call; + } + + /** + * Overrides the _serverStreamRequest method in \Grpc\BaseStub + * (https://github.com/grpc/grpc/blob/master/src/php/lib/Grpc/BaseStub.php) + * Returns a MockServerStreamingCall object that will stream items from $responses, and return + * a final status of $serverStreamingStatus. + * + * @param string $method The name of the method to call + * @param \Google\Protobuf\Internal\Message $argument The argument to the method + * @param callable $deserialize A function that deserializes the responses + * @param array $metadata A metadata map to send to the server + * (optional) + * @param array $options An array of options (optional) + * + * @return MockServerStreamingCall The active call object + */ + public function _serverStreamRequest( + $method, + $argument, + $deserialize, + array $metadata = [], + array $options = [] + ) { + + if (is_a($argument, '\Google\Protobuf\Internal\Message')) { + /** @var Message $newArgument */ + $newArgument = new $argument(); + $newArgument->mergeFromString($argument->serializeToString()); + $argument = $newArgument; + } + $this->receivedFuncCalls[] = new ReceivedRequest($method, $argument, $deserialize, $metadata, $options); + $responses = self::stripStatusFromResponses($this->responses); + $this->responses = []; + $call = new MockServerStreamingCall($responses, $deserialize, $this->serverStreamingStatus); + $this->callObjects[] = $call; + return $call; + } + + /** + * Overrides the _bidiRequest method in \Grpc\BaseStub + * (https://github.com/grpc/grpc/blob/master/src/php/lib/Grpc/BaseStub.php) + * Returns a MockBidiStreamingCall object that will stream items from $responses, and return + * a final status of $serverStreamingStatus. + * + * @param string $method The name of the method to call + * @param callable $deserialize A function that deserializes the responses + * @param array $metadata A metadata map to send to the server + * (optional) + * @param array $options An array of options (optional) + * + * @return MockBidiStreamingCall The active call object + */ + public function _bidiRequest( + $method, + $deserialize, + array $metadata = [], + array $options = [] + ) { + + $this->receivedFuncCalls[] = new ReceivedRequest($method, null, $deserialize, $metadata, $options); + $responses = self::stripStatusFromResponses($this->responses); + $this->responses = []; + $call = new MockBidiStreamingCall($responses, $deserialize, $this->serverStreamingStatus); + $this->callObjects[] = $call; + return $call; + } + + public static function stripStatusFromResponses($responses) + { + $strippedResponses = []; + foreach ($responses as $response) { + list($resp, $_) = $response; + $strippedResponses[] = $resp; + } + return $strippedResponses; + } + + /** + * Add a response object, and an optional status, to the list of responses to be returned via + * _simpleRequest. + * @param \Google\Protobuf\Internal\Message $response + * @param stdClass $status + */ + public function addResponse($response, stdClass $status = null) + { + if (!$this->deserialize && $response) { + $this->deserialize = [get_class($response), 'decode']; + } + + if (is_a($response, '\Google\Protobuf\Internal\Message')) { + $response = $response->serializeToString(); + } + $this->responses[] = [$response, $status]; + } + + /** + * Set the status object to be used when creating streaming calls. + * + * @param stdClass $status + */ + public function setStreamingStatus(stdClass $status) + { + $this->serverStreamingStatus = $status; + } + + /** + * Return a list of calls made to _simpleRequest, and clear $receivedFuncCalls. + * + * @return ReceivedRequest[] An array of received requests + */ + public function popReceivedCalls() + { + $receivedFuncCallsTemp = $this->receivedFuncCalls; + $this->receivedFuncCalls = []; + return $receivedFuncCallsTemp; + } + + /** + * @return int The number of calls received. + */ + public function getReceivedCallCount() + { + return count($this->receivedFuncCalls); + } + + /** + * @return mixed[] The call objects created by calls to the stub + */ + public function popCallObjects() + { + $callObjectsTemp = $this->callObjects; + $this->callObjects = []; + return $callObjectsTemp; + } + + /** + * @return bool True if $receivedFuncCalls and $response are empty. + */ + public function isExhausted() + { + return count($this->receivedFuncCalls) === 0 + && count($this->responses) === 0; + } + + /** + * @param mixed $responseObject + * @param stdClass|null $status + * @param callable $deserialize + * @return static An instance of the current class type. + */ + public static function create($responseObject, stdClass $status = null, callable $deserialize = null) + { + $stub = new static($deserialize); // @phpstan-ignore-line + $stub->addResponse($responseObject, $status); + return $stub; + } + + /** + * Creates a sequence such that the responses are returned in order. + * @param mixed[] $sequence + * @param callable $deserialize + * @param stdClass $finalStatus + * @return static An instance of the current class type. + */ + public static function createWithResponseSequence(array $sequence, callable $deserialize = null, stdClass $finalStatus = null) + { + $stub = new static($deserialize); // @phpstan-ignore-line + foreach ($sequence as $elem) { + if (count($elem) == 1) { + list($resp, $status) = [$elem, null]; + } else { + list($resp, $status) = $elem; + } + $stub->addResponse($resp, $status); + } + if ($finalStatus) { + $stub->setStreamingStatus($finalStatus); + } + return $stub; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockTransport.php b/lib/Google/vendor/google/gax/src/Testing/MockTransport.php new file mode 100644 index 000000000..333cb0b51 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockTransport.php @@ -0,0 +1,114 @@ +agentHeaderDescriptor = $agentHeaderDescriptor; + } + + public function startUnaryCall(Call $call, array $options) + { + $call = call_user_func([$this, $call->getMethod()], $call, $options); + return $promise = new Promise( + function () use ($call, &$promise) { + list($response, $status) = $call->wait(); + + if ($status->code == Code::OK) { + $promise->resolve($response); + } else { + throw ApiException::createFromStdClass($status); + } + }, + [$call, 'cancel'] + ); + } + + public function startBidiStreamingCall(Call $call, array $options) + { + $newArgs = ['/' . $call->getMethod(), $this->deserialize, $options, $options]; + $response = $this->_bidiRequest(...$newArgs); + return new BidiStream($response, $call->getDescriptor()); + } + + public function startClientStreamingCall(Call $call, array $options) + { + $newArgs = ['/' . $call->getMethod(), $this->deserialize, $options, $options]; + $response = $this->_clientStreamRequest(...$newArgs); + return new ClientStream($response, $call->getDescriptor()); + } + + public function startServerStreamingCall(Call $call, array $options) + { + $newArgs = ['/' . $call->getMethod(), $call->getMessage(), $this->deserialize, $options, $options]; + $response = $this->_serverStreamRequest(...$newArgs); + return new ServerStream($response, $call->getDescriptor()); + } + + public function __call(string $name, array $arguments) + { + $call = $arguments[0]; + $options = $arguments[1]; + $decode = $call->getDecodeType() ? [$call->getDecodeType(), 'decode'] : null; + return $this->_simpleRequest( + '/' . $call->getMethod(), + $call->getMessage(), + $decode, + isset($options['headers']) ? $options['headers'] : [], + $options + ); + } + + public function close() + { + // does nothing + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/MockUnaryCall.php b/lib/Google/vendor/google/gax/src/Testing/MockUnaryCall.php new file mode 100644 index 000000000..99afce996 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/MockUnaryCall.php @@ -0,0 +1,83 @@ +response = $response; + $this->deserialize = $deserialize; + if (is_null($status)) { + $status = new MockStatus(Code::OK); + } + $this->status = $status; + } + + /** + * Immediately return the preset response object and status. + * @return array The response object and status. + */ + public function wait() + { + return [ + $this->deserializeMessage($this->response, $this->deserialize), + $this->status, + ]; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/ProtobufGPBEmptyComparator.php b/lib/Google/vendor/google/gax/src/Testing/ProtobufGPBEmptyComparator.php new file mode 100644 index 000000000..834a7f91a --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/ProtobufGPBEmptyComparator.php @@ -0,0 +1,61 @@ +exporter = new MessageAwareExporter(); + } + + /** + * Returns whether the comparator can compare two values. + * + * @param mixed $expected The first value to compare + * @param mixed $actual The second value to compare + * @return boolean + */ + public function accepts($expected, $actual) + { + return $expected instanceof Message && $actual instanceof Message; + } + + /** + * Asserts that two values are equal. + * + * @param Message $expected The first value to compare + * @param Message $actual The second value to compare + * @param float|int $delta The allowed numerical distance between two values to + * consider them equal + * @param bool $canonicalize If set to TRUE, arrays are sorted before + * comparison + * @param bool $ignoreCase If set to TRUE, upper- and lowercasing is + * ignored when comparing string values + * @throws ComparisonFailure Thrown when the comparison + * fails. Contains information about the + * specific errors that lead to the failure. + */ + public function assertEquals($expected, $actual, $delta = 0, $canonicalize = FALSE, $ignoreCase = FALSE) + { + if ($expected->serializeToString() !== $actual->serializeToString()) { + throw new ComparisonFailure( + $expected, + $actual, + $this->exporter->shortenedExport($expected), + $this->exporter->shortenedExport($actual), + false, + 'Given 2 Message objects are not the same' + ); + } + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/ReceivedRequest.php b/lib/Google/vendor/google/gax/src/Testing/ReceivedRequest.php new file mode 100644 index 000000000..97cc1d271 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/ReceivedRequest.php @@ -0,0 +1,79 @@ +actualCall = [ + 'funcCall' => $funcCall, + 'request' => $requestObject, + 'deserialize' => $deserialize, + 'metadata' => $metadata, + 'options' => $options, + ]; + } + + public function getArray() + { + return $this->actualCall; + } + + public function getFuncCall() + { + return $this->actualCall['funcCall']; + } + + public function getRequestObject() + { + return $this->actualCall['request']; + } + + public function getMetadata() + { + return $this->actualCall['metadata']; + } + + public function getOptions() + { + return $this->actualCall['options']; + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/SerializationTrait.php b/lib/Google/vendor/google/gax/src/Testing/SerializationTrait.php new file mode 100644 index 000000000..c703f0dea --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/SerializationTrait.php @@ -0,0 +1,72 @@ +$deserializeFunc($message); + } elseif (is_string($message)) { + $obj->mergeFromString($message); + } + + return $obj; + } + + // Protobuf-PHP implementation + return call_user_func($deserialize, $message); + } +} diff --git a/lib/Google/vendor/google/gax/src/Testing/mocks.proto b/lib/Google/vendor/google/gax/src/Testing/mocks.proto new file mode 100644 index 000000000..314f13139 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Testing/mocks.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; + +package google.apicore.testing; + +import "google/protobuf/field_mask.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/struct.proto"; +import "google/protobuf/wrappers.proto"; + +option php_namespace = "Google\\ApiCore\\Testing"; +option php_metadata_namespace = "GPBMetadata\\ApiCore\\Testing"; + +message MockRequest { + string page_token = 1; + uint64 page_size = 2; +} + +message MockResponse { + string name = 1; + uint64 number = 2; + repeated string resources_list = 3; + string next_page_token = 4; + map resources_map = 5; +} + +message MockRequestBody { + string name = 1; + uint64 number = 2; + repeated string repeated_field = 3; + MockRequestBody nested_message = 4; + google.protobuf.BytesValue bytes_value = 5; + google.protobuf.Duration duration_value = 6; + google.protobuf.FieldMask field_mask = 7; + google.protobuf.Int64Value int64_value = 8; + google.protobuf.ListValue list_value = 9; + google.protobuf.StringValue string_value = 10; + google.protobuf.Struct struct_value = 11; + google.protobuf.Timestamp timestamp_value = 12; + google.protobuf.Value value_value = 13; + oneof oneof_field { + string field_1 = 14; + string field_2 = 15; + string field_3 = 16; + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingCall.php b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingCall.php new file mode 100644 index 000000000..2ec4f73fc --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingCall.php @@ -0,0 +1,90 @@ +innerCall = $innerCall; + } + + /** + * @return mixed The metadata sent by the server + */ + public function getMetadata() + { + return $this->innerCall->getMetadata(); + } + + /** + * @return mixed The trailing metadata sent by the server + */ + public function getTrailingMetadata() + { + return $this->innerCall->getTrailingMetadata(); + } + + /** + * @return string The URI of the endpoint + */ + public function getPeer() + { + return $this->innerCall->getPeer(); + } + + /** + * Cancels the call. + */ + public function cancel() + { + $this->innerCall->cancel(); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingServerStreamingCall.php b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingServerStreamingCall.php new file mode 100644 index 000000000..10e4ee706 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingServerStreamingCall.php @@ -0,0 +1,65 @@ +innerCall->responses(); + } + + /** + * Wait for the server to send the status, and return it. + * + * @return \stdClass The status object, with integer $code, string + * $details, and array $metadata members + */ + public function getStatus() + { + return $this->innerCall->getStatus(); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingUnaryCall.php b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingUnaryCall.php new file mode 100644 index 000000000..81b00646d --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Grpc/ForwardingUnaryCall.php @@ -0,0 +1,56 @@ +innerCall->wait(); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Grpc/ServerStreamingCallWrapper.php b/lib/Google/vendor/google/gax/src/Transport/Grpc/ServerStreamingCallWrapper.php new file mode 100644 index 000000000..bdf49d624 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Grpc/ServerStreamingCallWrapper.php @@ -0,0 +1,123 @@ +stream = $stream; + } + + /** + * {@inheritdoc} + */ + public function start($data, array $metadata = [], array $callOptions = []) + { + $this->stream->start($data, $metadata, $callOptions); + } + + /** + * {@inheritdoc} + */ + public function responses() + { + foreach ($this->stream->responses() as $response) { + yield $response; + } + } + + /** + * {@inheritdoc} + */ + public function getStatus() + { + return $this->stream->getStatus(); + } + + /** + * {@inheritdoc} + */ + public function getMetadata() + { + return $this->stream->getMetadata(); + } + + /** + * {@inheritdoc} + */ + public function getTrailingMetadata() + { + return $this->stream->getTrailingMetadata(); + } + + /** + * {@inheritdoc} + */ + public function getPeer() + { + return $this->stream->getPeer(); + } + + /** + * {@inheritdoc} + */ + public function cancel() + { + $this->stream->cancel(); + } + + /** + * {@inheritdoc} + */ + public function setCallCredentials($call_credentials) + { + $this->stream->setCallCredentials($call_credentials); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Grpc/UnaryInterceptorInterface.php b/lib/Google/vendor/google/gax/src/Transport/Grpc/UnaryInterceptorInterface.php new file mode 100644 index 000000000..fa510ea39 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Grpc/UnaryInterceptorInterface.php @@ -0,0 +1,61 @@ +baseUri = $baseUri; + $this->httpHandler = $httpHandler; + $this->transportName = 'grpc-fallback'; + } + + /** + * Builds a GrpcFallbackTransport. + * + * @param string $apiEndpoint + * The address of the API remote host, for example "example.googleapis.com". + * @param array $config { + * Config options used to construct the grpc-fallback transport. + * + * @type callable $httpHandler A handler used to deliver PSR-7 requests. + * } + * @return GrpcFallbackTransport + * @throws ValidationException + */ + public static function build(string $apiEndpoint, array $config = []) + { + $config += [ + 'httpHandler' => null, + 'clientCertSource' => null, + ]; + list($baseUri, $port) = self::normalizeServiceAddress($apiEndpoint); + $httpHandler = $config['httpHandler'] ?: self::buildHttpHandlerAsync(); + $transport = new GrpcFallbackTransport("$baseUri:$port", $httpHandler); + if ($config['clientCertSource']) { + $transport->configureMtlsChannel($config['clientCertSource']); + } + return $transport; + } + + /** + * {@inheritdoc} + */ + public function startUnaryCall(Call $call, array $options) + { + $httpHandler = $this->httpHandler; + return $httpHandler( + $this->buildRequest($call, $options), + $this->getCallOptions($options) + )->then( + function (ResponseInterface $response) use ($options) { + if (isset($options['metadataCallback'])) { + $metadataCallback = $options['metadataCallback']; + $metadataCallback($response->getHeaders()); + } + return $response; + } + )->then( + function (ResponseInterface $response) use ($call) { + return $this->unpackResponse($call, $response); + }, + function (\Exception $ex) { + throw $this->transformException($ex); + } + ); + } + + /** + * @param Call $call + * @param array $options + * @return RequestInterface + */ + private function buildRequest(Call $call, array $options) + { + // Build common headers and set the content type to 'application/x-protobuf' + $headers = ['Content-Type' => 'application/x-protobuf'] + self::buildCommonHeaders($options); + + // It is necessary to supply 'grpc-web' in the 'x-goog-api-client' header + // when using the grpc-fallback protocol. + $headers += ['x-goog-api-client' => []]; + $headers['x-goog-api-client'][] = 'grpc-web'; + + // Uri format: https:///$rpc/ + $uri = "https://{$this->baseUri}/\$rpc/{$call->getMethod()}"; + + return new Request( + 'POST', + $uri, + $headers, + $call->getMessage()->serializeToString() + ); + } + + /** + * @param Call $call + * @param ResponseInterface $response + * @return Message + */ + private function unpackResponse(Call $call, ResponseInterface $response) + { + $decodeType = $call->getDecodeType(); + /** @var Message $responseMessage */ + $responseMessage = new $decodeType; + $responseMessage->mergeFromString((string)$response->getBody()); + return $responseMessage; + } + + /** + * @param array $options + * @return array + */ + private function getCallOptions(array $options) + { + $callOptions = $options['transportOptions']['grpcFallbackOptions'] ?? []; + + if (isset($options['timeoutMillis'])) { + $callOptions['timeout'] = $options['timeoutMillis'] / 1000; + } + + if ($this->clientCertSource) { + list($cert, $key) = self::loadClientCertSource($this->clientCertSource); + $callOptions['cert'] = $cert; + $callOptions['key'] = $key; + } + + return $callOptions; + } + + /** + * @param \Exception $ex + * @return \Exception + */ + private function transformException(\Exception $ex) + { + if ($ex instanceof RequestException && $ex->hasResponse()) { + $res = $ex->getResponse(); + $body = (string) $res->getBody(); + $status = new Status(); + try { + $status->mergeFromString($body); + return ApiException::createFromRpcStatus($status); + } catch (\Exception $parseException) { + // We were unable to parse the response body into a $status object. Instead, + // create an ApiException using the unparsed $body as message. + $code = ApiStatus::rpcCodeFromHttpStatusCode($res->getStatusCode()); + return ApiException::createFromApiResponse($body, $code, null, $parseException); + } + } else { + return $ex; + } + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/GrpcTransport.php b/lib/Google/vendor/google/gax/src/Transport/GrpcTransport.php new file mode 100644 index 000000000..3bc3328e8 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/GrpcTransport.php @@ -0,0 +1,286 @@ + [], + 'channel' => null, + 'interceptors' => [], + 'clientCertSource' => null, + ]; + list($addr, $port) = self::normalizeServiceAddress($apiEndpoint); + $host = "$addr:$port"; + $stubOpts = $config['stubOpts']; + // Set the required 'credentials' key in stubOpts if it is not already set. Use + // array_key_exists because null is a valid value. + if (!array_key_exists('credentials', $stubOpts)) { + if (isset($config['clientCertSource'])) { + list($cert, $key) = self::loadClientCertSource($config['clientCertSource']); + $stubOpts['credentials'] = ChannelCredentials::createSsl(null, $key, $cert); + } else { + $stubOpts['credentials'] = ChannelCredentials::createSsl(); + } + } + $channel = $config['channel']; + if (!is_null($channel) && !($channel instanceof Channel)) { + throw new ValidationException( + "Channel argument to GrpcTransport must be of type \Grpc\Channel, " . + "instead got: " . print_r($channel, true) + ); + } + try { + return new GrpcTransport($host, $stubOpts, $channel, $config['interceptors']); + } catch (Exception $ex) { + throw new ValidationException( + "Failed to build GrpcTransport: " . $ex->getMessage(), + $ex->getCode(), + $ex + ); + } + } + + /** + * {@inheritdoc} + */ + public function startBidiStreamingCall(Call $call, array $options) + { + $this->verifyUniverseDomain($options); + + return new BidiStream( + $this->_bidiRequest( + '/' . $call->getMethod(), + [$call->getDecodeType(), 'decode'], + isset($options['headers']) ? $options['headers'] : [], + $this->getCallOptions($options) + ), + $call->getDescriptor() + ); + } + + /** + * {@inheritdoc} + */ + public function startClientStreamingCall(Call $call, array $options) + { + + $this->verifyUniverseDomain($options); + + return new ClientStream( + $this->_clientStreamRequest( + '/' . $call->getMethod(), + [$call->getDecodeType(), 'decode'], + isset($options['headers']) ? $options['headers'] : [], + $this->getCallOptions($options) + ), + $call->getDescriptor() + ); + } + + /** + * {@inheritdoc} + */ + public function startServerStreamingCall(Call $call, array $options) + { + $this->verifyUniverseDomain($options); + + $message = $call->getMessage(); + + if (!$message) { + throw new \InvalidArgumentException('A message is required for ServerStreaming calls.'); + } + + // This simultaenously creates and starts a \Grpc\ServerStreamingCall. + $stream = $this->_serverStreamRequest( + '/' . $call->getMethod(), + $message, + [$call->getDecodeType(), 'decode'], + isset($options['headers']) ? $options['headers'] : [], + $this->getCallOptions($options) + ); + return new ServerStream( + new ServerStreamingCallWrapper($stream), + $call->getDescriptor() + ); + } + + /** + * {@inheritdoc} + */ + public function startUnaryCall(Call $call, array $options) + { + $this->verifyUniverseDomain($options); + + $unaryCall = $this->_simpleRequest( + '/' . $call->getMethod(), + $call->getMessage(), + [$call->getDecodeType(), 'decode'], + isset($options['headers']) ? $options['headers'] : [], + $this->getCallOptions($options) + ); + + /** @var Promise $promise */ + $promise = new Promise( + function () use ($unaryCall, $options, &$promise) { + list($response, $status) = $unaryCall->wait(); + + if ($status->code == Code::OK) { + if (isset($options['metadataCallback'])) { + $metadataCallback = $options['metadataCallback']; + $metadataCallback($unaryCall->getMetadata()); + } + $promise->resolve($response); + } else { + throw ApiException::createFromStdClass($status); + } + }, + [$unaryCall, 'cancel'] + ); + + return $promise; + } + + private function verifyUniverseDomain(array $options) + { + if (isset($options['credentialsWrapper'])) { + $options['credentialsWrapper']->checkUniverseDomain(); + } + } + + private function getCallOptions(array $options) + { + $callOptions = $options['transportOptions']['grpcOptions'] ?? []; + + if (isset($options['credentialsWrapper'])) { + $audience = $options['audience'] ?? null; + $credentialsWrapper = $options['credentialsWrapper']; + $callOptions['call_credentials_callback'] = $credentialsWrapper + ->getAuthorizationHeaderCallback($audience); + } + + if (isset($options['timeoutMillis'])) { + $callOptions['timeout'] = $options['timeoutMillis'] * 1000; + } + + return $callOptions; + } + + private static function loadClientCertSource(callable $clientCertSource) + { + return call_user_func($clientCertSource); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/HttpUnaryTransportTrait.php b/lib/Google/vendor/google/gax/src/Transport/HttpUnaryTransportTrait.php new file mode 100644 index 000000000..1bcc686b5 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/HttpUnaryTransportTrait.php @@ -0,0 +1,170 @@ +throwUnsupportedException(); + } + + /** + * {@inheritdoc} + * @return never + * @throws \BadMethodCallException + */ + public function startServerStreamingCall(Call $call, array $options) + { + $this->throwUnsupportedException(); + } + + /** + * {@inheritdoc} + * @return never + * @throws \BadMethodCallException + */ + public function startBidiStreamingCall(Call $call, array $options) + { + $this->throwUnsupportedException(); + } + + /** + * {@inheritdoc} + */ + public function close() + { + // Nothing to do. + } + + /** + * @param array $options + * @return array + */ + private static function buildCommonHeaders(array $options) + { + $headers = $options['headers'] ?? []; + + if (!is_array($headers)) { + throw new \InvalidArgumentException( + 'The "headers" option must be an array' + ); + } + + // If not already set, add an auth header to the request + if (!isset($headers['Authorization']) && isset($options['credentialsWrapper'])) { + $credentialsWrapper = $options['credentialsWrapper']; + $audience = $options['audience'] ?? null; + $callback = $credentialsWrapper + ->getAuthorizationHeaderCallback($audience); + // Prevent unexpected behavior, as the authorization header callback + // uses lowercase "authorization" + unset($headers['authorization']); + // Mitigate scenario where InsecureCredentialsWrapper returns null. + $authHeaders = empty($callback) ? [] : $callback(); + if (!is_array($authHeaders)) { + throw new \UnexpectedValueException( + 'Expected array response from authorization header callback' + ); + } + $headers += $authHeaders; + } + + return $headers; + } + + /** + * @return callable + * @throws ValidationException + */ + private static function buildHttpHandlerAsync() + { + try { + return [HttpHandlerFactory::build(), 'async']; + } catch (Exception $ex) { + throw new ValidationException("Failed to build HttpHandler", $ex->getCode(), $ex); + } + } + + /** + * Set the path to a client certificate. + * + * @param callable $clientCertSource + */ + private function configureMtlsChannel(callable $clientCertSource) + { + $this->clientCertSource = $clientCertSource; + } + + /** + * @return never + * @throws \BadMethodCallException + */ + private function throwUnsupportedException() + { + throw new \BadMethodCallException( + "Streaming calls are not supported while using the {$this->transportName} transport." + ); + } + + private static function loadClientCertSource(callable $clientCertSource) + { + $certFile = tempnam(sys_get_temp_dir(), 'cert'); + $keyFile = tempnam(sys_get_temp_dir(), 'key'); + list($cert, $key) = call_user_func($clientCertSource); + file_put_contents($certFile, $cert); + file_put_contents($keyFile, $key); + + // the key and the cert are returned in one temporary file + return [$certFile, $keyFile]; + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Rest/JsonStreamDecoder.php b/lib/Google/vendor/google/gax/src/Transport/Rest/JsonStreamDecoder.php new file mode 100644 index 000000000..b173cf3a1 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Rest/JsonStreamDecoder.php @@ -0,0 +1,238 @@ + $options { + * An array of optional arguments. + * + * @type bool $ignoreUnknown + * Toggles whether or not to throw an exception when an unknown field + * is encountered in a response message. The default is true. + * @type int $readChunkSizeBytes + * The upper size limit in bytes that can be read at a time from the + * response stream. The default is 1 KB. + * } + * + * @experimental + */ + public function __construct(StreamInterface $stream, string $decodeType, array $options = []) + { + $this->stream = $stream; + $this->decodeType = $decodeType; + + if (isset($options['ignoreUnknown'])) { + $this->ignoreUnknown = $options['ignoreUnknown']; + } + if (isset($options['readChunkSize'])) { + $this->readChunkSize = $options['readChunkSizeBytes']; + } + } + + /** + * Begins decoding the configured response stream. It is a generator which + * yields messages of the given decode type from the stream until the stream + * completes. Throws an Exception if the stream is closed before the closing + * byte is read or if it encounters an error while decoding a message. + * + * @throws RuntimeException + * @return \Generator + */ + public function decode() + { + try { + foreach ($this->_decode() as $response) { + yield $response; + } + } catch (RuntimeException $re) { + $msg = $re->getMessage(); + $streamClosedException = + strpos($msg, 'Stream is detached') !== false || + strpos($msg, 'Unexpected stream close') !== false; + + // Only throw the exception if close() was not called and it was not + // a closing-related exception. + if (!$this->closeCalled || !$streamClosedException) { + throw $re; + } + } + } + + /** + * @return \Generator + */ + private function _decode() + { + $decodeType = $this->decodeType; + $str = false; + $prev = $chunk = ''; + $start = $end = $cursor = $level = 0; + while ($chunk !== '' || !$this->stream->eof()) { + // Read up to $readChunkSize bytes from the stream. + $chunk .= $this->stream->read($this->readChunkSize); + + // If the response stream has been closed and the only byte + // remaining is the closing array bracket, we are done. + if ($this->stream->eof() && $chunk === ']') { + $level--; + break; + } + + // Parse the freshly read data available in $chunk. + $chunkLength = strlen($chunk); + while ($cursor < $chunkLength) { + // Access the next byte for processing. + $b = $chunk[$cursor]; + + // Track open/close double quotes of a key or value. Do not + // toggle flag with the pervious byte was an escape character. + if ($b === '"' && $prev !== self::ESCAPE_CHAR) { + $str = !$str; + } + + // Skip over new lines that break up items. + if ($b === "\n" && $level === 1) { + $start++; + } + + // Ignore commas separating messages in the stream array. + if ($b === ',' && $level === 1) { + $start++; + } + // Track the opening of a new array or object if not in a string + // value. + if (($b === '{' || $b === '[') && !$str) { + $level++; + // Opening of the array/root object. + // Do not include it in the messageBuffer. + if ($level === 1) { + $start++; + } + } + // Track the closing of an object if not in a string value. + if ($b === '}' && !$str) { + $level--; + if ($level === 1) { + $end = $cursor+1; + } + } + // Track the closing of an array if not in a string value. + if ($b === ']' && !$str) { + $level--; + // If we are seeing a closing square bracket at the + // response message level, e.g. {"foo], there is a problem. + if ($level === 1) { + throw new \RuntimeException('Received closing byte mid-message'); + } + } + + // A message-closing byte was just buffered. Decode the + // message with the decode type, clearing the messageBuffer, + // and yield it. + // + // TODO(noahdietz): Support google.protobuf.*Value messages that + // are encoded as primitives and separated by commas. + if ($end !== 0) { + $length = $end - $start; + /** @var \Google\Protobuf\Internal\Message $return */ + $return = new $decodeType(); + $return->mergeFromJsonString( + substr($chunk, $start, $length), + $this->ignoreUnknown + ); + yield $return; + + // Dump the part of the chunk used for parsing the message + // and use the remaining for the next message. + $remaining = $chunkLength-$length; + $chunk = substr($chunk, $end, $remaining); + + // Reset all indices and exit chunk processing. + $start = 0; + $end = 0; + $cursor = 0; + break; + } + + $cursor++; + + // An escaped back slash should not escape the following character. + if ($b === self::ESCAPE_CHAR && $prev === self::ESCAPE_CHAR) { + $b = ''; + } + $prev = $b; + } + // If after attempting to process the chunk, no progress was made and the + // stream is closed, we must break as the stream has closed prematurely. + if ($cursor === $chunkLength && $this->stream->eof()) { + break; + } + } + if ($level > 0) { + throw new \RuntimeException('Unexpected stream close before receiving the closing byte'); + } + } + + /** + * Closes the underlying stream. If the stream is actively being decoded, an + * exception will not be thrown due to the interruption. + * + * @return void + */ + public function close() + { + $this->closeCalled = true; + $this->stream->close(); + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/Rest/RestServerStreamingCall.php b/lib/Google/vendor/google/gax/src/Transport/Rest/RestServerStreamingCall.php new file mode 100644 index 000000000..35d796199 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/Rest/RestServerStreamingCall.php @@ -0,0 +1,197 @@ + */ + private array $decoderOptions; + + private RequestInterface $originalRequest; + private ?JsonStreamDecoder $decoder; + private string $decodeType; + private ?ResponseInterface $response; + private stdClass $status; + + /** + * @param callable $httpHandler + * @param string $decodeType + * @param array $decoderOptions + */ + public function __construct(callable $httpHandler, string $decodeType, array $decoderOptions) + { + $this->httpHandler = $httpHandler; + $this->decodeType = $decodeType; + $this->decoderOptions = $decoderOptions; + } + + /** + * {@inheritdoc} + */ + public function start($request, array $headers = [], array $callOptions = []) + { + $this->originalRequest = $this->appendHeaders($request, $headers); + + try { + $handler = $this->httpHandler; + $response = $handler( + $this->originalRequest, + $callOptions + )->wait(); + } catch (\Exception $ex) { + if ($ex instanceof RequestException && $ex->hasResponse()) { + $ex = ApiException::createFromRequestException($ex, /* isStream */ true); + } + throw $ex; + } + + // Create an OK Status for a successful request just so that it + // has a return value. + $this->status = new stdClass(); + $this->status->code = Code::OK; + $this->status->message = ApiStatus::OK; + $this->status->details = []; + + $this->response = $response; + } + + /** + * @param RequestInterface $request + * @param array $headers + * @return RequestInterface + */ + private function appendHeaders(RequestInterface $request, array $headers) + { + foreach ($headers as $key => $value) { + $request = $request->hasHeader($key) ? + $request->withAddedHeader($key, $value) : + $request->withHeader($key, $value); + } + + return $request; + } + + /** + * {@inheritdoc} + */ + public function responses() + { + if (is_null($this->response)) { + throw new \Exception('Stream has not been started.'); + } + + // Decode the stream and yield responses as they are read. + $this->decoder = new JsonStreamDecoder( + $this->response->getBody(), + $this->decodeType, + $this->decoderOptions + ); + + foreach ($this->decoder->decode() as $message) { + yield $message; + } + } + + /** + * Return the status of the server stream. If the call has not been started + * this will be null. + * + * @return stdClass The status, with integer $code, string + * $details, and array $metadata members + */ + public function getStatus() + { + return $this->status; + } + + /** + * {@inheritdoc} + */ + public function getMetadata() + { + return is_null($this->response) ? null : $this->response->getHeaders(); + } + + /** + * The Rest transport does not support trailing metadata. This is a + * passthrough to getMetadata(). + */ + public function getTrailingMetadata() + { + return $this->getMetadata(); + } + + /** + * {@inheritdoc} + */ + public function getPeer() + { + return $this->originalRequest->getUri(); + } + + /** + * {@inheritdoc} + */ + public function cancel() + { + if (!is_null($this->decoder)) { + $this->decoder->close(); + } + } + + /** + * For the REST transport this is a no-op. + * {@inheritdoc} + */ + public function setCallCredentials($call_credentials) + { + // Do nothing. + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/RestTransport.php b/lib/Google/vendor/google/gax/src/Transport/RestTransport.php new file mode 100644 index 000000000..294879807 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/RestTransport.php @@ -0,0 +1,267 @@ +requestBuilder = $requestBuilder; + $this->httpHandler = $httpHandler; + $this->transportName = 'REST'; + } + + /** + * Builds a RestTransport. + * + * @param string $apiEndpoint + * The address of the API remote host, for example "example.googleapis.com". + * @param string $restConfigPath + * Path to rest config file. + * @param array $config { + * Config options used to construct the gRPC transport. + * + * @type callable $httpHandler A handler used to deliver PSR-7 requests. + * @type callable $clientCertSource A callable which returns the client cert as a string. + * } + * @return RestTransport + * @throws ValidationException + */ + public static function build(string $apiEndpoint, string $restConfigPath, array $config = []) + { + $config += [ + 'httpHandler' => null, + 'clientCertSource' => null, + ]; + list($baseUri, $port) = self::normalizeServiceAddress($apiEndpoint); + $requestBuilder = new RequestBuilder("$baseUri:$port", $restConfigPath); + $httpHandler = $config['httpHandler'] ?: self::buildHttpHandlerAsync(); + $transport = new RestTransport($requestBuilder, $httpHandler); + if ($config['clientCertSource']) { + $transport->configureMtlsChannel($config['clientCertSource']); + } + return $transport; + } + + /** + * {@inheritdoc} + */ + public function startUnaryCall(Call $call, array $options) + { + $headers = self::buildCommonHeaders($options); + + // call the HTTP handler + $httpHandler = $this->httpHandler; + return $httpHandler( + $this->requestBuilder->build( + $call->getMethod(), + $call->getMessage(), + $headers + ), + $this->getCallOptions($options) + )->then( + function (ResponseInterface $response) use ($call, $options) { + $decodeType = $call->getDecodeType(); + /** @var Message $return */ + $return = new $decodeType; + $body = (string) $response->getBody(); + + // In some rare cases LRO response metadata may not be loaded + // in the descriptor pool, triggering an exception. The catch + // statement handles this case and attempts to add the LRO + // metadata type to the pool by directly instantiating the + // metadata class. + try { + $return->mergeFromJsonString( + $body, + true + ); + } catch (\Exception $ex) { + if (!isset($options['metadataReturnType'])) { + throw $ex; + } + + if (strpos($ex->getMessage(), 'Error occurred during parsing:') !== 0) { + throw $ex; + } + + new $options['metadataReturnType'](); + $return->mergeFromJsonString( + $body, + true + ); + } + + if (isset($options['metadataCallback'])) { + $metadataCallback = $options['metadataCallback']; + $metadataCallback($response->getHeaders()); + } + + return $return; + }, + function (\Throwable $ex) { + if ($ex instanceof RequestException && $ex->hasResponse()) { + throw ApiException::createFromRequestException($ex); + } + + throw $ex; + } + ); + } + + /** + * {@inheritdoc} + * @throws \BadMethodCallException for forwards compatibility with older GAPIC clients + */ + public function startServerStreamingCall(Call $call, array $options) + { + $message = $call->getMessage(); + if (!$message) { + throw new \InvalidArgumentException('A message is required for ServerStreaming calls.'); + } + + // Maintain forwards compatibility with older GAPIC clients not configured for REST server streaming + // @see https://github.com/googleapis/gax-php/issues/370 + if (!$this->requestBuilder->pathExists($call->getMethod())) { + $this->unsupportedServerStreamingCall($call, $options); + } + + $headers = self::buildCommonHeaders($options); + $callOptions = $this->getCallOptions($options); + $request = $this->requestBuilder->build( + $call->getMethod(), + $call->getMessage() + // Exclude headers here because they will be added in _serverStreamRequest(). + ); + + $decoderOptions = []; + if (isset($options['decoderOptions'])) { + $decoderOptions = $options['decoderOptions']; + } + + return new ServerStream( + $this->_serverStreamRequest( + $this->httpHandler, + $request, + $headers, + $call->getDecodeType(), + $callOptions, + $decoderOptions + ), + $call->getDescriptor() + ); + } + + /** + * Creates and starts a RestServerStreamingCall. + * + * @param callable $httpHandler The HTTP Handler to invoke the request with. + * @param RequestInterface $request The request to invoke. + * @param array $headers The headers to include in the request. + * @param string $decodeType The response stream message type to decode. + * @param array $callOptions The call options to use when making the call. + * @param array $decoderOptions The options to use for the JsonStreamDecoder. + * + * @return RestServerStreamingCall + */ + private function _serverStreamRequest( + $httpHandler, + $request, + $headers, + $decodeType, + $callOptions, + $decoderOptions = [] + ) { + $call = new RestServerStreamingCall( + $httpHandler, + $decodeType, + $decoderOptions + ); + $call->start($request, $headers, $callOptions); + + return $call; + } + + /** + * @param array $options + * + * @return array + */ + private function getCallOptions(array $options) + { + $callOptions = $options['transportOptions']['restOptions'] ?? []; + + if (isset($options['timeoutMillis'])) { + $callOptions['timeout'] = $options['timeoutMillis'] / 1000; + } + + if ($this->clientCertSource) { + list($cert, $key) = self::loadClientCertSource($this->clientCertSource); + $callOptions['cert'] = $cert; + $callOptions['key'] = $key; + } + + return $callOptions; + } +} diff --git a/lib/Google/vendor/google/gax/src/Transport/TransportInterface.php b/lib/Google/vendor/google/gax/src/Transport/TransportInterface.php new file mode 100644 index 000000000..682a43019 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/Transport/TransportInterface.php @@ -0,0 +1,91 @@ + $options + * + * @return BidiStream + */ + public function startBidiStreamingCall(Call $call, array $options); + + /** + * Starts a client streaming call. + * + * @param Call $call + * @param array $options + * + * @return ClientStream + */ + public function startClientStreamingCall(Call $call, array $options); + + /** + * Starts a server streaming call. + * + * @param Call $call + * @param array $options + * + * @return ServerStream + */ + public function startServerStreamingCall(Call $call, array $options); + + /** + * Returns a promise used to execute network requests. + * + * @param Call $call + * @param array $options + * + * @return PromiseInterface + * @throws ValidationException + */ + public function startUnaryCall(Call $call, array $options); + + /** + * Closes the connection, if one exists. + * + * @return void + */ + public function close(); +} diff --git a/lib/Google/vendor/google/gax/src/UriTrait.php b/lib/Google/vendor/google/gax/src/UriTrait.php new file mode 100644 index 000000000..d3fc6aa37 --- /dev/null +++ b/lib/Google/vendor/google/gax/src/UriTrait.php @@ -0,0 +1,69 @@ + &$v) { + if (is_bool($v)) { + $v = $v ? 'true' : 'false'; + } + } + + return Utils::uriFor($uri) + ->withQuery( + Query::build($query) + ); + } +} diff --git a/lib/Google/vendor/google/gax/src/ValidationException.php b/lib/Google/vendor/google/gax/src/ValidationException.php new file mode 100644 index 000000000..27a66a82c --- /dev/null +++ b/lib/Google/vendor/google/gax/src/ValidationException.php @@ -0,0 +1,41 @@ +setRules([ + '@PSR2' => true, + 'concat_space' => ['spacing' => 'one'], + 'no_unused_imports' => true, + 'method_argument_space' => false, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->notPath('firestore') + ->in(__DIR__) + ) +; + diff --git a/lib/Google/vendor/google/grpc-gcp/LICENSE b/lib/Google/vendor/google/grpc-gcp/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/lib/Google/vendor/google/grpc-gcp/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/lib/Google/vendor/google/grpc-gcp/README.md b/lib/Google/vendor/google/grpc-gcp/README.md new file mode 100644 index 000000000..4d49b4e5d --- /dev/null +++ b/lib/Google/vendor/google/grpc-gcp/README.md @@ -0,0 +1,14 @@ +# gRPC for GCP extensions + +Copyright 2018 +[The gRPC Authors](https://github.com/grpc/grpc/blob/master/AUTHORS) + +## About This Repository + +This repo is created to support GCP specific extensions for gRPC. To use the extension features, please refer to [src](src). + +This repo also contains supporting infrastructures such as end2end tests and benchmarks for accessing cloud APIs with gRPC client libraries. + +## License + +Apache 2.0 - See [LICENSE](LICENSE) for more information. diff --git a/lib/Google/vendor/google/grpc-gcp/cloudprober/bins/opt/grpc_php_plugin b/lib/Google/vendor/google/grpc-gcp/cloudprober/bins/opt/grpc_php_plugin new file mode 100755 index 0000000000000000000000000000000000000000..a0e24c9f499d076659083ed2632863bd2aab975b GIT binary patch literal 2295352 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

1&Sxce;5cE_yDZnTa=!8xd&l?#!f4E09!p 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 GWa#e!Do&M-%-4E=PBS@{$-Gd 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 G~mvTm);ku@p87#mr8_4;`{0*d%SG@YutDl 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

-
+
- $migration ) : ?> -
-

- - - domain); ?> - domain); ?> - domain); ?> - -

+ -
-

message; ?>

- -
-
- -
-
-
- +

message; ?>

+ +
+
+
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index e33c38cb5..46a03bf9c 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -43,15 +43,12 @@ 'wpCloud\\StatelessMedia\\Compatibility' => $baseDir . '/lib/classes/class-compatibility.php', 'wpCloud\\StatelessMedia\\CompatibilityWooExtraProductOptions' => $baseDir . '/lib/classes/compatibility/woo-extra-product-options.php', 'wpCloud\\StatelessMedia\\DB' => $baseDir . '/lib/classes/class-db.php', - 'wpCloud\\StatelessMedia\\Divi' => $baseDir . '/lib/classes/compatibility/divi.php', 'wpCloud\\StatelessMedia\\DynamicImageSupport' => $baseDir . '/lib/classes/class-dynamic-image-support.php', 'wpCloud\\StatelessMedia\\EDDDownloadMethod' => $baseDir . '/lib/classes/compatibility/easy-digital-downloads.php', 'wpCloud\\StatelessMedia\\EWWW' => $baseDir . '/lib/classes/compatibility/ewww.php', 'wpCloud\\StatelessMedia\\Errors' => $baseDir . '/lib/classes/class-errors.php', 'wpCloud\\StatelessMedia\\FatalException' => $baseDir . '/lib/classes/exception-fatal.php', 'wpCloud\\StatelessMedia\\GS_Client' => $baseDir . '/lib/classes/class-gs-client.php', - 'wpCloud\\StatelessMedia\\GravityForm' => $baseDir . '/lib/classes/compatibility/gravity-forms.php', - 'wpCloud\\StatelessMedia\\GravityFormSignature' => $baseDir . '/lib/classes/compatibility/gravity-forms-signature.php', 'wpCloud\\StatelessMedia\\Helper' => $baseDir . '/lib/classes/class-helper.php', 'wpCloud\\StatelessMedia\\Imagify' => $baseDir . '/lib/classes/compatibility/imagify.php', 'wpCloud\\StatelessMedia\\LSCacheWP' => $baseDir . '/lib/classes/compatibility/lite-speed-cache.php', @@ -67,6 +64,7 @@ 'wpCloud\\StatelessMedia\\SimpleLocalAvatars' => $baseDir . '/lib/classes/compatibility/simple-local-avatars.php', 'wpCloud\\StatelessMedia\\Singleton' => $baseDir . '/lib/classes/trait-singleton.php', 'wpCloud\\StatelessMedia\\Status' => $baseDir . '/lib/classes/class-status.php', + 'wpCloud\\StatelessMedia\\Status\\GoogleCloudInfo' => $baseDir . '/lib/classes/status/class-info-google_cloud.php', 'wpCloud\\StatelessMedia\\Status\\Info' => $baseDir . '/lib/classes/status/class-info.php', 'wpCloud\\StatelessMedia\\Status\\Migrations' => $baseDir . '/lib/classes/status/class-migrations.php', 'wpCloud\\StatelessMedia\\Status\\StatelessInfo' => $baseDir . '/lib/classes/status/class-info-stateless.php', @@ -86,5 +84,4 @@ 'wpCloud\\StatelessMedia\\WPBakeryPageBuilder' => $baseDir . '/lib/classes/compatibility/wpbakery-page-builder.php', 'wpCloud\\StatelessMedia\\WPForms' => $baseDir . '/lib/classes/compatibility/wpforms.php', 'wpCloud\\StatelessMedia\\WPSmush' => $baseDir . '/lib/classes/compatibility/wp-smush.php', - 'wpCloud\\StatelessMedia\\WooCommerce' => $baseDir . '/lib/classes/compatibility/woocommerce.php', ); diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index 04395796a..1625b1ef0 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -84,15 +84,12 @@ class ComposerStaticInitc59d002476a452800baaf79c430753cb 'wpCloud\\StatelessMedia\\Compatibility' => __DIR__ . '/../..' . '/lib/classes/class-compatibility.php', 'wpCloud\\StatelessMedia\\CompatibilityWooExtraProductOptions' => __DIR__ . '/../..' . '/lib/classes/compatibility/woo-extra-product-options.php', 'wpCloud\\StatelessMedia\\DB' => __DIR__ . '/../..' . '/lib/classes/class-db.php', - 'wpCloud\\StatelessMedia\\Divi' => __DIR__ . '/../..' . '/lib/classes/compatibility/divi.php', 'wpCloud\\StatelessMedia\\DynamicImageSupport' => __DIR__ . '/../..' . '/lib/classes/class-dynamic-image-support.php', 'wpCloud\\StatelessMedia\\EDDDownloadMethod' => __DIR__ . '/../..' . '/lib/classes/compatibility/easy-digital-downloads.php', 'wpCloud\\StatelessMedia\\EWWW' => __DIR__ . '/../..' . '/lib/classes/compatibility/ewww.php', 'wpCloud\\StatelessMedia\\Errors' => __DIR__ . '/../..' . '/lib/classes/class-errors.php', 'wpCloud\\StatelessMedia\\FatalException' => __DIR__ . '/../..' . '/lib/classes/exception-fatal.php', 'wpCloud\\StatelessMedia\\GS_Client' => __DIR__ . '/../..' . '/lib/classes/class-gs-client.php', - 'wpCloud\\StatelessMedia\\GravityForm' => __DIR__ . '/../..' . '/lib/classes/compatibility/gravity-forms.php', - 'wpCloud\\StatelessMedia\\GravityFormSignature' => __DIR__ . '/../..' . '/lib/classes/compatibility/gravity-forms-signature.php', 'wpCloud\\StatelessMedia\\Helper' => __DIR__ . '/../..' . '/lib/classes/class-helper.php', 'wpCloud\\StatelessMedia\\Imagify' => __DIR__ . '/../..' . '/lib/classes/compatibility/imagify.php', 'wpCloud\\StatelessMedia\\LSCacheWP' => __DIR__ . '/../..' . '/lib/classes/compatibility/lite-speed-cache.php', @@ -108,6 +105,7 @@ class ComposerStaticInitc59d002476a452800baaf79c430753cb 'wpCloud\\StatelessMedia\\SimpleLocalAvatars' => __DIR__ . '/../..' . '/lib/classes/compatibility/simple-local-avatars.php', 'wpCloud\\StatelessMedia\\Singleton' => __DIR__ . '/../..' . '/lib/classes/trait-singleton.php', 'wpCloud\\StatelessMedia\\Status' => __DIR__ . '/../..' . '/lib/classes/class-status.php', + 'wpCloud\\StatelessMedia\\Status\\GoogleCloudInfo' => __DIR__ . '/../..' . '/lib/classes/status/class-info-google_cloud.php', 'wpCloud\\StatelessMedia\\Status\\Info' => __DIR__ . '/../..' . '/lib/classes/status/class-info.php', 'wpCloud\\StatelessMedia\\Status\\Migrations' => __DIR__ . '/../..' . '/lib/classes/status/class-migrations.php', 'wpCloud\\StatelessMedia\\Status\\StatelessInfo' => __DIR__ . '/../..' . '/lib/classes/status/class-info-stateless.php', @@ -127,7 +125,6 @@ class ComposerStaticInitc59d002476a452800baaf79c430753cb 'wpCloud\\StatelessMedia\\WPBakeryPageBuilder' => __DIR__ . '/../..' . '/lib/classes/compatibility/wpbakery-page-builder.php', 'wpCloud\\StatelessMedia\\WPForms' => __DIR__ . '/../..' . '/lib/classes/compatibility/wpforms.php', 'wpCloud\\StatelessMedia\\WPSmush' => __DIR__ . '/../..' . '/lib/classes/compatibility/wp-smush.php', - 'wpCloud\\StatelessMedia\\WooCommerce' => __DIR__ . '/../..' . '/lib/classes/compatibility/woocommerce.php', ); public static function getInitializer(ClassLoader $loader) diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index b13ab383b..30493e29a 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -48,41 +48,39 @@ }, { "name": "composer/installers", - "version": "v1.12.0", - "version_normalized": "1.12.0.0", + "version": "v2.3.0", + "version_normalized": "2.3.0.0", "source": { "type": "git", "url": "https://github.com/composer/installers.git", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", - "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", + "url": "https://api.github.com/repos/composer/installers/zipball/12fb2dfe5e16183de69e784a7b84046c43d97e8e", + "reference": "12fb2dfe5e16183de69e784a7b84046c43d97e8e", "shasum": "" }, "require": { - "composer-plugin-api": "^1.0 || ^2.0" - }, - "replace": { - "roundcube/plugin-installer": "*", - "shama/baton": "*" + "composer-plugin-api": "^1.0 || ^2.0", + "php": "^7.2 || ^8.0" }, "require-dev": { - "composer/composer": "1.6.* || ^2.0", - "composer/semver": "^1 || ^3", - "phpstan/phpstan": "^0.12.55", - "phpstan/phpstan-phpunit": "^0.12.16", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.3" - }, - "time": "2021-09-13T08:19:44+00:00", + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "phpstan/phpstan": "^1.11", + "phpstan/phpstan-phpunit": "^1", + "symfony/phpunit-bridge": "^7.1.1", + "symfony/process": "^5 || ^6 || ^7" + }, + "time": "2024-06-24T20:46:46+00:00", "type": "composer-plugin", "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-main": "1.x-dev" - } + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true }, "installation-source": "dist", "autoload": { @@ -104,7 +102,6 @@ "description": "A multi-framework Composer library installer", "homepage": "https://composer.github.io/installers/", "keywords": [ - "Craft", "Dolibarr", "Eliasis", "Hurad", @@ -125,7 +122,6 @@ "Whmcs", "WolfCMS", "agl", - "aimeos", "annotatecms", "attogram", "bitrix", @@ -134,6 +130,7 @@ "cockpit", "codeigniter", "concrete5", + "concreteCMS", "croogo", "dokuwiki", "drupal", @@ -144,7 +141,6 @@ "grav", "installer", "itop", - "joomla", "known", "kohana", "laravel", @@ -153,6 +149,7 @@ "magento", "majima", "mako", + "matomo", "mediawiki", "miaoxing", "modulework", @@ -172,14 +169,16 @@ "silverstripe", "sydes", "sylius", - "symfony", "tastyigniter", - "typo3", "wordpress", "yawik", "zend", "zikula" ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v2.3.0" + }, "funding": [ { "url": "https://packagist.com", @@ -198,27 +197,27 @@ }, { "name": "firebase/php-jwt", - "version": "v6.9.0", - "version_normalized": "6.9.0.0", + "version": "v6.10.1", + "version_normalized": "6.10.1.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11" + "reference": "500501c2ce893c824c801da135d02661199f60c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f03270e63eaccf3019ef0f32849c497385774e11", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/500501c2ce893c824c801da135d02661199f60c5", + "reference": "500501c2ce893c824c801da135d02661199f60c5", "shasum": "" }, "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" }, @@ -226,7 +225,7 @@ "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, - "time": "2023-10-05T00:24:42+00:00", + "time": "2024-05-18T18:05:11+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -258,7 +257,7 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.9.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.1" }, "install-path": "../firebase/php-jwt" }, @@ -346,20 +345,23 @@ }, { "name": "wpmetabox/meta-box", - "version": "5.8.2", - "version_normalized": "5.8.2.0", + "version": "5.10.1", + "version_normalized": "5.10.1.0", "source": { "type": "git", "url": "https://github.com/wpmetabox/meta-box.git", - "reference": "de583a74171bdee1b5213232a5bf50f82c6fee14" + "reference": "6f571c95c2928703509f60de09be9c3d6df8ce0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wpmetabox/meta-box/zipball/de583a74171bdee1b5213232a5bf50f82c6fee14", - "reference": "de583a74171bdee1b5213232a5bf50f82c6fee14", + "url": "https://api.github.com/repos/wpmetabox/meta-box/zipball/6f571c95c2928703509f60de09be9c3d6df8ce0a", + "reference": "6f571c95c2928703509f60de09be9c3d6df8ce0a", "shasum": "" }, - "time": "2023-10-13T13:53:33+00:00", + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "time": "2024-09-07T03:49:09+00:00", "type": "wordpress-plugin", "installation-source": "dist", "autoload": { @@ -392,7 +394,7 @@ ], "support": { "issues": "https://github.com/wpmetabox/meta-box/issues", - "source": "https://github.com/wpmetabox/meta-box/tree/5.8.2" + "source": "https://github.com/wpmetabox/meta-box/tree/5.10.1" }, "install-path": "../wpmetabox/meta-box" } diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 5e93b8ba8..2a8f027aa 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'wpcloud/wp-stateless', 'pretty_version' => 'dev-latest', 'version' => 'dev-latest', - 'reference' => 'eafeb6838583f3d2dad20da1b5493d1981d092b4', + 'reference' => 'd5c85f0a678126bb93d49d18eb6d4bfae8cd189e', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -20,35 +20,23 @@ 'dev_requirement' => false, ), 'composer/installers' => array( - 'pretty_version' => 'v1.12.0', - 'version' => '1.12.0.0', - 'reference' => 'd20a64ed3c94748397ff5973488761b22f6d3f19', + 'pretty_version' => 'v2.3.0', + 'version' => '2.3.0.0', + 'reference' => '12fb2dfe5e16183de69e784a7b84046c43d97e8e', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/./installers', 'aliases' => array(), 'dev_requirement' => false, ), 'firebase/php-jwt' => array( - 'pretty_version' => 'v6.9.0', - 'version' => '6.9.0.0', - 'reference' => 'f03270e63eaccf3019ef0f32849c497385774e11', + 'pretty_version' => 'v6.10.1', + 'version' => '6.10.1.0', + 'reference' => '500501c2ce893c824c801da135d02661199f60c5', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), 'dev_requirement' => false, ), - 'roundcube/plugin-installer' => array( - 'dev_requirement' => false, - 'replaced' => array( - 0 => '*', - ), - ), - 'shama/baton' => array( - 'dev_requirement' => false, - 'replaced' => array( - 0 => '*', - ), - ), 'udx/lib-ud-api-client' => array( 'pretty_version' => '1.2.4', 'version' => '1.2.4.0', @@ -70,16 +58,16 @@ 'wpcloud/wp-stateless' => array( 'pretty_version' => 'dev-latest', 'version' => 'dev-latest', - 'reference' => 'eafeb6838583f3d2dad20da1b5493d1981d092b4', + 'reference' => 'd5c85f0a678126bb93d49d18eb6d4bfae8cd189e', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'wpmetabox/meta-box' => array( - 'pretty_version' => '5.8.2', - 'version' => '5.8.2.0', - 'reference' => 'de583a74171bdee1b5213232a5bf50f82c6fee14', + 'pretty_version' => '5.10.1', + 'version' => '5.10.1.0', + 'reference' => '6f571c95c2928703509f60de09be9c3d6df8ce0a', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../wpmetabox/meta-box', 'aliases' => array(), diff --git a/vendor/composer/installers/.github/workflows/continuous-integration.yml b/vendor/composer/installers/.github/workflows/continuous-integration.yml index 34b8f91fc..2ecae1364 100644 --- a/vendor/composer/installers/.github/workflows/continuous-integration.yml +++ b/vendor/composer/installers/.github/workflows/continuous-integration.yml @@ -8,6 +8,9 @@ env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT: "1" +permissions: + contents: read + jobs: tests: name: "CI" @@ -17,12 +20,6 @@ jobs: strategy: matrix: php-version: - - "5.3" - - "5.4" - - "5.5" - - "5.6" - - "7.0" - - "7.1" - "7.2" - "7.3" - "7.4" @@ -30,7 +27,7 @@ jobs: - "8.1" dependencies: [locked] include: - - php-version: "5.3" + - php-version: "7.2" dependencies: lowest - php-version: "8.1" dependencies: lowest @@ -61,16 +58,8 @@ jobs: if: "contains(matrix.dependencies, 'lowest')" run: "echo \"COMPOSER_FLAGS=$COMPOSER_FLAGS --prefer-lowest\" >> $GITHUB_ENV" - - name: "Upgrade phpunit-bridge if needed for php 8 lowest build" - if: "contains(matrix.php-version, '8.')" - run: | - composer require symfony/phpunit-bridge:^5.3.3 --dev --no-update - - name: "Install latest dependencies" - run: | - # Remove PHPStan as it requires a newer PHP - composer remove phpstan/phpstan phpstan/phpstan-phpunit --dev --no-update - composer update ${{ env.COMPOSER_FLAGS }} + run: "composer update ${{ env.COMPOSER_FLAGS }}" - name: "Run tests" run: "vendor/bin/simple-phpunit --verbose" diff --git a/vendor/composer/installers/.github/workflows/lint.yml b/vendor/composer/installers/.github/workflows/lint.yml index 81a1ac4d4..61b563336 100644 --- a/vendor/composer/installers/.github/workflows/lint.yml +++ b/vendor/composer/installers/.github/workflows/lint.yml @@ -4,6 +4,9 @@ on: - push - pull_request +permissions: + contents: read + jobs: tests: name: "Lint" @@ -13,8 +16,8 @@ jobs: strategy: matrix: php-version: - - "5.3" - - "8.0" + - "7.2" + - "latest" steps: - name: "Checkout" diff --git a/vendor/composer/installers/.github/workflows/phpstan.yml b/vendor/composer/installers/.github/workflows/phpstan.yml index ac4c4a92c..c638b4404 100644 --- a/vendor/composer/installers/.github/workflows/phpstan.yml +++ b/vendor/composer/installers/.github/workflows/phpstan.yml @@ -8,6 +8,9 @@ env: COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" SYMFONY_PHPUNIT_VERSION: "" +permissions: + contents: read + jobs: tests: name: "PHPStan" @@ -17,8 +20,7 @@ jobs: strategy: matrix: php-version: - # pinned to 7.4 because we need PHPUnit 7.5 which does not support PHP 8 - - "7.4" + - "8.0" steps: - name: "Checkout" @@ -45,7 +47,6 @@ jobs: run: "composer update ${{ env.COMPOSER_FLAGS }}" - name: Run PHPStan - # Locked to phpunit 7.5 here as newer ones have void return types which break inheritance run: | - composer require --dev phpunit/phpunit:^7.5.20 --with-all-dependencies ${{ env.COMPOSER_FLAGS }} + composer require --dev phpunit/phpunit:^8.5.18 --with-all-dependencies ${{ env.COMPOSER_FLAGS }} vendor/bin/phpstan analyse diff --git a/vendor/composer/installers/composer.json b/vendor/composer/installers/composer.json index 4a7fd3c31..910348483 100644 --- a/vendor/composer/installers/composer.json +++ b/vendor/composer/installers/composer.json @@ -5,7 +5,6 @@ "description": "A multi-framework Composer library installer", "keywords": [ "installer", - "Aimeos", "AGL", "AnnotateCms", "Attogram", @@ -15,7 +14,7 @@ "Cockpit", "CodeIgniter", "concrete5", - "Craft", + "ConcreteCMS", "Croogo", "DokuWiki", "Dolibarr", @@ -29,7 +28,6 @@ "Hurad", "ImageCMS", "iTop", - "Joomla", "Kanboard", "Known", "Kohana", @@ -41,6 +39,7 @@ "majima", "Mako", "MantisBT", + "Matomo", "Mautic", "Maya", "MODX", @@ -69,10 +68,8 @@ "Starbug", "SyDES", "Sylius", - "symfony", "TastyIgniter", "Thelia", - "TYPO3", "WHMCS", "WolfCMS", "WordPress", @@ -97,26 +94,24 @@ "extra": { "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "replace": { - "shama/baton": "*", - "roundcube/plugin-installer": "*" + "dev-main": "2.x-dev" + }, + "plugin-modifies-install-path": true }, "require": { + "php": "^7.2 || ^8.0", "composer-plugin-api": "^1.0 || ^2.0" }, "require-dev": { - "composer/composer": "1.6.* || ^2.0", - "composer/semver": "^1 || ^3", - "symfony/phpunit-bridge": "^4.2 || ^5", - "phpstan/phpstan": "^0.12.55", - "symfony/process": "^2.3", - "phpstan/phpstan-phpunit": "^0.12.16" + "composer/composer": "^1.10.27 || ^2.7", + "composer/semver": "^1.7.2 || ^3.4.0", + "symfony/phpunit-bridge": "^7.1.1", + "phpstan/phpstan": "^1.11", + "symfony/process": "^5 || ^6 || ^7", + "phpstan/phpstan-phpunit": "^1" }, "scripts": { - "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit", - "phpstan": "vendor/bin/phpstan analyse" + "test": "@php vendor/bin/simple-phpunit", + "phpstan": "@php vendor/bin/phpstan analyse" } } diff --git a/vendor/composer/installers/phpstan.neon.dist b/vendor/composer/installers/phpstan.neon.dist deleted file mode 100644 index 8e3d81e9a..000000000 --- a/vendor/composer/installers/phpstan.neon.dist +++ /dev/null @@ -1,10 +0,0 @@ -parameters: - level: 5 - paths: - - src - - tests - excludes_analyse: - - tests/Composer/Installers/Test/PolyfillTestCase.php - -includes: - - vendor/phpstan/phpstan-phpunit/extension.neon diff --git a/vendor/composer/installers/src/Composer/Installers/AglInstaller.php b/vendor/composer/installers/src/Composer/Installers/AglInstaller.php index 01b8a4165..b0996a6ae 100644 --- a/vendor/composer/installers/src/Composer/Installers/AglInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/AglInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'More/{$name}/', ); @@ -10,12 +12,18 @@ class AglInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) { + $name = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) { return strtoupper($matches[1]); }, $vars['name']); + if (null === $name) { + throw new \RuntimeException('Failed to run preg_replace_callback: '.preg_last_error()); + } + + $vars['name'] = $name; + return $vars; } } diff --git a/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php b/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php deleted file mode 100644 index 79a0e958f..000000000 --- a/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php +++ /dev/null @@ -1,9 +0,0 @@ - 'ext/{$name}/', - ); -} diff --git a/vendor/composer/installers/src/Composer/Installers/AkauntingInstaller.php b/vendor/composer/installers/src/Composer/Installers/AkauntingInstaller.php new file mode 100644 index 000000000..c504c70f3 --- /dev/null +++ b/vendor/composer/installers/src/Composer/Installers/AkauntingInstaller.php @@ -0,0 +1,23 @@ + */ + protected $locations = array( + 'module' => 'modules/{$name}', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars(array $vars): array + { + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php b/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php index 89d7ad905..58a0f6669 100644 --- a/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'addons/modules/{$name}/', 'component' => 'addons/components/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php b/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php index 22dad1b9a..f01b3991d 100644 --- a/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'Modules/{$name}/', 'theme' => 'Themes/{$name}/' @@ -14,9 +16,8 @@ class AsgardInstaller extends BaseInstaller * For package type asgard-module, cut off a trailing '-plugin' if present. * * For package type asgard-theme, cut off a trailing '-theme' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'asgard-module') { return $this->inflectPluginVars($vars); @@ -29,18 +30,26 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectPluginVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectPluginVars(array $vars): array { - $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-module$/', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } - protected function inflectThemeVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array { - $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-theme$/', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php b/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php index d62fd8fd1..bd7dd8d76 100644 --- a/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php b/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php index 70dde907e..663ec2afd 100644 --- a/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array(); + /** @var Composer */ protected $composer; + /** @var PackageInterface */ protected $package; + /** @var IOInterface */ protected $io; /** * Initializes base installer. - * - * @param PackageInterface $package - * @param Composer $composer - * @param IOInterface $io */ - public function __construct(PackageInterface $package = null, Composer $composer = null, IOInterface $io = null) + public function __construct(PackageInterface $package, Composer $composer, IOInterface $io) { $this->composer = $composer; $this->package = $package; @@ -28,12 +29,8 @@ public function __construct(PackageInterface $package = null, Composer $composer /** * Return the install path based on package type. - * - * @param PackageInterface $package - * @param string $frameworkType - * @return string */ - public function getInstallPath(PackageInterface $package, $frameworkType = '') + public function getInstallPath(PackageInterface $package, string $frameworkType = ''): string { $type = $this->package->getType(); @@ -52,18 +49,16 @@ public function getInstallPath(PackageInterface $package, $frameworkType = '') $availableVars['name'] = $extra['installer-name']; } - if ($this->composer->getPackage()) { - $extra = $this->composer->getPackage()->getExtra(); - if (!empty($extra['installer-paths'])) { - $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor); - if ($customPath !== false) { - return $this->templatePath($customPath, $availableVars); - } + $extra = $this->composer->getPackage()->getExtra(); + if (!empty($extra['installer-paths'])) { + $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor); + if ($customPath !== false) { + return $this->templatePath($customPath, $availableVars); } } $packageType = substr($type, strlen($frameworkType) + 1); - $locations = $this->getLocations(); + $locations = $this->getLocations($frameworkType); if (!isset($locations[$packageType])) { throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type)); } @@ -77,7 +72,7 @@ public function getInstallPath(PackageInterface $package, $frameworkType = '') * @param array $vars This will normally receive array{name: string, vendor: string, type: string} * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { return $vars; } @@ -87,7 +82,7 @@ public function inflectPackageVars($vars) * * @return array map of package types => install path */ - public function getLocations() + public function getLocations(string $frameworkType) { return $this->locations; } @@ -95,11 +90,9 @@ public function getLocations() /** * Replace vars in a path * - * @param string $path * @param array $vars - * @return string */ - protected function templatePath($path, array $vars = array()) + protected function templatePath(string $path, array $vars = array()): string { if (strpos($path, '{') !== false) { extract($vars); @@ -117,13 +110,10 @@ protected function templatePath($path, array $vars = array()) /** * Search through a passed paths array for a custom install path. * - * @param array $paths - * @param string $name - * @param string $type - * @param string $vendor = NULL + * @param array $paths * @return string|false */ - protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL) + protected function mapCustomInstallPaths(array $paths, string $name, string $type, ?string $vendor = null) { foreach ($paths as $path => $names) { $names = (array) $names; @@ -134,4 +124,14 @@ protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = N return false; } + + protected function pregReplace(string $pattern, string $replacement, string $subject): string + { + $result = preg_replace($pattern, $replacement, $subject); + if (null === $result) { + throw new \RuntimeException('Failed to run preg_replace with '.$pattern.': '.preg_last_error()); + } + + return $result; + } } diff --git a/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php b/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php index e80cd1e10..705ecb4fa 100644 --- a/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php @@ -9,9 +9,9 @@ * - `bitrix-d7-module` — copy the module to directory `bitrix/modules/.`. * - `bitrix-d7-component` — copy the component to directory `bitrix/components//`. * - `bitrix-d7-template` — copy the template to directory `bitrix/templates/_`. - * + * * You can set custom path to directory with Bitrix kernel in `composer.json`: - * + * * ```json * { * "extra": { @@ -25,6 +25,7 @@ */ class BitrixInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'module' => '{$bitrix_dir}/modules/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) 'component' => '{$bitrix_dir}/components/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) @@ -35,15 +36,13 @@ class BitrixInstaller extends BaseInstaller ); /** - * @var array Storage for informations about duplicates at all the time of installation packages. + * @var string[] Storage for informations about duplicates at all the time of installation packages. */ private static $checkedDuplicates = array(); - /** - * {@inheritdoc} - */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { + /** @phpstan-ignore-next-line */ if ($this->composer->getPackage()) { $extra = $this->composer->getPackage()->getExtra(); @@ -62,7 +61,7 @@ public function inflectPackageVars($vars) /** * {@inheritdoc} */ - protected function templatePath($path, array $vars = array()) + protected function templatePath(string $path, array $vars = array()): string { $templatePath = parent::templatePath($path, $vars); $this->checkDuplicates($templatePath, $vars); @@ -73,10 +72,9 @@ protected function templatePath($path, array $vars = array()) /** * Duplicates search packages. * - * @param string $path - * @param array $vars + * @param array $vars */ - protected function checkDuplicates($path, array $vars = array()) + protected function checkDuplicates(string $path, array $vars = array()): void { $packageType = substr($vars['type'], strlen('bitrix') + 1); $localDir = explode('/', $vars['bitrix_dir']); @@ -94,8 +92,7 @@ protected function checkDuplicates($path, array $vars = array()) return; } - if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) { - + if ($oldPath !== $path && file_exists($oldPath) && $this->io->isInteractive()) { $this->io->writeError(' Duplication of packages:'); $this->io->writeError(' Package ' . $oldPath . ' will be called instead package ' . $path . ''); diff --git a/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php b/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php index da3aad2a3..ab022d995 100644 --- a/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'package' => 'Packages/{$vendor}/{$name}/' ); diff --git a/vendor/composer/installers/src/Composer/Installers/BotbleInstaller.php b/vendor/composer/installers/src/Composer/Installers/BotbleInstaller.php new file mode 100644 index 000000000..35e1cb8d6 --- /dev/null +++ b/vendor/composer/installers/src/Composer/Installers/BotbleInstaller.php @@ -0,0 +1,12 @@ + */ + protected $locations = array( + 'plugin' => 'platform/plugins/{$name}/', + 'theme' => 'platform/themes/{$name}/', + ); +} diff --git a/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php b/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php index 1e2ddd022..12b4ed408 100644 --- a/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'plugin' => 'Plugin/{$name}/', ); @@ -13,7 +15,7 @@ class CakePHPInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($this->matchesCakeVersion('>=', '3.0.0')) { return $vars; @@ -21,7 +23,7 @@ public function inflectPackageVars($vars) $nameParts = explode('/', $vars['name']); foreach ($nameParts as &$value) { - $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $value)); $value = str_replace(array('-', '_'), ' ', $value); $value = str_replace(' ', '', ucwords($value)); } @@ -33,7 +35,7 @@ public function inflectPackageVars($vars) /** * Change the default plugin location when cakephp >= 3.0 */ - public function getLocations() + public function getLocations(string $frameworkType): array { if ($this->matchesCakeVersion('>=', '3.0.0')) { $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/'; @@ -44,19 +46,18 @@ public function getLocations() /** * Check if CakePHP version matches against a version * - * @param string $matcher - * @param string $version - * @return bool - * @phpstan-param Constraint::STR_OP_* $matcher + * @phpstan-param '='|'=='|'<'|'<='|'>'|'>='|'<>'|'!=' $matcher */ - protected function matchesCakeVersion($matcher, $version) + protected function matchesCakeVersion(string $matcher, string $version): bool { $repositoryManager = $this->composer->getRepositoryManager(); - if (! $repositoryManager) { + /** @phpstan-ignore-next-line */ + if (!$repositoryManager) { return false; } $repos = $repositoryManager->getLocalRepository(); + /** @phpstan-ignore-next-line */ if (!$repos) { return false; } diff --git a/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php b/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php index ab2f9aad8..b0d3c5f76 100644 --- a/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php @@ -1,11 +1,12 @@ */ protected $locations = array( 'cookbook' => 'Chef/{$vendor}/{$name}/', 'role' => 'Chef/roles/{$name}/', ); } - diff --git a/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php b/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php index 6673aea94..1c52e0cdc 100644 --- a/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'ext' => 'ext/{$name}/' ); diff --git a/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php b/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php index c887815c9..2c943b215 100644 --- a/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php @@ -1,10 +1,12 @@ 'CCF/orbit/{$name}/', - 'theme' => 'CCF/app/themes/{$name}/', - ); -} \ No newline at end of file + /** @var array */ + protected $locations = array( + 'ship' => 'CCF/orbit/{$name}/', + 'theme' => 'CCF/app/themes/{$name}/', + ); +} diff --git a/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php b/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php index 053f3ffd7..d3fcdf7d4 100644 --- a/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'cockpit/modules/addons/{$name}/', ); @@ -11,10 +13,8 @@ class CockpitInstaller extends BaseInstaller * Format module name. * * Strip `module-` prefix from package name. - * - * {@inheritDoc} */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] == 'cockpit-module') { return $this->inflectModuleVars($vars); @@ -23,9 +23,13 @@ public function inflectPackageVars($vars) return $vars; } - public function inflectModuleVars($vars) + /** + * @param array $vars + * @return array + */ + public function inflectModuleVars(array $vars): array { - $vars['name'] = ucfirst(preg_replace('/cockpit-/i', '', $vars['name'])); + $vars['name'] = ucfirst($this->pregReplace('/cockpit-/i', '', $vars['name'])); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php b/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php index 3b4a4ece1..a183e0781 100644 --- a/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'library' => 'application/libraries/{$name}/', 'third-party' => 'application/third_party/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php b/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php index 5c01bafd7..2f5fecb3d 100644 --- a/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php +++ b/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'core' => 'concrete/', 'block' => 'application/blocks/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php new file mode 100644 index 000000000..b6e7f009d --- /dev/null +++ b/vendor/composer/installers/src/Composer/Installers/ConcreteCMSInstaller.php @@ -0,0 +1,15 @@ + */ + protected $locations = array( + 'core' => 'concrete/', + 'block' => 'application/blocks/{$name}/', + 'package' => 'packages/{$name}/', + 'theme' => 'application/themes/{$name}/', + 'update' => 'updates/{$name}/', + ); +} diff --git a/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php b/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php deleted file mode 100644 index d37a77ae2..000000000 --- a/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php +++ /dev/null @@ -1,35 +0,0 @@ - 'craft/plugins/{$name}/', - ); - - /** - * Strip `craft-` prefix and/or `-plugin` suffix from package names - * - * @param array $vars - * - * @return array - */ - final public function inflectPackageVars($vars) - { - return $this->inflectPluginVars($vars); - } - - private function inflectPluginVars($vars) - { - $vars['name'] = preg_replace('/-' . self::NAME_SUFFIX . '$/i', '', $vars['name']); - $vars['name'] = preg_replace('/^' . self::NAME_PREFIX . '-/i', '', $vars['name']); - - return $vars; - } -} diff --git a/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php b/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php index d94219d3a..31d4939b0 100644 --- a/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'Plugin/{$name}/', 'theme' => 'View/Themed/{$name}/', @@ -11,7 +13,7 @@ class CroogoInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $vars['name'] = strtolower(str_replace(array('-', '_'), ' ', $vars['name'])); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php b/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php index f4837a6c1..88f53f731 100644 --- a/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php @@ -1,9 +1,11 @@ */ protected $locations = array( 'app' => 'app/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php b/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php index 70788163a..196f60efa 100644 --- a/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php @@ -4,6 +4,7 @@ class DframeInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'module' => 'modules/{$vendor}/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php b/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php index cfd638d5f..aa3a2e600 100644 --- a/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'lib/plugins/{$name}/', 'template' => 'lib/tpl/{$name}/', @@ -11,15 +13,13 @@ class DokuWikiInstaller extends BaseInstaller /** * Format package name. * - * For package type dokuwiki-plugin, cut off a trailing '-plugin', + * For package type dokuwiki-plugin, cut off a trailing '-plugin', * or leading dokuwiki_ if present. - * - * For package type dokuwiki-template, cut off a trailing '-template' if present. * + * For package type dokuwiki-template, cut off a trailing '-template' if present. */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - if ($vars['type'] === 'dokuwiki-plugin') { return $this->inflectPluginVars($vars); } @@ -31,20 +31,27 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectPluginVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectPluginVars(array $vars): array { - $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']); - $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-plugin$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/^dokuwiki_?-?/', '', $vars['name']); return $vars; } - protected function inflectTemplateVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectTemplateVars(array $vars): array { - $vars['name'] = preg_replace('/-template$/', '', $vars['name']); - $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-template$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/^dokuwiki_?-?/', '', $vars['name']); return $vars; } - } diff --git a/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php b/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php index 21f7e8e80..c583619ca 100644 --- a/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'module' => 'htdocs/custom/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php b/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php index 732823922..65a3a91a3 100644 --- a/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'core' => 'core/', 'module' => 'modules/{$name}/', @@ -18,5 +20,6 @@ class DrupalInstaller extends BaseInstaller 'console' => 'console/{$name}/', 'console-language' => 'console/language/{$name}/', 'config' => 'config/sync/', + 'recipe' => 'recipes/{$name}', ); } diff --git a/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php b/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php index c0bb609f4..48ef2ecdd 100644 --- a/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'mod/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php b/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php index 6f3dc97b1..d7dd9a922 100644 --- a/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'component' => 'components/{$name}/', 'module' => 'modules/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php b/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php index d5321a8ca..fe1d468a9 100644 --- a/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php @@ -1,29 +1,31 @@ */ private $ee2Locations = array( 'addon' => 'system/expressionengine/third_party/{$name}/', 'theme' => 'themes/third_party/{$name}/', ); + /** @var array */ private $ee3Locations = array( 'addon' => 'system/user/addons/{$name}/', 'theme' => 'themes/user/{$name}/', ); - public function getInstallPath(PackageInterface $package, $frameworkType = '') + public function getLocations(string $frameworkType): array { + if ($frameworkType === 'ee2') { + $this->locations = $this->ee2Locations; + } else { + $this->locations = $this->ee3Locations; + } - $version = "{$frameworkType}Locations"; - $this->locations = $this->$version; - - return parent::getInstallPath($package, $frameworkType); + return $this->locations; } } diff --git a/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php b/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php index f30ebcc77..1f5b84e2a 100644 --- a/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'meta-assets' => 'web/assets/ezplatform/', 'assets' => 'web/assets/ezplatform/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ForkCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/ForkCMSInstaller.php new file mode 100644 index 000000000..cf6292675 --- /dev/null +++ b/vendor/composer/installers/src/Composer/Installers/ForkCMSInstaller.php @@ -0,0 +1,58 @@ + */ + protected $locations = [ + 'module' => 'src/Modules/{$name}/', + 'theme' => 'src/Themes/{$name}/' + ]; + + /** + * Format package name. + * + * For package type fork-cms-module, cut off a trailing '-plugin' if present. + * + * For package type fork-cms-theme, cut off a trailing '-theme' if present. + */ + public function inflectPackageVars(array $vars): array + { + if ($vars['type'] === 'fork-cms-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'fork-cms-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + /** + * @param array $vars + * @return array + */ + protected function inflectModuleVars(array $vars): array + { + $vars['name'] = $this->pregReplace('/^fork-cms-|-module|ForkCMS|ForkCms|Forkcms|forkcms|Module$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); // replace hyphens with spaces + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); // make module name camelcased + + return $vars; + } + + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array + { + $vars['name'] = $this->pregReplace('/^fork-cms-|-theme|ForkCMS|ForkCms|Forkcms|forkcms|Theme$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); // replace hyphens with spaces + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); // make theme name camelcased + + return $vars; + } +} diff --git a/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php b/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php index 6eba2e34f..5948572e2 100644 --- a/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'fuel/app/modules/{$name}/', 'package' => 'fuel/packages/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php b/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php index 29d980b30..b4d80ed31 100644 --- a/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'component' => 'components/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/GravInstaller.php b/vendor/composer/installers/src/Composer/Installers/GravInstaller.php index dbe63e07e..f5792e36b 100644 --- a/vendor/composer/installers/src/Composer/Installers/GravInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/GravInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'user/plugins/{$name}/', 'theme' => 'user/themes/{$name}/', @@ -10,17 +12,14 @@ class GravInstaller extends BaseInstaller /** * Format package name - * - * @param array $vars - * - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $restrictedWords = implode('|', array_keys($this->locations)); $vars['name'] = strtolower($vars['name']); - $vars['name'] = preg_replace('/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui', + $vars['name'] = $this->pregReplace( + '/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui', '$1', $vars['name'] ); diff --git a/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php b/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php index 8fe017f0f..dd76c5b68 100644 --- a/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', 'theme' => 'plugins/{$name}/', @@ -11,11 +13,11 @@ class HuradInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $nameParts = explode('/', $vars['name']); foreach ($nameParts as &$value) { - $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $value)); $value = str_replace(array('-', '_'), ' ', $value); $value = str_replace(' ', '', ucwords($value)); } diff --git a/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php index 5e2142ea5..4157cecac 100644 --- a/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'template' => 'templates/{$name}/', 'module' => 'application/modules/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/Installer.php b/vendor/composer/installers/src/Composer/Installers/Installer.php index 9c9c24f7f..862d8ae21 100644 --- a/vendor/composer/installers/src/Composer/Installers/Installer.php +++ b/vendor/composer/installers/src/Composer/Installers/Installer.php @@ -6,6 +6,7 @@ use Composer\Installer\BinaryInstaller; use Composer\Installer\LibraryInstaller; use Composer\IO\IOInterface; +use Composer\Package\Package; use Composer\Package\PackageInterface; use Composer\Repository\InstalledRepositoryInterface; use Composer\Util\Filesystem; @@ -13,19 +14,19 @@ class Installer extends LibraryInstaller { - /** * Package types to installer class map * - * @var array + * @var array */ private $supportedTypes = array( - 'aimeos' => 'AimeosInstaller', + 'akaunting' => 'AkauntingInstaller', 'asgard' => 'AsgardInstaller', 'attogram' => 'AttogramInstaller', 'agl' => 'AglInstaller', 'annotatecms' => 'AnnotateCmsInstaller', 'bitrix' => 'BitrixInstaller', + 'botble' => 'BotbleInstaller', 'bonefish' => 'BonefishInstaller', 'cakephp' => 'CakePHPInstaller', 'chef' => 'ChefInstaller', @@ -34,7 +35,7 @@ class Installer extends LibraryInstaller 'cockpit' => 'CockpitInstaller', 'codeigniter' => 'CodeIgniterInstaller', 'concrete5' => 'Concrete5Installer', - 'craft' => 'CraftInstaller', + 'concretecms' => 'ConcreteCMSInstaller', 'croogo' => 'CroogoInstaller', 'dframe' => 'DframeInstaller', 'dokuwiki' => 'DokuWikiInstaller', @@ -46,6 +47,7 @@ class Installer extends LibraryInstaller 'ee3' => 'ExpressionEngineInstaller', 'ee2' => 'ExpressionEngineInstaller', 'ezplatform' => 'EzPlatformInstaller', + 'fork' => 'ForkCMSInstaller', 'fuel' => 'FuelInstaller', 'fuelphp' => 'FuelphpInstaller', 'grav' => 'GravInstaller', @@ -53,13 +55,11 @@ class Installer extends LibraryInstaller 'tastyigniter' => 'TastyIgniterInstaller', 'imagecms' => 'ImageCMSInstaller', 'itop' => 'ItopInstaller', - 'joomla' => 'JoomlaInstaller', 'kanboard' => 'KanboardInstaller', - 'kirby' => 'KirbyInstaller', 'known' => 'KnownInstaller', 'kodicms' => 'KodiCMSInstaller', 'kohana' => 'KohanaInstaller', - 'lms' => 'LanManagementSystemInstaller', + 'lms' => 'LanManagementSystemInstaller', 'laravel' => 'LaravelInstaller', 'lavalite' => 'LavaLiteInstaller', 'lithium' => 'LithiumInstaller', @@ -67,6 +67,7 @@ class Installer extends LibraryInstaller 'majima' => 'MajimaInstaller', 'mantisbt' => 'MantisBTInstaller', 'mako' => 'MakoInstaller', + 'matomo' => 'MatomoInstaller', 'maya' => 'MayaInstaller', 'mautic' => 'MauticInstaller', 'mediawiki' => 'MediaWikiInstaller', @@ -82,7 +83,6 @@ class Installer extends LibraryInstaller 'osclass' => 'OsclassInstaller', 'pxcms' => 'PxcmsInstaller', 'phpbb' => 'PhpBBInstaller', - 'pimcore' => 'PimcoreInstaller', 'piwik' => 'PiwikInstaller', 'plentymarkets'=> 'PlentymarketsInstaller', 'ppi' => 'PPIInstaller', @@ -103,12 +103,9 @@ class Installer extends LibraryInstaller 'starbug' => 'StarbugInstaller', 'sydes' => 'SyDESInstaller', 'sylius' => 'SyliusInstaller', - 'symfony1' => 'Symfony1Installer', 'tao' => 'TaoInstaller', 'thelia' => 'TheliaInstaller', 'tusk' => 'TuskInstaller', - 'typo3-cms' => 'TYPO3CmsInstaller', - 'typo3-flow' => 'TYPO3FlowInstaller', 'userfrosting' => 'UserFrostingInstaller', 'vanilla' => 'VanillaInstaller', 'whmcs' => 'WHMCSInstaller', @@ -122,26 +119,17 @@ class Installer extends LibraryInstaller ); /** - * Installer constructor. - * * Disables installers specified in main composer extra installer-disable * list - * - * @param IOInterface $io - * @param Composer $composer - * @param string $type - * @param Filesystem|null $filesystem - * @param BinaryInstaller|null $binaryInstaller */ public function __construct( IOInterface $io, Composer $composer, - $type = 'library', - Filesystem $filesystem = null, - BinaryInstaller $binaryInstaller = null + string $type = 'library', + ?Filesystem $filesystem = null, + ?BinaryInstaller $binaryInstaller = null ) { - parent::__construct($io, $composer, $type, $filesystem, - $binaryInstaller); + parent::__construct($io, $composer, $type, $filesystem, $binaryInstaller); $this->removeDisabledInstallers(); } @@ -160,9 +148,17 @@ public function getInstallPath(PackageInterface $package) } $class = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; + /** + * @var BaseInstaller + */ $installer = new $class($package, $this->composer, $this->getIO()); - return $installer->getInstallPath($package, $frameworkType); + $path = $installer->getInstallPath($package, $frameworkType); + if (!$this->filesystem->isAbsolutePath($path)) { + $path = getcwd() . '/' . $path; + } + + return $path; } public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) @@ -188,6 +184,8 @@ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $ /** * {@inheritDoc} + * + * @param string $packageType */ public function supports($packageType) { @@ -205,10 +203,9 @@ public function supports($packageType) /** * Finds a supported framework type if it exists and returns it * - * @param string $type * @return string|false */ - protected function findFrameworkType($type) + protected function findFrameworkType(string $type) { krsort($this->supportedTypes); @@ -224,30 +221,24 @@ protected function findFrameworkType($type) /** * Get the second part of the regular expression to check for support of a * package type - * - * @param string $frameworkType - * @return string */ - protected function getLocationPattern($frameworkType) + protected function getLocationPattern(string $frameworkType): string { - $pattern = false; + $pattern = null; if (!empty($this->supportedTypes[$frameworkType])) { $frameworkClass = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; /** @var BaseInstaller $framework */ - $framework = new $frameworkClass(null, $this->composer, $this->getIO()); - $locations = array_keys($framework->getLocations()); - $pattern = $locations ? '(' . implode('|', $locations) . ')' : false; + $framework = new $frameworkClass(new Package('dummy/pkg', '1.0.0.0', '1.0.0'), $this->composer, $this->getIO()); + $locations = array_keys($framework->getLocations($frameworkType)); + if ($locations) { + $pattern = '(' . implode('|', $locations) . ')'; + } } - return $pattern ? : '(\w+)'; + return $pattern ?: '(\w+)'; } - /** - * Get I/O object - * - * @return IOInterface - */ - private function getIO() + private function getIO(): IOInterface { return $this->io; } @@ -260,10 +251,8 @@ private function getIO() * - true, "all", and "*" - disable all installers. * - false - enable all installers (useful with * wikimedia/composer-merge-plugin or similar) - * - * @return void */ - protected function removeDisabledInstallers() + protected function removeDisabledInstallers(): void { $extra = $this->composer->getPackage()->getExtra(); @@ -286,12 +275,13 @@ protected function removeDisabledInstallers() if (!empty($intersect)) { // Disable all installers $this->supportedTypes = array(); - } else { - // Disable specified installers - foreach ($disable as $key => $installer) { - if (is_string($installer) && key_exists($installer, $this->supportedTypes)) { - unset($this->supportedTypes[$installer]); - } + return; + } + + // Disable specified installers + foreach ($disable as $key => $installer) { + if (is_string($installer) && key_exists($installer, $this->supportedTypes)) { + unset($this->supportedTypes[$installer]); } } } diff --git a/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php b/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php index c6c1b3374..06af06870 100644 --- a/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'extension' => 'extensions/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php b/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php deleted file mode 100644 index 9ee775965..000000000 --- a/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php +++ /dev/null @@ -1,15 +0,0 @@ - 'components/{$name}/', - 'module' => 'modules/{$name}/', - 'template' => 'templates/{$name}/', - 'plugin' => 'plugins/{$name}/', - 'library' => 'libraries/{$name}/', - ); - - // TODO: Add inflector for mod_ and com_ names -} diff --git a/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php b/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php index 9cb7b8cdb..bca954b28 100644 --- a/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php b/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php deleted file mode 100644 index 36b2f84a7..000000000 --- a/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php +++ /dev/null @@ -1,11 +0,0 @@ - 'site/plugins/{$name}/', - 'field' => 'site/fields/{$name}/', - 'tag' => 'site/tags/{$name}/' - ); -} diff --git a/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php b/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php index c5d08c5f9..61910a86b 100644 --- a/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'IdnoPlugins/{$name}/', 'theme' => 'Themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php index 7143e232b..2505ac688 100644 --- a/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php @@ -1,10 +1,12 @@ */ protected $locations = array( 'plugin' => 'cms/plugins/{$name}/', 'media' => 'cms/media/vendor/{$name}/' ); -} \ No newline at end of file +} diff --git a/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php b/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php index dcd6d2632..b6aa8097c 100644 --- a/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php b/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php index 903143a55..7fe9d9b79 100644 --- a/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php @@ -5,6 +5,7 @@ class LanManagementSystemInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'plugin' => 'plugins/{$name}/', 'template' => 'templates/{$name}/', @@ -15,13 +16,12 @@ class LanManagementSystemInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } - } diff --git a/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php b/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php index be4d53a7b..a69dc8890 100644 --- a/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'library' => 'libraries/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php b/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php index 412c0b5c0..e4a7c7da8 100644 --- a/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'package' => 'packages/{$vendor}/{$name}/', 'theme' => 'public/themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php b/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php index 47bbd4cab..b24bea20c 100644 --- a/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'library' => 'libraries/{$name}/', 'source' => 'libraries/_source/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php b/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php index 9c2e9fb40..369e8b45c 100644 --- a/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php index 5a664608d..062a839ba 100644 --- a/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'snippet' => 'assets/snippets/{$name}/', 'plugin' => 'assets/plugins/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php index cf18e9478..ec07cd64e 100644 --- a/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'theme' => 'app/design/frontend/{$name}/', 'skin' => 'skin/frontend/default/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php b/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php index e463756fa..6fc3089d2 100644 --- a/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); /** * Transforms the names - * @param array $vars - * @return array + * + * @param array $vars + * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { return $this->correctPluginName($vars); } /** * Change hyphenated names to camelcase - * @param array $vars - * @return array + * + * @param array $vars + * @return array */ - private function correctPluginName($vars) + private function correctPluginName(array $vars): array { $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { return strtoupper($matches[0][1]); }, $vars['name']); + + if (null === $camelCasedName) { + throw new \RuntimeException('Failed to run preg_replace_callback: '.preg_last_error()); + } + $vars['name'] = ucfirst($camelCasedName); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php index ca3cfacb4..cbe3760ba 100644 --- a/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'package' => 'app/packages/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php b/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php index dadb1dbbc..98e230fb4 100644 --- a/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php @@ -1,10 +1,12 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); @@ -12,9 +14,9 @@ class MantisBTInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php b/vendor/composer/installers/src/Composer/Installers/MatomoInstaller.php similarity index 53% rename from vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php rename to vendor/composer/installers/src/Composer/Installers/MatomoInstaller.php index 4781fa6d1..57fdb0330 100644 --- a/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MatomoInstaller.php @@ -1,8 +1,15 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); @@ -10,9 +17,9 @@ class PimcoreInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php b/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php index c3dd2b6f9..e48c133b8 100644 --- a/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php @@ -1,17 +1,19 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', 'theme' => 'themes/{$name}/', 'core' => 'app/', ); - private function getDirectoryName() + private function getDirectoryName(): string { $extra = $this->package->getExtra(); if (!empty($extra['install-directory-name'])) { @@ -21,12 +23,7 @@ private function getDirectoryName() return $this->toCamelCase($this->package->getPrettyName()); } - /** - * @param string $packageName - * - * @return string - */ - private function toCamelCase($packageName) + private function toCamelCase(string $packageName): string { return str_replace(' ', '', ucwords(str_replace('-', ' ', basename($packageName)))); } @@ -34,9 +31,8 @@ private function toCamelCase($packageName) /** * Format package name of mautic-plugins to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - if ($vars['type'] == 'mautic-plugin' || $vars['type'] == 'mautic-theme') { $directoryName = $this->getDirectoryName(); $vars['name'] = $directoryName; @@ -44,5 +40,4 @@ public function inflectPackageVars($vars) return $vars; } - } diff --git a/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php b/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php index 30a91676d..df486dacd 100644 --- a/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', ); @@ -11,9 +13,8 @@ class MayaInstaller extends BaseInstaller * Format package name. * * For package type maya-module, cut off a trailing '-module' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'maya-module') { return $this->inflectModuleVars($vars); @@ -22,9 +23,13 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectModuleVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectModuleVars(array $vars): array { - $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-module$/', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php b/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php index f5a8957ef..8e9d7713e 100644 --- a/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'core' => 'core/', 'extension' => 'extensions/{$name}/', @@ -16,11 +18,9 @@ class MediaWikiInstaller extends BaseInstaller * to CamelCase keeping existing uppercase chars. * * For package type mediawiki-skin, cut off a trailing '-skin' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - if ($vars['type'] === 'mediawiki-extension') { return $this->inflectExtensionVars($vars); } @@ -32,20 +32,27 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectExtensionVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectExtensionVars(array $vars): array { - $vars['name'] = preg_replace('/-extension$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-extension$/', '', $vars['name']); $vars['name'] = str_replace('-', ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } - protected function inflectSkinVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectSkinVars(array $vars): array { - $vars['name'] = preg_replace('/-skin$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-skin$/', '', $vars['name']); return $vars; } - } diff --git a/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php b/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php index 66d8369c4..025417798 100644 --- a/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php @@ -4,6 +4,7 @@ class MiaoxingInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php b/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php index b7d970392..a4d97ab0c 100644 --- a/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'userfiles/modules/{$install_item_dir}/', 'module-skin' => 'userfiles/modules/{$install_item_dir}/templates/', @@ -18,13 +20,10 @@ class MicroweberInstaller extends BaseInstaller * For package type microweber-module, cut off a trailing '-module' if present * * For package type microweber-template, cut off a trailing '-template' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - - - if ($this->package->getTargetDir()) { + if ($this->package->getTargetDir() !== null && $this->package->getTargetDir() !== '') { $vars['install_item_dir'] = $this->package->getTargetDir(); } else { $vars['install_item_dir'] = $vars['name']; @@ -54,65 +53,92 @@ public function inflectPackageVars($vars) } } - return $vars; } - protected function inflectTemplateVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectTemplateVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-template$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/template-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-template$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/template-$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectTemplatesVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectTemplatesVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-templates$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/templates-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-templates$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/templates-$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectCoreVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectCoreVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-providers$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/-provider$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/-adapter$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-providers$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-provider$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-adapter$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectModuleVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectModuleVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-module$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/module-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-module$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/module-$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectModulesVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectModulesVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-modules$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/modules-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-modules$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/modules-$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectSkinVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectSkinVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-skin$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/skin-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-skin$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/skin-$/', '', $vars['install_item_dir']); return $vars; } - protected function inflectElementVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectElementVars(array $vars): array { - $vars['install_item_dir'] = preg_replace('/-elements$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/elements-$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/-element$/', '', $vars['install_item_dir']); - $vars['install_item_dir'] = preg_replace('/element-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-elements$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/elements-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/-element$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = $this->pregReplace('/element-$/', '', $vars['install_item_dir']); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php b/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php index 0ee140abf..e2dddec5e 100644 --- a/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'extra' => 'core/packages/{$name}/' ); diff --git a/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php b/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php index 05317995f..eb2b8acf6 100644 --- a/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'mod' => 'mod/{$name}/', 'admin_report' => 'admin/report/{$name}/', @@ -11,6 +13,7 @@ class MoodleInstaller extends BaseInstaller 'assignment' => 'mod/assignment/type/{$name}/', 'assignsubmission' => 'mod/assign/submission/{$name}/', 'assignfeedback' => 'mod/assign/feedback/{$name}/', + 'antivirus' => 'lib/antivirus/{$name}/', 'auth' => 'auth/{$name}/', 'availability' => 'availability/condition/{$name}/', 'block' => 'blocks/{$name}/', @@ -18,27 +21,37 @@ class MoodleInstaller extends BaseInstaller 'cachestore' => 'cache/stores/{$name}/', 'cachelock' => 'cache/locks/{$name}/', 'calendartype' => 'calendar/type/{$name}/', + 'communication' => 'communication/provider/{$name}/', + 'customfield' => 'customfield/field/{$name}/', 'fileconverter' => 'files/converter/{$name}/', 'format' => 'course/format/{$name}/', 'coursereport' => 'course/report/{$name}/', + 'contenttype' => 'contentbank/contenttype/{$name}/', 'customcertelement' => 'mod/customcert/element/{$name}/', 'datafield' => 'mod/data/field/{$name}/', + 'dataformat' => 'dataformat/{$name}/', 'datapreset' => 'mod/data/preset/{$name}/', 'editor' => 'lib/editor/{$name}/', 'enrol' => 'enrol/{$name}/', 'filter' => 'filter/{$name}/', + 'forumreport' => 'mod/forum/report/{$name}/', 'gradeexport' => 'grade/export/{$name}/', 'gradeimport' => 'grade/import/{$name}/', 'gradereport' => 'grade/report/{$name}/', 'gradingform' => 'grade/grading/form/{$name}/', + 'h5plib' => 'h5p/h5plib/{$name}/', 'local' => 'local/{$name}/', 'logstore' => 'admin/tool/log/store/{$name}/', 'ltisource' => 'mod/lti/source/{$name}/', 'ltiservice' => 'mod/lti/service/{$name}/', + 'media' => 'media/player/{$name}/', 'message' => 'message/output/{$name}/', + 'mlbackend' => 'lib/mlbackend/{$name}/', 'mnetservice' => 'mnet/service/{$name}/', + 'paygw' => 'payment/gateway/{$name}/', 'plagiarism' => 'plagiarism/{$name}/', 'portfolio' => 'portfolio/{$name}/', + 'qbank' => 'question/bank/{$name}/', 'qbehaviour' => 'question/behaviour/{$name}/', 'qformat' => 'question/format/{$name}/', 'qtype' => 'question/type/{$name}/', @@ -49,6 +62,7 @@ class MoodleInstaller extends BaseInstaller 'scormreport' => 'mod/scorm/report/{$name}/', 'search' => 'search/engine/{$name}/', 'theme' => 'theme/{$name}/', + 'tiny' => 'lib/editor/tiny/plugins/{$name}/', 'tinymce' => 'lib/editor/tinymce/plugins/{$name}/', 'profilefield' => 'user/profile/field/{$name}/', 'webservice' => 'webservice/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php b/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php index 489ef02ab..524f17d87 100644 --- a/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', 'plugin' => 'plugins/{$vendor}/{$name}/', @@ -15,9 +17,8 @@ class OctoberInstaller extends BaseInstaller * For package type october-plugin, cut off a trailing '-plugin' if present. * * For package type october-theme, cut off a trailing '-theme' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'october-plugin') { return $this->inflectPluginVars($vars); @@ -30,18 +31,26 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectPluginVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectPluginVars(array $vars): array { - $vars['name'] = preg_replace('/^oc-|-plugin$/', '', $vars['name']); - $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + $vars['name'] = $this->pregReplace('/^oc-|-plugin$/', '', $vars['name']); + $vars['vendor'] = $this->pregReplace('/[^a-z0-9_]/i', '', $vars['vendor']); return $vars; } - protected function inflectThemeVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array { - $vars['name'] = preg_replace('/^oc-|-theme$/', '', $vars['name']); - $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + $vars['name'] = $this->pregReplace('/^oc-|-theme$/', '', $vars['name']); + $vars['vendor'] = $this->pregReplace('/[^a-z0-9_]/i', '', $vars['vendor']); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php b/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php index 5dd3438d9..fd20c1a86 100644 --- a/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'extension' => 'extensions/{$name}/', 'theme' => 'extensions/themes/{$name}/', @@ -12,12 +14,12 @@ class OntoWikiInstaller extends BaseInstaller /** * Format package name to lower case and remove ".ontowiki" suffix */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $vars['name'] = strtolower($vars['name']); - $vars['name'] = preg_replace('/.ontowiki$/', '', $vars['name']); - $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); - $vars['name'] = preg_replace('/-translation$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/.ontowiki$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-theme$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-translation$/', '', $vars['name']); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php b/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php index 3ca7954c9..e61d61f88 100644 --- a/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php @@ -1,14 +1,14 @@ */ protected $locations = array( 'plugin' => 'oc-content/plugins/{$name}/', 'theme' => 'oc-content/themes/{$name}/', 'language' => 'oc-content/languages/{$name}/', ); - } diff --git a/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php b/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php index 1797a22cf..6e1e8624f 100644 --- a/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php @@ -1,59 +1,49 @@ .+)\/.+/'; + const VENDOR_PATTERN = '/^modules\/(?P.+)\/.+/'; + /** @var array */ protected $locations = array( 'module' => 'modules/{$name}/', 'theme' => 'application/views/{$name}/', 'out' => 'out/{$name}/', ); - /** - * getInstallPath - * - * @param PackageInterface $package - * @param string $frameworkType - * @return string - */ - public function getInstallPath(PackageInterface $package, $frameworkType = '') - { - $installPath = parent::getInstallPath($package, $frameworkType); - $type = $this->package->getType(); - if ($type === 'oxid-module') { - $this->prepareVendorDirectory($installPath); - } - return $installPath; - } - - /** - * prepareVendorDirectory - * - * Makes sure there is a vendormetadata.php file inside - * the vendor folder if there is a vendor folder. - * - * @param string $installPath - * @return void - */ - protected function prepareVendorDirectory($installPath) - { - $matches = ''; - $hasVendorDirectory = preg_match(self::VENDOR_PATTERN, $installPath, $matches); - if (!$hasVendorDirectory) { - return; - } - - $vendorDirectory = $matches['vendor']; - $vendorPath = getcwd() . '/modules/' . $vendorDirectory; - if (!file_exists($vendorPath)) { - mkdir($vendorPath, 0755, true); - } - - $vendorMetaDataPath = $vendorPath . '/vendormetadata.php'; - touch($vendorMetaDataPath); - } + public function getInstallPath(PackageInterface $package, string $frameworkType = ''): string + { + $installPath = parent::getInstallPath($package, $frameworkType); + $type = $this->package->getType(); + if ($type === 'oxid-module') { + $this->prepareVendorDirectory($installPath); + } + return $installPath; + } + + /** + * Makes sure there is a vendormetadata.php file inside + * the vendor folder if there is a vendor folder. + */ + protected function prepareVendorDirectory(string $installPath): void + { + $matches = ''; + $hasVendorDirectory = preg_match(self::VENDOR_PATTERN, $installPath, $matches); + if (!$hasVendorDirectory) { + return; + } + + $vendorDirectory = $matches['vendor']; + $vendorPath = getcwd() . '/modules/' . $vendorDirectory; + if (!file_exists($vendorPath)) { + mkdir($vendorPath, 0755, true); + } + + $vendorMetaDataPath = $vendorPath . '/vendormetadata.php'; + touch($vendorMetaDataPath); + } } diff --git a/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php b/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php index 170136f98..714c46797 100644 --- a/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php b/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php index 4e59a8a74..3c970e217 100644 --- a/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'bundle' => 'bundles/{$name}/', 'library' => 'libraries/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php b/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php index deb2b77a6..d53ee4f6c 100644 --- a/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'extension' => 'ext/{$vendor}/{$name}/', 'language' => 'language/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php b/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php index c17f4572b..b2faf44a5 100644 --- a/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); /** * Format package name to CamelCase - * @param array $vars - * - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php b/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php index 903e55f62..0c063598a 100644 --- a/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php @@ -1,28 +1,27 @@ */ protected $locations = array( 'plugin' => '{$name}/' ); /** * Remove hyphen, "plugin" and format to camelcase - * @param array $vars - * - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = explode("-", $vars['name']); - foreach ($vars['name'] as $key => $name) { - $vars['name'][$key] = ucfirst($vars['name'][$key]); + $nameBits = explode("-", $vars['name']); + foreach ($nameBits as $key => $name) { + $nameBits[$key] = ucfirst($name); if (strcasecmp($name, "Plugin") == 0) { - unset($vars['name'][$key]); + unset($nameBits[$key]); } } - $vars['name'] = implode("",$vars['name']); + $vars['name'] = implode('', $nameBits); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/Plugin.php b/vendor/composer/installers/src/Composer/Installers/Plugin.php index e60da0e7f..437a9493a 100644 --- a/vendor/composer/installers/src/Composer/Installers/Plugin.php +++ b/vendor/composer/installers/src/Composer/Installers/Plugin.php @@ -8,20 +8,21 @@ class Plugin implements PluginInterface { + /** @var Installer */ private $installer; - public function activate(Composer $composer, IOInterface $io) + public function activate(Composer $composer, IOInterface $io): void { $this->installer = new Installer($io, $composer); $composer->getInstallationManager()->addInstaller($this->installer); } - public function deactivate(Composer $composer, IOInterface $io) + public function deactivate(Composer $composer, IOInterface $io): void { $composer->getInstallationManager()->removeInstaller($this->installer); } - public function uninstall(Composer $composer, IOInterface $io) + public function uninstall(Composer $composer, IOInterface $io): void { } } diff --git a/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php b/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php index dbf85e635..a01d7a0be 100644 --- a/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'container' => 'app/Containers/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php b/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php index 4c8421e36..23f156f53 100644 --- a/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', 'theme' => 'themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php b/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php index e6834a0ca..a7eb1eec6 100644 --- a/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php @@ -4,6 +4,7 @@ class ProcessWireInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'module' => 'site/modules/{$name}/', ); @@ -11,9 +12,9 @@ class ProcessWireInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php b/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php index 77cc3dd87..1a0a8a3fe 100644 --- a/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php @@ -5,6 +5,7 @@ class PuppetInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'module' => 'modules/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php b/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php index 65510580e..fc58b8a6d 100644 --- a/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'app/Modules/{$name}/', 'theme' => 'themes/{$name}/', @@ -10,12 +12,8 @@ class PxcmsInstaller extends BaseInstaller /** * Format package name. - * - * @param array $vars - * - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'pxcms-module') { return $this->inflectModuleVars($vars); @@ -31,30 +29,31 @@ public function inflectPackageVars($vars) /** * For package type pxcms-module, cut off a trailing '-plugin' if present. * - * return string + * @param array $vars + * @return array */ - protected function inflectModuleVars($vars) + protected function inflectModuleVars(array $vars): array { $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) $vars['name'] = str_replace('module-', '', $vars['name']); // strip out module- - $vars['name'] = preg_replace('/-module$/', '', $vars['name']); // strip out -module + $vars['name'] = $this->pregReplace('/-module$/', '', $vars['name']); // strip out -module $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s $vars['name'] = ucwords($vars['name']); // make module name camelcased return $vars; } - /** * For package type pxcms-module, cut off a trailing '-plugin' if present. * - * return string + * @param array $vars + * @return array */ - protected function inflectThemeVars($vars) + protected function inflectThemeVars(array $vars): array { $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) $vars['name'] = str_replace('theme-', '', $vars['name']); // strip out theme- - $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); // strip out -theme + $vars['name'] = $this->pregReplace('/-theme$/', '', $vars['name']); // strip out -theme $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s $vars['name'] = ucwords($vars['name']); // make module name camelcased diff --git a/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php b/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php index 0f78b5ca6..4caae51d9 100644 --- a/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'bundle' => 'src/{$name}/' ); @@ -10,11 +12,11 @@ class RadPHPInstaller extends BaseInstaller /** * Format package name to CamelCase */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $nameParts = explode('/', $vars['name']); foreach ($nameParts as &$value) { - $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $value)); $value = str_replace(array('-', '_'), ' ', $value); $value = str_replace(' ', '', ucwords($value)); } diff --git a/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php b/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php index 252c7339f..a19eaaf29 100644 --- a/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'theme' => 'themes/{$name}/', 'plugin' => 'plugins/{$name}/' diff --git a/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php b/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php index 23a20347e..b62c926a3 100644 --- a/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php +++ b/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'addon' => 'redaxo/src/addons/{$name}/', 'bestyle-plugin' => 'redaxo/src/addons/be_style/plugins/{$name}/' diff --git a/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php b/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php index 09544576b..26b3aa84a 100644 --- a/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'addon' => 'redaxo/include/addons/{$name}/', 'bestyle-plugin' => 'redaxo/include/addons/be_style/plugins/{$name}/' diff --git a/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php b/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php index d8d795be0..7e7167485 100644 --- a/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php @@ -1,19 +1,18 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', ); /** * Lowercase name and changes the name to a underscores - * - * @param array $vars - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $vars['name'] = strtolower(str_replace('-', '_', $vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php b/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php index 1acd3b14c..7321046f1 100644 --- a/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'Sources/{$name}/', 'theme' => 'Themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php b/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php index 7d20d27a2..82b8e28c7 100644 --- a/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'backend-plugin' => 'engine/Shopware/Plugins/Local/Backend/{$name}/', 'core-plugin' => 'engine/Shopware/Plugins/Local/Core/{$name}/', @@ -18,29 +20,32 @@ class ShopwareInstaller extends BaseInstaller /** * Transforms the names - * @param array $vars - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'shopware-theme') { return $this->correctThemeName($vars); } - return $this->correctPluginName($vars); + return $this->correctPluginName($vars); } /** * Changes the name to a camelcased combination of vendor and name - * @param array $vars - * @return array + * + * @param array $vars + * @return array */ - private function correctPluginName($vars) + private function correctPluginName(array $vars): array { $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { return strtoupper($matches[0][1]); }, $vars['name']); + if (null === $camelCasedName) { + throw new \RuntimeException('Failed to run preg_replace_callback: '.preg_last_error()); + } + $vars['name'] = ucfirst($vars['vendor']) . ucfirst($camelCasedName); return $vars; @@ -48,10 +53,11 @@ private function correctPluginName($vars) /** * Changes the name to a underscore separated name - * @param array $vars - * @return array + * + * @param array $vars + * @return array */ - private function correctThemeName($vars) + private function correctThemeName(array $vars): array { $vars['name'] = str_replace('-', '_', $vars['name']); diff --git a/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php b/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php index 81910e9f1..aa2de2163 100644 --- a/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php @@ -1,10 +1,12 @@ */ protected $locations = array( 'module' => '{$name}/', 'theme' => 'themes/{$name}/', @@ -15,12 +17,8 @@ class SilverStripeInstaller extends BaseInstaller * * Relies on built-in BaseInstaller behaviour with one exception: silverstripe/framework * must be installed to 'sapphire' and not 'framework' if the version is <3.0.0 - * - * @param PackageInterface $package - * @param string $frameworkType - * @return string */ - public function getInstallPath(PackageInterface $package, $frameworkType = '') + public function getInstallPath(PackageInterface $package, string $frameworkType = ''): string { if ( $package->getName() == 'silverstripe/framework' diff --git a/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php b/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php index 762d94c68..0af3239b4 100644 --- a/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php @@ -4,17 +4,26 @@ class SiteDirectInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'module' => 'modules/{$vendor}/{$name}/', 'plugin' => 'plugins/{$vendor}/{$name}/' ); - public function inflectPackageVars($vars) + /** + * @param array $vars + * @return array + */ + public function inflectPackageVars(array $vars): array { return $this->parseVars($vars); } - protected function parseVars($vars) + /** + * @param array $vars + * @return array + */ + protected function parseVars(array $vars): array { $vars['vendor'] = strtolower($vars['vendor']) == 'sitedirect' ? 'SiteDirect' : $vars['vendor']; $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); diff --git a/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php b/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php index a31c9fda0..72afa081b 100644 --- a/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', 'theme' => 'themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php b/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php index 8626a9bc2..24673d2f7 100644 --- a/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'app/modules/{$name}/', 'theme' => 'themes/{$name}/', @@ -12,10 +14,8 @@ class SyDESInstaller extends BaseInstaller * Format module name. * * Strip `sydes-` prefix and a trailing '-theme' or '-module' from package name if present. - * - * {@inerhitDoc} */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] == 'sydes-module') { return $this->inflectModuleVars($vars); @@ -28,18 +28,26 @@ public function inflectPackageVars($vars) return $vars; } - public function inflectModuleVars($vars) + /** + * @param array $vars + * @return array + */ + public function inflectModuleVars(array $vars): array { - $vars['name'] = preg_replace('/(^sydes-|-module$)/i', '', $vars['name']); + $vars['name'] = $this->pregReplace('/(^sydes-|-module$)/i', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } - protected function inflectThemeVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array { - $vars['name'] = preg_replace('/(^sydes-|-theme$)/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/(^sydes-|-theme$)/', '', $vars['name']); $vars['name'] = strtolower($vars['name']); return $vars; diff --git a/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php b/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php index 4357a35bb..c82bd8556 100644 --- a/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'theme' => 'themes/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php b/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php deleted file mode 100644 index 1675c4f21..000000000 --- a/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ -class Symfony1Installer extends BaseInstaller -{ - protected $locations = array( - 'plugin' => 'plugins/{$name}/', - ); - - /** - * Format package name to CamelCase - */ - public function inflectPackageVars($vars) - { - $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) { - return strtoupper($matches[0][1]); - }, $vars['name']); - - return $vars; - } -} diff --git a/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php b/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php deleted file mode 100644 index b1663e843..000000000 --- a/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ -class TYPO3CmsInstaller extends BaseInstaller -{ - protected $locations = array( - 'extension' => 'typo3conf/ext/{$name}/', - ); -} diff --git a/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php b/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php deleted file mode 100644 index 42572f44f..000000000 --- a/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php +++ /dev/null @@ -1,38 +0,0 @@ - 'Packages/Application/{$name}/', - 'framework' => 'Packages/Framework/{$name}/', - 'plugin' => 'Packages/Plugins/{$name}/', - 'site' => 'Packages/Sites/{$name}/', - 'boilerplate' => 'Packages/Boilerplates/{$name}/', - 'build' => 'Build/{$name}/', - ); - - /** - * Modify the package name to be a TYPO3 Flow style key. - * - * @param array $vars - * @return array - */ - public function inflectPackageVars($vars) - { - $autoload = $this->package->getAutoload(); - if (isset($autoload['psr-0']) && is_array($autoload['psr-0'])) { - $namespace = key($autoload['psr-0']); - $vars['name'] = str_replace('\\', '.', $namespace); - } - if (isset($autoload['psr-4']) && is_array($autoload['psr-4'])) { - $namespace = key($autoload['psr-4']); - $vars['name'] = rtrim(str_replace('\\', '.', $namespace), '.'); - } - - return $vars; - } -} diff --git a/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php b/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php index 4f79a45f9..8c1d81447 100644 --- a/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php @@ -1,4 +1,5 @@ */ protected $locations = array( 'extension' => '{$name}' ); - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { $extra = $this->package->getExtra(); diff --git a/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php b/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php index e20e65b83..39ceae071 100644 --- a/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php @@ -4,10 +4,12 @@ class TastyIgniterInstaller extends BaseInstaller { - protected $locations = array( + /** @var array */ + protected $locations = [ + 'module' => 'app/{$name}/', 'extension' => 'extensions/{$vendor}/{$name}/', 'theme' => 'themes/{$name}/', - ); + ]; /** * Format package name. @@ -16,17 +18,68 @@ class TastyIgniterInstaller extends BaseInstaller * Strip vendor name of characters that is not alphanumeric or an underscore * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { + $extra = $this->package->getExtra(); + + if ($vars['type'] === 'tastyigniter-module') { + return $this->inflectModuleVars($vars); + } + if ($vars['type'] === 'tastyigniter-extension') { - $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); - $vars['name'] = preg_replace('/^ti-ext-/', '', $vars['name']); + return $this->inflectExtensionVars($vars, $extra); } if ($vars['type'] === 'tastyigniter-theme') { - $vars['name'] = preg_replace('/^ti-theme-/', '', $vars['name']); + return $this->inflectThemeVars($vars, $extra); + } + + return $vars; + } + + /** + * @param array $vars + * @return array + */ + protected function inflectModuleVars(array $vars): array + { + $vars['name'] = $this->pregReplace('/^ti-module-/', '', $vars['name']); + + return $vars; + } + + /** + * @param array $vars + * @param array $extra + * @return array + */ + protected function inflectExtensionVars(array $vars, array $extra): array + { + if (!empty($extra['tastyigniter-extension']['code'])) { + $parts = explode('.', $extra['tastyigniter-extension']['code']); + $vars['vendor'] = (string)$parts[0]; + $vars['name'] = (string)($parts[1] ?? ''); + } + + $vars['vendor'] = $this->pregReplace('/[^a-z0-9_]/i', '', $vars['vendor']); + $vars['name'] = $this->pregReplace('/^ti-ext-/', '', $vars['name']); + + return $vars; + } + + /** + * @param array $vars + * @param array $extra + * @return array + */ + protected function inflectThemeVars(array $vars, array $extra): array + { + if (!empty($extra['tastyigniter-theme']['code'])) { + $vars['name'] = $extra['tastyigniter-theme']['code']; } + $vars['name'] = $this->pregReplace('/^ti-theme-/', '', $vars['name']); + return $vars; } -} \ No newline at end of file +} diff --git a/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php b/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php index 158af5261..896bed5c0 100644 --- a/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'local/modules/{$name}/', 'frontoffice-template' => 'templates/frontOffice/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php b/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php index 7c0113b85..3b5f14249 100644 --- a/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php @@ -1,14 +1,17 @@ - */ - class TuskInstaller extends BaseInstaller - { - protected $locations = array( - 'task' => '.tusk/tasks/{$name}/', - 'command' => '.tusk/commands/{$name}/', - 'asset' => 'assets/tusk/{$name}/', - ); - } + +namespace Composer\Installers; + +/** + * Composer installer for 3rd party Tusk utilities + * @author Drew Ewing + */ +class TuskInstaller extends BaseInstaller +{ + /** @var array */ + protected $locations = array( + 'task' => '.tusk/tasks/{$name}/', + 'command' => '.tusk/commands/{$name}/', + 'asset' => 'assets/tusk/{$name}/', + ); +} diff --git a/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php b/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php index fcb414ab7..a646c5b2a 100644 --- a/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'sprinkle' => 'app/sprinkles/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php b/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php index 24ca64512..06d5db3a4 100644 --- a/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'plugins/{$name}/', 'theme' => 'themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php b/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php index 7d90c5e6e..cf094dd59 100644 --- a/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'bundle' => 'src/{$vendor}/{$name}/', 'theme' => 'themes/{$name}/' @@ -16,7 +18,7 @@ class VgmcpInstaller extends BaseInstaller * For package type vgmcp-theme, cut off a trailing '-theme' if present. * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'vgmcp-bundle') { return $this->inflectPluginVars($vars); @@ -29,18 +31,26 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectPluginVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectPluginVars(array $vars): array { - $vars['name'] = preg_replace('/-bundle$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-bundle$/', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } - protected function inflectThemeVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array { - $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/-theme$/', '', $vars['name']); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); diff --git a/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php b/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php index b65dbbafd..91b19fd03 100644 --- a/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php @@ -4,6 +4,7 @@ class WHMCSInstaller extends BaseInstaller { + /** @var array */ protected $locations = array( 'addons' => 'modules/addons/{$vendor}_{$name}/', 'fraud' => 'modules/fraud/{$vendor}_{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php b/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php index cff1bf19d..f75a6817c 100644 --- a/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$name}/', 'plugin' => 'plugins/{$vendor}/{$name}/', @@ -15,9 +17,8 @@ class WinterInstaller extends BaseInstaller * For package type winter-plugin, cut off a trailing '-plugin' if present. * * For package type winter-theme, cut off a trailing '-theme' if present. - * */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { if ($vars['type'] === 'winter-module') { return $this->inflectModuleVars($vars); @@ -34,24 +35,36 @@ public function inflectPackageVars($vars) return $vars; } - protected function inflectModuleVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectModuleVars(array $vars): array { - $vars['name'] = preg_replace('/^wn-|-module$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/^wn-|-module$/', '', $vars['name']); return $vars; } - protected function inflectPluginVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectPluginVars(array $vars): array { - $vars['name'] = preg_replace('/^wn-|-plugin$/', '', $vars['name']); - $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + $vars['name'] = $this->pregReplace('/^wn-|-plugin$/', '', $vars['name']); + $vars['vendor'] = $this->pregReplace('/[^a-z0-9_]/i', '', $vars['vendor']); return $vars; } - protected function inflectThemeVars($vars) + /** + * @param array $vars + * @return array + */ + protected function inflectThemeVars(array $vars): array { - $vars['name'] = preg_replace('/^wn-|-theme$/', '', $vars['name']); + $vars['name'] = $this->pregReplace('/^wn-|-theme$/', '', $vars['name']); return $vars; } diff --git a/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php index cb387881d..58a958791 100644 --- a/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'wolf/plugins/{$name}/', ); diff --git a/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php b/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php index 91c46ad99..d46d5ab8e 100644 --- a/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'plugin' => 'wp-content/plugins/{$name}/', 'theme' => 'wp-content/themes/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php b/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php index 27f429ff2..d609dea50 100644 --- a/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php @@ -1,32 +1,23 @@ */ protected $locations = array( 'module' => 'module/{$name}/', ); /** * Format package name to CamelCase - * @param array $vars - * - * @return array */ - public function inflectPackageVars($vars) + public function inflectPackageVars(array $vars): array { - $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = strtolower($this->pregReplace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); return $vars; } -} \ No newline at end of file +} diff --git a/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php b/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php index bde9bc8c8..ccfcd4a0c 100644 --- a/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'library' => 'library/{$name}/', 'extra' => 'extras/library/{$name}/', diff --git a/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php b/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php index 56cdf5da7..d1fd1d789 100644 --- a/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php +++ b/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php @@ -1,8 +1,10 @@ */ protected $locations = array( 'module' => 'modules/{$vendor}-{$name}/', 'theme' => 'themes/{$vendor}-{$name}/' diff --git a/vendor/composer/installers/src/bootstrap.php b/vendor/composer/installers/src/bootstrap.php index 0de276ee2..a5bb9add4 100644 --- a/vendor/composer/installers/src/bootstrap.php +++ b/vendor/composer/installers/src/bootstrap.php @@ -1,9 +1,14 @@ = 70400)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 80000)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { diff --git a/vendor/firebase/php-jwt/CHANGELOG.md b/vendor/firebase/php-jwt/CHANGELOG.md index 4279dfd23..2662b0502 100644 --- a/vendor/firebase/php-jwt/CHANGELOG.md +++ b/vendor/firebase/php-jwt/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## [6.10.1](https://github.com/firebase/php-jwt/compare/v6.10.0...v6.10.1) (2024-05-18) + + +### Bug Fixes + +* ensure ratelimit expiry is set every time ([#556](https://github.com/firebase/php-jwt/issues/556)) ([09cb208](https://github.com/firebase/php-jwt/commit/09cb2081c2c3bc0f61e2f2a5fbea5741f7498648)) +* ratelimit cache expiration ([#550](https://github.com/firebase/php-jwt/issues/550)) ([dda7250](https://github.com/firebase/php-jwt/commit/dda725033585ece30ff8cae8937320d7e9f18bae)) + +## [6.10.0](https://github.com/firebase/php-jwt/compare/v6.9.0...v6.10.0) (2023-11-28) + + +### Features + +* allow typ header override ([#546](https://github.com/firebase/php-jwt/issues/546)) ([79cb30b](https://github.com/firebase/php-jwt/commit/79cb30b729a22931b2fbd6b53f20629a83031ba9)) + ## [6.9.0](https://github.com/firebase/php-jwt/compare/v6.8.1...v6.9.0) (2023-10-04) diff --git a/vendor/firebase/php-jwt/README.md b/vendor/firebase/php-jwt/README.md index 701de23a8..4fd140745 100644 --- a/vendor/firebase/php-jwt/README.md +++ b/vendor/firebase/php-jwt/README.md @@ -17,7 +17,7 @@ composer require firebase/php-jwt ``` Optionally, install the `paragonie/sodium_compat` package from composer if your -php is < 7.2 or does not have libsodium installed: +php env does not have libsodium installed: ```bash composer require paragonie/sodium_compat diff --git a/vendor/firebase/php-jwt/composer.json b/vendor/firebase/php-jwt/composer.json index e23dfe378..816cfd0bd 100644 --- a/vendor/firebase/php-jwt/composer.json +++ b/vendor/firebase/php-jwt/composer.json @@ -20,7 +20,7 @@ ], "license": "BSD-3-Clause", "require": { - "php": "^7.4||^8.0" + "php": "^8.0" }, "suggest": { "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present", @@ -32,10 +32,10 @@ } }, "require-dev": { - "guzzlehttp/guzzle": "^6.5||^7.4", + "guzzlehttp/guzzle": "^7.4", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", - "psr/cache": "^1.0||^2.0", + "psr/cache": "^2.0||^3.0", "psr/http-client": "^1.0", "psr/http-factory": "^1.0" } diff --git a/vendor/firebase/php-jwt/src/CachedKeySet.php b/vendor/firebase/php-jwt/src/CachedKeySet.php index ee529f9f5..65bab74f2 100644 --- a/vendor/firebase/php-jwt/src/CachedKeySet.php +++ b/vendor/firebase/php-jwt/src/CachedKeySet.php @@ -212,15 +212,21 @@ private function rateLimitExceeded(): bool } $cacheItem = $this->cache->getItem($this->rateLimitCacheKey); - if (!$cacheItem->isHit()) { - $cacheItem->expiresAfter(1); // # of calls are cached each minute + + $cacheItemData = []; + if ($cacheItem->isHit() && \is_array($data = $cacheItem->get())) { + $cacheItemData = $data; } - $callsPerMinute = (int) $cacheItem->get(); + $callsPerMinute = $cacheItemData['callsPerMinute'] ?? 0; + $expiry = $cacheItemData['expiry'] ?? new \DateTime('+60 seconds', new \DateTimeZone('UTC')); + if (++$callsPerMinute > $this->maxCallsPerMinute) { return true; } - $cacheItem->set($callsPerMinute); + + $cacheItem->set(['expiry' => $expiry, 'callsPerMinute' => $callsPerMinute]); + $cacheItem->expiresAt($expiry); $this->cache->save($cacheItem); return false; } diff --git a/vendor/firebase/php-jwt/src/JWT.php b/vendor/firebase/php-jwt/src/JWT.php index 6efcbb56d..e9d756398 100644 --- a/vendor/firebase/php-jwt/src/JWT.php +++ b/vendor/firebase/php-jwt/src/JWT.php @@ -203,13 +203,14 @@ public static function encode( string $keyId = null, array $head = null ): string { - $header = ['typ' => 'JWT', 'alg' => $alg]; + $header = ['typ' => 'JWT']; + if (isset($head) && \is_array($head)) { + $header = \array_merge($header, $head); + } + $header['alg'] = $alg; if ($keyId !== null) { $header['kid'] = $keyId; } - if (isset($head) && \is_array($head)) { - $header = \array_merge($head, $header); - } $segments = []; $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($header)); $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($payload)); @@ -250,6 +251,9 @@ public static function sign( return \hash_hmac($algorithm, $msg, $key, true); case 'openssl': $signature = ''; + if (!\is_resource($key) && !openssl_pkey_get_private($key)) { + throw new DomainException('OpenSSL unable to validate key'); + } $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line if (!$success) { throw new DomainException('OpenSSL unable to sign data'); diff --git a/vendor/wpmetabox/meta-box/css/icon.css b/vendor/wpmetabox/meta-box/css/icon.css new file mode 100644 index 000000000..a1fa37a84 --- /dev/null +++ b/vendor/wpmetabox/meta-box/css/icon.css @@ -0,0 +1,14 @@ +.rwmb-icon-select { + display: flex; + align-items: center; + gap: 8px; +} + +.rwmb-icon-select i { + width: 16px; +} + +.rwmb-icon-select svg { + width: 16px; + height: 16px; +} \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/css/input.css b/vendor/wpmetabox/meta-box/css/input.css index 720e22836..4c5ce4e1b 100644 --- a/vendor/wpmetabox/meta-box/css/input.css +++ b/vendor/wpmetabox/meta-box/css/input.css @@ -8,7 +8,8 @@ padding: 0 8px; background: #f0f0f0; border: 1px solid #7e8993; - border-radius: 4px;; + border-radius: 4px; + white-space: nowrap; } .rwmb-input-group-text:first-child, .rwmb-input-group input:not(:last-child) { diff --git a/vendor/wpmetabox/meta-box/css/modal.css b/vendor/wpmetabox/meta-box/css/modal.css index b98cc6477..35015a06f 100644 --- a/vendor/wpmetabox/meta-box/css/modal.css +++ b/vendor/wpmetabox/meta-box/css/modal.css @@ -16,10 +16,28 @@ body.rwmb-modal-show .interface-interface-skeleton__sidebar { right: 30px; bottom: 30px; z-index: 160000; + margin: auto; overflow: hidden; + flex-direction: column; display: none; } +.rwmb-modal[size="small"] { + max-width: 600px; +} + +.rwmb-modal-content { + overflow: hidden; + flex: 1; +} + +iframe#rwmb-modal-iframe { + width: 100%; + height: 100%; + border: none; + overflow: hidden; +} + .rwmb-modal-overlay { position: fixed; top: 0; diff --git a/vendor/wpmetabox/meta-box/css/style.css b/vendor/wpmetabox/meta-box/css/style.css index 5ee16e670..a828f70c0 100644 --- a/vendor/wpmetabox/meta-box/css/style.css +++ b/vendor/wpmetabox/meta-box/css/style.css @@ -104,6 +104,10 @@ padding-left: 15px; } +.rwmb-clone.rwmb-clone-template { + display: none; +} + /* jQuery validation */ p.rwmb-error { color: #dc3232; diff --git a/vendor/wpmetabox/meta-box/css/upload.css b/vendor/wpmetabox/meta-box/css/upload.css index 2d0246c97..c465562cc 100644 --- a/vendor/wpmetabox/meta-box/css/upload.css +++ b/vendor/wpmetabox/meta-box/css/upload.css @@ -2,16 +2,67 @@ height: 200px; border: 4px dashed #ddd; display: flex; - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; text-align: center; } + .rwmb-upload-inside h3 { font-size: 20px; line-height: 1.4; font-weight: 400; margin: 0; } + .rwmb-upload-inside p { margin: .5em 0; +} + +/* Progress bar */ +.rwmb-progress { + --height: 16px; + + margin-bottom: 12px; + + position: relative; + z-index: 1; + + border-radius: 99px; + background-color: #ddd; + + height: var(--height); + line-height: var(--height); + color: #fff; + font-size: 11px; + text-align: center; +} + +.rwmb-progress:before { + display: block; + content: ""; + + position: absolute; + width: calc(var(--value) * 1%); + height: 100%; + z-index: -1; + + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-size: 16px 16px; + background-color: var(--wp-admin-theme-color, #2271b1); + border-radius: 99px 0 0 99px; +} + +.rwmb-progress--completed:before { + border-radius: 99px; + animation: progress 1s linear infinite; +} + +@keyframes progress { + 0% { + background-position: 0 0; + } + + 100% { + background-position: 16px 0px; + } } \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/inc/about/about.php b/vendor/wpmetabox/meta-box/inc/about/about.php index ebd2055df..4460bbc0b 100644 --- a/vendor/wpmetabox/meta-box/inc/about/about.php +++ b/vendor/wpmetabox/meta-box/inc/about/about.php @@ -37,7 +37,7 @@ public function init() { public function plugin_links( array $links ): array { $links[] = '' . esc_html__( 'About', 'meta-box' ) . ''; if ( ! $this->update_checker->has_extensions() ) { - $links[] = '' . esc_html__( 'Go Pro', 'meta-box' ) . ''; + $links[] = '' . esc_html__( 'Go Pro', 'meta-box' ) . ''; } return $links; } @@ -125,8 +125,9 @@ public function redirect( $plugin, $network_wide = false ) { $is_cli = 'cli' === php_sapi_name(); $is_plugin = 'meta-box/meta-box.php' === $plugin; $is_bulk_activate = 'activate-selected' === rwmb_request()->post( 'action' ) && count( rwmb_request()->post( 'checked' ) ) > 1; + $is_doing_ajax = defined( 'DOING_AJAX' ) && DOING_AJAX; - if ( ! $is_plugin || $network_wide || $is_cli || $is_bulk_activate || $this->is_bundled() ) { + if ( ! $is_plugin || $network_wide || $is_cli || $is_bulk_activate || $this->is_bundled() || $is_doing_ajax ) { return; } wp_safe_redirect( $this->get_menu_link() ); diff --git a/vendor/wpmetabox/meta-box/inc/about/dashboard.php b/vendor/wpmetabox/meta-box/inc/about/dashboard.php deleted file mode 100644 index a2c584a17..000000000 --- a/vendor/wpmetabox/meta-box/inc/about/dashboard.php +++ /dev/null @@ -1,90 +0,0 @@ -feed_url = $feed_url; - $this->link = $link; - $this->translations = $translations; - $this->slug = sanitize_title( $translations['title'] ); - - $transient_name = $this->get_transient_name(); - add_filter( "transient_$transient_name", [ $this, 'add_news' ] ); - add_action( "wp_ajax_{$this->slug}-dismiss-news", [ $this, 'ajax_dismiss' ] ); - } - - private function get_transient_name() : string { - $locale = get_user_locale(); - return 'dash_v2_' . md5( "dashboard_primary_{$locale}" ); - } - - public function add_news( string $value ) : string { - $is_dismissed = get_user_meta( get_current_user_id(), $this->slug . '_dismiss_news', true ); - $is_dismissed = apply_filters( 'rwmb_dismiss_dashboard_widget', $is_dismissed ); - if ( $is_dismissed ) { - return $value; - } - - ob_start(); - $this->output_script(); - $script = ob_get_clean(); - - return $value . $this->get_html() . $script; - } - - private function get_html() : string { - $cache_key = $this->slug . '-news'; - $output = get_transient( $cache_key ); - if ( false !== $output ) { - return $output; - } - - $feeds = [ - $this->slug => [ - 'link' => $this->link, - 'url' => $this->feed_url, - 'title' => $this->translations['title'], - 'items' => 3, - 'show_summary' => 0, - 'show_author' => 0, - 'show_date' => 0, - ], - ]; - ob_start(); - wp_dashboard_primary_output( 'dashboard_primary', $feeds ); - $output = (string) ob_get_clean(); - - $output = (string) preg_replace( '/(.+?)<\/a>/i', '' . esc_html( $this->translations['title'] ) . ': $2', $output ); - $output = str_replace( '
  • ', '
  • ', $output ); - - set_transient( $cache_key, $output, DAY_IN_SECONDS ); - - return $output; - } - - private function output_script() { - ?> - - slug . '_dismiss_news', 1 ); - wp_send_json_success(); - } -} diff --git a/vendor/wpmetabox/meta-box/inc/about/sections/extensions.php b/vendor/wpmetabox/meta-box/inc/about/sections/extensions.php index be8330925..925c261e1 100644 --- a/vendor/wpmetabox/meta-box/inc/about/sections/extensions.php +++ b/vendor/wpmetabox/meta-box/inc/about/sections/extensions.php @@ -3,7 +3,7 @@


    - +

    @@ -15,7 +15,7 @@
    - +
    @@ -27,7 +27,7 @@
    - +
    @@ -39,7 +39,7 @@
    - +
    @@ -51,7 +51,7 @@
    - +
    @@ -63,7 +63,7 @@
    - +
    @@ -75,7 +75,7 @@
    - +
    @@ -87,7 +87,7 @@
    - +
    @@ -99,7 +99,7 @@
    - +
    @@ -111,9 +111,9 @@
    - +
    - + diff --git a/vendor/wpmetabox/meta-box/inc/about/sections/getting-started.php b/vendor/wpmetabox/meta-box/inc/about/sections/getting-started.php index a4445c098..768bfc1d2 100644 --- a/vendor/wpmetabox/meta-box/inc/about/sections/getting-started.php +++ b/vendor/wpmetabox/meta-box/inc/about/sections/getting-started.php @@ -6,25 +6,25 @@

    - <?php esc_attr_e( 'online generator', 'meta-box' ); ?> + <?php esc_attr_e( 'online generator', 'meta-box' ); ?> -

    +

      -
    • -
    • -
    • -
    • -
    • -
    • -
    • -
    • +
    • -
    • +
    • -
    • +
    • -
    • +
    • -
    -

    +

    diff --git a/vendor/wpmetabox/meta-box/inc/about/sections/support.php b/vendor/wpmetabox/meta-box/inc/about/sections/support.php index 7efedd944..aa15c394e 100644 --- a/vendor/wpmetabox/meta-box/inc/about/sections/support.php +++ b/vendor/wpmetabox/meta-box/inc/about/sections/support.php @@ -9,7 +9,7 @@ ], ]; // Translators: %s - link to documentation. - echo wp_kses( sprintf( __( 'Still need help with Meta Box? We offer excellent support for you. But don\'t forget to check our documentation first.', 'meta-box' ), 'https://docs.metabox.io?utm_source=WordPress&utm_medium=link&utm_campaign=plugin' ), $allowed_html ); + echo wp_kses( sprintf( __( 'Still need help with Meta Box? We offer excellent support for you. But don\'t forget to check our documentation first.', 'meta-box' ), 'https://docs.metabox.io?utm_source=dashboard&utm_medium=link&utm_campaign=meta_box' ), $allowed_html ); ?>

    @@ -23,7 +23,7 @@
    diff --git a/vendor/wpmetabox/meta-box/inc/about/sections/upgrade.php b/vendor/wpmetabox/meta-box/inc/about/sections/upgrade.php index 6b24b0103..dca916d8a 100644 --- a/vendor/wpmetabox/meta-box/inc/about/sections/upgrade.php +++ b/vendor/wpmetabox/meta-box/inc/about/sections/upgrade.php @@ -11,7 +11,7 @@
  • - + diff --git a/vendor/wpmetabox/meta-box/inc/about/sections/welcome.php b/vendor/wpmetabox/meta-box/inc/about/sections/welcome.php index e871ddda0..9e0038bc9 100644 --- a/vendor/wpmetabox/meta-box/inc/about/sections/welcome.php +++ b/vendor/wpmetabox/meta-box/inc/about/sections/welcome.php @@ -9,10 +9,10 @@ ?>
    - +

    - - + +

    diff --git a/vendor/wpmetabox/meta-box/inc/clone.php b/vendor/wpmetabox/meta-box/inc/clone.php index 6c519d6a5..842098745 100644 --- a/vendor/wpmetabox/meta-box/inc/clone.php +++ b/vendor/wpmetabox/meta-box/inc/clone.php @@ -34,6 +34,8 @@ public static function html( array $meta, array $field ) : string { $class .= ' rwmb-sort-clone'; $sort_icon = ""; } + + $class .= $index === 0 ? ' rwmb-clone-template' : ''; $input_html = "
    " . $sort_icon; // Call separated methods for displaying each type of field. @@ -65,6 +67,17 @@ public static function value( $new, $old, $object_id, array $field ) { $new = []; } + $request = rwmb_request(); + $cleanup = $request->post( 'rwmb_cleanup', [] ); // Array of field ids + + // Remove the first item of $new because it's the template. + // Also, check the count of $new because some fields may create another input (e.g., file). + if ( in_array( $field['id'], $cleanup ) ) { + if ( isset( $new[0] ) ) { + array_shift( $new ); + } + } + if ( in_array( $field['type'], [ 'file', 'image' ], true ) ) { $new = RWMB_File_Field::clone_value( $new, $old, $object_id, $field ); } else { @@ -89,7 +102,7 @@ public static function add_clone_button( array $field ) : string { return ''; } $text = RWMB_Field::filter( 'add_clone_button_text', $field['add_button'], $field ); - return '' . esc_html( $text ) . ''; + return '' . esc_html( $text ) . ''; } public static function remove_clone_button( array $field ) : string { diff --git a/vendor/wpmetabox/meta-box/inc/field.php b/vendor/wpmetabox/meta-box/inc/field.php index 19052516b..dc5770ca6 100644 --- a/vendor/wpmetabox/meta-box/inc/field.php +++ b/vendor/wpmetabox/meta-box/inc/field.php @@ -37,10 +37,15 @@ public static function show( array $field, bool $saved, $post_id = 0 ) { $field_html = self::filter( 'html', $field_html, $field, $meta ); } - $end = static::end_html( $field ); - $end = self::filter( 'end_html', $end, $field, $meta ); + $cleanup = ''; - $html = self::filter( 'wrapper_html', "$begin$field_html$end", $field, $meta ); + if ( $field['clone'] ) { + $cleanup = ''; + } + + $end = static::end_html( $field ); + $end = self::filter( 'end_html', $end, $field, $meta ); + $html = self::filter( 'wrapper_html', $begin . $field_html . $cleanup . $end, $field, $meta ); // Display label and input in DIV and allow user-defined classes to be appended. $classes = "rwmb-field rwmb-{$field['type']}-wrapper " . $field['class']; @@ -48,11 +53,12 @@ public static function show( array $field, bool $saved, $post_id = 0 ) { $classes .= ' required'; } - $outer_html = sprintf( - $field['before'] . '
    %s
    ' . $field['after'], - esc_attr( trim( $classes ) ), - $html - ); + $classes = esc_attr( trim( $classes ) ); + + $outer_html = $field['before']; + $outer_html .= '
    ' . $html . '
    '; + $outer_html .= $field['after']; + $outer_html = self::filter( 'outer_html', $outer_html, $field, $meta ); echo $outer_html; // phpcs:ignore WordPress.Security.EscapeOutput @@ -70,7 +76,7 @@ public static function html( $meta, $field ) { return ''; } - protected static function begin_html( array $field ) : string { + protected static function begin_html( array $field ): string { $id = $field['attributes']['id'] ?? $field['id']; $required = $field['required'] || ! empty( $field['attributes']['required'] ); @@ -89,28 +95,30 @@ protected static function begin_html( array $field ) : string { $label ) : ''; - $data_min_clone = is_numeric( $field['min_clone'] ) && $field['min_clone'] > 1 ? ' data-min-clone=' . $field['min_clone'] : ''; - $data_max_clone = is_numeric( $field['max_clone'] ) && $field['max_clone'] > 1 ? ' data-max-clone=' . $field['max_clone'] : ''; + $data_min_clone = is_numeric( $field['min_clone'] ) && $field['min_clone'] > 1 ? ' data-min-clone=' . $field['min_clone'] : ''; + $data_max_clone = is_numeric( $field['max_clone'] ) && $field['max_clone'] > 1 ? ' data-max-clone=' . $field['max_clone'] : ''; + $data_empty_start = $field['clone_empty_start'] ? ' data-clone-empty-start="1"' : ' data-clone-empty-start="0"'; $input_open = sprintf( - '
    ', + '
    ', $data_min_clone, - $data_max_clone + $data_max_clone, + $data_empty_start ); return $label . $input_open; } - protected static function end_html( array $field ) : string { + protected static function end_html( array $field ): string { return RWMB_Clone::add_clone_button( $field ) . static::input_description( $field ) . '
    '; } - protected static function label_description( array $field ) : string { + protected static function label_description( array $field ): string { $id = $field['id'] ? ' id="' . esc_attr( $field['id'] ) . '-label-description"' : ''; return $field['label_description'] ? "{$field['label_description']}

    " : ''; } - protected static function input_description( array $field ) : string { + protected static function input_description( array $field ): string { $id = $field['id'] ? ' id="' . esc_attr( $field['id'] ) . '-description"' : ''; return $field['desc'] ? "{$field['desc']}

    " : ''; } @@ -167,31 +175,32 @@ public static function meta( $post_id, $saved, $field ) { if ( empty( $field['id'] ) ) { return ''; } - // Get raw meta. - $meta = self::call( $field, 'raw_meta', $post_id ); + $raw_meta = self::call( $field, 'raw_meta', $post_id ); + $single_std = self::call( 'get_single_std', $field ); + $std = self::call( 'get_std', $field ); + $saved = $saved && $field['save_field']; // Use $field['std'] only when the meta box hasn't been saved (i.e. the first time we run). - $meta = ! $saved || ! $field['save_field'] ? $field['std'] : $meta; + $meta = $saved ? $raw_meta : $std; - if ( $field['clone'] ) { - $meta = Arr::ensure( $meta ); + if ( ! $field['clone'] ) { + return $meta; + } - // Ensure $meta is an array with values so that the foreach loop in self::show() runs properly. - if ( empty( $meta ) ) { - $meta = [ '' ]; - } + $meta = is_array( $raw_meta ) ? $raw_meta : []; - if ( $field['multiple'] ) { - $first = reset( $meta ); + // Clone empty start = TRUE, get nothing to display + // Clone empty start = FALSE, get all default values to display + $std = $field['clone_empty_start'] ? [] : $std; + $empty_std = $field['clone_empty_start'] ? [] : Arr::to_depth( $raw_meta, Arr::depth( $std ) ); - // If users set std for a cloneable checkbox list field in the Builder, they can only set [value1, value2]. We need to transform it to [[value1, value2]]. - // In other cases, make sure each value is an array. - $meta = is_array( $first ) ? array_map( 'MetaBox\Support\Arr::ensure', $meta ) : [ $meta ]; - } - } elseif ( $field['multiple'] ) { - $meta = Arr::ensure( $meta ); + if ( empty( $meta ) ) { + $meta = $saved ? $empty_std : $std; } + + // 2. Always prepend a template + array_unshift( $meta, $single_std ); return $meta; } @@ -309,6 +318,7 @@ public static function normalize( $field ) { 'add_button' => __( '+ Add more', 'meta-box' ), 'clone_default' => false, 'clone_as_multiple' => false, + 'clone_empty_start' => false, 'class' => '', 'disabled' => false, @@ -369,7 +379,7 @@ public static function get_attributes( $field, $value = null ) { return $attributes; } - public static function render_attributes( array $attributes ) : string { + public static function render_attributes( array $attributes ): string { $output = ''; $attributes = array_filter( $attributes, 'RWMB_Helpers_Value::is_valid_for_attribute' ); @@ -575,4 +585,28 @@ public static function filter() { return $value; } + + protected static function get_std( array $field ) { + $depth = 0; + + if ( $field['multiple'] ) { + $depth++; + } + + if ( $field['clone'] ) { + $depth++; + } + + return Arr::to_depth( $field['std'], $depth ); + } + + protected static function get_single_std( array $field ) { + $depth = 0; + + if ( $field['multiple'] ) { + $depth++; + } + + return Arr::to_depth( $field[ 'std' ], $depth ); + } } diff --git a/vendor/wpmetabox/meta-box/inc/fields/autocomplete.php b/vendor/wpmetabox/meta-box/inc/fields/autocomplete.php index 902d7c96c..6591994f0 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/autocomplete.php +++ b/vendor/wpmetabox/meta-box/inc/fields/autocomplete.php @@ -7,6 +7,7 @@ class RWMB_Autocomplete_Field extends RWMB_Multiple_Values_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-autocomplete', RWMB_CSS_URL . 'autocomplete.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-autocomplete', 'path', RWMB_CSS_DIR . 'autocomplete.css' ); wp_enqueue_script( 'rwmb-autocomplete', RWMB_JS_URL . 'autocomplete.js', [ 'jquery-ui-autocomplete' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-autocomplete', 'RWMB_Autocomplete', [ @@ -26,6 +27,11 @@ public static function html( $meta, $field ) { $meta = [ $meta ]; } + // Filter out empty values in case the array started with empty or 0 values + $meta = array_filter( $meta, function ( $index ) use ( $meta ) { + return $meta[ $index ] !== ''; + }, ARRAY_FILTER_USE_KEY ); + $field = apply_filters( 'rwmb_autocomplete_field', $field, $meta ); $options = $field['options']; @@ -33,7 +39,7 @@ public static function html( $meta, $field ) { $options = []; foreach ( $field['options'] as $value => $label ) { $options[] = [ - 'value' => $value, + 'value' => (string) $value, 'label' => $label, ]; } diff --git a/vendor/wpmetabox/meta-box/inc/fields/background.php b/vendor/wpmetabox/meta-box/inc/fields/background.php index bb695499c..4b622cc19 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/background.php +++ b/vendor/wpmetabox/meta-box/inc/fields/background.php @@ -7,6 +7,7 @@ class RWMB_Background_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-background', RWMB_CSS_URL . 'background.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-background', 'path', RWMB_CSS_DIR . 'background.css' ); $args = func_get_args(); $field = reset( $args ); diff --git a/vendor/wpmetabox/meta-box/inc/fields/button-group.php b/vendor/wpmetabox/meta-box/inc/fields/button-group.php index 399caca79..4d4a47338 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/button-group.php +++ b/vendor/wpmetabox/meta-box/inc/fields/button-group.php @@ -7,6 +7,7 @@ class RWMB_Button_Group_Field extends RWMB_Choice_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-button-group', RWMB_CSS_URL . 'button-group.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-button-group', 'path', RWMB_CSS_DIR . 'button-group.css' ); wp_enqueue_script( 'rwmb-button-group', RWMB_JS_URL . 'button-group.js', [ 'rwmb' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/color.php b/vendor/wpmetabox/meta-box/inc/fields/color.php index c3bf47a7f..fe97e6fc1 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/color.php +++ b/vendor/wpmetabox/meta-box/inc/fields/color.php @@ -7,6 +7,7 @@ class RWMB_Color_Field extends RWMB_Input_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-color', RWMB_CSS_URL . 'color.css', [ 'wp-color-picker' ], RWMB_VER ); + wp_style_add_data( 'rwmb-color', 'path', RWMB_CSS_DIR . 'color.css' ); $dependencies = [ 'wp-color-picker' ]; $args = func_get_args(); diff --git a/vendor/wpmetabox/meta-box/inc/fields/datetime.php b/vendor/wpmetabox/meta-box/inc/fields/datetime.php index 3d158d35d..144cee0e7 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/datetime.php +++ b/vendor/wpmetabox/meta-box/inc/fields/datetime.php @@ -52,14 +52,23 @@ public static function register_assets() { // jQueryUI base theme: https://github.com/jquery/jquery-ui/tree/1.13.2/themes/base $url = RWMB_CSS_URL . 'jqueryui'; wp_register_style( 'jquery-ui-core', "$url/core.css", [], '1.13.2' ); + wp_style_add_data( 'jquery-ui-core', 'path', RWMB_CSS_DIR . 'jqueryui/core.css' ); + wp_register_style( 'jquery-ui-theme', "$url/theme.css", [], '1.13.2' ); + wp_style_add_data( 'jquery-ui-theme', 'path', RWMB_CSS_DIR . 'jqueryui/theme.css' ); + wp_register_style( 'jquery-ui-datepicker', "$url/datepicker.css", [ 'jquery-ui-core', 'jquery-ui-theme' ], '1.13.2' ); + wp_style_add_data( 'jquery-ui-datepicker', 'path', RWMB_CSS_DIR . 'jqueryui/datepicker.css' ); + wp_register_style( 'jquery-ui-slider', "$url/slider.css", [ 'jquery-ui-core', 'jquery-ui-theme' ], '1.13.2' ); + wp_style_add_data( 'jquery-ui-slider', 'path', RWMB_CSS_DIR . 'jqueryui/slider.css' ); // jQueryUI timepicker addon: https://github.com/trentrichardson/jQuery-Timepicker-Addon wp_register_style( 'jquery-ui-timepicker', "$url/jquery-ui-timepicker-addon.min.css", [ 'rwmb-date', 'jquery-ui-slider' ], '1.6.3' ); + wp_style_add_data( 'jquery-ui-timepicker', 'path', RWMB_CSS_DIR . 'jqueryui/jquery-ui-timepicker-addon.min.css' ); wp_register_style( 'rwmb-date', RWMB_CSS_URL . 'date.css', [ 'jquery-ui-datepicker' ], RWMB_VER ); + wp_style_add_data( 'rwmb-date', 'path', RWMB_CSS_DIR . 'date.css' ); // Scripts. $url = RWMB_JS_URL . 'jqueryui'; @@ -233,6 +242,7 @@ public static function normalize( $field ) { 'yearRange' => '-100:+100', 'changeMonth' => true, 'oneLine' => true, + 'stepMinute' => 5, 'controlType' => 'select', // select or slider 'addSliderAccess' => true, 'sliderAccessArgs' => [ diff --git a/vendor/wpmetabox/meta-box/inc/fields/divider.php b/vendor/wpmetabox/meta-box/inc/fields/divider.php index c8b8a61ee..e382099dc 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/divider.php +++ b/vendor/wpmetabox/meta-box/inc/fields/divider.php @@ -7,6 +7,7 @@ class RWMB_Divider_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-divider', RWMB_CSS_URL . 'divider.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-divider', 'path', RWMB_CSS_DIR . 'divider.css' ); } protected static function begin_html( array $field ) : string { diff --git a/vendor/wpmetabox/meta-box/inc/fields/fieldset-text.php b/vendor/wpmetabox/meta-box/inc/fields/fieldset-text.php index fe9b921e5..d339e7dd2 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/fieldset-text.php +++ b/vendor/wpmetabox/meta-box/inc/fields/fieldset-text.php @@ -7,6 +7,7 @@ class RWMB_Fieldset_Text_Field extends RWMB_Input_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-fieldset-text', RWMB_CSS_URL . 'fieldset-text.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-fieldset-text', 'path', RWMB_CSS_DIR . 'fieldset-text.css' ); } /** @@ -21,6 +22,10 @@ public static function html( $meta, $field ) { $html = []; $tpl = '

    %s

    '; + if ( ! is_array( $field['options'] ) ) { + return ''; + } + foreach ( $field['options'] as $key => $label ) { $value = isset( $meta[ $key ] ) ? $meta[ $key ] : ''; $field['attributes']['name'] = $field['field_name'] . "[{$key}]"; diff --git a/vendor/wpmetabox/meta-box/inc/fields/file-input.php b/vendor/wpmetabox/meta-box/inc/fields/file-input.php index 2ce150512..8b16cbc14 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/file-input.php +++ b/vendor/wpmetabox/meta-box/inc/fields/file-input.php @@ -11,6 +11,7 @@ class RWMB_File_Input_Field extends RWMB_Input_Field { public static function admin_enqueue_scripts() { wp_enqueue_media(); wp_enqueue_style( 'rwmb-file-input', RWMB_CSS_URL . 'file-input.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-file-input', 'path', RWMB_CSS_DIR . 'file-input.css' ); wp_enqueue_script( 'rwmb-file-input', RWMB_JS_URL . 'file-input.js', [ 'jquery' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-file-input', 'rwmbFileInput', [ 'frameTitle' => esc_html__( 'Select File', 'meta-box' ), diff --git a/vendor/wpmetabox/meta-box/inc/fields/file-upload.php b/vendor/wpmetabox/meta-box/inc/fields/file-upload.php index 5c2099806..51e5376fa 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/file-upload.php +++ b/vendor/wpmetabox/meta-box/inc/fields/file-upload.php @@ -8,6 +8,7 @@ class RWMB_File_Upload_Field extends RWMB_Media_Field { public static function admin_enqueue_scripts() { parent::admin_enqueue_scripts(); wp_enqueue_style( 'rwmb-upload', RWMB_CSS_URL . 'upload.css', [ 'rwmb-media' ], RWMB_VER ); + wp_style_add_data( 'rwmb-upload', 'path', RWMB_CSS_DIR . 'upload.css' ); wp_enqueue_script( 'rwmb-file-upload', RWMB_JS_URL . 'file-upload.js', [ 'rwmb-media' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/file.php b/vendor/wpmetabox/meta-box/inc/fields/file.php index e0f5307f3..daa3628be 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/file.php +++ b/vendor/wpmetabox/meta-box/inc/fields/file.php @@ -7,6 +7,7 @@ class RWMB_File_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-file', RWMB_CSS_URL . 'file.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-file', 'path', RWMB_CSS_DIR . 'file.css' ); wp_enqueue_script( 'rwmb-file', RWMB_JS_URL . 'file.js', [ 'jquery-ui-sortable' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-file', 'rwmbFile', [ diff --git a/vendor/wpmetabox/meta-box/inc/fields/heading.php b/vendor/wpmetabox/meta-box/inc/fields/heading.php index 64beb0862..ea7eb3a6a 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/heading.php +++ b/vendor/wpmetabox/meta-box/inc/fields/heading.php @@ -7,6 +7,7 @@ class RWMB_Heading_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-heading', RWMB_CSS_URL . 'heading.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-heading', 'path', RWMB_CSS_DIR . 'heading.css' ); } protected static function begin_html( array $field ) : string { diff --git a/vendor/wpmetabox/meta-box/inc/fields/icon.php b/vendor/wpmetabox/meta-box/inc/fields/icon.php new file mode 100644 index 000000000..73f78f07f --- /dev/null +++ b/vendor/wpmetabox/meta-box/inc/fields/icon.php @@ -0,0 +1,305 @@ + $field['icon_file'], + 'icon_dir' => $field['icon_dir'], + 'icon_css' => is_string( $field['icon_css'] ) ? $field['icon_css'] : '', + ]; + $cache_key = md5( serialize( $params ) ) . '-icons'; + $icons = wp_cache_get( $cache_key, self::CACHE_GROUP ); + if ( false !== $icons ) { + return $icons; + } + + $data = self::parse_icon_data( $field ); + + // Reformat icons. + $icons = []; + foreach ( $data as $key => $icon ) { + $icon = self::normalize_icon( $field, $key, $icon ); + + if ( is_numeric( key( $icon ) ) ) { + $icons = array_merge( $icons, $icon ); + continue; + } + + $icons[] = $icon; + } + + // Cache the result. + wp_cache_set( $cache_key, $icons, self::CACHE_GROUP ); + return $icons; + } + + private static function parse_icon_data( array $field ): array { + $keys = [ + 'icon_file', + 'icon_css', + 'icon_dir', + ]; + foreach ( $keys as $key ) { + if ( ! empty( $field[ $key ] ) && is_string( $field[ $key ] ) ) { + return call_user_func( [ __CLASS__, "parse_$key" ], $field ); + } + } + + return []; + } + + private static function parse_icon_file( array $field ): array { + if ( ! file_exists( $field['icon_file'] ) ) { + return []; + } + + $data = (string) file_get_contents( $field['icon_file'] ); + $decoded = json_decode( $data, true ); + + // JSON file. + if ( JSON_ERROR_NONE === json_last_error() ) { + return $decoded; + } + + // Text file: each icon on a line. + return array_map( 'trim', explode( "\n", $data ) ); + } + + private static function parse_icon_css( array $field ): array { + // Parse local CSS file only. + $file = self::url_to_path( $field['icon_css'] ); + if ( ! file_exists( $file ) ) { + return []; + } + + $css = (string) file_get_contents( $file ); + + preg_match_all( '/\.([^\s:]+):before/', $css, $matches ); + + if ( empty( $matches[1] ) ) { + preg_match_all( '/\.([^\s:]+)/', $css, $matches ); + } + + return $matches[1]; + } + + private static function parse_icon_dir( array $field ): array { + $dir = $field['icon_dir']; + if ( ! is_dir( $dir ) ) { + return []; + } + + $icons = []; + $files = glob( trailingslashit( $dir ) . '*.svg' ); + + foreach ( $files as $file ) { + $filename = substr( basename( $file ), 0, -4 ); + $icons[] = [ + 'value' => $filename, + 'label' => $filename, + 'svg' => file_get_contents( $file ), + ]; + } + + return $icons; + } + + private static function normalize_icon( array $field, $key, $icon ): array { + // Default: Font Awesome Free. + if ( $field['icon_set'] === 'font-awesome-free' ) { + $style = $icon['styles'][0]; + return [ + 'value' => "fa-{$style} fa-{$key}", + 'label' => $icon['label'], + 'svg' => $icon['svg'][ $style ]['raw'], + ]; + } + + // Font Awesome Pro. + if ( $field['icon_set'] === 'font-awesome-pro' ) { + $icons = []; + foreach ( $icon['styles'] as $style ) { + $icons[] = [ + 'value' => "fa-{$style} fa-{$key}", + 'label' => "{$icon[ 'label' ]} ({$style})", + 'svg' => $icon['svg'][ $style ]['raw'], + ]; + } + return $icons; + } + + // JSON file: "icon-class": { "label": "Label", "svg": "" } or from `icon_dir`. + if ( is_array( $icon ) ) { + return [ + 'value' => $icon['value'] ?? $key, + 'label' => $icon['label'] ?? $key, + 'svg' => $icon['svg'] ?? '', + ]; + } + + // JSON file: "icon-class": "Label" or "icon-class": "". + if ( is_string( $key ) ) { + $label = str_contains( $icon, ' $key, + 'label' => $label, + 'svg' => $svg, + ]; + } + + // Parse classes from CSS. + if ( $field['icon_css'] && ! $field['icon_file'] ) { + $icon = trim( $field['icon_base_class'] . ' ' . $icon ); + } + + // Text file: each icon on a line. + return [ + 'value' => $icon, + 'label' => $icon, + 'svg' => '', + ]; + } + + private static function get_svg( array $field, string $value ): string { + $file = trailingslashit( $field['icon_dir'] ) . $value . '.svg'; + return file_exists( $file ) ? file_get_contents( $file ) : ''; + } + + private static function get_options( array $field ): array { + $icons = self::get_icons( $field ); + + $options = []; + foreach ( $icons as $icon ) { + $svg = ! $icon['svg'] && $field['icon_dir'] ? self::get_svg( $field, $icon['value'] ) : $icon['svg']; + + $options[] = [ + 'value' => $icon['value'], + 'label' => $svg . $icon['label'], + ]; + } + + return $options; + } + + /** + * Normalize field settings. + * + * @param array $field Field settings. + * @return array + */ + public static function normalize( $field ) { + $field = wp_parse_args( $field, [ + 'placeholder' => __( 'Select an icon', 'meta-box' ), + 'icon_css' => '', + 'icon_set' => '', + 'icon_file' => '', + 'icon_dir' => '', + 'icon_base_class' => '', + ] ); + + // Ensure absolute paths and URLs. + $field['icon_file'] = self::ensure_absolute_path( $field['icon_file'] ); + $field['icon_dir'] = self::ensure_absolute_path( $field['icon_dir'] ); + if ( is_string( $field['icon_css'] ) && $field['icon_css'] ) { + $field['icon_css'] = self::ensure_absolute_url( $field['icon_css'] ); + } + + // Font Awesome Pro. + if ( $field['icon_set'] === 'font-awesome-pro' ) { + + } elseif ( $field['icon_file'] || $field['icon_dir'] || $field['icon_css'] ) { + // Custom icon set. + $field['icon_set'] = 'custom'; + } else { + // Font Awesome Free. + $field['icon_set'] = 'font-awesome-free'; + $field['icon_file'] = RWMB_DIR . 'css/fontawesome/icons.json'; + } + + $field['options'] = self::get_options( $field ); + + $field = parent::normalize( $field ); + + return $field; + } + + /** + * Format value for the helper functions. + * + * @param array $field Field parameters. + * @param string|array $value The field meta value. + * @param array $args Additional arguments. Rarely used. See specific fields for details. + * @param int|null $post_id Post ID. null for current post. Optional. + * + * @return string + */ + public static function format_single_value( $field, $value, $args, $post_id ) { + // SVG from file. + if ( $field['icon_dir'] ) { + return self::get_svg( $field, $value ); + } + + $icons = self::get_icons( $field ); + $key = array_search( $value, array_column( $icons, 'value' ) ); + if ( false === $key ) { + return ''; + } + + // Embed SVG. + if ( $icons[ $key ]['svg'] ) { + return $icons[ $key ]['svg']; + } + + // Render with class and use css. + self::enqueue_icon_font_style( $field ); + return sprintf( '', $value ); + } + + private static function url_to_path( string $url ): string { + return str_starts_with( $url, home_url( '/' ) ) ? str_replace( home_url( '/' ), trailingslashit( ABSPATH ), $url ) : ''; + } + + private static function ensure_absolute_path( string $path ): string { + if ( ! $path || file_exists( $path ) ) { + return $path; + } + + $root = wp_normalize_path( ABSPATH ); + $path = wp_normalize_path( $path ); + + return str_starts_with( $path, $root ) ? $path : trailingslashit( $root ) . ltrim( $path, '/' ); + } + + private static function ensure_absolute_url( string $url ): string { + return filter_var( $url, FILTER_VALIDATE_URL ) ? $url : home_url( $url ); + } +} diff --git a/vendor/wpmetabox/meta-box/inc/fields/image-select.php b/vendor/wpmetabox/meta-box/inc/fields/image-select.php index 12e0e839b..23c2f4a6d 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/image-select.php +++ b/vendor/wpmetabox/meta-box/inc/fields/image-select.php @@ -7,6 +7,7 @@ class RWMB_Image_Select_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-image-select', RWMB_CSS_URL . 'image-select.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-image-select', 'path', RWMB_CSS_DIR . 'image-select.css' ); wp_enqueue_script( 'rwmb-image-select', RWMB_JS_URL . 'image-select.js', [ 'jquery' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/image.php b/vendor/wpmetabox/meta-box/inc/fields/image.php index 0595f62c7..f5349550b 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/image.php +++ b/vendor/wpmetabox/meta-box/inc/fields/image.php @@ -9,6 +9,7 @@ public static function admin_enqueue_scripts() { parent::admin_enqueue_scripts(); wp_enqueue_media(); wp_enqueue_style( 'rwmb-image', RWMB_CSS_URL . 'image.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-image', 'path', RWMB_CSS_DIR . 'image.css' ); } /** diff --git a/vendor/wpmetabox/meta-box/inc/fields/input-list.php b/vendor/wpmetabox/meta-box/inc/fields/input-list.php index 52f977380..54b7f782f 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/input-list.php +++ b/vendor/wpmetabox/meta-box/inc/fields/input-list.php @@ -7,6 +7,7 @@ class RWMB_Input_List_Field extends RWMB_Choice_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-input-list', RWMB_CSS_URL . 'input-list.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-input-list', 'path', RWMB_CSS_DIR . 'input-list.css' ); wp_enqueue_script( 'rwmb-input-list', RWMB_JS_URL . 'input-list.js', [], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/input.php b/vendor/wpmetabox/meta-box/inc/fields/input.php index 1d5440f52..eb3925d5b 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/input.php +++ b/vendor/wpmetabox/meta-box/inc/fields/input.php @@ -7,6 +7,7 @@ abstract class RWMB_Input_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-input', RWMB_CSS_URL . 'input.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-input', 'path', RWMB_CSS_DIR . 'input.css' ); } /** diff --git a/vendor/wpmetabox/meta-box/inc/fields/key-value.php b/vendor/wpmetabox/meta-box/inc/fields/key-value.php index 7fe4baaaa..6a1cd6168 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/key-value.php +++ b/vendor/wpmetabox/meta-box/inc/fields/key-value.php @@ -7,6 +7,7 @@ class RWMB_Key_Value_Field extends RWMB_Input_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-key-value', RWMB_CSS_URL . 'key-value.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-key-value', 'path', RWMB_CSS_DIR . 'key-value.css' ); } /** diff --git a/vendor/wpmetabox/meta-box/inc/fields/map.php b/vendor/wpmetabox/meta-box/inc/fields/map.php index 8b33365cb..40107ff55 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/map.php +++ b/vendor/wpmetabox/meta-box/inc/fields/map.php @@ -7,6 +7,7 @@ class RWMB_Map_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-map', RWMB_CSS_URL . 'map.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-map', 'path', RWMB_CSS_DIR . 'map.css' ); $args = func_get_args(); $field = $args[0]; @@ -96,24 +97,31 @@ public static function normalize( $field ) { * @return mixed Array(latitude, longitude, zoom) */ public static function get_value( $field, $args = [], $post_id = null ) { - $value = parent::get_value( $field, $args, $post_id ); + $value = parent::get_value( $field, $args, $post_id ); + + if ( is_array( $value ) ) { + $location = []; + foreach ( $value as $clone ) { + list( $latitude, $longitude, $zoom ) = explode( ',', $clone . ',,' ); + $location[] = compact( 'latitude', 'longitude', 'zoom' ); + } + return $location; + } + list( $latitude, $longitude, $zoom ) = explode( ',', $value . ',,' ); return compact( 'latitude', 'longitude', 'zoom' ); } /** - * Output the field value. - * Display Google maps. - * - * @param array $field Field parameters. - * @param array $args Additional arguments for the map. - * @param int|null $post_id Post ID. null for current post. Optional. - * - * @return string HTML output of the field + * Format value before render map + * @param mixed $field + * @param mixed $value + * @param mixed $args + * @param mixed $post_id + * @return string */ - public static function the_value( $field, $args = [], $post_id = null ) { - $value = parent::get_value( $field, $args, $post_id ); - $args = wp_parse_args( $args, [ + public static function format_single_value( $field, $value, $args, $post_id ): string { + $args = wp_parse_args( $args, [ 'api_key' => $field['api_key'] ?? '', ] ); return self::render_map( $value, $args ); @@ -128,11 +136,17 @@ public static function the_value( $field, $args = [], $post_id = null ) { * @return string */ public static function render_map( $location, $args = [] ) { - list( $latitude, $longitude, $zoom ) = explode( ',', $location . ',,' ); - if ( ! $latitude || ! $longitude ) { - return ''; + // For compatibility with previous version, or within groups. + if ( is_string( $location ) ) { + list( $latitude, $longitude, $zoom ) = explode( ',', $location . ',,' ); + } else { + extract( $location ); } + if ( ! $latitude || ! $longitude ) { + return ''; + } + $args = wp_parse_args( $args, [ 'latitude' => $latitude, 'longitude' => $longitude, diff --git a/vendor/wpmetabox/meta-box/inc/fields/media.php b/vendor/wpmetabox/meta-box/inc/fields/media.php index a0c3d22bb..9f3542044 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/media.php +++ b/vendor/wpmetabox/meta-box/inc/fields/media.php @@ -13,6 +13,7 @@ public static function admin_enqueue_scripts() { wp_register_script( 'media-grid', includes_url( 'js/media-grid.min.js' ), [ 'media-editor' ], '4.9.7', true ); } wp_enqueue_style( 'rwmb-media', RWMB_CSS_URL . 'media.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-media', 'path', RWMB_CSS_DIR . 'media.css' ); wp_enqueue_script( 'rwmb-media', RWMB_JS_URL . 'media.js', [ 'jquery-ui-sortable', 'underscore', 'backbone', 'media-grid' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-media', 'i18nRwmbMedia', [ diff --git a/vendor/wpmetabox/meta-box/inc/fields/object-choice.php b/vendor/wpmetabox/meta-box/inc/fields/object-choice.php index c79effaac..7b8657047 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/object-choice.php +++ b/vendor/wpmetabox/meta-box/inc/fields/object-choice.php @@ -142,6 +142,7 @@ public static function admin_enqueue_scripts() { } wp_enqueue_style( 'rwmb-modal', RWMB_CSS_URL . 'modal.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-modal', 'path', RWMB_CSS_DIR . 'modal.css' ); wp_enqueue_script( 'rwmb-modal', RWMB_JS_URL . 'modal.js', [ 'jquery' ], RWMB_VER, true ); $type = $field['type'] === 'taxonomy_advanced' ? 'taxonomy' : $field['type']; diff --git a/vendor/wpmetabox/meta-box/inc/fields/oembed.php b/vendor/wpmetabox/meta-box/inc/fields/oembed.php index 192cf0c36..b519f367a 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/oembed.php +++ b/vendor/wpmetabox/meta-box/inc/fields/oembed.php @@ -26,6 +26,7 @@ public static function normalize( $field ) { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-oembed', RWMB_CSS_URL . 'oembed.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-oembed', 'path', RWMB_CSS_DIR . 'oembed.css' ); wp_enqueue_script( 'rwmb-oembed', RWMB_JS_URL . 'oembed.js', [ 'jquery', 'underscore', 'rwmb' ], RWMB_VER, true ); wp_localize_script( 'rwmb-oembed', 'rwmbOembed', [ 'nonce' => wp_create_nonce( 'oembed_get' ), diff --git a/vendor/wpmetabox/meta-box/inc/fields/osm.php b/vendor/wpmetabox/meta-box/inc/fields/osm.php index 55e840b49..706382a7f 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/osm.php +++ b/vendor/wpmetabox/meta-box/inc/fields/osm.php @@ -9,6 +9,7 @@ public static function admin_enqueue_scripts() { self::enqueue_map_assets(); wp_enqueue_style( 'rwmb-osm', RWMB_CSS_URL . 'osm.css', [ 'leaflet' ], RWMB_VER ); + wp_style_add_data( 'rwmb-osm', 'path', RWMB_CSS_DIR . 'osm.css' ); wp_enqueue_script( 'rwmb-osm', RWMB_JS_URL . 'osm.js', [ 'jquery', 'jquery-ui-autocomplete', 'leaflet' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-osm', 'RWMB_Osm', [ @@ -80,40 +81,53 @@ public static function normalize( $field ) { * @return mixed Array(latitude, longitude, zoom) */ public static function get_value( $field, $args = [], $post_id = null ) { - $value = parent::get_value( $field, $args, $post_id ); + $value = parent::get_value( $field, $args, $post_id ); + + if ( is_array( $value ) ) { + $location = []; + foreach ( $value as $clone ) { + list( $latitude, $longitude, $zoom ) = explode( ',', $clone . ',,' ); + $location[] = compact( 'latitude', 'longitude', 'zoom' ); + } + return $location; + } + list( $latitude, $longitude, $zoom ) = explode( ',', $value . ',,' ); return compact( 'latitude', 'longitude', 'zoom' ); } /** - * Output the field value. - * Display Open Street Map using Leaflet - * - * @param array $field Field parameters. - * @param array $args Additional arguments for the map. - * @param int|null $post_id Post ID. null for current post. Optional. - * - * @return string HTML output of the field + * Format value before render map + * @param mixed $field + * @param mixed $value + * @param mixed $args + * @param mixed $post_id + * @return string */ - public static function the_value( $field, $args = [], $post_id = null ) { - $value = parent::get_value( $field, $args, $post_id ); + public static function format_single_value( $field, $value, $args, $post_id ): string { return self::render_map( $value, $args ); } /** * Render a map in the frontend. * - * @param string $location The "latitude,longitude[,zoom]" location. + * @param string|array $location The "latitude,longitude[,zoom]" location. * @param array $args Additional arguments for the map. * * @return string */ public static function render_map( $location, $args = [] ) { - list( $latitude, $longitude, $zoom ) = explode( ',', $location . ',,' ); - if ( ! $latitude || ! $longitude ) { - return ''; + // For compatibility with previous version, or within groups. + if ( is_string( $location ) ) { + list( $latitude, $longitude, $zoom ) = explode( ',', $location . ',,' ); + } else { + extract( $location ); } + if ( ! $latitude || ! $longitude ) { + return ''; + } + $args = wp_parse_args( $args, [ 'latitude' => $latitude, 'longitude' => $longitude, @@ -129,6 +143,7 @@ public static function render_map( $location, $args = [] ) { self::enqueue_map_assets(); wp_enqueue_script( 'rwmb-osm-frontend', RWMB_JS_URL . 'osm-frontend.js', [ 'jquery', 'leaflet' ], RWMB_VER, true ); wp_enqueue_style( 'rwmb-osm-frontend', RWMB_CSS_URL . 'osm-frontend.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-osm-frontend', 'path', RWMB_CSS_DIR . 'osm-frontend.css' ); /* * More Open Street Map options diff --git a/vendor/wpmetabox/meta-box/inc/fields/post.php b/vendor/wpmetabox/meta-box/inc/fields/post.php index 8cf78ad56..665cfebae 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/post.php +++ b/vendor/wpmetabox/meta-box/inc/fields/post.php @@ -133,6 +133,10 @@ public static function query( $meta, array $field ): array { $options = []; foreach ( $query->posts as $post ) { + if ( ! current_user_can( 'read_post', $post ) ) { + continue; + } + $label = $post->post_title ? $post->post_title : __( '(No title)', 'meta-box' ); $label = self::filter( 'choice_label', $label, $field, $post ); $options[ $post->ID ] = [ diff --git a/vendor/wpmetabox/meta-box/inc/fields/range.php b/vendor/wpmetabox/meta-box/inc/fields/range.php index 0eb8e0af0..ecf526c58 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/range.php +++ b/vendor/wpmetabox/meta-box/inc/fields/range.php @@ -25,6 +25,7 @@ public static function html( $meta, $field ) { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-range', RWMB_CSS_URL . 'range.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-range', 'path', RWMB_CSS_DIR . 'range.css' ); wp_enqueue_script( 'rwmb-range', RWMB_JS_URL . 'range.js', [], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/select-advanced.php b/vendor/wpmetabox/meta-box/inc/fields/select-advanced.php index 83d728180..833856fba 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/select-advanced.php +++ b/vendor/wpmetabox/meta-box/inc/fields/select-advanced.php @@ -8,7 +8,10 @@ class RWMB_Select_Advanced_Field extends RWMB_Select_Field { public static function admin_enqueue_scripts() { parent::admin_enqueue_scripts(); wp_enqueue_style( 'rwmb-select2', RWMB_CSS_URL . 'select2/select2.css', [], '4.0.10' ); + wp_style_add_data( 'rwmb-select2', 'path', RWMB_CSS_DIR . 'select2/select2.css' ); + wp_enqueue_style( 'rwmb-select-advanced', RWMB_CSS_URL . 'select-advanced.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-select-advanced', 'path', RWMB_CSS_DIR . 'select-advanced.css' ); wp_register_script( 'rwmb-select2', RWMB_JS_URL . 'select2/select2.min.js', [ 'jquery' ], '4.0.10', true ); diff --git a/vendor/wpmetabox/meta-box/inc/fields/select-tree.php b/vendor/wpmetabox/meta-box/inc/fields/select-tree.php index 9bcce29ad..95e4f82d1 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/select-tree.php +++ b/vendor/wpmetabox/meta-box/inc/fields/select-tree.php @@ -21,6 +21,7 @@ public static function html( $meta, $field ) { public static function admin_enqueue_scripts() { parent::admin_enqueue_scripts(); wp_enqueue_style( 'rwmb-select-tree', RWMB_CSS_URL . 'select-tree.css', [ 'rwmb-select' ], RWMB_VER ); + wp_style_add_data( 'rwmb-select-tree', 'path', RWMB_CSS_DIR . 'select-tree.css' ); wp_enqueue_script( 'rwmb-select-tree', RWMB_JS_URL . 'select-tree.js', [ 'rwmb-select' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/select.php b/vendor/wpmetabox/meta-box/inc/fields/select.php index 05c88f167..c6fcfb6ee 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/select.php +++ b/vendor/wpmetabox/meta-box/inc/fields/select.php @@ -7,6 +7,7 @@ class RWMB_Select_Field extends RWMB_Choice_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-select', RWMB_CSS_URL . 'select.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-select', 'path', RWMB_CSS_DIR . 'select.css' ); wp_enqueue_script( 'rwmb-select', RWMB_JS_URL . 'select.js', [ 'jquery' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/slider.php b/vendor/wpmetabox/meta-box/inc/fields/slider.php index 2987078b7..42c4eacfb 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/slider.php +++ b/vendor/wpmetabox/meta-box/inc/fields/slider.php @@ -8,10 +8,16 @@ class RWMB_Slider_Field extends RWMB_Field { public static function admin_enqueue_scripts() { $url = RWMB_CSS_URL . 'jqueryui'; wp_register_style( 'jquery-ui-core', "$url/core.css", [], '1.13.2' ); + wp_style_add_data( 'jquery-ui-core', 'path', RWMB_CSS_DIR . 'jqueryui/core.css' ); + wp_register_style( 'jquery-ui-theme', "$url/theme.css", [], '1.13.2' ); + wp_style_add_data( 'jquery-ui-theme', 'path', RWMB_CSS_DIR . 'jqueryui/theme.css' ); + wp_register_style( 'jquery-ui-slider', "$url/slider.css", [ 'jquery-ui-core', 'jquery-ui-theme' ], '1.13.2' ); + wp_style_add_data( 'jquery-ui-slider', 'path', RWMB_CSS_DIR . 'jqueryui/slider.css' ); wp_enqueue_style( 'rwmb-slider', RWMB_CSS_URL . 'slider.css', [ 'jquery-ui-slider' ], RWMB_VER ); + wp_style_add_data( 'rwmb-slider', 'path', RWMB_CSS_DIR . 'slider.css' ); wp_enqueue_script( 'rwmb-slider', RWMB_JS_URL . 'slider.js', [ 'jquery-ui-slider', 'jquery-ui-widget', 'jquery-ui-mouse', 'jquery-ui-core' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/fields/switch.php b/vendor/wpmetabox/meta-box/inc/fields/switch.php index 18bb79dbf..80c063076 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/switch.php +++ b/vendor/wpmetabox/meta-box/inc/fields/switch.php @@ -7,6 +7,7 @@ class RWMB_Switch_Field extends RWMB_Input_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-switch', RWMB_CSS_URL . 'switch.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-switch', 'path', RWMB_CSS_DIR . 'switch.css' ); } /** diff --git a/vendor/wpmetabox/meta-box/inc/fields/taxonomy.php b/vendor/wpmetabox/meta-box/inc/fields/taxonomy.php index 5cb654642..382c0397a 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/taxonomy.php +++ b/vendor/wpmetabox/meta-box/inc/fields/taxonomy.php @@ -122,6 +122,7 @@ public static function query( $meta, array $field ): array { // Query only selected items. if ( ! empty( $field['ajax'] ) && ! empty( $meta ) ) { $args['include'] = $meta; + $args['number'] = count( $meta ); } $terms = get_terms( $args ); diff --git a/vendor/wpmetabox/meta-box/inc/fields/text-list.php b/vendor/wpmetabox/meta-box/inc/fields/text-list.php index 010bde480..d8ef5de0e 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/text-list.php +++ b/vendor/wpmetabox/meta-box/inc/fields/text-list.php @@ -7,6 +7,7 @@ class RWMB_Text_List_Field extends RWMB_Multiple_Values_Field { public static function admin_enqueue_scripts() { wp_enqueue_style( 'rwmb-text-list', RWMB_CSS_URL . 'text-list.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-text-list', 'path', RWMB_CSS_DIR . 'text-list.css' ); } /** diff --git a/vendor/wpmetabox/meta-box/inc/fields/time.php b/vendor/wpmetabox/meta-box/inc/fields/time.php index 2654a9cc4..1ae8cc74a 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/time.php +++ b/vendor/wpmetabox/meta-box/inc/fields/time.php @@ -22,4 +22,12 @@ public static function normalize( $field ) { $field['js_options']['timeFormat'] = empty( $field['format'] ) ? $field['js_options']['timeFormat'] : $field['format']; return $field; } -} + + /** + * Returns a date() compatible format string from the JavaScript format. + * @link http://www.php.net/manual/en/function.date.php + */ + protected static function get_php_format( array $js_options ): string { + return strtr( $js_options['timeFormat'], self::$time_formats ); + } +} \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/inc/fields/user.php b/vendor/wpmetabox/meta-box/inc/fields/user.php index 62856b4f8..f440bbfec 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/user.php +++ b/vendor/wpmetabox/meta-box/inc/fields/user.php @@ -17,7 +17,7 @@ public static function ajax_get_users() { $request = rwmb_request(); $field = $request->filter_post( 'field', FILTER_DEFAULT, FILTER_FORCE_ARRAY ); - + // Required for 'choice_label' filter. See self::filter(). $field['clone'] = false; $field['_original_id'] = $field['id']; @@ -96,27 +96,28 @@ public static function normalize( $field ) { public static function query( $meta, array $field ): array { $display_field = $field['display_field']; + $args = wp_parse_args( $field['query_args'], [ 'orderby' => $display_field, 'order' => 'asc', - 'fields' => [ - 'ID', - 'user_login', - 'user_pass', - 'user_nicename', - 'user_email', - 'user_url', - 'user_registered', - 'user_status', - 'display_name', - ], ] ); + $args['fields'] = [ + 'ID', + 'user_login', + 'user_nicename', + 'user_url', + 'user_registered', + 'user_status', + 'display_name', + ]; + $meta = wp_parse_id_list( (array) $meta ); // Query only selected items. if ( ! empty( $field['ajax'] ) && ! empty( $meta ) ) { $args['include'] = $meta; + $args['number'] = count( $meta ); } // Get from cache to prevent same queries. @@ -131,7 +132,7 @@ public static function query( $meta, array $field ): array { $users = get_users( $args ); $options = []; foreach ( $users as $user ) { - $label = $user->$display_field ? $user->$display_field : __( '(No title)', 'meta-box' ); + $label = $user->$display_field ?? __( '(No title)', 'meta-box' ); $label = self::filter( 'choice_label', $label, $field, $user ); $options[ $user->ID ] = [ diff --git a/vendor/wpmetabox/meta-box/inc/fields/video.php b/vendor/wpmetabox/meta-box/inc/fields/video.php index 48f708dcf..c659bb64d 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/video.php +++ b/vendor/wpmetabox/meta-box/inc/fields/video.php @@ -8,6 +8,7 @@ class RWMB_Video_Field extends RWMB_Media_Field { public static function admin_enqueue_scripts() { parent::admin_enqueue_scripts(); wp_enqueue_style( 'rwmb-video', RWMB_CSS_URL . 'video.css', [ 'rwmb-media' ], RWMB_VER ); + wp_style_add_data( 'rwmb-video', 'path', RWMB_CSS_DIR . 'video.css' ); wp_enqueue_script( 'rwmb-video', RWMB_JS_URL . 'video.js', [ 'rwmb-media' ], RWMB_VER, true ); RWMB_Helpers_Field::localize_script_once( 'rwmb-video', 'i18nRwmbVideo', [ 'extensions' => wp_get_video_extensions(), diff --git a/vendor/wpmetabox/meta-box/inc/fields/wysiwyg.php b/vendor/wpmetabox/meta-box/inc/fields/wysiwyg.php index 91ba57b9b..d28f3f77a 100644 --- a/vendor/wpmetabox/meta-box/inc/fields/wysiwyg.php +++ b/vendor/wpmetabox/meta-box/inc/fields/wysiwyg.php @@ -8,6 +8,7 @@ class RWMB_Wysiwyg_Field extends RWMB_Field { public static function admin_enqueue_scripts() { wp_enqueue_editor(); wp_enqueue_style( 'rwmb-wysiwyg', RWMB_CSS_URL . 'wysiwyg.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-wysiwyg', 'path', RWMB_CSS_DIR . 'wysiwyg.css' ); wp_enqueue_script( 'rwmb-wysiwyg', RWMB_JS_URL . 'wysiwyg.js', [ 'jquery', 'rwmb' ], RWMB_VER, true ); } diff --git a/vendor/wpmetabox/meta-box/inc/functions.php b/vendor/wpmetabox/meta-box/inc/functions.php index a4f855f61..8b8bf1898 100644 --- a/vendor/wpmetabox/meta-box/inc/functions.php +++ b/vendor/wpmetabox/meta-box/inc/functions.php @@ -22,12 +22,13 @@ function rwmb_meta( $key, $args = [], $post_id = null ) { * Then fallback to the old method to retrieve meta (which uses get_post_meta() as the latest fallback). */ if ( false === $field ) { - return apply_filters( 'rwmb_meta', rwmb_meta_legacy( $key, $args, $post_id ) ); + $value = rwmb_meta_legacy( $key, $args, $post_id ); + return apply_filters( 'rwmb_meta', $value, $key, $args, $post_id ); } - $meta = in_array( $field['type'], [ 'oembed', 'map', 'osm' ], true ) ? + $value = in_array( $field['type'], [ 'oembed', 'map', 'osm' ], true ) ? rwmb_the_value( $key, $args, $post_id, false ) : rwmb_get_value( $key, $args, $post_id ); - return apply_filters( 'rwmb_meta', $meta, $key, $args, $post_id ); + return apply_filters( 'rwmb_meta', $value, $key, $args, $post_id ); } } @@ -77,9 +78,9 @@ function rwmb_get_field_settings( $key, $args = [], $object_id = null ) { /** * Filter meta type from object type and object id. * - * @var string Meta type, default is post type name. - * @var string Object type. - * @var string|int Object id. + * @var string Meta type, default is post type name. + * @var string Object type. + * @var ?string|?int Object id. */ $type = apply_filters( 'rwmb_meta_type', $args['type'], $args['object_type'], $object_id ); if ( ! $type ) { diff --git a/vendor/wpmetabox/meta-box/inc/loader.php b/vendor/wpmetabox/meta-box/inc/loader.php index 469af5743..85634c589 100644 --- a/vendor/wpmetabox/meta-box/inc/loader.php +++ b/vendor/wpmetabox/meta-box/inc/loader.php @@ -7,7 +7,7 @@ class RWMB_Loader { protected function constants() { // Script version, used to add version for scripts and styles. - define( 'RWMB_VER', '5.8.2' ); + define( 'RWMB_VER', '5.10.1' ); list( $path, $url ) = self::get_path( dirname( __DIR__ ) ); @@ -19,6 +19,7 @@ protected function constants() { // Plugin paths, for including files. define( 'RWMB_DIR', $path ); define( 'RWMB_INC_DIR', trailingslashit( RWMB_DIR . 'inc' ) ); + define( 'RWMB_CSS_DIR', trailingslashit( RWMB_DIR . 'css' ) ); } /** @@ -109,20 +110,14 @@ public function init() { $update_notification->init(); // Register categories for page builders. - new \MetaBox\Block\Register(); - new \MetaBox\Oxygen\Register(); - new \MetaBox\Elementor\Register(); - new \MetaBox\Bricks\Register(); + new \MetaBox\Integrations\Block(); + new \MetaBox\Integrations\Bricks; + new \MetaBox\Integrations\Elementor; + new \MetaBox\Integrations\Oxygen(); if ( is_admin() ) { $about = new RWMB_About( $update_checker ); $about->init(); - - new RWMB_Dashboard( 'http://feeds.feedburner.com/metaboxio', 'https://metabox.io/blog/', [ - 'title' => 'Meta Box', - 'dismiss_tooltip' => esc_html__( 'Dismiss all Meta Box news', 'meta-box' ), - 'dismiss_confirm' => esc_html__( 'Are you sure to dismiss all Meta Box news?', 'meta-box' ), - ] ); } // Public functions. diff --git a/vendor/wpmetabox/meta-box/inc/media-modal.php b/vendor/wpmetabox/meta-box/inc/media-modal.php index 285b7428a..0ea5205dd 100644 --- a/vendor/wpmetabox/meta-box/inc/media-modal.php +++ b/vendor/wpmetabox/meta-box/inc/media-modal.php @@ -35,11 +35,8 @@ public function get_fields() { * * @return mixed */ - public function add_fields( $form_fields, ?WP_Post $post ) { - if (is_null($post)) { - return $form_fields; - } - if ( $this->is_attachment_edit_screen() ) { + public function add_fields( $form_fields, $post ) { + if ( empty( $post ) || $this->is_attachment_edit_screen() ) { return $form_fields; } diff --git a/vendor/wpmetabox/meta-box/inc/meta-box.php b/vendor/wpmetabox/meta-box/inc/meta-box.php index 12a9c4828..bb2411431 100644 --- a/vendor/wpmetabox/meta-box/inc/meta-box.php +++ b/vendor/wpmetabox/meta-box/inc/meta-box.php @@ -110,13 +110,15 @@ protected function object_hooks() { } public function enqueue() { - if ( is_admin() && ! $this->is_edit_screen() ) { + if ( is_admin() && ! $this->is_edit_screen() && ! $this->is_gutenberg_screen() ) { return; } wp_enqueue_style( 'rwmb', RWMB_CSS_URL . 'style.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb', 'path', RWMB_CSS_DIR . 'style.css' ); if ( is_rtl() ) { wp_enqueue_style( 'rwmb-rtl', RWMB_CSS_URL . 'style-rtl.css', [], RWMB_VER ); + wp_style_add_data( 'rwmb-rtl', 'path', RWMB_CSS_DIR . 'style-rtl.css' ); } wp_enqueue_script( 'rwmb', RWMB_JS_URL . 'script.js', [ 'jquery' ], RWMB_VER, true ); @@ -147,6 +149,12 @@ public function enqueue() { do_action( 'rwmb_enqueue_scripts', $this ); } + private function is_gutenberg_screen() : bool { + $screen = get_current_screen(); + + return in_array( $screen->base, [ 'site-editor', 'widgets' ] ); + } + /** * Add meta box for multiple post types */ diff --git a/vendor/wpmetabox/meta-box/inc/sanitizer.php b/vendor/wpmetabox/meta-box/inc/sanitizer.php index 33ddb0f16..8c3c3421a 100644 --- a/vendor/wpmetabox/meta-box/inc/sanitizer.php +++ b/vendor/wpmetabox/meta-box/inc/sanitizer.php @@ -117,7 +117,7 @@ private function sanitize_color( string $value ): string { } if ( ! str_contains( $value, 'rgb' ) ) { - return sanitize_hex_color( $value ); + return (string) sanitize_hex_color( $value ); } // rgba value. diff --git a/vendor/wpmetabox/meta-box/inc/shortcode.php b/vendor/wpmetabox/meta-box/inc/shortcode.php index c29b3bbea..821e0226f 100644 --- a/vendor/wpmetabox/meta-box/inc/shortcode.php +++ b/vendor/wpmetabox/meta-box/inc/shortcode.php @@ -22,15 +22,33 @@ public function register_shortcode( $atts ) { $field_id = $atts['id']; $object_id = $atts['object_id']; + unset( $atts['id'], $atts['object_id'] ); $value = $this->get_value( $field_id, $object_id, $atts ); $value = 'true' === $atts['render_shortcodes'] ? do_shortcode( $value ) : $value; + $secure = apply_filters( 'rwmb_meta_shortcode_secure', true, $field_id, $atts, $object_id ); + $secure = apply_filters( "rwmb_meta_shortcode_secure_{$field_id}", $secure, $atts, $object_id ); + + if ( $secure ) { + $value = wp_kses_post( $value ); + } + return $value; } private function get_value( $field_id, $object_id, $atts ) { + // If we pass object_id via shortcode, we need to make sure current user + // has permission to view the object + if ( ! is_null ( $object_id ) ) { + $has_object_permission = $this->check_object_permission( $object_id, $atts ); + + if ( ! $has_object_permission ) { + return null; + } + } + $attribute = $atts['attribute']; if ( ! $attribute ) { return rwmb_the_value( $field_id, $atts, $object_id, false ); @@ -55,4 +73,30 @@ private function get_value( $field_id, $object_id, $atts ) { return $value; } + + private function check_object_permission( $object_id, $atts ) { + // Skip checking if object_type is not post + if ( isset( $atts['object_type'] ) && $atts['object_type'] !== 'post' ) { + return true; + } + + $post = get_post( $object_id ); + if ( ! $post ) { + return false; + } + + // Skip checking if post status is publish AND no password is set + if ( 'publish' === $post->post_status && ! post_password_required( $post ) ) { + return true; + } + + $object_type = get_post_type_object( $post->post_type ); + if ( ! $object_type ) { + return false; + } + + $read_post = $object_type->cap->read_post; + + return current_user_can( $read_post, $object_id ); + } } diff --git a/vendor/wpmetabox/meta-box/inc/templates/media.php b/vendor/wpmetabox/meta-box/inc/templates/media.php index b2a72d8ac..0c91ead1f 100644 --- a/vendor/wpmetabox/meta-box/inc/templates/media.php +++ b/vendor/wpmetabox/meta-box/inc/templates/media.php @@ -30,9 +30,15 @@ {{{ i18nRwmbMedia.edit }}} + <# if( data.file ) { #> + + {{{ i18nRwmbMedia.remove }}} + + <# } else { #> {{{ i18nRwmbMedia.remove }}} + <# } #>
    diff --git a/vendor/wpmetabox/meta-box/inc/validation.php b/vendor/wpmetabox/meta-box/inc/validation.php index 76d247285..bb42a66ec 100644 --- a/vendor/wpmetabox/meta-box/inc/validation.php +++ b/vendor/wpmetabox/meta-box/inc/validation.php @@ -12,28 +12,32 @@ public function __construct() { * Output validation rules of each meta box. * The rules are outputted in [data-validation] attribute of an hidden '; + echo ''; } public function enqueue() { - wp_enqueue_script( 'jquery-validation', RWMB_JS_URL . 'validation/jquery.validate.js', [ 'jquery' ], '1.19.5', true ); - wp_enqueue_script( 'jquery-validation-additional-methods', RWMB_JS_URL . 'validation/additional-methods.js', [ 'jquery-validation' ], '1.19.5', true ); + wp_enqueue_script( 'jquery-validation', RWMB_JS_URL . 'validation/jquery.validate.js', [ 'jquery' ], '1.20.0', true ); + wp_enqueue_script( 'jquery-validation-additional-methods', RWMB_JS_URL . 'validation/additional-methods.js', [ 'jquery-validation' ], '1.20.0', true ); wp_enqueue_script( 'rwmb-validation', RWMB_JS_URL . 'validation/validation.js', [ 'jquery-validation-additional-methods', 'rwmb' ], RWMB_VER, true ); $locale = determine_locale(); @@ -55,7 +59,7 @@ public function enqueue() { $locale = file_exists( RWMB_DIR . "js/validation/i18n/messages_$locale.js" ) ? $locale : $locale_short; if ( file_exists( RWMB_DIR . "js/validation/i18n/messages_$locale.js" ) ) { - wp_enqueue_script( 'jquery-validation-i18n', RWMB_JS_URL . "validation/i18n/messages_$locale.js", [ 'jquery-validation-additional-methods' ], '1.19.5', true ); + wp_enqueue_script( 'jquery-validation-i18n', RWMB_JS_URL . "validation/i18n/messages_$locale.js", [ 'jquery-validation-additional-methods' ], '1.20.0', true ); } RWMB_Helpers_Field::localize_script_once( 'rwmb-validation', 'rwmbValidation', [ diff --git a/vendor/wpmetabox/meta-box/js/clone.js b/vendor/wpmetabox/meta-box/js/clone.js index 6a13b0f3b..1fc8642b0 100644 --- a/vendor/wpmetabox/meta-box/js/clone.js +++ b/vendor/wpmetabox/meta-box/js/clone.js @@ -71,6 +71,13 @@ */ nextIndex: function ( $container ) { var nextIndex = $container.data( 'next-index' ); + + // If we render cloneable fields via AJAX, the mb_ready event is not fired. + // so nextIndex is undefined. In this case, we get the next index from the number of existing clones. + if ( nextIndex === undefined ) { + nextIndex = $container.children( '.rwmb-clone' ).length; + } + $container.data( 'next-index', nextIndex + 1 ); return nextIndex; } @@ -121,16 +128,23 @@ */ function clone( $container ) { var $last = $container.children( '.rwmb-clone' ).last(), - $clone = $last.clone(), + $template = $container.children( '.rwmb-clone-template' ), + $clone = $template.clone(), nextIndex = cloneIndex.nextIndex( $container ); // Clear fields' values. - var $inputs = $clone.find( rwmb.inputSelectors ); - $inputs.each( cloneValue.clear ); - + var $inputs = $clone.find( rwmb.inputSelectors ); + const count = $container.children( '.rwmb-clone' ).length; + + // The first clone should keep the default values. + if ( count > 1 ) { + $inputs.each( cloneValue.clear ); + } + + $clone = $clone.removeClass( 'rwmb-clone-template' ); // Remove validation errors. $clone.find( 'p.rwmb-error' ).remove(); - + // Insert clone. $clone.insertAfter( $last ); @@ -160,13 +174,22 @@ */ function toggleRemoveButtons( $container ) { - var $clones = $container.children( '.rwmb-clone' ), - minClone = 1; + const $clones = $container.children( '.rwmb-clone' ); + let minClone = 1; + let offset = 1; + + // Add the first clone if data-clone-empty-start = false + const cloneEmptyStart = $container[0].dataset.cloneEmptyStart ?? 0; + + // If clone-empty-start is true, we need at least 1 item. + if ( cloneEmptyStart == 1 ) { + offset = 0; + } if ( $container.data( 'min-clone' ) ) { minClone = parseInt( $container.data( 'min-clone' ) ); } - $clones.children( '.remove-clone' ).toggle( $clones.length > minClone ); + $clones.children( '.remove-clone' ).toggle( $clones.length - offset > minClone ); // Recursive for nested groups. $container.find( '.rwmb-input' ).each( function () { @@ -182,7 +205,7 @@ */ function toggleAddButton( $container ) { var $button = $container.children( '.add-clone' ), - maxClone = parseInt( $container.data( 'max-clone' ) ), + maxClone = parseInt( $container.data( 'max-clone' ) ) + 1, numClone = $container.children( '.rwmb-clone' ).length; $button.toggle( isNaN( maxClone ) || ( maxClone && numClone < maxClone ) ); diff --git a/vendor/wpmetabox/meta-box/js/date.js b/vendor/wpmetabox/meta-box/js/date.js index 18b56ad5e..3a8451f6b 100644 --- a/vendor/wpmetabox/meta-box/js/date.js +++ b/vendor/wpmetabox/meta-box/js/date.js @@ -28,6 +28,12 @@ $timestamp.val( getTimestamp( $picker.datepicker( 'getDate' ) ) ); $this.trigger( 'change' ); }; + + $this.on( 'change', () => { + if ( !$this.val() ) { + $timestamp.val( '' ); + } + } ); } if ( ! $inline.length ) { diff --git a/vendor/wpmetabox/meta-box/js/datetime.js b/vendor/wpmetabox/meta-box/js/datetime.js index a97a39427..e8d1c72a6 100644 --- a/vendor/wpmetabox/meta-box/js/datetime.js +++ b/vendor/wpmetabox/meta-box/js/datetime.js @@ -28,6 +28,12 @@ $timestamp.val( getTimestamp( $picker.datetimepicker( 'getDate' ) ) ); $this.trigger( 'change' ); }; + + $this.on( 'change', () => { + if ( !$this.val() ) { + $timestamp.val( '' ); + } + } ); } if ( ! $inline.length ) { diff --git a/vendor/wpmetabox/meta-box/js/file-upload.js b/vendor/wpmetabox/meta-box/js/file-upload.js index c68f727f6..9c9126b46 100644 --- a/vendor/wpmetabox/meta-box/js/file-upload.js +++ b/vendor/wpmetabox/meta-box/js/file-upload.js @@ -7,7 +7,7 @@ FileUploadField = views.FileUploadField = MediaField.extend( { createAddButton: function () { - this.addButton = new UploadButton( {controller: this.controller} ); + this.addButton = new UploadButton( { controller: this.controller } ); } } ); @@ -27,24 +27,36 @@ // Auto hide if you reach the max number of media this.listenTo( this.controller, 'change:full', function () { - this.$el.toggle( ! this.controller.get( 'full' ) ); + this.$el.toggle( !this.controller.get( 'full' ) ); + } ); + + this.collection = this.controller.get( 'items' ); + this.listenTo( this.collection, 'remove', function ( item ) { + if ( item.get( 'file' ) !== undefined ) { + this.uploader.uploader.removeFile( item.get( 'file' ) ); + } + const totalFiles = parseInt( this.uploader.uploader.getOption( 'totalFiles' ) ); + this.uploader.uploader.setOption( 'totalFiles', totalFiles - 1 ); } ); }, // Initializes plupload using code from wp.Uploader (wp-includes/js/plupload/wp-plupload.js) initUploader: function ( $this ) { var self = this, + $input = $this.closest( '.rwmb-input' ), + $process = $input.find( '.rwmb-media-view .rwmb-media-progress' ), extensions = this.getExtensions().join( ',' ), maxFileSize = this.controller.get( 'maxFileSize' ), + maxFiles = parseInt( this.controller.get( 'maxFiles' ) ), options = { container: this.el, dropzone: this.el, browser: this.$( '.rwmb-browse-button' ), params: { - post_id : $( '#post_ID' ).val() + post_id: $( '#post_ID' ).val() }, - added: function( attachment ) { - self.controller.get( 'items' ).add( [attachment] ); + added: function ( attachment ) { + self.controller.get( 'items' ).add( [ attachment ] ); } }; @@ -56,9 +68,48 @@ filters.max_file_size = maxFileSize; } if ( extensions ) { - filters.mime_types = [{title: i18nRwmbMedia.select, extensions: extensions}]; + filters.mime_types = [ { title: i18nRwmbMedia.select, extensions: extensions } ]; } this.uploader.uploader.setOption( 'filters', filters ); + this.uploader.uploader.setOption( 'totalFiles', 0 ); + + this.uploader.uploader.bind( 'FilesAdded', function ( up, files ) { + const that = this, + totalFiles = parseInt( that.getOption( 'totalFiles' ) ); + + $.each( files, function ( i, file ) { + if ( maxFiles !== 0 && i >= maxFiles - totalFiles ) { + up.removeFile( files[ i ] ); + return; + } + + $process.append( `
    + ${ file.name } - ${ file.percent } % +
    ` ); + that.setOption( 'totalFiles', parseInt( that.getOption( 'totalFiles' ) ) + 1 ); + } ); + } ); + + const setWidth = ( file, value ) => $process.find( `#${ file.id }` ).attr( 'aria-valuenow', value ).css( '--value', value ).text( `${ file.name } - ${ value }%` ); + + this.uploader.uploader.bind( 'UploadProgress', ( up, file ) => setWidth( file, file.percent ).addClass( file.percent === 100 ? 'rwmb-progress--completed' : '' ) ); + this.uploader.uploader.bind( 'FileUploaded', ( up, file ) => $process.find( `#${ file.id }` ).fadeOut( 'slow', function () { + $( this ).remove(); + } ) ); + + this.uploader.uploader.bind( 'Error', function ( up, err ) { + + if ( $input.find( '.rwmb-error' ).length === 0 ) { + $input.append( '

    ' ); + } + + const $error = $input.find( '.rwmb-error' ).empty().show(); + $error.text( err.message ); + setTimeout( function () { + $error.fadeOut( "slow" ); + }, 5000 ); + } ); + $this.data( 'uploader', this.uploader ); }, @@ -67,8 +118,8 @@ exts = []; _.each( mimeTypes, function ( current, index ) { - if ( i18nRwmbMedia.extensions[current] ) { - exts = exts.concat( i18nRwmbMedia.extensions[current] ); + if ( i18nRwmbMedia.extensions[ current ] ) { + exts = exts.concat( i18nRwmbMedia.extensions[ current ] ); } } ); return exts; @@ -86,7 +137,8 @@ $this.siblings( '.rwmb-media-view' ).remove(); $this.after( view.el ); - + // Init progress + view.$el.find( '.rwmb-media-list' ).after( '
    ' ); // Init uploader after view is inserted to make wp.Uploader works. view.addButton.initUploader( $this ); @@ -97,7 +149,12 @@ $( e.target ).find( '.rwmb-file_upload' ).each( initFileUpload ); } + function removeFile( e ) { + $( '.rwmb-media-progress #' + $( this ).data( 'file_id' ) ).remove(); + } + rwmb.$document .on( 'mb_ready', init ) .on( 'clone', '.rwmb-file_upload', initFileUpload ) + .on( 'click', '.rwmb-file-actions .rwmb-remove-media', removeFile ); } )( jQuery, wp, rwmb ); diff --git a/vendor/wpmetabox/meta-box/js/icon.js b/vendor/wpmetabox/meta-box/js/icon.js new file mode 100644 index 000000000..a5a2a7416 --- /dev/null +++ b/vendor/wpmetabox/meta-box/js/icon.js @@ -0,0 +1,27 @@ +/** + * Link: https://stackoverflow.com/questions/37386293/how-to-add-icon-in-select2 + */ + +( function ( $, rwmb ) { + 'use strict'; + + const template = option => { + if ( option.text.includes( '.*?<\/svg>/, '' ); + return $( `${ option.text }` ); + } + + return option.id ? $( `${ option.text }` ) : option.text; + }; + + function initIconField( event, options ) { + $( this ).select2( { + ...options, + templateResult: template, + templateSelection: template, + } ); + } + + rwmb.$document + .on( 'init_icon_field', '.rwmb-icon', initIconField ); +} )( jQuery, rwmb ); \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/js/input-list.js b/vendor/wpmetabox/meta-box/js/input-list.js index ad9545c8c..619a11206 100644 --- a/vendor/wpmetabox/meta-box/js/input-list.js +++ b/vendor/wpmetabox/meta-box/js/input-list.js @@ -3,7 +3,7 @@ function toggleTree() { var $this = $( this ), - $children = $this.closest( 'li' ).children( 'ul' ); + $children = $this.closest( 'label' ).next( 'fieldset' ); if ( $this.is( ':checked' ) ) { $children.removeClass( 'hidden' ); diff --git a/vendor/wpmetabox/meta-box/js/modal.js b/vendor/wpmetabox/meta-box/js/modal.js index aff158833..af82688f4 100644 --- a/vendor/wpmetabox/meta-box/js/modal.js +++ b/vendor/wpmetabox/meta-box/js/modal.js @@ -1,25 +1,27 @@ -( function ( $, rwmb ) { +( $ => { 'use strict'; - - const $body = $( 'body' ); + + const $body = $( 'body' ); const defaultOptions = { wrapper: `
    -
    +

    -
    +
    `, markupIframe: '', - markupOverlay: '
    ', - removeElement: '', - removeElementDefault: '#adminmenumain, #wpadminbar, #wpfooter, .row-actions, .form-wrap.edit-term-notes, #screen-meta-links, .wp-heading-inline, .wp-header-end', + markupOverlay: '
    ', + hideElement: '', + hideElementDefault: '#adminmenumain, #wpadminbar, #wpfooter, .row-actions, .form-wrap.edit-term-notes, #screen-meta-links, .wp-heading-inline, .wp-header-end, .page-title-action', callback: null, closeModalCallback: null, isBlockEditor: false, $objectId: null, - $objectDisplay: null + $objectDisplay: null, + isEdit: false, + size: 'large', }; $.fn.rwmbModal = function ( options = {} ) { @@ -32,6 +34,7 @@ return; } + // $this is the button that opens the modal const $this = $( this ), $modal = $( '.rwmb-modal' ); @@ -42,16 +45,15 @@ $this.click( function ( e ) { e.preventDefault(); - + $modal.attr( 'size', options.size ); $modal.find( '.rwmb-modal-title h2' ).html( $this.html() ); - $modal.find( '.rwmb-modal-content' ).html( options.markupIframe.replace( '{URL}', $this.data( 'url' ) ) ); + $modal.find( '.rwmb-modal-content' ).html( options.markupIframe.replace( '{URL}', $this.attr( 'data-url' ) ) ); + $( '#rwmb-modal-iframe' ).on( 'load', function () { const $contents = $( this ).contents(); options.isBlockEditor = $contents.find( 'body' ).hasClass( 'block-editor-page' ); - if ( options.removeElement !== '' ) { - $contents.find( options.removeElement ).remove(); - } + $contents.find( options.hideElement ).hide(); $modal.find( '.rwmb-modal-title' ).css( 'background-color', '' ); if ( options.isBlockEditor ) { @@ -59,8 +61,8 @@ } $contents - .find( options.removeElementDefault ).remove().end() - .find( '.rwmb-modal-add-button' ).parent().remove(); + .find( options.hideElementDefault ).hide().end() + .find( '.rwmb-modal-add-button' ).parents('.rwmb-field').hide(); $contents.find( 'html' ).css( 'padding-top', 0 ).end() .find( '#wpcontent' ).css( 'margin-left', 0 ).end() .find( 'a' ).on( 'click', e => e.preventDefault() ); @@ -69,9 +71,9 @@ options.callback( $modal, $contents ); } - $body.addClass( 'rwmb-modal-show' ); - $( '.rwmb-modal-overlay' ).fadeIn( 'medium' ); - $modal.fadeIn( 'medium' ); + $body.addClass( 'rwmb-modal-show' ); + $( '.rwmb-modal-overlay' ).fadeIn( 'medium' ).css( 'display', 'flex' ); + $modal.fadeIn( 'medium' ).css( 'display', 'flex' ); return false; } ); @@ -81,7 +83,7 @@ options.closeModalCallback( $( '#rwmb-modal-iframe' ).contents(), $input ); } - $modal.fadeOut( 'medium' ); + $modal.fadeOut( 'medium' ); $( '.rwmb-modal-overlay' ).fadeOut( 'medium' ); $body.removeClass( 'rwmb-modal-show' ); @@ -120,7 +122,7 @@ options.$objectId = null; options.$objectDisplay = null; $( this ).off( event ); - } ); + }); } ); }; @@ -129,4 +131,4 @@ .append( defaultOptions.markupOverlay ); } -} )( jQuery, rwmb ); \ No newline at end of file +} )( jQuery ); \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/js/notification.js b/vendor/wpmetabox/meta-box/js/notification.js deleted file mode 100644 index f9ab7f124..000000000 --- a/vendor/wpmetabox/meta-box/js/notification.js +++ /dev/null @@ -1,16 +0,0 @@ -( function( $, i18n ) { - 'use strict'; - - function dismissNotification() { - $( '#meta-box-notification' ).on( 'click', '.notice-dismiss', function( event ) { - event.preventDefault(); - - $.post( ajaxurl, { - action: 'mb_dismiss_notification', - nonce: i18n.nonce - } ); - } ); - } - - $( dismissNotification ); -} )( jQuery, MBNotification ); diff --git a/vendor/wpmetabox/meta-box/js/post.js b/vendor/wpmetabox/meta-box/js/post.js index 5aa8f1727..5e077f32a 100644 --- a/vendor/wpmetabox/meta-box/js/post.js +++ b/vendor/wpmetabox/meta-box/js/post.js @@ -2,40 +2,33 @@ 'use strict'; function addNew() { - const $this = $( this ); - - $this.rwmbModal( { - removeElement: '#editor .interface-interface-skeleton__footer, .edit-post-fullscreen-mode-close', - callback: function ( $modal, $modalContent ) { - if ( !this.isBlockEditor ) { - this.$objectId = $modalContent.find( '#post_ID' ).val(); - return; - } + $( this ).rwmbModal( { + hideElement: '#editor .interface-interface-skeleton__footer, .edit-post-fullscreen-mode-close', + callback: function ( $modal, $modalContent ) { + $modalContent.find( 'body' ).addClass( 'is-fullscreen-mode' ); + + // Retry if the first statement fail + setTimeout( () => { + $modalContent.find( 'body' ).addClass( 'is-fullscreen-mode' ); + }, 500 ); + }, + closeModalCallback: function ( $modal, $input ) { + const objectId = $modal.find( '#post_ID' ).val(); + const objectDisplay = !this.isBlockEditor ? $modal.find( '#title' ).val() : $modal.find( 'h1.editor-post-title' ).text(); - setTimeout( () => { - if ( $modalContent.find( '.edit-post-post-url .edit-post-post-url__toggle' ).length > 0 ) { - let url = $modalContent.find( '.edit-post-post-url .edit-post-post-url__toggle' ).text(); - this.$objectId = url.substr( url.indexOf( "=" ) + 1 ); - } - }, 2000 ); + if ( !objectId ) { + return; + } - setTimeout( () => { - const $ui = $modalContent.find( '.interface-interface-skeleton' ); - $ui.css( { - left: 0, - top: 0 - } ); - $ui.find( '.interface-interface-skeleton__editor' ).css( 'overflow', 'scroll' ); - }, 500 ); - }, - closeModalCallback: function ( $modal, $input ) { - this.$objectDisplay = !this.isBlockEditor ? $modal.find( '#title' ).val() : $modal.find( '.interface-interface-skeleton__editor h1.editor-post-title__input' ).text().trim(); + this.$objectId = objectId; + this.$objectDisplay = objectDisplay; } } ); } function init( e ) { const wrapper = e.target || e; + $( wrapper ).find( '.rwmb-post-add-button' ).each( addNew ); } diff --git a/vendor/wpmetabox/meta-box/js/select-advanced.js b/vendor/wpmetabox/meta-box/js/select-advanced.js index d90eaa630..2bb44fc96 100644 --- a/vendor/wpmetabox/meta-box/js/select-advanced.js +++ b/vendor/wpmetabox/meta-box/js/select-advanced.js @@ -90,7 +90,15 @@ }; } - $this.show().select2( options ); + $this.show(); + + if ( $this.hasClass( 'rwmb-icon' ) ) { + // Initialize select2 with icons for icon field. + $this.trigger( 'init_icon_field', [ options ] ); + } else { + // Initialize select2 normally. + $this.select2( options ); + } if ( !$this.attr( 'multiple' ) ) { return; @@ -110,7 +118,7 @@ } function init( e ) { - $( e.target ).find( '.rwmb-select_advanced' ).each( transform ); + $( e.target ).find( '.rwmb-select_advanced, .rwmb-icon' ).each( transform ); } function fixDropdownPosition( e ) { @@ -128,6 +136,6 @@ rwmb.$document .on( 'mb_ready', init ) - .on( 'clone', '.rwmb-select_advanced', transform ) + .on( 'clone', '.rwmb-select_advanced, .rwmb-icon', transform ) .on( 'select2:open', fixDropdownPosition ); } )( jQuery, rwmb ); diff --git a/vendor/wpmetabox/meta-box/js/taxonomy.js b/vendor/wpmetabox/meta-box/js/taxonomy.js index c10cd4b35..eee3297d8 100644 --- a/vendor/wpmetabox/meta-box/js/taxonomy.js +++ b/vendor/wpmetabox/meta-box/js/taxonomy.js @@ -5,15 +5,12 @@ const $this = $( this ); $this.rwmbModal( { - removeElement: '.form-wrap > h2', + size: 'small', + hideElement: '.form-wrap > h2', callback: function ( $modal, $modalContent ) { $modalContent.find( '#col-right' ).css( 'display', 'none' ); $modalContent.find( '.search-box' ).css( 'display', 'none' ); $modalContent.find( '#wpbody' ).css( 'padding-top', 0 ); - $modal.css( { - 'max-width': '480px', - 'margin': 'auto', - } ); }, closeModalCallback: function ( $modal, $input ) { if ( $modal.find( '#the-list tr:first td:eq(0) .row-actions' ).length > 0 ) { diff --git a/vendor/wpmetabox/meta-box/js/time.js b/vendor/wpmetabox/meta-box/js/time.js index 6cf3f494f..8b0335bad 100644 --- a/vendor/wpmetabox/meta-box/js/time.js +++ b/vendor/wpmetabox/meta-box/js/time.js @@ -9,20 +9,21 @@ options = $this.data( 'options' ), $inline = $this.siblings( '.rwmb-datetime-inline' ), current = $this.val(); + current = formatTime( current ); $this.siblings( '.ui-datepicker-append' ).remove(); // Remove appended text - options.onSelect = function() { + options.onSelect = function () { $this.trigger( 'change' ); - } - options.beforeShow = function( i ) { + }; + options.beforeShow = function ( i ) { if ( $( i ).prop( 'readonly' ) ) { return false; } - } + }; - if ( ! $inline.length ) { - $this.removeClass( 'hasDatepicker' ).timepicker( options ); + if ( !$inline.length ) { + $this.removeClass( 'hasDatepicker' ).timepicker( options ).timepicker( 'setTime', current ); return; } @@ -35,12 +36,23 @@ .timepicker( 'setTime', current ); } + const formatTime = time => { + if ( !time.includes( ':' ) ) { + return time; + } + let [ hours, minutes ] = time.split( ':' ); + hours = hours.padStart( 2, '0' ); + minutes = minutes.padStart( 2, '0' ); + + return `${ hours }:${ minutes }`; + }; + // Set language if available function setTimeI18n() { if ( $.timepicker.regional.hasOwnProperty( i18n.locale ) ) { - $.timepicker.setDefaults( $.timepicker.regional[i18n.locale] ); + $.timepicker.setDefaults( $.timepicker.regional[ i18n.locale ] ); } else if ( $.timepicker.regional.hasOwnProperty( i18n.localeShort ) ) { - $.timepicker.setDefaults( $.timepicker.regional[i18n.localeShort] ); + $.timepicker.setDefaults( $.timepicker.regional[ i18n.localeShort ] ); } } diff --git a/vendor/wpmetabox/meta-box/js/user.js b/vendor/wpmetabox/meta-box/js/user.js index 9af889417..e819d9736 100644 --- a/vendor/wpmetabox/meta-box/js/user.js +++ b/vendor/wpmetabox/meta-box/js/user.js @@ -5,7 +5,8 @@ const $this = $( this ); $this.rwmbModal( { - removeElement: '#add-new-user', + size: 'small', + hideElement: '#add-new-user', callback: function ( $modal, $modalContent ) { $modalContent.find( '#add-new-user' ).next().next().remove(); }, diff --git a/vendor/wpmetabox/meta-box/meta-box.php b/vendor/wpmetabox/meta-box/meta-box.php index 715f0110c..03df290ad 100644 --- a/vendor/wpmetabox/meta-box/meta-box.php +++ b/vendor/wpmetabox/meta-box/meta-box.php @@ -3,7 +3,7 @@ * Plugin Name: Meta Box * Plugin URI: https://metabox.io * Description: Create custom meta boxes and custom fields in WordPress. - * Version: 5.8.2 + * Version: 5.10.1 * Author: MetaBox.io * Author URI: https://metabox.io * License: GPL2+ diff --git a/vendor/wpmetabox/meta-box/phpunit.xml b/vendor/wpmetabox/meta-box/phpunit.xml new file mode 100644 index 000000000..a4a16bf80 --- /dev/null +++ b/vendor/wpmetabox/meta-box/phpunit.xml @@ -0,0 +1,8 @@ + + + + + ./tests/phpunit + + + diff --git a/vendor/wpmetabox/meta-box/readme.txt b/vendor/wpmetabox/meta-box/readme.txt index b28283dc5..29c0785bf 100644 --- a/vendor/wpmetabox/meta-box/readme.txt +++ b/vendor/wpmetabox/meta-box/readme.txt @@ -1,11 +1,11 @@ === Meta Box - WordPress Custom Fields Framework === -Contributors: elightup, metabox, rilwis, fitwp, f-j-kaiser, funkatronic, PerWiklander, ruanmer, Omnicia +Contributors: elightup, metabox, rilwis, f-j-kaiser, funkatronic, PerWiklander, ruanmer, tanng Donate link: https://metabox.io/pricing/ -Tags: meta box, custom fields, custom post types, custom taxonomies, cpt, meta boxes, custom field, post type, taxonomy, meta, admin, advanced, custom, edit, field, file, image, magic fields, post types, more fields, post, repeater, simple fields, text, textarea, type, cms, fields post +Tags: custom fields, custom post types, post type, custom taxonomies, meta box Requires at least: 5.9 Requires PHP: 7.0 -Tested up to: 6.3.2 -Stable tag: 5.8.2 +Tested up to: 6.6.1 +Stable tag: 5.10.1 License: GPLv2 or later Meta Box plugin is a powerful, professional developer toolkit to create custom meta boxes and custom fields for your custom post types in WordPress. @@ -14,7 +14,7 @@ Meta Box plugin is a powerful, professional developer toolkit to create custom m **Meta Box is a powerful, professional, and lightweight toolkit for developers to create custom meta boxes and custom fields for any custom post type in WordPress.** -Meta Box helps you add [custom fields](https://metabox.io) and details on your website such as pages, posts, custom post types, forms and anywhere you want using over 40 different field types such as text, images, file upload, checkboxes, and more. +Meta Box helps you add [custom fields](https://metabox.io/what-is-custom-fields-in-wordpress/) and details on your website such as pages, posts, custom post types, forms and anywhere you want using over 40 different field types such as text, images, file upload, checkboxes, and more. On top of that, each WordPress custom field type has extensive internal options for unlimited content possibilities. Complete customization and control is just a few clicks away. @@ -38,8 +38,7 @@ That's right – any type. No matter where you need to insert custom data and fe - Pages - Custom post types (you can also use our free plugin [MB Custom Post Types & Custom Taxonomies](https://metabox.io/plugins/custom-post-type/) to create custom post types and custom taxonomies) - [Taxonomies](https://metabox.io/plugins/mb-term-meta/) -- [Settings pages](https://metabox.io/plugins/mb-settings-page/) -- [Theme option pages](https://metabox.io/plugins/mb-settings-page/) +- [Settings pages or Customizer sections](https://metabox.io/plugins/mb-settings-page/) - [User profile pages](https://metabox.io/plugins/mb-user-profile/) - [Post comments](https://metabox.io/plugins/mb-comment-meta/) - [And even more data types](https://docs.metabox.io/field-settings/) than Batman has tools on his utility belt. @@ -51,7 +50,6 @@ Take your standard WordPress custom field and imagine it infinitely expanded. Th - Meta Box supports [40+ built-in WordPress custom field types](https://docs.metabox.io/field-settings/) for all your needs including text, textarea, WYSIWYG editor, image, file, post, select, checkbox, radio buttons, date/time picker, taxonomy, user, oembed and more to come. - Not enough? You can also [effortlessly create your own field type](https://docs.metabox.io/custom-field-type/). - Meta Box supports cloning fields for most field types including the WYSIWYG editor field. It also supports [repeatable field groups](https://metabox.io/plugins/meta-box-group/). -- Utilize WordPress' powerful [action](https://docs.metabox.io/actions/) and [filter](https://docs.metabox.io/filters/) system so you can build or change a site's appearance and behavior in the plugin. #### It's developer-friendly @@ -61,77 +59,65 @@ You can use Meta Box and its custom fields for any custom post type in WordPress - Has an ultra-lightweight, yet powerful API that won't overload your site. - Add only what you need instead of getting stuck with a bundle of features you don't even want that bloat your site. -- Meta Box [easily integrates with any theme and plugin](https://docs.metabox.io/integration/), and also [works with the Composer package dependency manager](https://docs.metabox.io/composer/). +- Meta Box [easily integrates with any theme and plugin](https://docs.metabox.io/integration/), and supports Composer! - We use the [native WordPress meta data storage](https://docs.metabox.io/database/) and functions for ease of use and lightning-fast processing. -- It's compatible with WPML multilingual plugin, and is officially supported by the WPML team. +- Has a lot of [actions](https://docs.metabox.io/category/actions/) and [filters](https://docs.metabox.io/category/filters/) so you can build or change a site's appearance and behavior in the plugin. #### Don't love coding? You're in luck! -Meta Box is built mostly for developers since you need to copy and paste some code, but if you prefer a more visual system to create custom fields in WordPress, you can choose one or all of the extensions below: +If you prefer a more visual system to create custom fields in WordPress, you can choose one or all of the extensions below: - [MB Custom Post Types & Custom Taxonomies](https://wordpress.org/plugins/mb-custom-post-type/) -- [Meta Box – Beaver Themer Integrator](https://metabox.io/plugins/meta-box-beaver-themer-integrator/) - [Meta Box Builder](https://metabox.io/plugins/meta-box-builder/) -The [Meta Box Builder extension](https://metabox.io/plugins/meta-box-builder/) has a ton of features to make quick work of any project: +These plugins have a ton of features to make quick work of any project: - All the power of Meta Box without touching a single line of code. -- It's designer-friendly, lightweight and works at top-notch speeds. -- Create an unlimited amount of WordPress custom fields at lightning speeds and with a user-friendly drag-and-drop interface. -- Over 40 custom field types available that you can drag and drop to where you need ‘em. +- Designer-friendly, lightweight and work at top-notch speeds. - Export your custom fields and settings to PHP. Then, add it to a new site without needing to install this extension for an incredibly lightweight option. -- It has the goods with conditional logic, priority and context options ready and waiting. ### Extensions -Speaking of extensions, there are a ton of free and premium ones available to further extend the already powerful core Meta Box plugin so you can supercharge your custom fields in WordPress. - -You'll have ultimate control to add whatever meta box and custom fields in WordPress you could ever want. Then, you can tailor it all to fit your exact specifications. - #### Free Extensions - [MB ACF Migration](https://metabox.io/plugins/mb-acf-migration/): Migrate field groups and custom field data from Advanced Custom Fields (ACF) to Meta Box. -- [MB Comment Meta](https://metabox.io/plugins/mb-comment-meta/): Add WordPress custom fields to comments in WordPress. It supports all field types and options. -- [MB Custom Post Types & Custom Taxonomies](https://metabox.io/plugins/custom-post-type/): Create and manage custom post types and taxonomies quickly with an easy-to-use interface. +- [MB Comment Meta](https://metabox.io/plugins/mb-comment-meta/): Add WordPress custom fields to comments in WordPress. +- [MB Custom Post Types & Custom Taxonomies](https://metabox.io/plugins/custom-post-type/): Create and manage custom post types and taxonomies with UI. - [MB Relationships](https://wordpress.org/plugins/mb-relationships/): Create as many connections as you want from post-to-post or page-to-page. - [MB Rank Math](https://metabox.io/plugins/mb-rank-math/): Add content of custom fields to Rank Math Content Analysis to have better/correct SEO score. - [MB Rest API](https://metabox.io/plugins/mb-rest-api/): Pull all meta values from posts and terms into the WP REST API responses. - [MB Toolset Migration](https://metabox.io/plugins/mb-toolset-migration/): Migrate custom post types & taxonomies, field groups, custom field data, and relationships from Toolset to Meta Box. -- [Meta Box – Beaver Themer Integrator](https://metabox.io/plugins/meta-box-beaver-themer-integrator/): Integrates Meta Box, and Beaver Themer to show WordPress custom fields easier in the frontend. +- [Meta Box – Beaver Themer Integrator](https://metabox.io/plugins/meta-box-beaver-themer-integrator/): Integrates Meta Box and Beaver Themer to show custom fields on the frontend. - [Meta Box – Elementor Integrator](https://metabox.io/plugins/mb-elementor-integrator/): Connect and display custom fields created by the Meta Box plugin in the Elementor's dynamic tags. -- [Meta Box – FacetWP Integrator](https://metabox.io/plugins/meta-box-facetwp-integrator/): Integrates Meta Box, and FacetWP to make WordPress custom fields searchable and filterable in the frontend. +- [Meta Box – FacetWP Integrator](https://metabox.io/plugins/meta-box-facetwp-integrator/): Integrates Meta Box and FacetWP to make custom fields searchable and filterable. - [Meta Box Text Limiter](https://wordpress.org/plugins/meta-box-text-limiter/): Limit the number of characters or words entered for text and textarea fields. - [Meta Box Yoast SEO](https://wordpress.org/plugins/meta-box-yoast-seo/): Add WordPress custom fields to Yoast SEO Content Analysis to generate more accurate SEO scores. #### Premium Extensions -- [MB Admin Columns](https://metabox.io/plugins/mb-admin-columns/): Display WordPress custom fields in table columns on admin screens for all post types. +- [MB Admin Columns](https://metabox.io/plugins/mb-admin-columns/): Display WordPress custom fields in table columns in admin. - [MB Blocks](https://metabox.io/plugins/mb-blocks/): Create custom Gutenberg blocks with PHP, using the same syntax in Meta Box. -- [MB Custom Table](https://metabox.io/plugins/mb-custom-table/): Save custom field data to custom tables instead of the default meta tables to reduce your database's size and increase its performance. -- [MB Frontend Submission](https://metabox.io/plugins/mb-frontend-submission/): Create frontend forms for users to submit custom content and embed them anywhere with a shortcode. -- [MB Revision](https://metabox.io/plugins/mb-revision/): Track changes to custom fields in WordPress with revisions. You can save, compare and restore the changes smoothly. +- [MB Custom Table](https://metabox.io/plugins/mb-custom-table/): Save custom fields to custom tables instead of the default meta tables to reduce your database's size and increase its performance. +- [MB Frontend Submission](https://metabox.io/plugins/mb-frontend-submission/): Create frontend forms for users to submit posts. +- [MB Revision](https://metabox.io/plugins/mb-revision/): Track changes to custom fields in WordPress with revisions. You can compare and restore the changes smoothly. - [MB Settings Page](https://metabox.io/plugins/mb-settings-page/): Create settings pages for themes, plugins or websites with beautiful syntax. -- [MB Term Meta](https://metabox.io/plugins/mb-term-meta/): Add meta data to categories, tags or any custom taxonomy with simple syntax. -- [MB User Meta](https://metabox.io/plugins/mb-user-meta/): Quickly add WordPress custom fields to user profiles in the wp_usermeta table with simple syntax. +- [MB Term Meta](https://metabox.io/plugins/mb-term-meta/): Add custom fields to categories, tags or custom taxonomies. +- [MB User Meta](https://metabox.io/plugins/mb-user-meta/): Add custom fields to users. - [MB Views](https://metabox.io/plugins/mb-views/): Outputting custom fields and build front-end templates for WordPress without touching theme files. - [Meta Box Builder](https://metabox.io/plugins/meta-box-builder/): Create custom meta boxes and custom fields in WordPress using a user-friendly drag-and-drop interface. - [Meta Box Columns](https://metabox.io/plugins/meta-box-columns/): Display eye-catching custom fields in WordPress by putting them into 12-column grids. - [Meta Box Conditional Logic](https://metabox.io/plugins/meta-box-conditional-logic/): Add visibility dependency for custom meta boxes and custom fields in WordPress. - [Meta Box Geolocation](https://metabox.io/plugins/meta-box-geolocation/): Automatically and instantly populate location data with the power of the Google Maps Geolocation API. -- [Meta Box Group](https://metabox.io/plugins/meta-box-group/): Create repeatable groups of WordPress custom fields for better appearance and structure. +- [Meta Box Group](https://metabox.io/plugins/meta-box-group/): Create repeatable groups for better appearance and structure. - [Meta Box Include Exclude](https://metabox.io/plugins/meta-box-include-exclude/): Show or hide meta boxes by ID, page template, taxonomy, or custom function. -- [Meta Box Show Hide](https://metabox.io/plugins/meta-box-show-hide-javascript/): Toggle meta boxes by page template, post format, taxonomy and category via JavaScript. -- [Meta Box Tabs](https://metabox.io/plugins/meta-box-tabs/): Painlessly create tabs for meta boxes. There are 3 supported WordPress-native tab styles and icons. +- [Meta Box Show Hide](https://metabox.io/plugins/meta-box-show-hide-javascript/): Toggle meta boxes by page template, post format, taxonomy and category. +- [Meta Box Tabs](https://metabox.io/plugins/meta-box-tabs/): Painlessly create tabs for meta boxes with multiple styles and icons. - [Meta Box Template](https://metabox.io/plugins/meta-box-template/): Make defining custom meta boxes and WordPress custom fields way easier with templates. -- [Meta Box Tooltip](https://metabox.io/plugins/meta-box-tooltip/): Display help information for custom fields in WordPress using beautiful tooltips. - -See all the available [extensions on the Meta Box website](https://metabox.io/plugins/). +- [Meta Box Tooltip](https://metabox.io/plugins/meta-box-tooltip/): Display help information for custom fields with tooltips. ### Detailed Documentation -We won't leave you high and dry. - -We provide regularly updated, and extensive documentation as well as tutorials on how to use MetaBox and custom fields in WordPress to your advantage as well as in the most efficient way possible. +We provide regularly updated, and extensive documentation as well as tutorials on how to use MetaBox and custom fields in WordPress to your advantage as well as in the most efficient way possible. Here are a few guides to quickly get you started with Meta Box and creating your own WordPress custom fields: @@ -147,7 +133,6 @@ Check out more on the [Meta Box Documentation](https://docs.metabox.io/) page. If you like this plugin, you might also like our other WordPress products: -- [Meta Box](https://metabox.io) - A powerful WordPress plugin for creating custom post types and custom fields. - [Slim SEO](https://wpslimseo.com) - A fast, lightweight and full-featured SEO plugin for WordPress with minimal configuration. - [Slim SEO Schema](https://wpslimseo.com/products/slim-seo-schema/) - An advanced, powerful and flexible plugin to add schemas to WordPress. - [Slim SEO Link Manager](https://wpslimseo.com/products/slim-seo-link-manager/) - Build internal link easier in WordPress with real-time reports. @@ -175,512 +160,92 @@ If you like this plugin, you might also like our other WordPress products: == Changelog == -= 5.8.2 - 2023-10-13 = -- Google Maps & OSM: ask for current user location for the map if there is no saved location or no default location is set (#1537) -- Fix media templates missing in blocks (#1536) - -= 5.8.1 - 2023-09-20 = -- Fix missing validation files += 5.10.1 - 2024-09-07 = +- Fix issue with `clone_empty_start` (validation, now showing data for the 1st clone, broken `text_list` field, etc.) -= 5.8.0 - 2023-09-20 = += 5.10.0 - 2024-08-19 = **Highlights:** -This version improves validation module, makes it work for file's MIME types and in groups. More specifically, validation now works in the following cases: +This version introduces new parameter for field: `clone_empty_start` that makes cloneable groups **not** showing inputs at first. When users want to enter data, they'll need to click the "+ Add new" button. This feature updates the UI and makes it cleaner. -- Cloneable fields -- file and image fields, both non-cloneable & cloneable. -- Subfields in groups, including file and image. For required subfields, asterisks are also added properly. - -It works well with Meta Box Builder and with code. - -An improvement for registering validation rules with code is that **you only need to set field ID in all cases**. Previously, you had to set like `_file_{field_id}[]` for files, or `field_id[]` for taxonomy fields. +See more details on our [blog post](https://metabox.io/clone-empty-start/). Other changes: -- Output media templates only on edit pages -- Remove non-existing icon files in jQueryUI CSS -- Hide right area when creating new term (#1528) -- Fix validation i18n URL -- Fix image advanced not working in Customizer -- Fix wrong position of dropdown for select advanced field (#1530) - -= 5.7.5 - 2023-08-10 = -- Improve security (#1518). Thanks Patchstack for helping us. -- Add jQuery validation i18n (#1525) -- Fix media button not show in WordPress 6.3 when Elementor is activated -- Fix OSM not display properly -- Update leaflet to 1.9.4 -- Update jQuery Validation to 1.19.5 -- Make field class filterable with filter `rwmb_field_class`, accept 2 parameters `$class` and `$field_type`. - -= 5.7.4 - 2023-07-18 = -- Datetime: set the same timezone the same as in WordPress when 'save_format' is 'c' or 'r' (#1515) -- Fix WYSIWYG not working in custom block (#1513) -- Fix deleting file in Media Library breaks validation -- Fix checkbox, radio field spacing - -= 5.7.3 - 2023-06-23 = -- Fix visual tab not editable in WYSIWYG field -- Fix adding new term with checkbox tree display duplicates -- Use modern PHP 8 string functions available in WordPress's 5.9 compat - -= 5.7.2 - 2023-06-05 = -- Fix taxonomy field remove default meta box applied for all post types -- Fix the first option of a select is not selected when cloning a parent group with `clone_default` = `true` -- Fix error when deleting image in the media lib and on the frontend with `file_advanced` -- Fix datetime's `save_format` not working with formats `c` and `r` -- Improve license check - -= 5.7.1 - 2023-05-24 = -- Fix saved clone values not showing -- Fix alignment for inputs - -= 5.7.0 - 2023-05-23 = - -**Highlights:** - -Add `add_new` option (bool) for `post`, `taxonomy`, `taxonomy_advanced` and `user` fields, allowing users to add new posts, terms or users without leaving the edit screen. The add new action is done in a popup in the current edit screen, where you can set all the necessary data for the new item. - -This option improves the existing option for `taxonomy`, and now works for `post` and `user` fields as well. It also works with cloneable fields and all field types (`select_advanced`, `select`, `checkbox_list`, `radio` and even `select_tree` and `checkbox_tree`). - -Other changes: - -- Add `rwmb_ajax_get_*` hook for filtering ajax results for getting posts, terms and users -- Register "Meta Box" block category for other extensions to use -- Update style for input list, select tree and switch label -- Fix not setting default value for relationships -- Fix meta box style in the media modal -- Fix missing underscore dependency for `select_advanced` -- Fix conflict with Beaver Builder - -= 5.6.18 - 2023-03-21 = -- Fix select dropdown overflowing in the Gutenberg sidebar -- Fix not clearing color - -= 5.6.17 - 2023-02-27 = -- Use icon for file types like PDF in the file fields. Credit Eric Celeste. -- Add `mb_field_id` in query variable args for `post` field for developers to detect this kind of query. Credit Eric Celeste. -- Fix CSS for marker position for OSM field on the front end -- Fix color picker mode HSL not working -- Fix custom fields for media modal not working with custom tables -- Fix sanitizing date timestamp before Jan 01 1970 - -= 5.6.16 - 2023-01-29 = -- Fix multiple `file` fields in cloneable groups not cloning properly -- Fix custom fields not showing up in media modal -- Fix warning when image select field not having options -- Fix autoload file not found when the whole WordPress site is managed by Composer -- Fix `taxonomy_advanced` not displaying selected values in sub groups -- Fix CSS for files in settings pages with `no-box` style -- Add a type-safe check for meta box settings - -= 5.6.15 - 2022-12-21 = -- Remove empty post types from meta box settings -- Fix multiple type file fields in cloneable groups not cloning properly -- Fix color for date month/year dropdown -- Fix error message when deleting images in the Customizer with MB Settings Page - -= 5.6.14 - 2022-12-13 = -- Improve style for date picker -- Update jQueryUI to 1.13.2 -- Fix inline date field not localized -- Fix visibility for object field's query() method, which is called in MB Views and Meta Box Builder -- Fix $meta is not countable in object field's query method -- Remove return type for is_save() to be compatible with old version of MB Term Meta -- Start to use PSR-4 and Composer - -= 5.6.13 - 2022-12-08 = -- Fix name for adding form enctype to match with MB Term Meta extension -- Fix return type for RWMB_Helpers_Array::map() -- Fix required param type for RWMB_Helpers_Field::get_class() - -= 5.6.12 - 2022-12-06 = -- Fix error getting license key - -= 5.6.11 - 2022-12-06 = -- Fix compatibility with other extensions - -= 5.6.10 - 2022-12-06 = -- Fix padding for images in custom blocks -- Fix sidebar::query not compatible with object_choice::query -- Fix compatibility with custom models in MB Custom Table. Closes #1466. -- Modernize code: use short array, add type hints, remove comments - -= 5.6.9 - 2022-12-05 = -- Improve accessibility for form controls, especially when using on the front end -- Use all admin themes for switch and button group -- Add filter 'rwmb_validation_message_string' for validation message -- Display field label description even if no label -- Fix not displaying the language according to user preference -- Fix not setting post parent for the uploaded images on the front end for `image_upload` fields -- Fix warning when using `file_info` helper function -- Modernize code for PHP 7 - -= 5.6.8 - 2022-11-11 = -- Fix PHP8 warning in image field file info -- Fix wrong comment for translation -- Bump PHP version requirement to 7.0 - -= 5.6.7 - 2022-09-16 = -- Fix `file_upload` not working with required validation -- Fix wrong text domain -- Fix button group option to display horizontally not save in the builder - -= 5.6.6 - 2022-08-05 = -- Fix meta box not showing for settings page under Media -- Fix upload to the custom folder does not display the image -- Fix field taxonomy not creating new term if required = true - -= 5.6.5 - 2022-07-14 = -- Fix select advanced don't escape HTML characters - -= 5.6.4 - 2022-05-05 = -- Fix when field taxonomy return WP_Error -- Fix field image_upload not working with tab -- Fix wysiwyg not working for attachment in the media modal -- Improve license check - -= 5.6.3 - 2022-04-18 = -- Improve Google Maps search, allowing to search by place names -- Fix incorrect the label ID for subfield in groups -- Fix validation not working when a cloneable group collapse -- Improve license key check - -= 5.6.2 - 2022-04-01 = -- Fix map not showing in block preview -- Fix deleting images in cloneable groups -- Fix PHP notice for file_upload field -- Expose the uploader for file_upload/image_upload so developers can work on that. For example: disable the submit button when uploading files. - -= 5.6.1 - 2022-03-08 = -- Fix compatibility for PHP < 7.3 - -= 5.6.0 - 2022-03-01 = -- Field `background` and `file_input`: support showing image thumbnail -- Add `link` param in helper functions for `taxonomy`, `post`, `user` fields to show `view`, `edit` link or plain text (`false`) -- Add support for float values for range field -- Add `minlength` as a common props for fields -- Remove FILTER_SANITIZE_STRING to compatible with PHP 8 -- Fix PHP notice when run rwmb_the_value() for taxonomy field with no values - -= 5.5.1 - 2021-12-15 = -- Fix warning for post field caused by the search by post title - -= 5.5.0 - 2021-12-14 = -- Add `min_clone` parameter to set the minimum number of clones. Props @baden03. -- Post field: find by title only -- Meta Box Builder compatibility: parse choice options in real-time -- Prevent inputs overflow the container - -= 5.4.8 - 2021-10-20 = -- Respect `cols` attribute of `textarea` field to set the width of the input (without `cols`, textarea is 100% width) -- Fix padding for seamless style in Gutenberg -- Fix divider not showing in Gutenberg -- Remove unnesseccary escape meta value - -= 5.4.7 - 2021-09-16 = -- Fix deleting files and images inside groups. -- Fix maxlength and pattern not working if not set inside attributes -- Fix not switching tabs for wysiwyg editors -- Fix unit for checkbox width -- Fix remove clone button on top of inputs -- Fix style for checked checkboxes on desktops -- Hide hidden field with custom class, not .hidden - -= 5.4.6 - 2021-07-08 = -- Remove debug code - -= 5.4.5 - 2021-07-08 = -- Fix styling issue for heading field and side meta boxes - -= 5.4.4 - 2021-07-06 = -- Improve usability for time picker on mobile by adding +/- buttons -- Make all input, select, textarea 100% width -- Export clone functions to the global "rwmb" - -= 5.4.3 - 2021-06-30 = -- Fix trailing comma in function call for PHP < 7.3 - -= 5.4.2 - 2021-06-29 = -- Improve style for media fields to reuse style/HTML markup. -- Make input, select, input group, select2, textarea full width on the side context. -- Improve style for button group when buttons don't have same width. -- Set better default options for date time pickers. -- Allow to output HTML in input prepend/append (ex. icon). -- Add filter `rwmb_dismiss_dashboard_widget` to dismiss dashboard widget. - -= 5.4.1 - 2021-06-01 = -- Improve style for prepend, append text -- Improve style for select2 on mobiles -- Make select_tree extend select_advanced and respect select_advanced options - -= 5.4.0 - 2021-05-08 = -- Shortcode: add `render_shortcodes` attribute (default true) to allow render inner shortcodes. -- File fields: allow to change uploaded file name when uploading to custom folder via `unique_filename_callback` setting -- Dashboard: add more video tutorials -- Image fields: fix actions (edit, delete) not visible on mobile -- Choice fields: fix not saving value if they contain quotes -- Datetime fields: fix not saving timestamp via REST API - -= 5.3.10 - 2021-04-24 = -- Disable autocomplete for date/datetime fields -- Input list field: Fix label not working if contains HTML -- Fix multiple OSM on the same page -- Add auto update for solutions -- Fix various bugs for the wysiwyg editor field (mostly in blocks) and allows to pass tinyMCE/quicktags settings to the editor - -= 5.3.9 - 2021-03-10 = -- Fix taxonomy_advanced doesn't load options in attachment with media_modal set to true. -- Fix `rwmb_{$field_id}_choice_label` not working for checkbox_list field type -- Fix clone_default not working for switch if set std = true -- Update jQueryUI styles to 1.12.1 - -= 5.3.8 - 2021-01-28 = -- Fix value not available when loaded in `map` and `osm` fields. - -= 5.3.7 - 2021-01-11 = -- Fix editor not editable in Gutenberg -- Fix content in the visual tab of editors not saving -- Make required validation work for color, map, osm, switch, text-list fields -- Add dismiss action for dashboard news - -= 5.3.6 - 2020-12-29 = -- Fix validation not working for image-select, image and wysiwyg fields -- Fix clone_default not working for switch -- Fix saving select field value when defining each option as an array -- Fix wysiwyg not editable in WP 5.6 - -= 5.3.5 - 2020-11-30 = -- Update color picker library to v3.0.0 and fix color picker with opacity not working in the Customizer (used with [MB Settings Page](https://metabox.io/plugins/mb-settings/page/)). -- Cache update requests -- Show (No title) in object fields if they don't have title - -= 5.3.4 - 2020-09-23 = -- Add default title -- Update autoloader -- Bypass the validation when previewing in Gutenberg -- Add MB Views to the updater -- Update color picker script to latest version 2.1.4 -- Fix missing labels for color field (wp 5.5.1) -- Fix preview is not generated -- Fix seamless style in WordPress 5.5 -- Fix style for file_input field (description is inline with input field) - -= 5.3.3 - 2020-07-21 = -- Hide Go Pro link for premium users -- Update intro and image for the Online Generator in the welcome page - -= 5.3.2 - 2020-07-03 = -- Fix validation not working for media fields -- Add "add_to" option for media fields to allow adding new images to the beginning/end of the list -- Improve style for input & select on the sidebar -- Improve style for mobiles - -= 5.3.1 - 2020-06-03 = -- Fix validation not working for multiple forms (front end) -- Fix PHP warning: Creating default object from empty value -- Fix cloning, sorting wysiwyg field when users disable visual editor -- Change color of switch based on admin color scheme - -= 5.3.0 - 2020-05-11 = -- Add `rwmb_set_meta` function to set meta value. -- Add Gutenberg compatibility for validation. -- Fix wrong label output for switch when it's off. - -= 5.2.10 - 2020-04-17 = -- Hotfix for getting meta value for checkbox list. - -= 5.2.9 - 2020-04-17 = -- Fix cloning default value not working for some fields. - -= 5.2.8 - 2020-04-06 = - -**Added** - -- Add option open info window in Google Maps when loaded -- Add `alpha_channel` & update style to background field -- Add support for custom Ajax parameters for object fields. - -**Fixed** - -- Fix validation rules still applied for hidden fields -- Fix `image_upload` field select files not working on iPhone -- Fix fatal error with Frontend Submission & Elementor -- Fix 'zoom' parameter not working for OSM field on the front end - -**Changed** - -- Remove languages folder. Load languages from translate.wordpress.org only - -= 5.2.7 - 2020-02-07 = - -- Fix warning in image field for metadata[‘sizes’]. -- Allow to quick define text fields with “name” attribute only. - -= 5.2.6 - 2020-02-03 = - -- Fix wrong tag when deploying - -= 5.2.5 - 2020-02-03 = - -**Fixed** - -- Fix CSS in about page and add MB Core to list of premium plugins -- Fix edit icon not showing popup for image fields -- Fix OpenStreetMap not loading properly in tabs - -**Changed** - -- Replace date() with gmdate() -- Update style for input prepend/append for WordPress >= 5.3 - -**Added** +- Replace `sprintf` with string concatenation in `RWMB_Field::show` to fix issues when `$field['before']` or `$field['after']` contains special characters (`%`). Props Daniel Haim. +- Fix mismatch filter params for `rwmb_meta` when no fields are found. -- Add custom trigger after validation for Tabs/Settings extensiosn to show error fields -- Add URL to all sizes in the returned value of helper functions for images += 5.9.11 - 2024-07-10.0 = +- Make validation work for blocks +- Fix JavaScript validation error in site editor +- Set default minute step = 5 for datetime/time pickers +- Security fix for ajax getting posts -= 5.2.4 - 2019-12-11 = += 5.9.10 - 2024-07-02 = +- Fix modal not updating URL (when add new) +- Security fix for ajax get posts/users -**Added** += 5.9.9 - 2024-06-20 = +- Fix show hide checkbox tree +- Fix default value not display as selected time +- Fix datetime field not removing value when set inline & timestamp = true -- Add hook `rwmb_field_registered` after a field is registered. -- Add (*) to required fields += 5.9.8 - 2024-05-08 = +- Fix activation error on ajax request since WordPress 6.5 -**Changed** += 5.9.7 - 2024-04-18 = +- Revert fix for Meta Box Conditional Logic -- Remove required attribute for license input box. -- Don't redirect when bulk activate with other plugins. += 5.9.6 - 2024-04-17 = +- Add progress bar for field `file_upload` +- Force returned value of sanitize color to string +- Enqueue assets for FSE and widget (with block editor) screens +- Fix jumping layout for Meta Box Conditional Logic +- Fix errors when using cloneable map/osm fields -**Fixed** += 5.9.5 - 2024-03-26 = +- Add `save_format` settings to `time` field +- Field icon SVG not displaying -- Fix style for `select`, `select_advanced` fields in WordPress 5.3. -- Fix getting object fields for settings pages += 5.9.4 - 2024-02-27 = +- Fix security issue when users set object id in the helper functions where they don't have permission to view (such as private posts) -= 5.2.3 - 2019-11-01 = += 5.9.3 - 2024-02-02 = -**Changed** - -- Set clone=false if max_clone=1 -- Shows only images in the selection popup for image field -- Hide license key - -**Fixed** - -- Fixed parsed terms in taxonomy advanced for MB Blocks -- Don't show date picker for readonly fields -- Fix warning when output empty background field value -- Fix empty meta value when save_field=false - -= 5.2.2 - 2019-10-09 = - -**Fixed** - -- Fix sanitizing empty post field -- Fix post thumbnail not saving in MB Frontend Submission -- Fix undefined index for `image_select` field when using helper functions with no value. -- Fix JQMIGRATE: 'ready' event is deprecated - -**Changed** - -- Add styling for date picker, autocomplete, select2 to show in the Customizer (for MB Settings Page) - -= 5.2.1 - 2019-09-26 = - -**Fixed** - -- Fix object fields show only selected items when field type is not select advanced -- Fix background field not saving position, attachment & size -- Fix undefined variable in media modal -- Fix non-unique input name for a non-cloneable file in a cloneable group - -= 5.2.0 - 2019-09-18 = - -**Added** - -- Add ajax support for object fields. -- Add custom CSS class for meta box wrapper div. - -**Changed** - -- Improve file upload, making it works in groups. -- Optimize performance for cloning wysiwyg field. -- Bypass updates for embed extensions via TGMPA. - -**Fixed** - -- Fix PHP warning when using clone with date formatting. -- Fix file upload input not visible when clone a file field with uploaded files = max_file_uploads. - -= 5.1.2 - 2019-08-29 = - -**Fixed** - -- Fix adding >= 2 blocks containing a wysiwyg field not rendering -- Fix CSS for wyswigy field in Gutenberg -- Do not show upgrade message in the Dashboard for premium users -- Fix media field is blank -- Fix cannot access to license page in Multisite - -**Changed** - -- Fire `change` and/or `mb_change` events when fields change to update custom blocks in real-time (requires [MB Blocks](https://metabox.io/plugins/mb-blocks/) extension) - -= 5.1.1 - 2019-08-23 = - -**Fixed** - -- Fix sanitizing number always return 0 if it's blank -- Fix sanitizing URL - -**Changed** - -- Set default field 'type' to 'text', make it optional and help you write less code -- File/image fields: do not show add new file link if max_file_uploads = 1 - -= 5.1.0 - 2019-08-19 = - -**Fixed** - -- Fatal error with `RWMB_About::redirect()` -- Ensure change event fires when editors change -- Fix `rwmb_{$field_id}_choice_label` not working for cloneable fields -- Fix missing dependency (underscore) for datepicker JS -- Fix unindex notice for key_value field -- Fix alignment for video field - -**Changed** - -- Update notification sytem -- Improve sanitization for fields. See [documentation](https://docs.metabox.io/sanitization/) for details. - -= 5.0.1 - 2019-07-25 = +**Highlights:** -**Fixed** +Fix security issue of the output shortcode `[rwmb_meta]` not escaping. Users can disable escaping (to revert the previous behavior) by adding this snippet: -- Fix license notification always show +`add_filter( 'rwmb_meta_shortcode_secure', '__return_false' ); +// or +add_filter( 'rwmb_meta_shortcode_secure_{$field_id}', '__return_false' );` -= 5.0.0 - 2019-07-24 = +Other changes: -**IMPORTANT:** Since version 5.0.0, the plugin requires PHP >= 5.3. If you use an older PHP version, please ask your host to upgrade or use an older version of Meta Box. +- Fix compatibility with PHP 8.3 +- Fix not showing more than 10 saved users or terms -**Changed** += 5.9.2 - 2024-01-22 = +- Validation: fix PHP warning when fields has non-consecutive keys +- Icon field: fix custom icon not working +- Update jQuery Validation to 1.20.0. Props Maarten. +- Prepare css to be inlined. Props Maarten. -- New minimum PHP version is now 5.3. -- Rewrite all JavaScript to prepare for Gutenberg blocks -- Allow to create meta box with no fields. += 5.9.1 - 2023-12-25 = +- Fix preview posts not working in the block editor in WP 6.4. +- Icon field: allow to set relative path/URL for settings +- Icon field: add support for scanning CSS file (`icon_css` setting) and parsing CSS class +- Autocomplete field: fix not saving first value if the value is 0 (integer). -**Added** += 5.9.0 - 2023-11-22 = -- Add the updater for auto update of premium extensions -- Add support for `user`, `settings_pages` in `rwmb_get_object_fields` +**Highlights:** -**Fixed** +Add new `icon` field type, which supports Font Awesome Free, Font Awesome Pro and custom icon set. Can be used with icon font with CSS file or with SVGs. See the [plugin docs](https://docs.metabox.io/fields/icon/) for how to use it. -- Fix warning for cloneable single image. +The `icon` field type will be added to the new version of Meta Box Builder soon, which will allow you to configure its settings with UI. [See full changelog here](https://metabox.io/changelog/). == Upgrade Notice == - -Since version 5.0.0, the plugin requires PHP >= 5.3. If you use an older PHP version, please ask your host to upgrade or use an older version of Meta Box. \ No newline at end of file diff --git a/vendor/wpmetabox/meta-box/src/Block/Register.php b/vendor/wpmetabox/meta-box/src/Integrations/Block.php similarity index 87% rename from vendor/wpmetabox/meta-box/src/Block/Register.php rename to vendor/wpmetabox/meta-box/src/Integrations/Block.php index 924399eeb..984114986 100644 --- a/vendor/wpmetabox/meta-box/src/Block/Register.php +++ b/vendor/wpmetabox/meta-box/src/Integrations/Block.php @@ -1,7 +1,7 @@ $depth ) { + $input = reset( $input ); + $current_depth--; + } + } elseif ( $depth > $current_depth ) { + while ( $current_depth < $depth ) { + $input = [ $input ]; + $current_depth++; + } + } + + return $input; + } + + public static function depth( array $array ) { + $max_depth = 1; + + foreach ( $array as $key => $value ) { + if ( !is_string($key) && is_array( $value ) ) { + $depth = self::depth( $value ) + 1; + + if ( $depth > $max_depth ) { + $max_depth = $depth; + } + } + } + + return $max_depth; + } } diff --git a/vendor/wpmetabox/meta-box/src/Updater/Notification.php b/vendor/wpmetabox/meta-box/src/Updater/Notification.php index d2d64b1f7..53645f421 100644 --- a/vendor/wpmetabox/meta-box/src/Updater/Notification.php +++ b/vendor/wpmetabox/meta-box/src/Updater/Notification.php @@ -39,41 +39,18 @@ public function init() { add_filter( "plugin_action_links_$file", [ $this, 'plugin_links' ], 20 ); } - // Show global update notification. - if ( $this->is_dismissed() ) { - return; - } - $admin_notices_hook = $this->option->is_network_activated() ? 'network_admin_notices' : 'admin_notices'; add_action( $admin_notices_hook, [ $this, 'notify' ] ); - - add_action( 'admin_enqueue_scripts', [ $this, 'enqueue' ] ); - add_action( 'wp_ajax_mb_dismiss_notification', [ $this, 'dismiss' ] ); - } - - public function enqueue() { - wp_enqueue_script( 'mb-notification', RWMB_JS_URL . 'notification.js', [ 'jquery' ], RWMB_VER, true ); - wp_localize_script( 'mb-notification', 'MBNotification', [ 'nonce' => wp_create_nonce( 'dismiss' ) ] ); - } - - public function dismiss() { - if ( ! current_user_can( 'manage_options' ) ) { - wp_send_json_error(); - } - check_ajax_referer( 'dismiss', 'nonce' ); - - $this->option->update( [ - 'notification_dismissed' => 1, - 'notification_dismissed_time' => time(), - ] ); - - wp_send_json_success(); } public function notify() { - // Do not show notification on License page. + $excluded_screens = [ + 'meta-box_page_meta-box-updater', + 'settings_page_meta-box-updater-network', + 'meta-box_page_meta-box-aio', + ]; $screen = get_current_screen(); - if ( in_array( $screen->id, [ 'meta-box_page_meta-box-updater', 'settings_page_meta-box-updater-network' ], true ) ) { + if ( in_array( $screen->id, $excluded_screens, true ) ) { return; } @@ -92,7 +69,7 @@ public function notify() { return; } - echo '

    ', wp_kses_post( sprintf( $messages[ $status ], $this->settings_page, 'https://metabox.io/pricing/', 'https://metabox.io/my-account/' ) ), '

    '; + echo '

    ', wp_kses_post( sprintf( $messages[ $status ], $this->settings_page, 'https://elu.to/mnp', 'https://elu.to/mna' ) ), '

    '; } /** @@ -122,10 +99,10 @@ public function show_update_message( $plugin_data, $response ) { return; } - echo '
     ' . wp_kses_post( sprintf( $messages[ $status ], $this->settings_page, 'https://metabox.io/pricing/', 'https://metabox.io/my-account/' ) ); + echo '
     ' . wp_kses_post( sprintf( $messages[ $status ], $this->settings_page, 'https://elu.to/mnp', 'https://elu.to/mna' ) ); } - public function plugin_links( array $links ) : array { + public function plugin_links( array $links ): array { $status = $this->option->get_license_status(); if ( 'active' === $status ) { return $links; @@ -136,14 +113,4 @@ public function plugin_links( array $links ) : array { return $links; } - - /** - * Check if the global notification is dismissed. - * Auto re-enable the notification every 2 weeks after it's dismissed. - */ - private function is_dismissed() : bool { - $time = $this->option->get( 'notification_dismissed_time', 0 ); - - return $this->option->get( 'notification_dismissed' ) && time() - $time < 14 * DAY_IN_SECONDS; - } } diff --git a/vendor/wpmetabox/meta-box/src/Updater/Settings.php b/vendor/wpmetabox/meta-box/src/Updater/Settings.php index 726e8646d..98ad19baa 100644 --- a/vendor/wpmetabox/meta-box/src/Updater/Settings.php +++ b/vendor/wpmetabox/meta-box/src/Updater/Settings.php @@ -58,8 +58,8 @@ public function render() { printf( // Translators: %1$s - URL to the My Account page, %2$s - URL to the pricing page. wp_kses_post( __( 'To get the license key, visit the My Account page on metabox.io website. If you have not purchased any extension yet, please get a new license here.', 'meta-box' ) ), - 'https://metabox.io/my-account/', - 'https://metabox.io/pricing/' + 'https://elu.to/mua', + 'https://elu.to/mup' ); ?>

    @@ -126,13 +126,13 @@ public function save() { } elseif ( 'expired' === $status ) { // Translators: %s - URL to the My Account page. $message = __( 'License expired. Please renew on the My Account page on metabox.io website.', 'meta-box' ); - $message = wp_kses_post( sprintf( $message, 'https://metabox.io/my-account/' ) ); + $message = wp_kses_post( sprintf( $message, 'https://elu.to/mua' ) ); add_settings_error( '', 'mb-expired', $message ); } else { // Translators: %1$s - URL to the My Account page, %2$s - URL to the pricing page. $message = __( 'Invalid license. Please check again or get a new license here.', 'meta-box' ); - $message = wp_kses_post( sprintf( $message, 'https://metabox.io/my-account/', 'https://metabox.io/pricing/' ) ); + $message = wp_kses_post( sprintf( $message, 'https://elu.to/mua', 'https://mup' ) ); add_settings_error( '', 'mb-invalid', $message ); } diff --git a/wp-stateless-media.php b/wp-stateless-media.php index eb19e1dae..d766a97f3 100644 --- a/wp-stateless-media.php +++ b/wp-stateless-media.php @@ -4,7 +4,7 @@ * Plugin URI: https://stateless.udx.io/ * Description: Upload and serve your WordPress media files from Google Cloud Storage. * Author: UDX - * Version: 4.0.4 + * Version: 4.1.0 * Text Domain: stateless-media * Author URI: https://udx.io * License: GPLv2 or later