ormbridge 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,48 @@
1
+ import type { IrField, IrSchema } from '../ir.js';
2
+ import type { GraphProperty } from './neo4jGraph.js';
3
+ /** Turns one graph property into a neomodel property class call such as `StringProperty(required=True)`. */
4
+ /** The imports the generated module needs, collected while the classes are planned. */
5
+ export declare class ModuleImports {
6
+ /** Names imported from `neomodel`. */
7
+ readonly neomodel: Set<string>;
8
+ /** `from datetime import date` (the default of a date column). */
9
+ usesDate: boolean;
10
+ /** Names imported from `datetime` for the default of a date and time column. */
11
+ readonly datetime: Set<string>;
12
+ /** `from uuid import uuid4` (the default of a UUID column). */
13
+ usesUuid: boolean;
14
+ /** Records a name of `neomodel` and returns it. */
15
+ use(name: string): string;
16
+ }
17
+ /** Which indexes and constraints a property takes part in. */
18
+ export interface PropertyRole {
19
+ unique: boolean;
20
+ index: boolean;
21
+ fulltext: boolean;
22
+ }
23
+ /** A property class and its arguments, ready to be laid out. */
24
+ export interface PropertyCall {
25
+ className: string;
26
+ args: string[];
27
+ }
28
+ export interface PropertyContext {
29
+ schema: IrSchema;
30
+ imports: ModuleImports;
31
+ warnings: string[];
32
+ }
33
+ export interface PropertyInput {
34
+ /** `Model.field`, for warnings. */
35
+ label: string;
36
+ property: GraphProperty;
37
+ /** The IR field behind the property; undefined for a foreign key column. */
38
+ field: IrField | undefined;
39
+ role: PropertyRole;
40
+ /** The attribute name in the class; `db_property` is written when it differs from the key. */
41
+ attribute: string;
42
+ /** True for the single UUID key of a node, which `UniqueIdProperty` can generate. */
43
+ uniqueId: boolean;
44
+ }
45
+ /** The text of a call, `Name(arg, arg)`. */
46
+ export declare function callText(call: PropertyCall): string;
47
+ /** Plans the property class and arguments of one graph property. */
48
+ export declare function planProperty(context: PropertyContext, input: PropertyInput): PropertyCall;
@@ -0,0 +1,220 @@
1
+ import { oneLine } from './neo4jNames.js';
2
+ import { mapFieldType } from './neo4jTypes.js';
3
+ import { pyString } from './neomodelNames.js';
4
+ /** Turns one graph property into a neomodel property class call such as `StringProperty(required=True)`. */
5
+ /** The imports the generated module needs, collected while the classes are planned. */
6
+ export class ModuleImports {
7
+ /** Names imported from `neomodel`. */
8
+ neomodel = new Set();
9
+ /** `from datetime import date` (the default of a date column). */
10
+ usesDate = false;
11
+ /** Names imported from `datetime` for the default of a date and time column. */
12
+ datetime = new Set();
13
+ /** `from uuid import uuid4` (the default of a UUID column). */
14
+ usesUuid = false;
15
+ /** Records a name of `neomodel` and returns it. */
16
+ use(name) {
17
+ this.neomodel.add(name);
18
+ return name;
19
+ }
20
+ }
21
+ /** The property class for a Neo4j type, plus the note about what neomodel stores instead. */
22
+ function classFor(type, context, label) {
23
+ const { imports } = context;
24
+ switch (type.name) {
25
+ case 'INTEGER':
26
+ return imports.use('IntegerProperty');
27
+ case 'FLOAT':
28
+ return imports.use('FloatProperty');
29
+ case 'BOOLEAN':
30
+ return imports.use('BooleanProperty');
31
+ case 'DATE':
32
+ return imports.use('DateProperty');
33
+ case 'ZONED DATETIME':
34
+ case 'LOCAL DATETIME':
35
+ return imports.use('DateTimeNeo4jFormatProperty');
36
+ case 'LOCAL TIME':
37
+ case 'ZONED TIME':
38
+ context.warnings.push(`${label}: neomodel has no time property; the value is stored as an ISO 8601 text in a StringProperty.`);
39
+ return imports.use('StringProperty');
40
+ case 'DURATION':
41
+ context.warnings.push(`${label}: neomodel has no duration property; the value is stored as an ISO 8601 text in a StringProperty.`);
42
+ return imports.use('StringProperty');
43
+ case 'BYTE ARRAY':
44
+ context.warnings.push(`${label}: neomodel has no binary property; the value is stored as base64 text in a StringProperty.`);
45
+ return imports.use('StringProperty');
46
+ default:
47
+ return imports.use('StringProperty');
48
+ }
49
+ }
50
+ function enumOf(field, schema) {
51
+ return field.enumName === undefined
52
+ ? undefined
53
+ : schema.enums.find((candidate) => candidate.name === field.enumName);
54
+ }
55
+ /** `{"draft": "DRAFT", ...}`: the stored value and the name of the member. */
56
+ function choices(definition) {
57
+ const items = definition.values.map((value) => `${pyString(value.dbValue)}: ${pyString(value.name)}`);
58
+ return `{${items.join(', ')}}`;
59
+ }
60
+ /** The text of a call, `Name(arg, arg)`. */
61
+ export function callText(call) {
62
+ return `${call.className}(${call.args.join(', ')})`;
63
+ }
64
+ /** The base property of a field (the element property for an array). */
65
+ function baseCall(context, label, field, type) {
66
+ if (field !== undefined && field.type === 'json') {
67
+ return { className: context.imports.use('JSONProperty'), args: [] };
68
+ }
69
+ const className = classFor(type, context, label);
70
+ const args = [];
71
+ if (className === 'StringProperty' && field !== undefined) {
72
+ const definition = enumOf(field, context.schema);
73
+ if (definition !== undefined && type.name === 'STRING') {
74
+ args.push(`choices=${choices(definition)}`);
75
+ }
76
+ else if (field.maxLength !== undefined && field.type === 'string') {
77
+ args.push(`max_length=${field.maxLength}`);
78
+ }
79
+ }
80
+ if (field !== undefined &&
81
+ enumOf(field, context.schema) !== undefined &&
82
+ type.name !== 'STRING') {
83
+ context.warnings.push(`${label}: neomodel cannot restrict ${className} to the values of enum ${field.enumName ?? ''}; the values are not checked.`);
84
+ }
85
+ return { className, args };
86
+ }
87
+ /** The Python text of a default, or undefined (with a warning) when neomodel cannot hold it. */
88
+ function defaultArgs(context, label, field, base, isArray) {
89
+ const value = field.default ??
90
+ // A timestamp refreshed on every save starts as the time of the first save.
91
+ (field.isAutoUpdated &&
92
+ (base.className === 'DateTimeNeo4jFormatProperty' ||
93
+ base.className === 'DateProperty')
94
+ ? { kind: 'now' }
95
+ : undefined);
96
+ if (value === undefined || value.kind === 'autoIncrement') {
97
+ if (value !== undefined) {
98
+ context.warnings.push(`${label}: auto-increment has no neomodel equivalent; supply the value yourself (a UUID key with UniqueIdProperty needs none).`);
99
+ }
100
+ return undefined;
101
+ }
102
+ const drop = (what) => {
103
+ context.warnings.push(`${label}: ${what} has no neomodel equivalent and was dropped; set the value when you create the node.`);
104
+ return undefined;
105
+ };
106
+ if (isArray) {
107
+ return drop('the default of an array');
108
+ }
109
+ switch (value.kind) {
110
+ case 'literal':
111
+ return literalArgs(value.value, base.className, drop);
112
+ case 'now':
113
+ if (base.className === 'DateTimeNeo4jFormatProperty') {
114
+ // DateTimeNeo4jFormatProperty(default_now=True) would fix the time when the module is imported.
115
+ if (mapFieldType(field).type.name === 'LOCAL DATETIME') {
116
+ context.imports.datetime.add('datetime');
117
+ return ['default=datetime.now'];
118
+ }
119
+ context.imports.datetime.add('datetime').add('timezone');
120
+ return ['default=lambda: datetime.now(timezone.utc)'];
121
+ }
122
+ if (base.className === 'DateProperty') {
123
+ context.imports.usesDate = true;
124
+ return ['default=date.today'];
125
+ }
126
+ return drop('the default of the current time');
127
+ case 'uuid':
128
+ if (base.className === 'StringProperty') {
129
+ context.imports.usesUuid = true;
130
+ return ['default=lambda: str(uuid4())'];
131
+ }
132
+ return drop('the default of a generated UUID');
133
+ case 'enumValue': {
134
+ const definition = enumOf(field, context.schema);
135
+ const member = definition?.values.find((candidate) => candidate.name === value.value);
136
+ return base.className === 'StringProperty'
137
+ ? [`default=${pyString(member?.dbValue ?? value.value)}`]
138
+ : drop(`the default "${value.value}"`);
139
+ }
140
+ case 'clientGenerated':
141
+ return drop(`the ${value.generator}() default`);
142
+ case 'dbExpression':
143
+ return drop(`the database default ${oneLine(value.expression)}`);
144
+ }
145
+ }
146
+ function literalArgs(value, className, drop) {
147
+ const fits = (className === 'StringProperty' && typeof value !== 'boolean') ||
148
+ (className === 'IntegerProperty' &&
149
+ typeof value === 'number' &&
150
+ Number.isInteger(value)) ||
151
+ (className === 'FloatProperty' &&
152
+ typeof value === 'number' &&
153
+ Number.isFinite(value)) ||
154
+ (className === 'BooleanProperty' && typeof value === 'boolean');
155
+ if (!fits) {
156
+ return drop(`the default ${JSON.stringify(value)}`);
157
+ }
158
+ if (typeof value === 'boolean') {
159
+ return [`default=${value ? 'True' : 'False'}`];
160
+ }
161
+ if (className === 'StringProperty') {
162
+ return [`default=${pyString(String(value))}`];
163
+ }
164
+ const text = String(value);
165
+ return [
166
+ `default=${className === 'FloatProperty' && /^-?\d+$/.test(text) ? `${text}.0` : text}`,
167
+ ];
168
+ }
169
+ /** Plans the property class and arguments of one graph property. */
170
+ export function planProperty(context, input) {
171
+ const { label, property, field, role, attribute } = input;
172
+ const dbProperty = attribute === property.key ? [] : [`db_property=${pyString(property.key)}`];
173
+ if (input.uniqueId) {
174
+ return {
175
+ className: context.imports.use('UniqueIdProperty'),
176
+ args: dbProperty,
177
+ };
178
+ }
179
+ const isArray = property.type.name.startsWith('LIST<');
180
+ let call;
181
+ if (isArray && field !== undefined) {
182
+ const element = mapFieldType({
183
+ ...field,
184
+ arrayDepth: undefined,
185
+ }).type;
186
+ const base = baseCall(context, label, field, element);
187
+ call = {
188
+ className: context.imports.use('ArrayProperty'),
189
+ args: [callText(base)],
190
+ };
191
+ }
192
+ else {
193
+ call = baseCall(context, label, field, property.type);
194
+ }
195
+ const flags = [];
196
+ if (role.unique) {
197
+ flags.push('unique_index=True');
198
+ }
199
+ else if (role.index) {
200
+ flags.push('index=True');
201
+ }
202
+ if (role.fulltext) {
203
+ if (call.className === 'StringProperty') {
204
+ flags.push(`fulltext_index=${context.imports.use('FulltextIndex')}()`);
205
+ }
206
+ else {
207
+ context.warnings.push(`${label}: a full-text index needs a string property, so it was dropped.`);
208
+ }
209
+ }
210
+ const defaults = field === undefined
211
+ ? []
212
+ : (defaultArgs(context, label, field, call, isArray) ?? []);
213
+ const hasDefault = defaults.length > 0;
214
+ const required = property.required && !hasDefault ? ['required=True'] : [];
215
+ return {
216
+ className: call.className,
217
+ args: [...call.args, ...flags, ...required, ...defaults, ...dbProperty],
218
+ };
219
+ }
220
+ //# sourceMappingURL=neomodelProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"neomodelProperties.js","sourceRoot":"","sources":["../../src/emitters/neomodelProperties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { MultiFileEmitOutput } from '../formats.js';
2
+ import type { IrSchema } from '../ir.js';
3
+ /**
4
+ * Spring Data Neo4j writer (Java, SDN 7 with Spring Boot 3).
5
+ *
6
+ * Writes one `@Node("Label")` class per node label, a Java `enum` per enum (with a
7
+ * `Neo4jPersistentPropertyConverter` when the stored values differ from the constant names), and a
8
+ * `@RelationshipProperties` class for every direction of a join table that has extra columns. Properties
9
+ * whose graph key differs from the Java name carry `@Property`. Relationships are `@Relationship` fields with
10
+ * the type and the direction, a single value or a `List`. Labels and relationship types are the ones of the
11
+ * Cypher writer, so the three Neo4j outputs agree. Foreign key columns stay as plain properties.
12
+ *
13
+ * The identifier follows the source key: a generated integer is Neo4j's internal id (`@GeneratedValue`), a
14
+ * generated UUID a `UUIDStringGenerator` string, any other single column an assigned `@Id`; a composite or
15
+ * missing key becomes a generated internal id `graphId` and the key columns are plain properties.
16
+ */
17
+ export { isValidJavaPackage } from './jpaNames.js';
18
+ export declare const DEFAULT_SDN_PACKAGE: string;
19
+ export interface SdnEmitOptions {
20
+ /** Use camelCase graph property keys (the `normalize` naming mode); otherwise the column names are kept. */
21
+ camelFields: boolean;
22
+ /** Java package of the generated classes; defaults to `app.models`. */
23
+ packageName?: string;
24
+ /** Write the `// <auto-generated>` comment at the top of every file (default true). */
25
+ header?: boolean;
26
+ }
27
+ export declare function emitSdn(schema: IrSchema, options: SdnEmitOptions): MultiFileEmitOutput;