Skip to content

Commit 34a6568

Browse files
committed
fix generated openStore() for apps that don't enable null-safety yet
1 parent 084bca5 commit 34a6568

File tree

8 files changed

+228
-20
lines changed

8 files changed

+228
-20
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# start with an empty project, without a objectbox-model.json
2+
objectbox-model.json
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: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import 'dart:io';
2+
import 'lib/lib.dart';
3+
import 'lib/objectbox.g.dart';
4+
import 'package:test/test.dart';
5+
import '../test_env.dart';
6+
import '../common.dart';
7+
8+
void main() {
9+
TestEnv<A> env;
10+
final jsonModel = readModelJson('lib');
11+
final defs = getObjectBoxModel();
12+
final model = defs.model;
13+
14+
setUp(() {
15+
env = TestEnv<A>(defs);
16+
});
17+
18+
tearDown(() {
19+
env.close();
20+
});
21+
22+
commonModelTests(defs, jsonModel);
23+
24+
test('project must be generated properly', () {
25+
expect(TestEnv.dir.existsSync(), true);
26+
expect(File('lib/objectbox.g.dart').existsSync(), true);
27+
expect(File('lib/objectbox-model.json').existsSync(), true);
28+
});
29+
30+
test('sync annotation', () {
31+
expect(entity(model, 'A').flags, equals(0));
32+
expect(entity(jsonModel, 'A').flags, equals(0));
33+
34+
expect(entity(model, 'D').flags, equals(OBXEntityFlags.SYNC_ENABLED));
35+
expect(entity(jsonModel, 'D').flags, equals(OBXEntityFlags.SYNC_ENABLED));
36+
});
37+
38+
test('types', () {
39+
expect(property(model, 'T.tBool').type, OBXPropertyType.Bool);
40+
expect(property(model, 'T.tByte').type, OBXPropertyType.Byte);
41+
expect(property(model, 'T.tShort').type, OBXPropertyType.Short);
42+
expect(property(model, 'T.tChar').type, OBXPropertyType.Char);
43+
expect(property(model, 'T.tInt').type, OBXPropertyType.Int);
44+
expect(property(model, 'T.tLong').type, OBXPropertyType.Long);
45+
expect(property(model, 'T.tFloat').type, OBXPropertyType.Float);
46+
expect(property(model, 'T.tDouble').type, OBXPropertyType.Double);
47+
expect(property(model, 'T.tString').type, OBXPropertyType.String);
48+
expect(property(model, 'T.tDate').type, OBXPropertyType.Date);
49+
expect(property(model, 'T.tDateNano').type, OBXPropertyType.DateNano);
50+
expect(property(model, 'T.tListInt').type, OBXPropertyType.ByteVector);
51+
expect(property(model, 'T.tInt8List').type, OBXPropertyType.ByteVector);
52+
expect(property(model, 'T.tUint8List').type, OBXPropertyType.ByteVector);
53+
expect(property(model, 'T.tListString').type, OBXPropertyType.StringVector);
54+
55+
expect(property(model, 'T.id').isSigned, isTrue);
56+
expect(property(model, 'T.tByte').isSigned, isTrue);
57+
expect(property(model, 'T.tShort').isSigned, isTrue);
58+
expect(property(model, 'T.tChar').isSigned, isTrue);
59+
expect(property(model, 'T.tInt').isSigned, isTrue);
60+
expect(property(model, 'T.tLong').isSigned, isTrue);
61+
62+
expect(property(model, 'Unsigned.id').isSigned, isTrue);
63+
expect(property(model, 'Unsigned.tByte').isSigned, isFalse);
64+
expect(property(model, 'Unsigned.tShort').isSigned, isFalse);
65+
expect(property(model, 'Unsigned.tChar').isSigned, isFalse);
66+
expect(property(model, 'Unsigned.tInt').isSigned, isFalse);
67+
expect(property(model, 'Unsigned.tLong').isSigned, isFalse);
68+
});
69+
}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
import 'dart:typed_data';
2+
3+
import 'package:objectbox/objectbox.dart';
4+
import 'objectbox.g.dart';
5+
6+
@Entity()
7+
class A {
8+
int id;
9+
String text;
10+
11+
A();
12+
}
13+
14+
@Entity()
15+
class B {
16+
@Id()
17+
int identifier;
18+
19+
B();
20+
}
21+
22+
@Entity()
23+
@Sync()
24+
class D {
25+
int id;
26+
27+
D();
28+
}
29+
30+
@Entity()
31+
class T {
32+
int id;
33+
34+
// implicit PropertyType.bool
35+
bool tBool;
36+
37+
@Property(type: PropertyType.byte)
38+
int tByte;
39+
40+
@Property(type: PropertyType.short)
41+
int tShort;
42+
43+
@Property(type: PropertyType.char)
44+
int tChar;
45+
46+
@Property(type: PropertyType.int)
47+
int tInt;
48+
49+
// implicit PropertyType.long
50+
int tLong;
51+
52+
@Property(type: PropertyType.float)
53+
double tFloat;
54+
55+
// implicit PropertyType.double
56+
double tDouble;
57+
58+
// implicitly determined types
59+
String tString;
60+
61+
@Property(type: PropertyType.date)
62+
int tDate;
63+
64+
@Property(type: PropertyType.dateNano)
65+
int tDateNano;
66+
67+
@Property(type: PropertyType.byteVector)
68+
List<int> tListInt; // truncates int to 8-bits
69+
70+
Int8List tInt8List;
71+
72+
Uint8List tUint8List;
73+
74+
List<String> tListString;
75+
}
76+
77+
@Entity()
78+
class Unsigned {
79+
int id;
80+
81+
@Property(type: PropertyType.byte, signed: false)
82+
int tByte;
83+
84+
@Property(type: PropertyType.short, signed: false)
85+
int tShort;
86+
87+
@Property(type: PropertyType.char, signed: false)
88+
int tChar;
89+
90+
@Property(type: PropertyType.int, signed: false)
91+
int tInt;
92+
93+
@Property(signed: false)
94+
int tLong;
95+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: objectbox_generator_test
2+
3+
environment:
4+
sdk: ">=2.7.0 <3.0.0"
5+
6+
dependencies:
7+
objectbox: any
8+
9+
dev_dependencies:
10+
objectbox_generator: any
11+
test: any
12+
build_runner: any
13+
build_test: any
14+
io: any
15+
path: any
16+
17+
dependency_overrides:
18+
objectbox:
19+
path: ../../../objectbox
20+
objectbox_generator:
21+
path: ../../

generator/lib/src/code_chunks.dart

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ import 'package:source_gen/source_gen.dart' show InvalidGenerationSourceError;
77

88
class CodeChunks {
99
static String objectboxDart(
10-
ModelInfo model, List<String> imports, Pubspec? pubspec) {
11-
final obxFlutter = pubspec?.hasObxFlutterDependency ?? false;
12-
return """
10+
ModelInfo model, List<String> imports, Pubspec? pubspec) =>
11+
"""
1312
// GENERATED CODE - DO NOT MODIFY BY HAND
1413
1514
// ignore_for_file: camel_case_types
@@ -29,35 +28,40 @@ class CodeChunks {
2928
];
3029
3130
/// Open an ObjectBox store with the model declared in this file.
32-
${obxFlutter ? 'Future<Store>' : 'Store'} openStore(
33-
{String? directory,
34-
int? maxDBSizeInKB,
35-
int? fileMode,
36-
int? maxReaders,
37-
bool queriesCaseSensitiveDefault = true,
38-
String? macosApplicationGroup})${obxFlutter ? ' async' : ''} =>
39-
Store(getObjectBoxModel(),
40-
directory: directory${obxFlutter ? ' ?? (await defaultStoreDirectory()).path' : ''},
41-
maxDBSizeInKB: maxDBSizeInKB,
42-
fileMode: fileMode,
43-
maxReaders: maxReaders,
44-
queriesCaseSensitiveDefault: queriesCaseSensitiveDefault,
45-
macosApplicationGroup: macosApplicationGroup);
31+
${openStore(model, pubspec)}
4632
4733
/// ObjectBox model definition, pass it to [Store] - Store(getObjectBoxModel())
4834
ModelDefinition getObjectBoxModel() {
4935
${defineModel(model)}
5036
5137
final bindings = <Type, EntityDefinition>{
52-
${model.entities.mapIndexed((i, entity) => "${entity
53-
.name}: ${entityBinding(i, entity)}").join(",\n")}
38+
${model.entities.mapIndexed((i, entity) => "${entity.name}: ${entityBinding(i, entity)}").join(",\n")}
5439
};
5540
5641
return ModelDefinition(model, bindings);
5742
}
5843
5944
${model.entities.mapIndexed(_metaClass).join("\n")}
6045
""";
46+
47+
static String openStore(ModelInfo model, Pubspec? pubspec) {
48+
final obxFlutter = pubspec?.hasObxFlutterDependency ?? false;
49+
final nullableOperator = model.entities.first.nullSafetyEnabled ? '?' : '';
50+
return '''${obxFlutter ? 'Future<Store>' : 'Store'} openStore(
51+
{String$nullableOperator directory,
52+
int$nullableOperator maxDBSizeInKB,
53+
int$nullableOperator fileMode,
54+
int$nullableOperator maxReaders,
55+
bool queriesCaseSensitiveDefault = true,
56+
String$nullableOperator macosApplicationGroup})${obxFlutter ? ' async' : ''} =>
57+
Store(getObjectBoxModel(),
58+
directory: directory${obxFlutter ? ' ?? (await defaultStoreDirectory()).path' : ''},
59+
maxDBSizeInKB: maxDBSizeInKB,
60+
fileMode: fileMode,
61+
maxReaders: maxReaders,
62+
queriesCaseSensitiveDefault: queriesCaseSensitiveDefault,
63+
macosApplicationGroup: macosApplicationGroup);
64+
''';
6165
}
6266

6367
static List<T> sorted<T>(List<T> list) {

generator/lib/src/entity_resolver.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ class EntityResolver extends Builder {
200200
} else if (isToManyRel) {
201201
// create relation
202202
final rel = ModelRelation.create(IdUid(0, propUid ?? 0), f.name,
203-
targetName: relTargetName, uidRequest: propUid != null && propUid == 0);
203+
targetName: relTargetName,
204+
uidRequest: propUid != null && propUid == 0);
204205
entity.relations.add(rel);
205206

206207
log.info(' $rel');

objectbox/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## latest
2+
3+
* Fix generated `openStore()` for apps that don't enable null-safety yet.
4+
15
## 1.1.0 (2021-07-06)
26

37
* New `openStore()` in the generated code to simplify creating a store instance, especially on Flutter (uses application

0 commit comments

Comments
 (0)