Skip to content

Commit cbd9009

Browse files
committed
add realClass field to the @entity() annotation to support some custom code generators
1 parent c58e729 commit cbd9009

File tree

8 files changed

+123
-2
lines changed

8 files changed

+123
-2
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# start with an empty project, without a objectbox-model.json
2+
objectbox-model.json
3+
*.freezed.dart
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import 'dart:io';
2+
import 'package:test/test.dart';
3+
import '../test_env.dart';
4+
5+
void main() {
6+
// this is actually a meta test - that `git clean -fX` is run
7+
test('project must be clean before generating the code', () {
8+
expect(TestEnv.dir.existsSync(), false);
9+
expect(File('lib/objectbox.g.dart').existsSync(), false);
10+
expect(File('lib/objectbox-model.json').existsSync(), false);
11+
});
12+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import 'dart:io';
2+
3+
import 'package:test/test.dart';
4+
5+
import '../test_env.dart';
6+
import '../common.dart';
7+
import 'lib/json.dart';
8+
import 'lib/frozen.dart';
9+
import 'lib/objectbox.g.dart';
10+
11+
void main() {
12+
commonModelTests(getObjectBoxModel(), readModelJson('lib'));
13+
14+
test('project must be generated properly', () {
15+
expect(File('lib/objectbox.g.dart').existsSync(), true);
16+
expect(File('lib/objectbox-model.json').existsSync(), true);
17+
});
18+
19+
setupTestsFor(JsonEntity(id: 0, str: 'foo', date: DateTime.now()));
20+
setupTestsFor(FrozenEntity(id: 1, str: 'foo', date: DateTime.now()));
21+
}
22+
23+
void setupTestsFor<EntityT>(EntityT newObject) {
24+
group('${EntityT}', () {
25+
late TestEnv<EntityT> env;
26+
setUp(() => env = TestEnv(getObjectBoxModel()));
27+
tearDown(() => env.close());
28+
29+
test('read/write', () {
30+
env.box.put(newObject);
31+
env.box.get(1);
32+
});
33+
});
34+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import 'package:objectbox/objectbox.dart';
2+
import 'package:freezed_annotation/freezed_annotation.dart';
3+
4+
part 'frozen.freezed.dart';
5+
6+
@freezed
7+
class FrozenEntity with _$FrozenEntity {
8+
@Entity(realClass: FrozenEntity)
9+
factory FrozenEntity(
10+
{@Id(assignable: true) required int id,
11+
required String str,
12+
required DateTime date}) = _FrozenEntity;
13+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import 'package:objectbox/objectbox.dart';
2+
import 'package:json_annotation/json_annotation.dart';
3+
4+
part 'json.g.dart';
5+
6+
@Entity()
7+
@JsonSerializable()
8+
class JsonEntity {
9+
int id;
10+
final String str;
11+
final DateTime? date;
12+
13+
JsonEntity({required this.id, required this.str, required this.date});
14+
15+
factory JsonEntity.fromJson(Map<String, dynamic> json) =>
16+
_$JsonEntityFromJson(json);
17+
18+
Map<String, dynamic> toJson() => _$JsonEntityToJson(this);
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
name: objectbox_generator_test
2+
3+
environment:
4+
sdk: ">=2.12.0 <3.0.0"
5+
6+
dependencies:
7+
objectbox:
8+
json_serializable:
9+
freezed_annotation:
10+
11+
dev_dependencies:
12+
freezed:
13+
objectbox_generator:
14+
test:
15+
build_runner:
16+
build_test:
17+
io:
18+
path:
19+
20+
dependency_overrides:
21+
objectbox:
22+
path: ../../../objectbox
23+
objectbox_generator:
24+
path: ../../

generator/lib/src/entity_resolver.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,12 @@ class EntityResolver extends Builder {
5959

6060
// process basic entity (note that allModels.createEntity is not used, as the entity will be merged)
6161
final entityUid = annotation.read('uid');
62+
final entityRealClass = annotation.read('realClass');
6263
final entity = ModelEntity.create(
6364
IdUid(0, entityUid.isNull ? 0 : entityUid.intValue),
64-
element.name,
65+
entityRealClass.isNull
66+
? element.name
67+
: entityRealClass.typeValue.element!.name!,
6568
null);
6669

6770
if (_syncChecker.hasAnnotationOfExact(element)) {

objectbox/lib/src/annotations.dart

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,21 @@ class Entity {
1717
/// Entity instead of creating a new one.
1818
final int? uid;
1919

20+
/// Actual type this entity represents. ObjectBox will use it instead of the
21+
/// `@Entity()`-annotated class's name. For example:
22+
/// ```dart
23+
/// @freezed
24+
/// class Person with _$Person {
25+
/// @Entity(realClass: Person)
26+
/// factory Person(
27+
/// {@Id(assignable: true) required int id,
28+
/// required String name}) = _Person;
29+
/// }
30+
/// ```
31+
final Type? realClass;
32+
2033
/// Create an Entity annotation.
21-
const Entity({this.uid});
34+
const Entity({this.uid, this.realClass});
2235
}
2336

2437
/// Property annotation enables you to explicitly configure some details about

0 commit comments

Comments
 (0)