ormbridge 0.12.0 → 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.
- package/README.md +14 -0
- package/dist/cliRunner.js +1 -1
- package/dist/cliRunner.js.map +1 -1
- package/dist/emitters/neo4jEdges.d.ts +46 -0
- package/dist/emitters/neo4jEdges.js +147 -0
- package/dist/emitters/neo4jEdges.js.map +1 -0
- package/dist/emitters/neo4jGraph.d.ts +9 -0
- package/dist/emitters/neo4jGraph.js +9 -5
- package/dist/emitters/neo4jGraph.js.map +1 -1
- package/dist/emitters/neo4jRelationships.d.ts +3 -1
- package/dist/emitters/neo4jRelationships.js +1 -1
- package/dist/emitters/neo4jRelationships.js.map +1 -1
- package/dist/emitters/neomodel.d.ts +20 -0
- package/dist/emitters/neomodel.js +415 -0
- package/dist/emitters/neomodel.js.map +1 -0
- package/dist/emitters/neomodelNames.d.ts +25 -0
- package/dist/emitters/neomodelNames.js +159 -0
- package/dist/emitters/neomodelNames.js.map +1 -0
- package/dist/emitters/neomodelProperties.d.ts +48 -0
- package/dist/emitters/neomodelProperties.js +220 -0
- package/dist/emitters/neomodelProperties.js.map +1 -0
- package/dist/emitters/sdn.d.ts +27 -0
- package/dist/emitters/sdn.js +584 -0
- package/dist/emitters/sdn.js.map +1 -0
- package/dist/emitters/sdnTypes.d.ts +7 -0
- package/dist/emitters/sdnTypes.js +81 -0
- package/dist/emitters/sdnTypes.js.map +1 -0
- package/dist/formats.js +35 -0
- package/dist/formats.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { collectEdges, defaultReverseName, } from './neo4jEdges.js';
|
|
2
|
+
import { buildGraph, primaryKeyNamesOf, } from './neo4jGraph.js';
|
|
3
|
+
import { labelOf, oneLine } from './neo4jNames.js';
|
|
4
|
+
import { attributeNameOf, classNameOf, isPythonIdentifier, pyString, RESERVED_TYPES, uniqueAttribute, uniqueClassName, } from './neomodelNames.js';
|
|
5
|
+
import { callText, ModuleImports, planProperty, } from './neomodelProperties.js';
|
|
6
|
+
const INDENT = ' ';
|
|
7
|
+
const MAX_LINE_WIDTH = 88;
|
|
8
|
+
const CARDINALITY_CLASS = {
|
|
9
|
+
one: 'One',
|
|
10
|
+
zeroOrOne: 'ZeroOrOne',
|
|
11
|
+
zeroOrMore: 'ZeroOrMore',
|
|
12
|
+
oneOrMore: 'OneOrMore',
|
|
13
|
+
};
|
|
14
|
+
export function emitNeomodel(schema, options) {
|
|
15
|
+
const warnings = schemaWarnings(schema);
|
|
16
|
+
if (schema.models.length === 0) {
|
|
17
|
+
return { text: '', warnings };
|
|
18
|
+
}
|
|
19
|
+
const graph = buildGraph(schema, {
|
|
20
|
+
camelFields: options.camelFields,
|
|
21
|
+
omitWarnings: { defaults: true, autoIncrement: true, maxLength: true },
|
|
22
|
+
}, warnings);
|
|
23
|
+
const edges = collectEdges(schema, graph, warnings);
|
|
24
|
+
const imports = new ModuleImports();
|
|
25
|
+
const context = {
|
|
26
|
+
schema,
|
|
27
|
+
imports,
|
|
28
|
+
warnings,
|
|
29
|
+
};
|
|
30
|
+
const classNames = new Set(RESERVED_TYPES);
|
|
31
|
+
const nodes = graph.nodes.map((node) => planNode(node, classNames, warnings));
|
|
32
|
+
const byLabel = new Map(nodes.map((plan) => [plan.node.label, plan]));
|
|
33
|
+
for (const plan of nodes) {
|
|
34
|
+
addProperties(context, plan);
|
|
35
|
+
}
|
|
36
|
+
const relationClasses = [];
|
|
37
|
+
for (const edge of edges) {
|
|
38
|
+
addEdge(context, edge, byLabel, classNames, relationClasses);
|
|
39
|
+
}
|
|
40
|
+
const blocks = [
|
|
41
|
+
...relationClasses.map((plan) => plan.text),
|
|
42
|
+
...nodes.map(renderNode),
|
|
43
|
+
];
|
|
44
|
+
const sections = [];
|
|
45
|
+
if (options.header !== false) {
|
|
46
|
+
sections.push(headerLines().join('\n'));
|
|
47
|
+
}
|
|
48
|
+
sections.push(importLines(imports).join('\n'));
|
|
49
|
+
const body = blocks.join('\n\n\n');
|
|
50
|
+
return {
|
|
51
|
+
text: `${sections.join('\n\n')}\n\n\n${body}\n`,
|
|
52
|
+
warnings: [...new Set(warnings)],
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Warnings for constructs neomodel has no place for
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
function schemaWarnings(schema) {
|
|
59
|
+
const warnings = [];
|
|
60
|
+
for (const enumDefinition of schema.enums) {
|
|
61
|
+
if (enumDefinition.schema !== undefined) {
|
|
62
|
+
warnings.push(`enum ${enumDefinition.name}: the database schema "${enumDefinition.schema}" (@@schema) was ignored.`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const model of schema.models) {
|
|
66
|
+
if (model.isView === true) {
|
|
67
|
+
warnings.push(`${model.name}: this is a database view; it was written as a node class like any other model.`);
|
|
68
|
+
}
|
|
69
|
+
if (model.schema !== undefined) {
|
|
70
|
+
warnings.push(`${model.name}: the database schema "${model.schema}" (@@schema) was ignored.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return warnings;
|
|
74
|
+
}
|
|
75
|
+
function planNode(node, classNames, warnings) {
|
|
76
|
+
const wanted = classNameOf(node.label);
|
|
77
|
+
const safe = RESERVED_TYPES.has(wanted) ? `${wanted}Node` : wanted;
|
|
78
|
+
const className = uniqueClassName(safe, classNames);
|
|
79
|
+
if (className !== node.label) {
|
|
80
|
+
warnings.push(`${node.model.name}: the class is named ${className} because ${isPythonIdentifier(node.label)
|
|
81
|
+
? `${node.label} is a name the module uses or another class has`
|
|
82
|
+
: `${node.label} is not a Python class name`}; the label ${node.label} is kept with __label__.`);
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
node,
|
|
86
|
+
className,
|
|
87
|
+
needsLabel: className !== node.label,
|
|
88
|
+
used: new Set(),
|
|
89
|
+
attributes: new Map(),
|
|
90
|
+
members: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** The attribute for a graph property or relationship name, with a warning when it had to change. */
|
|
94
|
+
function claimAttribute(raw, used, where, warnings, stored) {
|
|
95
|
+
const wanted = attributeNameOf(raw);
|
|
96
|
+
const name = uniqueAttribute(wanted, used);
|
|
97
|
+
if (name !== wanted) {
|
|
98
|
+
warnings.push(`${where}: "${wanted}" is taken, so the attribute was named "${name}" (stored as ${stored}).`);
|
|
99
|
+
}
|
|
100
|
+
return name;
|
|
101
|
+
}
|
|
102
|
+
function resolveKeys(node, names) {
|
|
103
|
+
const keys = [];
|
|
104
|
+
for (const name of names) {
|
|
105
|
+
const key = node.keys.get(name);
|
|
106
|
+
if (key === undefined) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
keys.push(key);
|
|
110
|
+
}
|
|
111
|
+
return keys;
|
|
112
|
+
}
|
|
113
|
+
/** Decides which properties are unique, indexed or full-text indexed, as the Cypher writer does. */
|
|
114
|
+
function nodeRoles(node, warnings) {
|
|
115
|
+
const roles = {
|
|
116
|
+
unique: new Set(),
|
|
117
|
+
index: new Set(),
|
|
118
|
+
fulltext: new Set(),
|
|
119
|
+
};
|
|
120
|
+
const model = node.model;
|
|
121
|
+
const keyNames = primaryKeyNamesOf(model);
|
|
122
|
+
const keys = resolveKeys(node, keyNames);
|
|
123
|
+
if (keyNames.length > 0 && keys === undefined) {
|
|
124
|
+
warnings.push(`${model.name}: the primary key (${keyNames.join(', ')}) names a column that does not exist, so it was dropped.`);
|
|
125
|
+
}
|
|
126
|
+
else if (keys !== undefined && keys.length === 1) {
|
|
127
|
+
roles.unique.add(keys[0] ?? '');
|
|
128
|
+
}
|
|
129
|
+
else if (keys !== undefined && keys.length > 1) {
|
|
130
|
+
warnings.push(`${model.name}: neomodel has no composite constraint, so the composite primary key (${keys.join(', ')}) was written as an index on each property.`);
|
|
131
|
+
keys.forEach((key) => roles.index.add(key));
|
|
132
|
+
}
|
|
133
|
+
for (const field of model.fields) {
|
|
134
|
+
const key = node.keys.get(field.name);
|
|
135
|
+
if (field.isUnique && key !== undefined) {
|
|
136
|
+
roles.unique.add(key);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
for (const relation of model.relations) {
|
|
140
|
+
const key = node.keys.get(relation.name);
|
|
141
|
+
if (relation.kind === 'oneToOne' && key !== undefined) {
|
|
142
|
+
roles.unique.add(key);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
for (const index of model.indexes) {
|
|
146
|
+
planIndex(node, index, roles, warnings);
|
|
147
|
+
}
|
|
148
|
+
return roles;
|
|
149
|
+
}
|
|
150
|
+
function planIndex(node, index, roles, warnings) {
|
|
151
|
+
const label = `${node.model.name} index (${index.fields.join(', ')})`;
|
|
152
|
+
const keys = resolveKeys(node, index.fields);
|
|
153
|
+
if (keys === undefined || keys.length === 0) {
|
|
154
|
+
warnings.push(`${label}: it names a column that does not exist and was dropped.`);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (index.method !== undefined && index.method.toLowerCase() !== 'btree') {
|
|
158
|
+
warnings.push(`${label}: Neo4j has no ${index.method} index method; the index was dropped.`);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (index.clustered !== undefined ||
|
|
162
|
+
(index.fieldOptions !== undefined &&
|
|
163
|
+
Object.keys(index.fieldOptions).length > 0)) {
|
|
164
|
+
warnings.push(`${label}: clustering, sort order, prefix length and operator class options have no Neo4j equivalent and were dropped.`);
|
|
165
|
+
}
|
|
166
|
+
const single = keys.length === 1;
|
|
167
|
+
if (index.kind === 'fulltext') {
|
|
168
|
+
if (!single) {
|
|
169
|
+
warnings.push(`${label}: a neomodel full-text index covers one property, so each property got its own.`);
|
|
170
|
+
}
|
|
171
|
+
keys.forEach((key) => roles.fulltext.add(key));
|
|
172
|
+
}
|
|
173
|
+
else if (index.isUnique) {
|
|
174
|
+
if (!single) {
|
|
175
|
+
warnings.push(`${label}: neomodel has no composite uniqueness constraint, so each property was written as an index.`);
|
|
176
|
+
keys.forEach((key) => roles.index.add(key));
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
roles.unique.add(keys[0] ?? '');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
if (!single) {
|
|
184
|
+
warnings.push(`${label}: neomodel has no composite index, so each property got its own index.`);
|
|
185
|
+
}
|
|
186
|
+
keys.forEach((key) => roles.index.add(key));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function roleOf(roles, key) {
|
|
190
|
+
const unique = roles.unique.has(key);
|
|
191
|
+
return {
|
|
192
|
+
unique,
|
|
193
|
+
index: !unique && roles.index.has(key),
|
|
194
|
+
fulltext: roles.fulltext.has(key),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// ---------------------------------------------------------------------------
|
|
198
|
+
// Properties
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
/** True when the node has one UUID key that neomodel can generate (the source generates it too). */
|
|
201
|
+
function generatedUuidKey(node) {
|
|
202
|
+
const keyNames = primaryKeyNamesOf(node.model);
|
|
203
|
+
if (keyNames.length !== 1) {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
const field = node.model.fields.find((candidate) => candidate.name === keyNames[0]);
|
|
207
|
+
return field !== undefined &&
|
|
208
|
+
field.type === 'uuid' &&
|
|
209
|
+
field.arrayDepth === undefined &&
|
|
210
|
+
field.default?.kind === 'uuid'
|
|
211
|
+
? node.keys.get(field.name)
|
|
212
|
+
: undefined;
|
|
213
|
+
}
|
|
214
|
+
/** Lays out `name = Class(args)`, one argument per line when it does not fit in 88 columns. */
|
|
215
|
+
function assignment(name, call, level) {
|
|
216
|
+
const pad = INDENT.repeat(level);
|
|
217
|
+
const flat = `${pad}${name} = ${callText(call)}`;
|
|
218
|
+
if (flat.length <= MAX_LINE_WIDTH || call.args.length === 0) {
|
|
219
|
+
return [flat];
|
|
220
|
+
}
|
|
221
|
+
return [
|
|
222
|
+
`${pad}${name} = ${call.className}(`,
|
|
223
|
+
...call.args.map((arg) => `${pad}${INDENT}${arg},`),
|
|
224
|
+
`${pad})`,
|
|
225
|
+
];
|
|
226
|
+
}
|
|
227
|
+
function addProperties(context, plan) {
|
|
228
|
+
const node = plan.node;
|
|
229
|
+
const roles = nodeRoles(node, context.warnings);
|
|
230
|
+
const uuidKey = generatedUuidKey(node);
|
|
231
|
+
for (const property of node.properties) {
|
|
232
|
+
const attribute = claimAttribute(property.key, plan.used, `${node.model.name}.${property.irName}`, context.warnings, pyString(property.key));
|
|
233
|
+
plan.attributes.set(property.key, attribute);
|
|
234
|
+
const field = node.model.fields.find((candidate) => candidate.name === property.irName &&
|
|
235
|
+
node.keys.get(candidate.name) === property.key);
|
|
236
|
+
const call = planProperty(context, {
|
|
237
|
+
label: `${node.model.name}.${property.irName}`,
|
|
238
|
+
property,
|
|
239
|
+
field,
|
|
240
|
+
role: roleOf(roles, property.key),
|
|
241
|
+
attribute,
|
|
242
|
+
uniqueId: uuidKey === property.key,
|
|
243
|
+
});
|
|
244
|
+
plan.members.push(...assignment(attribute, call, 1));
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
// Relationships
|
|
249
|
+
// ---------------------------------------------------------------------------
|
|
250
|
+
function pattern(edge) {
|
|
251
|
+
return `(:${edge.source.label})-[:${edge.type}]->(:${edge.target.label})`;
|
|
252
|
+
}
|
|
253
|
+
/** The unique and indexed extra columns of a join table, as the Cypher writer finds them. */
|
|
254
|
+
function joinRoles(join, warnings) {
|
|
255
|
+
const roles = {
|
|
256
|
+
unique: new Set(),
|
|
257
|
+
index: new Set(),
|
|
258
|
+
fulltext: new Set(),
|
|
259
|
+
};
|
|
260
|
+
const model = join.model;
|
|
261
|
+
for (const field of model.fields) {
|
|
262
|
+
const property = join.extras.find((extra) => extra.irName === field.name);
|
|
263
|
+
if (property !== undefined && field.isUnique) {
|
|
264
|
+
roles.unique.add(property.key);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const pairNames = new Set([
|
|
268
|
+
join.from.name,
|
|
269
|
+
join.from.columnName,
|
|
270
|
+
join.to.name,
|
|
271
|
+
join.to.columnName,
|
|
272
|
+
]);
|
|
273
|
+
for (const index of model.indexes) {
|
|
274
|
+
if (index.fields.every((name) => pairNames.has(name))) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const known = index.fields.every((name) => join.extras.some((extra) => extra.irName === name));
|
|
278
|
+
const keys = index.fields.map((name) => join.keys.get(name) ?? name);
|
|
279
|
+
if (index.isUnique &&
|
|
280
|
+
index.kind === undefined &&
|
|
281
|
+
known &&
|
|
282
|
+
keys.length === 1) {
|
|
283
|
+
roles.unique.add(keys[0] ?? '');
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
warnings.push(`${model.name} index (${index.fields.join(', ')}): the join table became a relationship, so this index was dropped.`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return roles;
|
|
290
|
+
}
|
|
291
|
+
function relationClassFor(context, join, classNames, relationClasses) {
|
|
292
|
+
if (join.extras.length === 0) {
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
const className = uniqueClassName(`${classNameOf(labelOf(join.model.name))}Rel`, classNames);
|
|
296
|
+
const used = new Set();
|
|
297
|
+
const roles = joinRoles(join, context.warnings);
|
|
298
|
+
const lines = [
|
|
299
|
+
`class ${className}(${context.imports.use('StructuredRel')}):`,
|
|
300
|
+
`${INDENT}"""Properties of the ${oneLine(join.model.name).replace(/["\\]/g, '')} relationship."""`,
|
|
301
|
+
'',
|
|
302
|
+
];
|
|
303
|
+
for (const property of join.extras) {
|
|
304
|
+
const attribute = claimAttribute(property.key, used, `${join.model.name}.${property.irName}`, context.warnings, pyString(property.key));
|
|
305
|
+
const field = join.model.fields.find((candidate) => candidate.name === property.irName);
|
|
306
|
+
const call = planProperty(context, {
|
|
307
|
+
label: `${join.model.name}.${property.irName}`,
|
|
308
|
+
property,
|
|
309
|
+
field,
|
|
310
|
+
role: roleOf(roles, property.key),
|
|
311
|
+
attribute,
|
|
312
|
+
uniqueId: false,
|
|
313
|
+
});
|
|
314
|
+
lines.push(...assignment(attribute, call, 1));
|
|
315
|
+
}
|
|
316
|
+
relationClasses.push({ text: lines.join('\n') });
|
|
317
|
+
return className;
|
|
318
|
+
}
|
|
319
|
+
function relationshipCall(context, direction, targetClass, edge, cardinality, relationClass) {
|
|
320
|
+
const cardinalityClass = context.imports.use(CARDINALITY_CLASS[cardinality]);
|
|
321
|
+
return {
|
|
322
|
+
className: context.imports.use(direction),
|
|
323
|
+
args: [
|
|
324
|
+
pyString(targetClass),
|
|
325
|
+
pyString(edge.type),
|
|
326
|
+
`cardinality=${cardinalityClass}`,
|
|
327
|
+
...(relationClass === undefined ? [] : [`model=${relationClass}`]),
|
|
328
|
+
],
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
function edgeWarning(edge) {
|
|
332
|
+
const where = `${edge.source.model.name}.${edge.name}`;
|
|
333
|
+
switch (edge.kind) {
|
|
334
|
+
case 'manyToMany':
|
|
335
|
+
return `${where}: the many-to-many relation to ${edge.target.model.name} became the relationship ${pattern(edge)}; no join node is created.`;
|
|
336
|
+
case 'join':
|
|
337
|
+
return `${edge.join?.model.name ?? where}: the join table became the relationship ${pattern(edge)} instead of a node class.`;
|
|
338
|
+
default: {
|
|
339
|
+
const keys = (edge.composite?.fields ?? [edge.relation?.name ?? edge.name])
|
|
340
|
+
.map((name) => edge.source.keys.get(name) ?? name)
|
|
341
|
+
.join(', ');
|
|
342
|
+
const many = keys.includes(',');
|
|
343
|
+
return `${where}: the foreign key to ${edge.target.model.name} became the relationship ${pattern(edge)}; neomodel does not enforce the on delete action (${edge.onDelete ?? 'noAction'}), and ${keys} ${many ? 'were kept as plain properties' : 'was kept as a plain property'} that nothing ties to the relationship.`;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function addEdge(context, edge, byLabel, classNames, relationClasses) {
|
|
348
|
+
const source = byLabel.get(edge.source.label);
|
|
349
|
+
const target = byLabel.get(edge.target.label);
|
|
350
|
+
if (source === undefined || target === undefined) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
context.warnings.push(edgeWarning(edge));
|
|
354
|
+
const relationClass = edge.join === undefined
|
|
355
|
+
? undefined
|
|
356
|
+
: relationClassFor(context, edge.join, classNames, relationClasses);
|
|
357
|
+
const outgoing = claimAttribute(edge.name, source.used, `${source.node.model.name}.${edge.name}`, context.warnings, pyString(edge.type));
|
|
358
|
+
source.members.push(...assignment(outgoing, relationshipCall(context, 'RelationshipTo', target.className, edge, edge.outgoing, relationClass), 1));
|
|
359
|
+
const reverseName = edge.reverseName ?? defaultReverseName(edge);
|
|
360
|
+
const incoming = claimAttribute(reverseName, target.used, `${target.node.model.name}.${reverseName}`, context.warnings, pyString(edge.type));
|
|
361
|
+
target.members.push(...assignment(incoming, relationshipCall(context, 'RelationshipFrom', source.className, edge, edge.incoming, relationClass), 1));
|
|
362
|
+
}
|
|
363
|
+
// ---------------------------------------------------------------------------
|
|
364
|
+
// Text
|
|
365
|
+
// ---------------------------------------------------------------------------
|
|
366
|
+
function renderNode(plan) {
|
|
367
|
+
const model = plan.node.model;
|
|
368
|
+
const description = `Model ${model.name} (table ${model.tableName}).`.replace(/["\\\r\n]/g, ' ');
|
|
369
|
+
const lines = [
|
|
370
|
+
`class ${plan.className}(StructuredNode):`,
|
|
371
|
+
`${INDENT}"""${description}"""`,
|
|
372
|
+
];
|
|
373
|
+
if (plan.needsLabel) {
|
|
374
|
+
lines.push('', `${INDENT}__label__ = ${pyString(plan.node.label)}`);
|
|
375
|
+
}
|
|
376
|
+
if (plan.members.length > 0) {
|
|
377
|
+
lines.push('', ...plan.members);
|
|
378
|
+
}
|
|
379
|
+
return lines.join('\n');
|
|
380
|
+
}
|
|
381
|
+
function headerLines() {
|
|
382
|
+
return [
|
|
383
|
+
'# Generated by ormbridge. Review the output before creating constraints or data.',
|
|
384
|
+
'#',
|
|
385
|
+
'# neomodel classes for Neo4j 5: one StructuredNode per node label, RelationshipTo and',
|
|
386
|
+
'# RelationshipFrom for the relationships. Create the constraints and indexes with',
|
|
387
|
+
'# neomodel_install_labels <this file> --db bolt://user:password@host:7687',
|
|
388
|
+
'# (or db.install_labels(Class) in your code). Foreign key columns stay as plain properties.',
|
|
389
|
+
];
|
|
390
|
+
}
|
|
391
|
+
function importLines(imports) {
|
|
392
|
+
const names = ['StructuredNode', ...imports.neomodel];
|
|
393
|
+
const unique = [...new Set(names)].sort();
|
|
394
|
+
const standard = [];
|
|
395
|
+
const dates = [
|
|
396
|
+
...(imports.usesDate ? ['date'] : []),
|
|
397
|
+
...imports.datetime,
|
|
398
|
+
].sort();
|
|
399
|
+
if (dates.length > 0) {
|
|
400
|
+
standard.push(`from datetime import ${[...new Set(dates)].join(', ')}`);
|
|
401
|
+
}
|
|
402
|
+
if (imports.usesUuid) {
|
|
403
|
+
standard.push('from uuid import uuid4');
|
|
404
|
+
}
|
|
405
|
+
const flat = `from neomodel import ${unique.join(', ')}`;
|
|
406
|
+
const block = flat.length <= MAX_LINE_WIDTH
|
|
407
|
+
? [flat]
|
|
408
|
+
: [
|
|
409
|
+
'from neomodel import (',
|
|
410
|
+
...unique.map((name) => `${INDENT}${name},`),
|
|
411
|
+
')',
|
|
412
|
+
];
|
|
413
|
+
return standard.length > 0 ? [...standard, '', ...block] : block;
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=neomodel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neomodel.js","sourceRoot":"","sources":["../../src/emitters/neomodel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attribute names that neomodel itself uses on a node or relationship class. A property with one of these
|
|
3
|
+
* names is refused (`id`, `element_id`, `deleted`, `source`, `target`) or hides a method (`save`, `delete`).
|
|
4
|
+
*/
|
|
5
|
+
export declare const RESERVED_ATTRIBUTES: ReadonlySet<string>;
|
|
6
|
+
/**
|
|
7
|
+
* Names the generated module imports or defines at the top level. A node class with one of these names
|
|
8
|
+
* would hide the import, so its class is renamed and the label is kept with `__label__`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const RESERVED_TYPES: ReadonlySet<string>;
|
|
11
|
+
/** True when the text is a plain Python identifier that is not a keyword. */
|
|
12
|
+
export declare function isPythonIdentifier(text: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* The Python attribute name for a graph property key or relation name: snake_case, a leading underscore
|
|
15
|
+
* before a digit, a trailing underscore when the word is a keyword or one neomodel uses (`id` is `id_`).
|
|
16
|
+
*/
|
|
17
|
+
export declare function attributeNameOf(raw: string): string;
|
|
18
|
+
/** Reserves `base` in `used`, appending `_2`, `_3`, ... when the name is taken. */
|
|
19
|
+
export declare function uniqueAttribute(base: string, used: Set<string>): string;
|
|
20
|
+
/** Reserves a class name in `used`, appending 2, 3, ... when it is taken. */
|
|
21
|
+
export declare function uniqueClassName(base: string, used: Set<string>): string;
|
|
22
|
+
/** A class name for a node label: the label when it is a valid identifier, otherwise a repaired form. */
|
|
23
|
+
export declare function classNameOf(label: string): string;
|
|
24
|
+
/** A Python string literal in double quotes (the JSON escapes are valid Python escapes). */
|
|
25
|
+
export declare function pyString(value: string): string;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { toSnakeCase } from '../naming.js';
|
|
2
|
+
/** Name and literal helpers of the neomodel writer. */
|
|
3
|
+
/** Python keywords: an identifier with one of these names does not parse. */
|
|
4
|
+
const PYTHON_KEYWORDS = new Set([
|
|
5
|
+
'False',
|
|
6
|
+
'None',
|
|
7
|
+
'True',
|
|
8
|
+
'and',
|
|
9
|
+
'as',
|
|
10
|
+
'assert',
|
|
11
|
+
'async',
|
|
12
|
+
'await',
|
|
13
|
+
'break',
|
|
14
|
+
'class',
|
|
15
|
+
'continue',
|
|
16
|
+
'def',
|
|
17
|
+
'del',
|
|
18
|
+
'elif',
|
|
19
|
+
'else',
|
|
20
|
+
'except',
|
|
21
|
+
'finally',
|
|
22
|
+
'for',
|
|
23
|
+
'from',
|
|
24
|
+
'global',
|
|
25
|
+
'if',
|
|
26
|
+
'import',
|
|
27
|
+
'in',
|
|
28
|
+
'is',
|
|
29
|
+
'lambda',
|
|
30
|
+
'nonlocal',
|
|
31
|
+
'not',
|
|
32
|
+
'or',
|
|
33
|
+
'pass',
|
|
34
|
+
'raise',
|
|
35
|
+
'return',
|
|
36
|
+
'try',
|
|
37
|
+
'while',
|
|
38
|
+
'with',
|
|
39
|
+
'yield',
|
|
40
|
+
]);
|
|
41
|
+
/**
|
|
42
|
+
* Attribute names that neomodel itself uses on a node or relationship class. A property with one of these
|
|
43
|
+
* names is refused (`id`, `element_id`, `deleted`, `source`, `target`) or hides a method (`save`, `delete`).
|
|
44
|
+
*/
|
|
45
|
+
export const RESERVED_ATTRIBUTES = new Set([
|
|
46
|
+
'DoesNotExist',
|
|
47
|
+
'bulk_save',
|
|
48
|
+
'create',
|
|
49
|
+
'create_or_update',
|
|
50
|
+
'cypher',
|
|
51
|
+
'defined_properties',
|
|
52
|
+
'deflate',
|
|
53
|
+
'delete',
|
|
54
|
+
'deleted',
|
|
55
|
+
'element_id',
|
|
56
|
+
'element_id_property',
|
|
57
|
+
'end_node',
|
|
58
|
+
'get_or_create',
|
|
59
|
+
'id',
|
|
60
|
+
'inflate',
|
|
61
|
+
'inherited_labels',
|
|
62
|
+
'inherited_optional_labels',
|
|
63
|
+
'labels',
|
|
64
|
+
'nodes',
|
|
65
|
+
'refresh',
|
|
66
|
+
'save',
|
|
67
|
+
'source',
|
|
68
|
+
'start_node',
|
|
69
|
+
'target',
|
|
70
|
+
'was_saved',
|
|
71
|
+
]);
|
|
72
|
+
/**
|
|
73
|
+
* Names the generated module imports or defines at the top level. A node class with one of these names
|
|
74
|
+
* would hide the import, so its class is renamed and the label is kept with `__label__`.
|
|
75
|
+
*/
|
|
76
|
+
export const RESERVED_TYPES = new Set([
|
|
77
|
+
'AliasProperty',
|
|
78
|
+
'ArrayProperty',
|
|
79
|
+
'BooleanProperty',
|
|
80
|
+
'DateProperty',
|
|
81
|
+
'DateTimeNeo4jFormatProperty',
|
|
82
|
+
'datetime',
|
|
83
|
+
'timezone',
|
|
84
|
+
'DateTimeProperty',
|
|
85
|
+
'EmailProperty',
|
|
86
|
+
'FloatProperty',
|
|
87
|
+
'FulltextIndex',
|
|
88
|
+
'IntegerProperty',
|
|
89
|
+
'JSONProperty',
|
|
90
|
+
'One',
|
|
91
|
+
'OneOrMore',
|
|
92
|
+
'Q',
|
|
93
|
+
'Relationship',
|
|
94
|
+
'RelationshipFrom',
|
|
95
|
+
'RelationshipTo',
|
|
96
|
+
'StringProperty',
|
|
97
|
+
'StructuredNode',
|
|
98
|
+
'StructuredRel',
|
|
99
|
+
'UniqueIdProperty',
|
|
100
|
+
'ZeroOrMore',
|
|
101
|
+
'ZeroOrOne',
|
|
102
|
+
'date',
|
|
103
|
+
'uuid4',
|
|
104
|
+
]);
|
|
105
|
+
const IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
106
|
+
/** True when the text is a plain Python identifier that is not a keyword. */
|
|
107
|
+
export function isPythonIdentifier(text) {
|
|
108
|
+
return IDENTIFIER.test(text) && !PYTHON_KEYWORDS.has(text);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The Python attribute name for a graph property key or relation name: snake_case, a leading underscore
|
|
112
|
+
* before a digit, a trailing underscore when the word is a keyword or one neomodel uses (`id` is `id_`).
|
|
113
|
+
*/
|
|
114
|
+
export function attributeNameOf(raw) {
|
|
115
|
+
let name = toSnakeCase(raw);
|
|
116
|
+
if (name === '') {
|
|
117
|
+
name = 'value';
|
|
118
|
+
}
|
|
119
|
+
if (/^[0-9]/.test(name)) {
|
|
120
|
+
name = `_${name}`;
|
|
121
|
+
}
|
|
122
|
+
return PYTHON_KEYWORDS.has(name) || RESERVED_ATTRIBUTES.has(name)
|
|
123
|
+
? `${name}_`
|
|
124
|
+
: name;
|
|
125
|
+
}
|
|
126
|
+
/** Reserves `base` in `used`, appending `_2`, `_3`, ... when the name is taken. */
|
|
127
|
+
export function uniqueAttribute(base, used) {
|
|
128
|
+
let candidate = base;
|
|
129
|
+
let suffix = 2;
|
|
130
|
+
while (used.has(candidate)) {
|
|
131
|
+
candidate = `${base}_${suffix}`;
|
|
132
|
+
suffix += 1;
|
|
133
|
+
}
|
|
134
|
+
used.add(candidate);
|
|
135
|
+
return candidate;
|
|
136
|
+
}
|
|
137
|
+
/** Reserves a class name in `used`, appending 2, 3, ... when it is taken. */
|
|
138
|
+
export function uniqueClassName(base, used) {
|
|
139
|
+
let candidate = base;
|
|
140
|
+
let suffix = 2;
|
|
141
|
+
while (used.has(candidate)) {
|
|
142
|
+
candidate = `${base}${suffix}`;
|
|
143
|
+
suffix += 1;
|
|
144
|
+
}
|
|
145
|
+
used.add(candidate);
|
|
146
|
+
return candidate;
|
|
147
|
+
}
|
|
148
|
+
/** A class name for a node label: the label when it is a valid identifier, otherwise a repaired form. */
|
|
149
|
+
export function classNameOf(label) {
|
|
150
|
+
const cleaned = label.replace(/[^A-Za-z0-9_]/g, '_');
|
|
151
|
+
const prefixed = /^[0-9]/.test(cleaned) ? `_${cleaned}` : cleaned;
|
|
152
|
+
const named = prefixed === '' ? 'Node' : prefixed;
|
|
153
|
+
return PYTHON_KEYWORDS.has(named) ? `${named}_` : named;
|
|
154
|
+
}
|
|
155
|
+
/** A Python string literal in double quotes (the JSON escapes are valid Python escapes). */
|
|
156
|
+
export function pyString(value) {
|
|
157
|
+
return JSON.stringify(value);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=neomodelNames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"neomodelNames.js","sourceRoot":"","sources":["../../src/emitters/neomodelNames.ts"],"names":[],"mappings":"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"}
|