Skip to content

Commit 4703147

Browse files
authored
Merge pull request #10 from swaggest/cleanup
Cleanup
2 parents 90f1f4f + 0fdc81a commit 4703147

28 files changed

+227
-733
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ JSON;
6464

6565
Load it
6666
```php
67-
$schema = SchemaLoader::create()->readSchema(json_decode($schemaJson));
67+
$schema = Schema::import(json_decode($schemaJson));
6868
```
6969

7070
Validate data
7171
```php
72-
$schema->import(json_decode(<<<'JSON'
72+
$schema->in(json_decode(<<<'JSON'
7373
{
7474
"id": 1,
7575
"name":"John Doe",

src/ProcessingOptions.php renamed to src/Context.php

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
namespace Swaggest\JsonSchema;
44

5-
class ProcessingOptions extends MagicMap
5+
class Context extends MagicMap
66
{
7-
8-
9-
protected $import = true;
7+
public $import = true;
108
/** @var DataPreProcessor */
119
public $dataPreProcessor;
1210
/** @var RefResolver */
@@ -18,6 +16,9 @@ class ProcessingOptions extends MagicMap
1816
/** @var string */
1917
public $propagateObjectItemClass;
2018

19+
/** @var \SplObjectStorage */
20+
public $circularReferences;
21+
2122
/**
2223
* ProcessingOptions constructor.
2324
* @param RemoteRefProvider $remoteRefProvider
@@ -37,7 +38,7 @@ public function getDataPreProcessor()
3738

3839
/**
3940
* @param DataPreProcessor $dataPreProcessor
40-
* @return ProcessingOptions
41+
* @return Context
4142
*/
4243
public function setDataPreProcessor($dataPreProcessor)
4344
{
@@ -55,7 +56,7 @@ public function getRemoteRefProvider()
5556

5657
/**
5758
* @param RemoteRefProvider $remoteRefProvider
58-
* @return ProcessingOptions
59+
* @return Context
5960
*/
6061
public function setRemoteRefProvider($remoteRefProvider)
6162
{

src/JsonSchema.php

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33
namespace Swaggest\JsonSchema;
44

55
use Swaggest\JsonSchema\Constraint\Properties;
6-
use Swaggest\JsonSchema\Structure\SchemaStructure;
6+
use Swaggest\JsonSchema\Structure\ClassStructure;
77

88

9-
class JsonSchema extends SchemaStructure {
9+
class JsonSchema extends ClassStructure {
1010
/** @var string */
1111
public $id;
1212

@@ -114,69 +114,69 @@ class JsonSchema extends SchemaStructure {
114114
*/
115115
public static function setUpProperties($properties, Schema $ownerSchema)
116116
{
117-
$properties->id = JsonSchema::string();
118-
$properties->schema = JsonSchema::string();
117+
$properties->id = Schema::string();
118+
$properties->schema = Schema::string();
119119
$ownerSchema->addPropertyMapping('$schema', self::names()->schema);
120-
$properties->title = JsonSchema::string();
121-
$properties->description = JsonSchema::string();
120+
$properties->title = Schema::string();
121+
$properties->description = Schema::string();
122122
$properties->default = new Schema();
123-
$properties->multipleOf = JsonSchema::number();
123+
$properties->multipleOf = Schema::number();
124124
$properties->multipleOf->minimum = 0;
125125
$properties->multipleOf->exclusiveMinimum = true;
126-
$properties->maximum = JsonSchema::number();
127-
$properties->exclusiveMaximum = JsonSchema::boolean();
128-
$properties->minimum = JsonSchema::number();
129-
$properties->exclusiveMinimum = JsonSchema::boolean();
130-
$properties->maxLength = JsonSchema::integer();
126+
$properties->maximum = Schema::number();
127+
$properties->exclusiveMaximum = Schema::boolean();
128+
$properties->minimum = Schema::number();
129+
$properties->exclusiveMinimum = Schema::boolean();
130+
$properties->maxLength = Schema::integer();
131131
$properties->maxLength->minimum = 0;
132132
$properties->minLength = new Schema();
133-
$properties->minLength->allOf[0] = JsonSchema::integer();
133+
$properties->minLength->allOf[0] = Schema::integer();
134134
$properties->minLength->allOf[0]->minimum = 0;
135135
$properties->minLength->allOf[1] = new Schema();
136-
$properties->pattern = JsonSchema::string();
136+
$properties->pattern = Schema::string();
137137
$properties->additionalItems = new Schema();
138-
$properties->additionalItems->anyOf[0] = JsonSchema::boolean();
139-
$properties->additionalItems->anyOf[1] = JsonSchema::schema();
138+
$properties->additionalItems->anyOf[0] = Schema::boolean();
139+
$properties->additionalItems->anyOf[1] = Schema::schema();
140140
$properties->items = new Schema();
141-
$properties->items->anyOf[0] = JsonSchema::schema();
142-
$properties->items->anyOf[1] = JsonSchema::arr();
143-
$properties->items->anyOf[1]->items = JsonSchema::schema();
141+
$properties->items->anyOf[0] = Schema::schema();
142+
$properties->items->anyOf[1] = Schema::arr();
143+
$properties->items->anyOf[1]->items = Schema::schema();
144144
$properties->items->anyOf[1]->minItems = 1;
145-
$properties->maxItems = JsonSchema::integer();
145+
$properties->maxItems = Schema::integer();
146146
$properties->maxItems->minimum = 0;
147147
$properties->minItems = new Schema();
148-
$properties->minItems->allOf[0] = JsonSchema::integer();
148+
$properties->minItems->allOf[0] = Schema::integer();
149149
$properties->minItems->allOf[0]->minimum = 0;
150150
$properties->minItems->allOf[1] = new Schema();
151-
$properties->uniqueItems = JsonSchema::boolean();
152-
$properties->maxProperties = JsonSchema::integer();
151+
$properties->uniqueItems = Schema::boolean();
152+
$properties->maxProperties = Schema::integer();
153153
$properties->maxProperties->minimum = 0;
154154
$properties->minProperties = new Schema();
155-
$properties->minProperties->allOf[0] = JsonSchema::integer();
155+
$properties->minProperties->allOf[0] = Schema::integer();
156156
$properties->minProperties->allOf[0]->minimum = 0;
157157
$properties->minProperties->allOf[1] = new Schema();
158-
$properties->required = JsonSchema::arr();
159-
$properties->required->items = JsonSchema::string();
158+
$properties->required = Schema::arr();
159+
$properties->required->items = Schema::string();
160160
$properties->required->uniqueItems = true;
161161
$properties->required->minItems = 1;
162162
$properties->additionalProperties = new Schema();
163-
$properties->additionalProperties->anyOf[0] = JsonSchema::boolean();
164-
$properties->additionalProperties->anyOf[1] = JsonSchema::schema();
165-
$properties->definitions = JsonSchema::object();
166-
$properties->definitions->additionalProperties = JsonSchema::schema();
167-
$properties->properties = JsonSchema::object();
168-
$properties->properties->additionalProperties = JsonSchema::schema();
169-
$properties->patternProperties = JsonSchema::object();
170-
$properties->patternProperties->additionalProperties = JsonSchema::schema();
171-
$properties->dependencies = JsonSchema::object();
172-
//$properties->dependencies->additionalProperties = JsonSchema::schema();
163+
$properties->additionalProperties->anyOf[0] = Schema::boolean();
164+
$properties->additionalProperties->anyOf[1] = Schema::schema();
165+
$properties->definitions = Schema::object();
166+
$properties->definitions->additionalProperties = Schema::schema();
167+
$properties->properties = Schema::object();
168+
$properties->properties->additionalProperties = Schema::schema();
169+
$properties->patternProperties = Schema::object();
170+
$properties->patternProperties->additionalProperties = Schema::schema();
171+
$properties->dependencies = Schema::object();
172+
//$properties->dependencies->additionalProperties = Schema::schema();
173173
$properties->dependencies->additionalProperties = new Schema();
174-
$properties->dependencies->additionalProperties->anyOf[0] = JsonSchema::schema();
175-
$properties->dependencies->additionalProperties->anyOf[1] = JsonSchema::arr();
176-
$properties->dependencies->additionalProperties->anyOf[1]->items = JsonSchema::string();
174+
$properties->dependencies->additionalProperties->anyOf[0] = Schema::schema();
175+
$properties->dependencies->additionalProperties->anyOf[1] = Schema::arr();
176+
$properties->dependencies->additionalProperties->anyOf[1]->items = Schema::string();
177177
$properties->dependencies->additionalProperties->anyOf[1]->uniqueItems = true;
178178
$properties->dependencies->additionalProperties->anyOf[1]->minItems = 1;
179-
$properties->enum = JsonSchema::arr();
179+
$properties->enum = Schema::arr();
180180
$properties->enum->uniqueItems = true;
181181
$properties->enum->minItems = 1;
182182
$properties->type = new Schema();
@@ -190,7 +190,7 @@ public static function setUpProperties($properties, Schema $ownerSchema)
190190
5 => 'object',
191191
6 => 'string',
192192
);
193-
$properties->type->anyOf[1] = JsonSchema::arr();
193+
$properties->type->anyOf[1] = Schema::arr();
194194
$properties->type->anyOf[1]->items = new Schema();
195195
$properties->type->anyOf[1]->items->enum = array (
196196
0 => 'array',
@@ -203,19 +203,19 @@ public static function setUpProperties($properties, Schema $ownerSchema)
203203
);
204204
$properties->type->anyOf[1]->uniqueItems = true;
205205
$properties->type->anyOf[1]->minItems = 1;
206-
$properties->format = JsonSchema::string();
207-
$properties->ref = JsonSchema::string();
206+
$properties->format = Schema::string();
207+
$properties->ref = Schema::string();
208208
$ownerSchema->addPropertyMapping('$ref', self::names()->ref);
209-
$properties->allOf = JsonSchema::arr();
210-
$properties->allOf->items = JsonSchema::schema();
209+
$properties->allOf = Schema::arr();
210+
$properties->allOf->items = Schema::schema();
211211
$properties->allOf->minItems = 1;
212-
$properties->anyOf = JsonSchema::arr();
213-
$properties->anyOf->items = JsonSchema::schema();
212+
$properties->anyOf = Schema::arr();
213+
$properties->anyOf->items = Schema::schema();
214214
$properties->anyOf->minItems = 1;
215-
$properties->oneOf = JsonSchema::arr();
216-
$properties->oneOf->items = JsonSchema::schema();
215+
$properties->oneOf = Schema::arr();
216+
$properties->oneOf->items = Schema::schema();
217217
$properties->oneOf->minItems = 1;
218-
$properties->not = JsonSchema::schema();
218+
$properties->not = Schema::schema();
219219
$ownerSchema->type = 'object';
220220
$ownerSchema->dependencies = array (
221221
'exclusiveMaximum' =>

src/Schema.php

Lines changed: 22 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,13 @@
2222
* Class Schema
2323
* @package Swaggest\JsonSchema
2424
*/
25-
class Schema extends ObjectItem
25+
class Schema extends JsonSchema
2626
{
2727
const SCHEMA_DRAFT_04_URL = 'http://json-schema.org/draft-04/schema';
2828

29+
const REF = '$ref';
30+
31+
2932
/*
3033
public $__seqId;
3134
public static $seq = 0;
@@ -37,67 +40,21 @@ public function __construct()
3740
}
3841
//*/
3942

40-
/** @var Type */
41-
public $type;
42-
4343
// Object
4444
/** @var Properties|Schema[] */
4545
public $properties;
4646
/** @var Schema|bool */
4747
public $additionalProperties;
4848
/** @var Schema[] */
4949
public $patternProperties;
50-
/** @var string[] */
51-
public $required;
5250
/** @var string[][]|Schema[] */
5351
public $dependencies;
54-
/** @var int */
55-
public $minProperties;
56-
/** @var int */
57-
public $maxProperties;
5852

5953
// Array
6054
/** @var Schema|Schema[] */
6155
public $items;
6256
/** @var Schema|bool */
6357
public $additionalItems;
64-
/** @var bool */
65-
public $uniqueItems;
66-
/** @var int */
67-
public $minItems;
68-
/** @var int */
69-
public $maxItems;
70-
71-
// Reference
72-
/** @var string */
73-
public $ref;
74-
75-
// Enum
76-
/** @var array */
77-
public $enum;
78-
79-
// Number
80-
/** @var int */
81-
public $maximum;
82-
/** @var bool */
83-
public $exclusiveMaximum;
84-
/** @var int */
85-
public $minimum;
86-
/** @var bool */
87-
public $exclusiveMinimum;
88-
/** @var float|int */
89-
public $multipleOf;
90-
91-
92-
// String
93-
/** @var string */
94-
public $pattern;
95-
/** @var int */
96-
public $minLength;
97-
/** @var int */
98-
public $maxLength;
99-
/** @var string */
100-
public $format;
10158

10259
const FORMAT_DATE_TIME = 'date-time'; // todo implement
10360

@@ -125,7 +82,7 @@ public function addPropertyMapping($dataName, $propertyName)
12582
return $this;
12683
}
12784

128-
private function preProcessReferences($data, ProcessingOptions $options = null)
85+
private function preProcessReferences($data, Context $options = null)
12986
{
13087
if (is_array($data)) {
13188
foreach ($data as $key => $item) {
@@ -147,10 +104,10 @@ private function preProcessReferences($data, ProcessingOptions $options = null)
147104
}
148105
}
149106

150-
public function import($data, ProcessingOptions $options = null)
107+
public function in($data, Context $options = null)
151108
{
152109
if ($options === null) {
153-
$options = new ProcessingOptions();
110+
$options = new Context();
154111
}
155112

156113
$options->import = true;
@@ -167,23 +124,35 @@ public function import($data, ProcessingOptions $options = null)
167124
return $this->process($data, $options, '#');
168125
}
169126

170-
public function export($data, ProcessingOptions $options = null)
127+
128+
public function out($data, Context $options = null)
171129
{
172130
if ($options === null) {
173-
$options = new ProcessingOptions();
131+
$options = new Context();
174132
}
175133

134+
$options->circularReferences = new \SplObjectStorage();
176135
$options->import = false;
177136
return $this->process($data, $options);
178137
}
179138

180-
public function process($data, ProcessingOptions $options, $path = '#', $result = null)
139+
public function process($data, Context $options, $path = '#', $result = null)
181140
{
182141

183142
$import = $options->import;
184143
//$pathTrace = explode('->', $path);
185144

186145
if (!$import && $data instanceof ObjectItem) {
146+
$result = new \stdClass();
147+
if ($options->circularReferences->contains($data)) {
148+
/** @noinspection PhpIllegalArrayKeyTypeInspection */
149+
$path = $options->circularReferences[$data];
150+
$result->{self::REF} = $path;
151+
return $result;
152+
}
153+
$options->circularReferences->attach($data, $path);
154+
155+
187156
$data = $data->jsonSerialize();
188157
}
189158
if (!$import && is_array($data) && $this->useObjectAsArray) {

0 commit comments

Comments
 (0)