diff --git a/.travis.yml b/.travis.yml index 5ca85ee1..0d1487bf 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,7 @@ matrix: include: - php: 7.0 - php: 7.1 + - php: 7.2 - php: nightly allow_failures: - php: nightly @@ -25,7 +26,7 @@ before_install: before_script: - composer install --prefer-source - vendor/bin/parallel-lint --exclude vendor . - - vendor/bin/php-cs-fixer fix --dry-run --diff --level psr2 . + - vendor/bin/php-cs-fixer fix --dry-run --diff . - phpenv config-add ./xdebug.ini after_script: diff --git a/README.md b/README.md index 01d40516..d53033c4 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,10 @@ OpenStack services, and versions of services, are supported. * [Contributing guide](/CONTRIBUTING.md) * [Code of Conduct](/CODE_OF_CONDUCT.md) +## Backward incompatibility + +Due to new [object typehint](https://wiki.php.net/rfc/object-typehint) since PHP 7.2, class `\OpenStack\ObjectStore\v1\Models\Object` had to be renamed to `\OpenStack\ObjectStore\v1\Models\ObjectEntity` in [v3.0.0](/releases/v3.0.0)! + ## Getting help - Meet us on Slack: https://phpopencloud.slack.com ([Get your invitation](https://slackpass.io/phpopencloud)) diff --git a/composer.json b/composer.json index 6b699598..10d41e66 100644 --- a/composer.json +++ b/composer.json @@ -49,6 +49,6 @@ "psr/log": "~1.0", "satooshi/php-coveralls": "~1.0", "jakub-onderka/php-parallel-lint": "0.*", - "friendsofphp/php-cs-fixer": "^1.0" + "friendsofphp/php-cs-fixer": "^2.0" } } diff --git a/doc/services/object-store/v1/objects.rst b/doc/services/object-store/v1/objects.rst index f2a2ff88..657149dc 100644 --- a/doc/services/object-store/v1/objects.rst +++ b/doc/services/object-store/v1/objects.rst @@ -27,7 +27,7 @@ Download an object ------------------ .. sample:: object_store/v1/objects/download.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_download +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_download As you will notice, a Stream_ object is returned by this call. For more information about dealing with streams, please consult `Guzzle's docs`_. @@ -88,19 +88,19 @@ Copy object ----------- .. sample:: object_store/v1/objects/copy.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_copy +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_copy Delete object ------------- .. sample:: object_store/v1/objects/delete.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_delete +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_delete Get metadata ------------ .. sample:: object_store/v1/objects/get_metadata.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_getMetadata +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_getMetadata The returned value will be a standard associative array, or hash, containing arbitrary key/value pairs. These will correspond to the values set either when the object was created, or when a previous ``mergeMetadata`` or @@ -110,7 +110,7 @@ Replace all metadata with new values ------------------------------------ .. sample:: object_store/v1/objects/reset_metadata.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_resetMetadata +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_resetMetadata In order to replace all existing metadata with a set of new values, you can use this operation. Any existing metadata items which not specified in the new set will be removed. For example, say an account has the following metadata @@ -140,7 +140,7 @@ Merge new metadata values with existing --------------------------------------- .. sample:: object_store/v1/objects/merge_metadata.php -.. refdoc:: OpenStack/ObjectStore/v1/Models/Object.html#method_mergeMetadata +.. refdoc:: OpenStack/ObjectStore/v1/Models/ObjectEntity.html#method_mergeMetadata In order to merge a set of new metadata values with the existing metadata set, you can use this operation. Any existing metadata items which are not specified in the new set will be preserved. For example, say an account has the following diff --git a/src/BlockStorage/v2/Models/Snapshot.php b/src/BlockStorage/v2/Models/Snapshot.php index 64dc11d1..72997ab6 100644 --- a/src/BlockStorage/v2/Models/Snapshot.php +++ b/src/BlockStorage/v2/Models/Snapshot.php @@ -13,6 +13,7 @@ use OpenStack\Common\Resource\Updateable; use OpenStack\Common\Transport\Utils; use Psr\Http\Message\ResponseInterface; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\BlockStorage\v2\Api $api @@ -63,7 +64,7 @@ protected function getAliases(): array ]; } - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); $this->metadata = $this->parseMetadata($response); diff --git a/src/BlockStorage/v2/Models/Volume.php b/src/BlockStorage/v2/Models/Volume.php index dbf5ef84..2ef8ec4a 100644 --- a/src/BlockStorage/v2/Models/Volume.php +++ b/src/BlockStorage/v2/Models/Volume.php @@ -12,6 +12,7 @@ use OpenStack\Common\Resource\Updateable; use OpenStack\Common\Transport\Utils; use Psr\Http\Message\ResponseInterface; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\BlockStorage\v2\Api $api @@ -89,7 +90,7 @@ protected function getAliases(): array ]; } - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); $this->metadata = $this->parseMetadata($response); diff --git a/src/Common/JsonSchema/JsonPatch.php b/src/Common/JsonSchema/JsonPatch.php index eb6c6e0a..88a96e97 100644 --- a/src/Common/JsonSchema/JsonPatch.php +++ b/src/Common/JsonSchema/JsonPatch.php @@ -78,7 +78,7 @@ protected function handleObject(\stdClass $srcStruct, \stdClass $desStruct, stri protected function shouldPartiallyReplace(\stdClass $o1, \stdClass $o2): bool { - return count(array_diff_key((array) $o1, (array) $o2)) < count($o1); + return count(array_diff_key((array) $o1, (array) $o2)) < count((array) $o1); } protected function arrayDiff(array $a1, array $a2): array diff --git a/src/Common/Resource/AbstractResource.php b/src/Common/Resource/AbstractResource.php index a3f2f51a..4b0d10a4 100644 --- a/src/Common/Resource/AbstractResource.php +++ b/src/Common/Resource/AbstractResource.php @@ -40,9 +40,9 @@ abstract class AbstractResource implements ResourceInterface, Serializable * * @param ResponseInterface $response * - * @return AbstractResource + * @return ResourceInterface */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { if (strpos($response->getHeaderLine('Content-Type'), 'application/json') === 0) { $json = Utils::jsonDecode($response); @@ -59,9 +59,9 @@ public function populateFromResponse(ResponseInterface $response): self * * @param array $array * - * @return mixed|void + * @return ResourceInterface */ - public function populateFromArray(array $array): self + public function populateFromArray(array $array): ResourceInterface { $aliases = $this->getAliases(); diff --git a/src/Common/Resource/ResourceInterface.php b/src/Common/Resource/ResourceInterface.php index 7c5ea40b..19dae3d0 100644 --- a/src/Common/Resource/ResourceInterface.php +++ b/src/Common/Resource/ResourceInterface.php @@ -17,15 +17,15 @@ interface ResourceInterface * * @param ResponseInterface $response * - * @return self + * @return ResourceInterface */ - public function populateFromResponse(ResponseInterface $response); + public function populateFromResponse(ResponseInterface $response): ResourceInterface; /** * @param array $data - * @return mixed + * @return ResourceInterface */ - public function populateFromArray(array $data); + public function populateFromArray(array $data): ResourceInterface; /** * @param string $name The name of the model class. diff --git a/src/Compute/v2/Models/Keypair.php b/src/Compute/v2/Models/Keypair.php index 8a270729..358b3757 100644 --- a/src/Compute/v2/Models/Keypair.php +++ b/src/Compute/v2/Models/Keypair.php @@ -9,6 +9,7 @@ use OpenStack\Common\Resource\Listable; use OpenStack\Common\Resource\Retrievable; use OpenStack\Common\Transport\Utils; +use OpenStack\Common\Resource\ResourceInterface; /** * Represents a Compute v2 Keypair @@ -78,7 +79,7 @@ public function create(array $userOptions): Creatable /** * {@inheritDoc} */ - public function populateFromArray(array $array): self + public function populateFromArray(array $array): ResourceInterface { return parent::populateFromArray(Utils::flattenJson($array, $this->resourceKey)); } diff --git a/src/Identity/v2/Models/Catalog.php b/src/Identity/v2/Models/Catalog.php index 6081507a..de98c243 100644 --- a/src/Identity/v2/Models/Catalog.php +++ b/src/Identity/v2/Models/Catalog.php @@ -6,6 +6,7 @@ use OpenStack\Common\Resource\OperatorResource; use OpenStack\Common\Transport\Utils; use Psr\Http\Message\ResponseInterface; +use OpenStack\Common\Resource\ResourceInterface; /** * Represents an Identity v2 service catalog. @@ -36,7 +37,7 @@ protected function getAliases(): array /** * {@inheritDoc} */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { $entries = Utils::jsonDecode($response)['access']['serviceCatalog']; diff --git a/src/Identity/v2/Models/Token.php b/src/Identity/v2/Models/Token.php index a98791e8..4d1fe188 100644 --- a/src/Identity/v2/Models/Token.php +++ b/src/Identity/v2/Models/Token.php @@ -6,7 +6,7 @@ use OpenStack\Common\Transport\Utils; use Psr\Http\Message\ResponseInterface; use OpenStack\Common\Resource\OperatorResource; -use OpenStack\Common\Resource\ValueResource; +use OpenStack\Common\Resource\ResourceInterface; /** * Represents an Identity v2 Token. @@ -42,7 +42,7 @@ protected function getAliases(): array /** * {@inheritDoc} */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { $this->populateFromArray(Utils::jsonDecode($response)['access']['token']); diff --git a/src/Identity/v3/Models/Catalog.php b/src/Identity/v3/Models/Catalog.php index 9fc1a7f9..76fd2df7 100644 --- a/src/Identity/v3/Models/Catalog.php +++ b/src/Identity/v3/Models/Catalog.php @@ -4,6 +4,7 @@ use OpenStack\Common\Resource\Alias; use OpenStack\Common\Resource\OperatorResource; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\Identity\v3\Api $api @@ -23,7 +24,7 @@ protected function getAliases(): array ]; } - public function populateFromArray(array $data): self + public function populateFromArray(array $data): ResourceInterface { foreach ($data as $service) { $this->services[] = $this->model(Service::class, $service); diff --git a/src/Identity/v3/Models/Token.php b/src/Identity/v3/Models/Token.php index de430798..5c877867 100644 --- a/src/Identity/v3/Models/Token.php +++ b/src/Identity/v3/Models/Token.php @@ -8,6 +8,7 @@ use OpenStack\Common\Resource\OperatorResource; use OpenStack\Common\Resource\Creatable; use OpenStack\Common\Resource\Retrievable; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\Identity\v3\Api $api @@ -64,7 +65,7 @@ protected function getAliases(): array /** * {@inheritDoc} */ - public function populateFromResponse(ResponseInterface $response) + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); $this->id = $response->getHeaderLine('X-Subject-Token'); diff --git a/src/Images/v2/Models/Image.php b/src/Images/v2/Models/Image.php index 3b731241..9d0681e6 100644 --- a/src/Images/v2/Models/Image.php +++ b/src/Images/v2/Models/Image.php @@ -13,6 +13,7 @@ use OpenStack\Common\Transport\Utils; use OpenStack\Images\v2\JsonPatch; use Psr\Http\Message\StreamInterface; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\Images\v2\Api $api @@ -97,7 +98,7 @@ protected function getAliases(): array ]; } - public function populateFromArray(array $data): self + public function populateFromArray(array $data): ResourceInterface { parent::populateFromArray($data); diff --git a/src/ObjectStore/v1/Models/Account.php b/src/ObjectStore/v1/Models/Account.php index cd280411..3731ffd5 100644 --- a/src/ObjectStore/v1/Models/Account.php +++ b/src/ObjectStore/v1/Models/Account.php @@ -6,6 +6,7 @@ use OpenStack\Common\Resource\HasMetadata; use OpenStack\Common\Resource\Retrievable; use Psr\Http\Message\ResponseInterface; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\ObjectStore\v1\Api $api @@ -34,7 +35,7 @@ class Account extends OperatorResource implements Retrievable, HasMetadata /** * {@inheritdoc} */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); diff --git a/src/ObjectStore/v1/Models/Container.php b/src/ObjectStore/v1/Models/Container.php index 52704546..7c012a2c 100644 --- a/src/ObjectStore/v1/Models/Container.php +++ b/src/ObjectStore/v1/Models/Container.php @@ -12,6 +12,7 @@ use OpenStack\Common\Resource\HasMetadata; use OpenStack\Common\Resource\Listable; use OpenStack\Common\Resource\Retrievable; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\ObjectStore\v1\Api $api @@ -39,7 +40,7 @@ class Container extends OperatorResource implements Creatable, Deletable, Retrie /** * {@inheritdoc} */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); @@ -61,7 +62,7 @@ public function populateFromResponse(ResponseInterface $response): self public function listObjects(array $options = [], callable $mapFn = null): \Generator { $options = array_merge($options, ['name' => $this->name, 'format' => 'json']); - return $this->model(Object::class)->enumerate($this->api->getContainer(), $options, $mapFn); + return $this->model(ObjectEntity::class)->enumerate($this->api->getContainer(), $options, $mapFn); } /** @@ -142,11 +143,11 @@ public function getMetadata(): array * * @param string $name The name of the object * - * @return Object + * @return ObjectEntity */ - public function getObject($name): Object + public function getObject($name): ObjectEntity { - return $this->model(Object::class, ['containerName' => $this->name, 'name' => $name]); + return $this->model(ObjectEntity::class, ['containerName' => $this->name, 'name' => $name]); } /** @@ -177,11 +178,11 @@ public function objectExists(string $name): bool * * @param array $data {@see \OpenStack\ObjectStore\v1\Api::putObject} * - * @return Object + * @return ObjectEntity */ - public function createObject(array $data): Object + public function createObject(array $data): ObjectEntity { - return $this->model(Object::class)->create($data + ['containerName' => $this->name]); + return $this->model(ObjectEntity::class)->create($data + ['containerName' => $this->name]); } /** @@ -195,9 +196,9 @@ public function createObject(array $data): Object * @param string $data['segmentPrefix'] The prefix that will come before each segment. If omitted, a default * is used: name/timestamp/filesize * - * @return Object + * @return ObjectEntity */ - public function createLargeObject(array $data): Object + public function createLargeObject(array $data): ObjectEntity { /** @var \Psr\Http\Message\StreamInterface $stream */ $stream = $data['stream']; @@ -218,7 +219,7 @@ public function createLargeObject(array $data): Object $count = 0; while (!$stream->eof() && $count < round($stream->getSize() / $segmentSize)) { - $promises[] = $this->model(Object::class)->createAsync([ + $promises[] = $this->model(ObjectEntity::class)->createAsync([ 'name' => sprintf("%s/%d", $segmentPrefix, ++$count), 'stream' => new LimitStream($stream, $segmentSize, ($count - 1) * $segmentSize), 'containerName' => $segmentContainer, diff --git a/src/ObjectStore/v1/Models/Object.php b/src/ObjectStore/v1/Models/ObjectEntity.php similarity index 96% rename from src/ObjectStore/v1/Models/Object.php rename to src/ObjectStore/v1/Models/ObjectEntity.php index 2f255817..764f2861 100644 --- a/src/ObjectStore/v1/Models/Object.php +++ b/src/ObjectStore/v1/Models/ObjectEntity.php @@ -10,11 +10,12 @@ use OpenStack\Common\Resource\Creatable; use OpenStack\Common\Resource\Deletable; use OpenStack\Common\Resource\HasMetadata; +use OpenStack\Common\Resource\ResourceInterface; /** * @property \OpenStack\ObjectStore\v1\Api $api */ -class Object extends OperatorResource implements Creatable, Deletable, HasMetadata +class ObjectEntity extends OperatorResource implements Creatable, Deletable, HasMetadata { use MetadataTrait; @@ -47,7 +48,7 @@ class Object extends OperatorResource implements Creatable, Deletable, HasMetada /** * {@inheritdoc} */ - public function populateFromResponse(ResponseInterface $response): self + public function populateFromResponse(ResponseInterface $response): ResourceInterface { parent::populateFromResponse($response); diff --git a/tests/unit/ObjectStore/v1/Models/ContainerTest.php b/tests/unit/ObjectStore/v1/Models/ContainerTest.php index 6e83b8a4..41000e7d 100644 --- a/tests/unit/ObjectStore/v1/Models/ContainerTest.php +++ b/tests/unit/ObjectStore/v1/Models/ContainerTest.php @@ -8,7 +8,7 @@ use OpenStack\Common\Error\BadResponseError; use OpenStack\ObjectStore\v1\Api; use OpenStack\ObjectStore\v1\Models\Container; -use OpenStack\ObjectStore\v1\Models\Object; +use OpenStack\ObjectStore\v1\Models\ObjectEntity; use OpenStack\Test\TestCase; use Prophecy\Argument; @@ -95,7 +95,7 @@ public function test_It_Gets_Object() { $object = $this->container->getObject('foo.txt'); - $this->assertInstanceOf(Object::class, $object); + $this->assertInstanceOf(ObjectEntity::class, $object); $this->assertEquals('foo.txt', $object->name); } @@ -135,7 +135,7 @@ public function test_it_lists_objects() ->willReturn($this->getFixture('GET_Container')); foreach ($this->container->listObjects(['limit' => 2]) as $object) { - $this->assertInstanceOf(Object::class, $object); + $this->assertInstanceOf(ObjectEntity::class, $object); } } diff --git a/tests/unit/ObjectStore/v1/Models/ObjectTest.php b/tests/unit/ObjectStore/v1/Models/ObjectTest.php index 36e3e689..98ac5b14 100644 --- a/tests/unit/ObjectStore/v1/Models/ObjectTest.php +++ b/tests/unit/ObjectStore/v1/Models/ObjectTest.php @@ -5,7 +5,7 @@ use function GuzzleHttp\Psr7\uri_for; use GuzzleHttp\Psr7\Stream; use OpenStack\ObjectStore\v1\Api; -use OpenStack\ObjectStore\v1\Models\Object; +use OpenStack\ObjectStore\v1\Models\ObjectEntity; use OpenStack\Test\TestCase; class ObjectTest extends TestCase @@ -21,7 +21,7 @@ public function setUp() $this->rootFixturesDir = dirname(__DIR__); - $this->object = new Object($this->client->reveal(), new Api()); + $this->object = new ObjectEntity($this->client->reveal(), new Api()); $this->object->containerName = self::CONTAINER; $this->object->name = self::NAME; }