Skip to content

Commit a4c02b1

Browse files
committed
POC: strong typed requests and responses
1 parent 4933cb5 commit a4c02b1

File tree

16 files changed

+135
-208
lines changed

16 files changed

+135
-208
lines changed

src/Contracts/Request.php

-18
This file was deleted.

src/DataObjectFactories/Moderation/ModerationResponseFactory.php

-30
This file was deleted.

src/DataObjects/Moderation/ModerationResponse.php renamed to src/DataObjects/Moderation/Moderation.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use OpenAI\Contracts\DataObject;
66

7-
final class ModerationResponse implements DataObject
7+
final class Moderation implements DataObject
88
{
99
/**
1010
* @param array<array-key, ModerationResult> $results

src/DataObjects/Moderation/ModerationCategory.php

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace OpenAI\DataObjects\Moderation;
44

5+
use OpenAI\Contracts\DataObject;
56
use OpenAI\Enums\Moderation\Category;
67

7-
final class ModerationCategory
8+
final class ModerationCategory implements DataObject
89
{
910
public function __construct(
1011
public readonly Category $category,

src/Enums/Moderation/ModerationModel.php

-9
This file was deleted.

src/DataObjectFactories/Moderation/ModerationCategoryFactory.php renamed to src/Factories/DataObjects/Moderation/ModerationCategoryFactory.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace OpenAI\DataObjectFactories\Moderation;
3+
namespace OpenAI\Factories\DataObjects\Moderation;
44

55
use OpenAI\DataObjects\Moderation\ModerationCategory;
66
use OpenAI\Enums\Moderation\Category;
@@ -33,8 +33,8 @@ public function make(array $attributes): ModerationCategory
3333
{
3434
return new ModerationCategory(
3535
category: Category::from((string) $attributes['category']),
36-
violated: (bool) ($attributes['violated'] ?? false),
37-
score: (float) ($attributes['score'] ?? 0),
36+
violated: (bool) $attributes['violated'],
37+
score: (float) $attributes['score'],
3838
);
3939
}
4040
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace OpenAI\Factories\DataObjects\Moderation;
4+
5+
use OpenAI\DataObjects\Moderation\Moderation;
6+
7+
final class ModerationFactory
8+
{
9+
/**
10+
* @param array<string, array<array-key, array<string, array<string, bool|float>>>|string> $attributes
11+
*/
12+
public static function new(array $attributes): Moderation
13+
{
14+
return (new self)->make(
15+
attributes: $attributes,
16+
);
17+
}
18+
19+
/**
20+
* @param array<string, array<array-key, array<string, array<string, bool|float>>>|string> $attributes
21+
*/
22+
public function make(array $attributes): Moderation
23+
{
24+
return new Moderation(
25+
id: strval($attributes['id']),
26+
model: strval($attributes['model']),
27+
results: ModerationResultFactory::collection($attributes['results']), /** @phpstan-ignore-line */
28+
);
29+
}
30+
}

src/DataObjectFactories/Moderation/ModerationResultFactory.php renamed to src/Factories/DataObjects/Moderation/ModerationResultFactory.php

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php
22

3-
namespace OpenAI\DataObjectFactories\Moderation;
3+
namespace OpenAI\Factories\DataObjects\Moderation;
44

55
use OpenAI\DataObjects\Moderation\ModerationResult;
66
use OpenAI\Enums\Moderation\Category;
@@ -13,7 +13,7 @@ final class ModerationResultFactory
1313
*/
1414
public static function collection(array $results): array
1515
{
16-
return array_map(fn ($result): \OpenAI\DataObjects\Moderation\ModerationResult => static::new($result), $results);
16+
return array_map(fn ($result): ModerationResult => static::new($result), $results);
1717
}
1818

1919
/**
@@ -33,13 +33,13 @@ public function make(array $attributes): ModerationResult
3333
{
3434
$categories = array_map(fn (Category $category): array => [
3535
'category' => $category->value,
36-
'violated' => $attributes['categories'][$category->value] ?? false,
37-
'score' => $attributes['category_scores'][$category->value] ?? 0,
36+
'violated' => $attributes['categories'][$category->value],
37+
'score' => $attributes['category_scores'][$category->value],
3838
], Category::cases());
3939

4040
return new ModerationResult(
4141
categories: ModerationCategoryFactory::collection($categories),
42-
flagged: (bool) ($attributes['flagged'] ?? false),
42+
flagged: (bool) ($attributes['flagged']),
4343
);
4444
}
4545
}

src/RequestFactories/Moderation/ModerationCreateRequestFactory.php

-33
This file was deleted.

src/Requests/Moderation/ModerationCreateRequest.php

-26
This file was deleted.

src/Resources/Moderations.php

+8-7
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@
44

55
namespace OpenAI\Resources;
66

7-
use OpenAI\DataObjectFactories\Moderation\ModerationResponseFactory;
8-
use OpenAI\DataObjects\Moderation\ModerationResponse;
9-
use OpenAI\Requests\Moderation\ModerationCreateRequest;
7+
use OpenAI\DataObjects\Moderation\Moderation;
8+
use OpenAI\Factories\DataObjects\Moderation\ModerationFactory;
109
use OpenAI\ValueObjects\Transporter\Payload;
1110

1211
final class Moderations
@@ -17,14 +16,16 @@ final class Moderations
1716
* Classifies if text violates OpenAI's Content Policy.
1817
*
1918
* @see https://beta.openai.com/docs/api-reference/moderations/create
19+
*
20+
* @param array<string, mixed> $parameters
2021
*/
21-
public function create(ModerationCreateRequest $request): ModerationResponse
22+
public function create(array $parameters): Moderation
2223
{
23-
$payload = Payload::createFromRequest('moderations', $request);
24+
$payload = Payload::create('moderations', $parameters);
2425

25-
/** @var array<string, mixed> $result */
26+
/** @var array<string, array<array-key, array<string, array<string, bool|float>>>|string> $result */
2627
$result = $this->transporter->requestObject($payload);
2728

28-
return ModerationResponseFactory::new($result);
29+
return ModerationFactory::new($result);
2930
}
3031
}

src/ValueObjects/Transporter/Payload.php

-12
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,6 @@ public static function create(string $resource, array $parameters): self
8080
return new self($contentType, $method, $uri, $parameters);
8181
}
8282

83-
/**
84-
* Creates a new Payload value object from the given parameters.
85-
*/
86-
public static function createFromRequest(string $resource, Request $request): self
87-
{
88-
$contentType = ContentType::JSON;
89-
$method = Method::POST;
90-
$uri = ResourceUri::create($resource);
91-
92-
return new self($contentType, $method, $uri, $request->toArray());
93-
}
94-
9583
/**
9684
* Creates a new Payload value object from the given parameters.
9785
*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
use OpenAI\DataObjects\Moderation\Moderation;
4+
use OpenAI\DataObjects\Moderation\ModerationResult;
5+
use OpenAI\Factories\DataObjects\Moderation\ModerationFactory;
6+
7+
test('build new moderation', function () {
8+
$moderation = ModerationFactory::new(moderationResource());
9+
10+
expect($moderation)
11+
->toBeInstanceOf(Moderation::class)
12+
->id->toBe('modr-5MWoLO')
13+
->model->toBe('text-moderation-001')
14+
->results->toBeArray()->toHaveCount(1)
15+
->results->each->toBeInstanceOf(ModerationResult::class);
16+
});
17+
18+
test('create array from moderation', function () {
19+
$moderation = ModerationFactory::new(moderationResource());
20+
21+
expect($moderation->toArray())
22+
->toBeArray()
23+
->id->toBe('modr-5MWoLO')
24+
->model->toBe('text-moderation-001')
25+
->results->toBeArray()->toHaveCount(1)
26+
->results->each->toBeArray();
27+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use OpenAI\Enums\Moderation\Category;
4+
use OpenAI\Factories\DataObjects\Moderation\ModerationCategoryFactory;
5+
6+
test('build new moderation category', function () {
7+
$category = ModerationCategoryFactory::new([
8+
'category' => Category::Hate->value,
9+
'violated' => true,
10+
'score' => 0.1234,
11+
]);
12+
13+
expect($category)
14+
->category->toBe(Category::Hate)
15+
->violated->toBe(true)
16+
->score->toBe(0.1234);
17+
});
18+
19+
test('create array from moderation category', function () {
20+
$raw = [
21+
'category' => Category::Hate->value,
22+
'violated' => true,
23+
'score' => 0.1234,
24+
];
25+
26+
$category = ModerationCategoryFactory::new($raw);
27+
28+
expect($category->toArray())
29+
->toBeArray()
30+
->toBe($raw);
31+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use OpenAI\DataObjects\Moderation\ModerationCategory;
4+
use OpenAI\Factories\DataObjects\Moderation\ModerationResultFactory;
5+
6+
test('build new moderation result', function () {
7+
$result = ModerationResultFactory::new(moderationResource()['results'][0]);
8+
9+
expect($result)
10+
->flagged->toBeTrue()
11+
->categories->toHaveCount(7)
12+
->each->toBeInstanceOf(ModerationCategory::class);
13+
});
14+
15+
test('create array from moderation result', function () {
16+
$result = ModerationResultFactory::new(moderationResource()['results'][0]);
17+
18+
expect($result->toArray())
19+
->flagged->toBeTrue()
20+
->categories->toHaveCount(7)
21+
->each->toBeArray();
22+
});

0 commit comments

Comments
 (0)