Skip to content

Commit ef71839

Browse files
committed
Merge branch 'release/2.2.0'
2 parents 6141406 + 2080cf7 commit ef71839

File tree

11 files changed

+218
-7
lines changed

11 files changed

+218
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
## [2.2.0] - 2021-03-18
10+
### Added
11+
- Utilise the new builder factory; Add mapToCollection methods [PR#13](https://github.com/JsonMapper/LaravelPackage/pull/13)
12+
913
## [2.1.0] - 2021-01-28
1014
### Changed
1115
- Migrate to GitHub actions [PR#12](https://github.com/JsonMapper/LaravelPackage/pull/12)

Version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.0
1+
2.2.0

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"license": "MIT",
1313
"minimum-stability": "stable",
1414
"require": {
15-
"json-mapper/json-mapper": "^2.0",
15+
"json-mapper/json-mapper": "^2.3",
1616
"php": "^7.2 || ^8.0",
1717
"illuminate/support": "^5.5|^6|^7|^8"
1818
},
@@ -40,6 +40,7 @@
4040
}
4141
},
4242
"require-dev": {
43+
"ext-json": "*",
4344
"squizlabs/php_codesniffer": "^3.5",
4445
"phpstan/phpstan": "^0.12.19",
4546
"phpunit/phpunit": "^8.0 || ^9.0",

src/JsonMapper.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage;
6+
7+
use Illuminate\Support\Collection;
8+
9+
class JsonMapper extends \JsonMapper\JsonMapper implements JsonMapperInterface
10+
{
11+
public function mapToCollection(array $json, object $object): Collection
12+
{
13+
return collect($this->mapArray($json, $object));
14+
}
15+
16+
public function mapToCollectionFromString(string $json, object $object): Collection
17+
{
18+
return collect($this->mapArrayFromString($json, $object));
19+
}
20+
}

src/JsonMapperInterface.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage;
6+
7+
use Illuminate\Support\Collection;
8+
9+
interface JsonMapperInterface extends \JsonMapper\JsonMapperInterface
10+
{
11+
public function mapToCollection(array $json, object $object): Collection;
12+
13+
public function mapToCollectionFromString(string $json, object $object): Collection;
14+
}

src/ServiceProvider.php

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,37 @@
66

77
use Illuminate\Support\ServiceProvider as BaseServiceProvider;
88
use JsonMapper\JsonMapper;
9+
use JsonMapper\JsonMapperBuilder;
910
use JsonMapper\JsonMapperFactory;
1011
use JsonMapper\JsonMapperInterface;
1112

1213
class ServiceProvider extends BaseServiceProvider
1314
{
1415
private const CONFIG_FILE = __DIR__ . '/../config/json-mapper.php';
1516

16-
/**
17-
* @return void
18-
*/
17+
/** @return void */
1918
public function register()
2019
{
2120
$this->mergeConfigFrom(self::CONFIG_FILE, 'json-mapper');
2221

2322
$this->app->singleton(JsonMapperInterface::class, function ($app) {
2423
$config = $app->get('config')->get('json-mapper.type');
24+
$builder = JsonMapperBuilder::new()
25+
->withJsonMapperClassName(\JsonMapper\LaravelPackage\JsonMapper::class);
26+
$factory = new JsonMapperFactory($builder);
27+
2528
switch ($config) {
2629
case 'best-fit':
27-
return (new JsonMapperFactory())->bestFit();
30+
return $factory->bestFit();
2831
case 'default':
2932
default:
30-
return (new JsonMapperFactory())->default();
33+
return $factory->default();
3134
}
3235
});
3336

3437
$this->app->alias(JsonMapperInterface::class, JsonMapper::class);
38+
$this->app->alias(JsonMapperInterface::class, \JsonMapper\LaravelPackage\JsonMapperInterface::class);
39+
$this->app->alias(JsonMapperInterface::class, \JsonMapper\LaravelPackage\JsonMapper::class);
3540
}
3641

3742
/**
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage\Tests\Implementation\ChuckNorris;
6+
7+
8+
class Joke
9+
{
10+
/** @var string[] */
11+
public $categories;
12+
/** @var \DateTimeImmutable */
13+
public $created_at;
14+
/** @var string */
15+
public $icon_url;
16+
/** @var string */
17+
public $id;
18+
/** @var \DateTimeImmutable */
19+
public $updated_at;
20+
/** @var string */
21+
public $url;
22+
/** @var string */
23+
public $value;
24+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage\Tests\Implementation\ChuckNorris;
6+
7+
8+
class SearchResponse
9+
{
10+
/** @var int */
11+
public $total;
12+
/** @var Joke[] */
13+
public $result;
14+
}

tests/Implementation/SimpleObject.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage\Tests\Implementation;
6+
7+
8+
class SimpleObject
9+
{
10+
/** @var int */
11+
private $number;
12+
13+
public function getNumber(): int
14+
{
15+
return $this->number;
16+
}
17+
18+
public function setNumber(int $number): void
19+
{
20+
$this->number = $number;
21+
}
22+
23+
public static function withNumber(int $number): self
24+
{
25+
$instance = new self();
26+
$instance->setNumber($number);
27+
28+
return $instance;
29+
}
30+
}

tests/Integration/JsonMapperTests.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage\Tests\Integration;
6+
7+
use JsonMapper\LaravelPackage\JsonMapperInterface;
8+
use JsonMapper\LaravelPackage\ServiceProvider;
9+
use JsonMapper\LaravelPackage\Tests\Implementation\ChuckNorris\Joke;
10+
use \Orchestra\Testbench\TestCase;
11+
12+
class JsonMapperTests extends TestCase
13+
{
14+
protected function getPackageProviders($app)
15+
{
16+
return [
17+
ServiceProvider::class,
18+
];
19+
}
20+
21+
/** @covers \JsonMapper\LaravelPackage\JsonMapper */
22+
public function testJsonMapperCanMapToCollection(): void
23+
{
24+
/** @var JsonMapperInterface $mapper */
25+
$mapper = $this->app->make(JsonMapperInterface::class);
26+
$url = "https://api.chucknorris.io/jokes/search?query=save";
27+
$data = (string) file_get_contents($url);
28+
$json = json_decode($data, false);
29+
$jokes = $mapper->mapToCollection($json->result, new Joke());
30+
31+
self::assertContainsOnlyInstancesOf(Joke::class, $jokes->all());
32+
}
33+
34+
/** @covers \JsonMapper\LaravelPackage\JsonMapper */
35+
public function testJsonMapperCanMapToCollectionWithLargeJson(): void
36+
{
37+
/** @var JsonMapperInterface $mapper */
38+
$mapper = $this->app->make(JsonMapperInterface::class);
39+
$url = "https://api.chucknorris.io/jokes/search?query=kick";
40+
$data = (string) file_get_contents($url);
41+
$json = json_decode($data, false);
42+
$jokes = $mapper->mapToCollection($json->result, new Joke());
43+
44+
self::assertContainsOnlyInstancesOf(Joke::class, $jokes->all());
45+
}
46+
47+
}

tests/Unit/JsonMapperTest.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonMapper\LaravelPackage\Tests\Unit;
6+
7+
use Illuminate\Config\Repository;
8+
use Illuminate\Foundation\Application;
9+
use JsonMapper\LaravelPackage\JsonMapperInterface;
10+
use JsonMapper\LaravelPackage\ServiceProvider;
11+
use JsonMapper\LaravelPackage\Tests\Implementation\SimpleObject;
12+
use PHPUnit\Framework\TestCase;
13+
14+
class JsonMapperTest extends TestCase
15+
{
16+
/** @covers \JsonMapper\LaravelPackage\JsonMapper */
17+
public function testCanMapToCollection(): void
18+
{
19+
$app = new Application();
20+
$app->offsetSet('config', new Repository(['json-mapper.type' => 'best-fit']));
21+
$serviceProvider = new ServiceProvider($app);
22+
23+
$serviceProvider->boot();
24+
$serviceProvider->register();
25+
/** @var JsonMapperInterface $jsonMapper */
26+
$jsonMapper = $app->make(JsonMapperInterface::class);
27+
$data = json_decode('[{"number": 12}, {"number": 13}]', false);
28+
29+
$result = $jsonMapper->mapToCollection($data, new SimpleObject());
30+
31+
self::assertCount(2, $result);
32+
self::assertEquals(collect([SimpleObject::withNumber(12), SimpleObject::withNumber(13)]), $result);
33+
}
34+
35+
/** @covers \JsonMapper\LaravelPackage\JsonMapper */
36+
public function testCanMapToCollectionFromstring(): void
37+
{
38+
$app = new Application();
39+
$app->offsetSet('config', new Repository(['json-mapper.type' => 'best-fit']));
40+
$serviceProvider = new ServiceProvider($app);
41+
42+
$serviceProvider->boot();
43+
$serviceProvider->register();
44+
/** @var JsonMapperInterface $jsonMapper */
45+
$jsonMapper = $app->make(JsonMapperInterface::class);
46+
47+
$result = $jsonMapper->mapToCollectionFromString('[{"number": 12}, {"number": 13}]', new SimpleObject());
48+
49+
self::assertCount(2, $result);
50+
self::assertEquals(collect([SimpleObject::withNumber(12), SimpleObject::withNumber(13)]), $result);
51+
}
52+
}

0 commit comments

Comments
 (0)