Skip to content

Commit 3084b4e

Browse files
committed
wip: update to dynamic prepoerties
1 parent 4803ed8 commit 3084b4e

22 files changed

+346
-296
lines changed

.vscode/settings.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"kiroAgent.trustedCommands": [
3+
"*",
4+
"./vendor/bin/pest --no-coverage --exclude-group=performance 2>&1 | grep -E \"(FAILED|Tests:)\" | tail -5"
5+
]
6+
}

CHANGELOG.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,8 +375,8 @@ Property::create([
375375

376376
// Use properties
377377
$user = User::find(1);
378-
$user->setProperty('phone', '+1234567890');
379-
$phone = $user->getProperty('phone');
378+
$user->setDynamicProperty('phone', '+1234567890');
379+
$phone = $user->getDynamicProperty('phone');
380380

381381
// Search by properties
382382
$users = User::whereProperty('phone', 'LIKE', '+1%')->get();

CONTRIBUTING.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class PropertyService
165165
* @throws PropertyNotFoundException
166166
* @throws PropertyValidationException
167167
*/
168-
public function setProperty(Model $entity, string $name, mixed $value): void
168+
public function setDynamicProperty(Model $entity, string $name, mixed $value): void
169169
{
170170
// Implementation...
171171
}
@@ -175,7 +175,7 @@ class PropertyService
175175
#### Naming Conventions
176176

177177
- **Classes**: PascalCase (`PropertyService`)
178-
- **Methods**: camelCase (`setProperty`)
178+
- **Methods**: camelCase (`setDynamicProperty`)
179179
- **Variables**: camelCase (`$propertyName`)
180180
- **Constants**: SCREAMING_SNAKE_CASE (`MAX_PROPERTY_LENGTH`)
181181
- **Database tables**: snake_case (`entity_properties`)
@@ -310,15 +310,15 @@ describe('PropertyService', function () {
310310
it('can set a property value', function () {
311311
$user = User::factory()->create();
312312

313-
$this->service->setProperty($user, 'test_property', 'test value');
313+
$this->service->setDynamicProperty($user, 'test_property', 'test value');
314314

315-
expect($user->getProperty('test_property'))->toBe('test value');
315+
expect($user->getDynamicProperty('test_property'))->toBe('test value');
316316
});
317317

318318
it('throws exception for invalid property', function () {
319319
$user = User::factory()->create();
320320

321-
expect(fn() => $this->service->setProperty($user, 'invalid', 'value'))
321+
expect(fn() => $this->service->setDynamicProperty($user, 'invalid', 'value'))
322322
->toThrow(PropertyNotFoundException::class);
323323
});
324324
});
@@ -344,8 +344,8 @@ describe('Property Search', function () {
344344
$engineeringUser = User::factory()->create();
345345
$marketingUser = User::factory()->create();
346346

347-
$engineeringUser->setProperty('department', 'engineering');
348-
$marketingUser->setProperty('department', 'marketing');
347+
$engineeringUser->setDynamicProperty('department', 'engineering');
348+
$marketingUser->setDynamicProperty('department', 'marketing');
349349

350350
$results = User::whereProperty('department', 'engineering')->get();
351351

INSTALLATION.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,8 @@ $property = Property::create([
406406
// Add trait to User model (if not already added)
407407
// Then test property operations
408408
$user = User::first();
409-
$user->setProperty('test_property', 'Hello World');
410-
echo $user->getProperty('test_property'); // Should output: Hello World
409+
$user->setDynamicProperty('test_property', 'Hello World');
410+
echo $user->getDynamicProperty('test_property'); // Should output: Hello World
411411

412412
// Clean up
413413
$user->removeProperty('test_property');

README.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -92,16 +92,16 @@ Property::create([
9292
$user = User::find(1);
9393

9494
// Set properties
95-
$user->setProperty('phone', '+1234567890');
96-
$user->setProperty('age', 25);
97-
$user->setProperty('status', 'active');
95+
$user->setDynamicProperty('phone', '+1234567890');
96+
$user->setDynamicProperty('age', 25);
97+
$user->setDynamicProperty('status', 'active');
9898

9999
// Or use magic methods
100100
$user->prop_phone = '+1234567890';
101101
$user->prop_age = 25;
102102

103103
// Get properties
104-
$phone = $user->getProperty('phone');
104+
$phone = $user->getDynamicProperty('phone');
105105
$age = $user->prop_age; // Magic method
106106
$allProperties = $user->properties; // All properties as array
107107

@@ -263,14 +263,14 @@ use YourVendor\DynamicProperties\Exceptions\PropertyNotFoundException;
263263
use YourVendor\DynamicProperties\Exceptions\PropertyValidationException;
264264

265265
try {
266-
$user->setProperty('nonexistent_property', 'value');
266+
$user->setDynamicProperty('nonexistent_property', 'value');
267267
} catch (PropertyNotFoundException $e) {
268268
// Handle property not found
269269
echo "Property not found: " . $e->getMessage();
270270
}
271271

272272
try {
273-
$user->setProperty('age', 'invalid_number');
273+
$user->setDynamicProperty('age', 'invalid_number');
274274
} catch (PropertyValidationException $e) {
275275
// Handle validation error
276276
echo "Validation failed: " . $e->getMessage();
@@ -301,18 +301,18 @@ php artisan properties:cache-sync
301301

302302
#### Methods
303303

304-
**setProperty(string $name, mixed $value): void**
304+
**setDynamicProperty(string $name, mixed $value): void**
305305
- Sets a single property value
306306
- Validates the value against property rules
307307
- Updates JSON cache if available
308308

309-
**getProperty(string $name): mixed**
309+
**getDynamicProperty(string $name): mixed**
310310
- Retrieves a single property value
311311
- Returns null if property doesn't exist
312312

313313
**setProperties(array $properties): void**
314314
- Sets multiple properties at once
315-
- More efficient than multiple setProperty calls
315+
- More efficient than multiple setDynamicProperty calls
316316

317317
**getPropertiesAttribute(): array**
318318
- Returns all properties as an associative array
@@ -340,7 +340,7 @@ php artisan properties:cache-sync
340340

341341
### PropertyService
342342

343-
**setProperty(Model $entity, string $name, mixed $value): void**
343+
**setDynamicProperty(Model $entity, string $name, mixed $value): void**
344344
- Core method for setting property values
345345
- Handles validation and storage
346346

composer.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"name": "user-property-library/dynamic-properties",
2+
"name": "solution-forest/laravel-dynamic-properties",
33
"description": "A fast, flexible dynamic property system for Laravel entities",
44
"type": "library",
55
"license": "MIT",
@@ -15,8 +15,8 @@
1515
},
1616
"require": {
1717
"php": "^8.3",
18-
"illuminate/database": "^10.0|^11.0",
19-
"illuminate/support": "^10.0|^11.0"
18+
"illuminate/database": "^10.0|^11.0|^12.0",
19+
"illuminate/support": "^10.0|^11.0|^12.0"
2020
},
2121
"require-dev": {
2222
"laravel/pint": "^1.24",
@@ -41,4 +41,4 @@
4141
},
4242
"minimum-stability": "dev",
4343
"prefer-stable": true
44-
}
44+
}

composer.json.backup

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{
2+
"name": "user-property-library/dynamic-properties",
3+
"description": "A fast, flexible dynamic property system for Laravel entities",
4+
"type": "library",
5+
"license": "MIT",
6+
"autoload": {
7+
"psr-4": {
8+
"DynamicProperties\\": "src/"
9+
}
10+
},
11+
"autoload-dev": {
12+
"psr-4": {
13+
"DynamicProperties\\Tests\\": "tests/"
14+
}
15+
},
16+
"require": {
17+
"php": "^8.3",
18+
"illuminate/database": "^10.0|^11.0",
19+
"illuminate/support": "^10.0|^11.0"
20+
},
21+
"require-dev": {
22+
"laravel/pint": "^1.24",
23+
"orchestra/testbench": "^8.0|^9.0",
24+
"pestphp/pest": "^4.0"
25+
},
26+
"extra": {
27+
"laravel": {
28+
"providers": [
29+
"DynamicProperties\\DynamicPropertyServiceProvider"
30+
],
31+
"aliases": {
32+
"DynamicProperties": "DynamicProperties\\Facades\\DynamicProperties"
33+
}
34+
}
35+
},
36+
"config": {
37+
"sort-packages": true,
38+
"allow-plugins": {
39+
"pestphp/pest-plugin": true
40+
}
41+
},
42+
"minimum-stability": "dev",
43+
"prefer-stable": true
44+
}

docs/API.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class User extends Model
160160
Sets a single property value with validation.
161161

162162
```php
163-
$user->setProperty('phone', '+1234567890');
163+
$user->setDynamicProperty('phone', '+1234567890');
164164
```
165165

166166
**Parameters:**
@@ -173,12 +173,12 @@ $user->setProperty('phone', '+1234567890');
173173

174174
---
175175

176-
**getProperty(string $name): mixed**
176+
**getDynamicProperty(string $name): mixed**
177177

178178
Retrieves a single property value.
179179

180180
```php
181-
$phone = $user->getProperty('phone');
181+
$phone = $user->getDynamicProperty('phone');
182182
```
183183

184184
**Parameters:**
@@ -250,15 +250,15 @@ $user->removeProperty('phone');
250250
Access properties using the `prop_` prefix.
251251

252252
```php
253-
$phone = $user->prop_phone; // Equivalent to $user->getProperty('phone')
253+
$phone = $user->prop_phone; // Equivalent to $user->getDynamicProperty('phone')
254254
```
255255

256256
**__set(string $key, mixed $value): void**
257257

258258
Set properties using the `prop_` prefix.
259259

260260
```php
261-
$user->prop_phone = '+1234567890'; // Equivalent to $user->setProperty('phone', '+1234567890')
261+
$user->prop_phone = '+1234567890'; // Equivalent to $user->setDynamicProperty('phone', '+1234567890')
262262
```
263263

264264
**__isset(string $key): bool**
@@ -374,7 +374,7 @@ Sets a property value for an entity.
374374

375375
```php
376376
$propertyService = app(PropertyService::class);
377-
$propertyService->setProperty($user, 'phone', '+1234567890');
377+
$propertyService->setDynamicProperty($user, 'phone', '+1234567890');
378378
```
379379

380380
**Parameters:**
@@ -388,12 +388,12 @@ $propertyService->setProperty($user, 'phone', '+1234567890');
388388

389389
---
390390

391-
**getProperty(Model $entity, string $name): mixed**
391+
**getDynamicProperty(Model $entity, string $name): mixed**
392392

393393
Gets a property value for an entity.
394394

395395
```php
396-
$phone = $propertyService->getProperty($user, 'phone');
396+
$phone = $propertyService->getDynamicProperty($user, 'phone');
397397
```
398398

399399
**Parameters:**
@@ -541,7 +541,7 @@ Thrown when trying to access a property that doesn't exist.
541541
use YourVendor\DynamicProperties\Exceptions\PropertyNotFoundException;
542542

543543
try {
544-
$user->setProperty('nonexistent', 'value');
544+
$user->setDynamicProperty('nonexistent', 'value');
545545
} catch (PropertyNotFoundException $e) {
546546
echo "Property not found: " . $e->getPropertyName();
547547
}
@@ -558,7 +558,7 @@ Thrown when a property value fails validation.
558558
use YourVendor\DynamicProperties\Exceptions\PropertyValidationException;
559559

560560
try {
561-
$user->setProperty('age', 'not_a_number');
561+
$user->setDynamicProperty('age', 'not_a_number');
562562
} catch (PropertyValidationException $e) {
563563
echo "Validation failed: " . $e->getMessage();
564564
$errors = $e->getValidationErrors(); // Array of validation messages
@@ -612,10 +612,10 @@ Provides convenient access to PropertyService methods.
612612
use YourVendor\DynamicProperties\Facades\DynamicProperties;
613613

614614
// Set property
615-
DynamicProperties::setProperty($user, 'phone', '+1234567890');
615+
DynamicProperties::setDynamicProperty($user, 'phone', '+1234567890');
616616

617617
// Get property
618-
$phone = DynamicProperties::getProperty($user, 'phone');
618+
$phone = DynamicProperties::getDynamicProperty($user, 'phone');
619619

620620
// Set multiple properties
621621
DynamicProperties::setProperties($user, [

0 commit comments

Comments
 (0)