@malloydata/malloy-tests 0.0.70-dev230810160210 → 0.0.70-dev230810215741

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.
@@ -1 +1,8 @@
1
- export {};
1
+ import { TagDict } from '@malloydata/malloy';
2
+ declare global {
3
+ namespace jest {
4
+ interface Matchers<R> {
5
+ tagsAre(t: TagDict): R;
6
+ }
7
+ }
8
+ }
package/dist/tags.spec.js CHANGED
@@ -23,11 +23,66 @@
23
23
  */
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
25
  const malloy_1 = require("@malloydata/malloy");
26
+ const runtimes_1 = require("./runtimes");
27
+ expect.extend({
28
+ tagsAre(src, result) {
29
+ if (typeof src === 'string') {
30
+ const { tag, log } = malloy_1.Tag.fromTagline(src, undefined);
31
+ const errs = log.map(e => e.message);
32
+ if (log.length > 0) {
33
+ return {
34
+ pass: false,
35
+ message: () => `${src}: Tag Parsing Error(s)\n${errs.join('\n')}`,
36
+ };
37
+ }
38
+ src = tag;
39
+ }
40
+ const got = src.properties;
41
+ if (this.equals(got, result)) {
42
+ return {
43
+ pass: true,
44
+ message: () => 'Parse returned expected object',
45
+ };
46
+ }
47
+ const expected = this.utils.printExpected(result);
48
+ const received = this.utils.printReceived(got);
49
+ return {
50
+ pass: false,
51
+ message: () => `Expected: ${expected}\nReceived: ${received}`,
52
+ };
53
+ },
54
+ });
55
+ const runtime = (0, runtimes_1.runtimeFor)('duckdb');
56
+ function unTestify(ta) {
57
+ const dloc = {
58
+ url: __filename,
59
+ range: { start: { character: 0, line: 0 }, end: { character: 0, line: 0 } },
60
+ };
61
+ const ret = {
62
+ notes: ta.notes.map(t => {
63
+ return { text: t, at: dloc };
64
+ }),
65
+ };
66
+ if (ta.blockNotes) {
67
+ ret.blockNotes = ta.blockNotes.map(t => {
68
+ return { text: t, at: dloc };
69
+ });
70
+ }
71
+ if (ta.inherits) {
72
+ ret.inherits = unTestify(ta.inherits);
73
+ }
74
+ return ret;
75
+ }
76
+ class TestTags extends malloy_1.Tags {
77
+ constructor(ta) {
78
+ super(unTestify(ta));
79
+ }
80
+ }
26
81
  function tstTaglist(a) {
27
- return new malloy_1.Tags(a).getTagList();
82
+ return new TestTags(a).getTagList();
28
83
  }
29
84
  function tstTagParse(s) {
30
- return new malloy_1.Tags({ notes: [s] }).getMalloyTags();
85
+ return new TestTags({ notes: [s] }).getMalloyTags();
31
86
  }
32
87
  describe('tag utilities', () => {
33
88
  test('own/block ordering is correct', () => {
@@ -119,141 +174,296 @@ describe('tag utilities', () => {
119
174
  }
120
175
  });
121
176
  });
122
- const runtimes_1 = require("./runtimes");
123
- const runtime = (0, runtimes_1.runtimeFor)('duckdb');
177
+ describe('tagParse to Tag', () => {
178
+ const tagTests = [
179
+ ['just_name', { just_name: {} }],
180
+ ['name=bare_string', { name: { eq: 'bare_string' } }],
181
+ ['name="quoted_string"', { name: { eq: 'quoted_string' } }],
182
+ ['name {prop1}', { name: { properties: { prop1: {} } } }],
183
+ [
184
+ 'name {prop1 prop2=value}',
185
+ {
186
+ name: {
187
+ properties: {
188
+ prop1: {},
189
+ prop2: { eq: 'value' },
190
+ },
191
+ },
192
+ },
193
+ ],
194
+ ['name.prop', { name: { properties: { prop: {} } } }],
195
+ ['name.prop=value', { name: { properties: { prop: { eq: 'value' } } } }],
196
+ [
197
+ 'name.prop.sub=value',
198
+ { name: { properties: { prop: { properties: { sub: { eq: 'value' } } } } } },
199
+ ],
200
+ [
201
+ 'name{first3=[a, b, c]}',
202
+ { name: { properties: { first3: { eq: [{ eq: 'a' }, { eq: 'b' }, { eq: 'c' }] } } } },
203
+ ],
204
+ ['name{first1=[a,]}', { name: { properties: { first1: { eq: [{ eq: 'a' }] } } } }],
205
+ [
206
+ 'name{first=[a {A}]}',
207
+ { name: { properties: { first: { eq: [{ eq: 'a', properties: { A: {} } }] } } } },
208
+ ],
209
+ [
210
+ 'name{first=[{A}]}',
211
+ { name: { properties: { first: { eq: [{ properties: { A: {} } }] } } } },
212
+ ],
213
+ ['name=value {prop}', { name: { eq: 'value', properties: { prop: {} } } }],
214
+ [
215
+ 'name.prop={prop2}',
216
+ { name: { properties: { prop: { properties: { prop2: {} } } } } },
217
+ ],
218
+ ['no yes -no', { yes: {} }],
219
+ ['x={y z} -x.y', { x: { properties: { z: {} } } }],
220
+ ['x={y z} x {-y}', { x: { properties: { z: {} } } }],
221
+ ['x=1 x {xx=11}', { x: { eq: '1', properties: { xx: { eq: '11' } } } }],
222
+ ['x.y=xx x=1 {...}', { x: { eq: '1', properties: { y: { eq: 'xx' } } } }],
223
+ ['a {b c} a=1', { a: { eq: '1' } }],
224
+ ['a=1 a=...{b}', { a: { eq: '1', properties: { b: {} } } }],
225
+ [
226
+ 'a=red { shade=dark } color=$(a) shade=$(a.shade)',
227
+ {
228
+ a: { eq: 'red', properties: { shade: { eq: 'dark' } } },
229
+ color: { eq: 'red', properties: { shade: { eq: 'dark' } } },
230
+ shade: { eq: 'dark' },
231
+ },
232
+ ],
233
+ ];
234
+ test.each(tagTests)('tag %s', (expression, expected) => {
235
+ expect(expression).tagsAre(expected);
236
+ });
237
+ test('uncomment to debug just one of the expressions', () => {
238
+ const x = ['a=a b=$(a)', { a: { eq: 'a' }, b: { eq: 'a' } }];
239
+ expect(x[0]).tagsAre(x[1]);
240
+ });
241
+ });
242
+ describe('Tag access', () => {
243
+ test('just text', () => {
244
+ const strToParse = 'a=b';
245
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
246
+ expect(getTags.log).toEqual([]);
247
+ const a = getTags.tag.tag('a');
248
+ expect(a).toBeDefined();
249
+ expect(a === null || a === void 0 ? void 0 : a.text()).toEqual('b');
250
+ });
251
+ test('tag path', () => {
252
+ const strToParse = 'a.b.c.d.e=f';
253
+ const tagParse = malloy_1.Tag.fromTagline(strToParse, undefined);
254
+ expect(tagParse.log).toEqual([]);
255
+ const abcde = tagParse.tag.tag('a', 'b', 'c', 'd', 'e');
256
+ expect(abcde).toBeDefined();
257
+ expect(abcde === null || abcde === void 0 ? void 0 : abcde.text()).toEqual('f');
258
+ });
259
+ test('just array', () => {
260
+ const strToParse = 'a=[b]';
261
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
262
+ expect(getTags.log).toEqual([]);
263
+ const a = getTags.tag.tag('a');
264
+ const aval = a === null || a === void 0 ? void 0 : a.array();
265
+ expect(aval).toBeDefined();
266
+ if (aval) {
267
+ expect(aval.length).toEqual(1);
268
+ expect(aval[0].text()).toEqual('b');
269
+ }
270
+ });
271
+ test('array as text', () => {
272
+ const strToParse = 'a=[b]';
273
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
274
+ expect(getTags.log).toEqual([]);
275
+ const a = getTags.tag.tag('a');
276
+ expect(a).toBeDefined();
277
+ expect(a === null || a === void 0 ? void 0 : a.text()).toEqual('');
278
+ });
279
+ test('text as array', () => {
280
+ const strToParse = 'a=b';
281
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
282
+ expect(getTags.log).toEqual([]);
283
+ const a = getTags.tag.tag('a');
284
+ expect(a).toBeDefined();
285
+ expect(a === null || a === void 0 ? void 0 : a.array()).toEqual([]);
286
+ });
287
+ test('just numeric', () => {
288
+ const strToParse = 'a=7';
289
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
290
+ expect(getTags.log).toEqual([]);
291
+ const a = getTags.tag.tag('a');
292
+ expect(a).toBeDefined();
293
+ const n = a === null || a === void 0 ? void 0 : a.numeric();
294
+ expect(typeof n).toBe('number');
295
+ expect(n).toEqual(7);
296
+ });
297
+ test('text as numeric', () => {
298
+ const strToParse = 'a=seven';
299
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
300
+ expect(getTags.log).toEqual([]);
301
+ const a = getTags.tag.tag('a');
302
+ expect(a).toBeDefined();
303
+ const n = a === null || a === void 0 ? void 0 : a.numeric();
304
+ expect(typeof n).toBe('number');
305
+ expect(n).toBeNaN();
306
+ });
307
+ test('array as numeric', () => {
308
+ const strToParse = 'a=[seven]';
309
+ const getTags = malloy_1.Tag.fromTagline(strToParse, undefined);
310
+ expect(getTags.log).toEqual([]);
311
+ const a = getTags.tag.tag('a');
312
+ expect(a).toBeDefined();
313
+ const n = a === null || a === void 0 ? void 0 : a.numeric();
314
+ expect(typeof n).toBe('number');
315
+ expect(n).toBeNaN();
316
+ });
317
+ });
124
318
  describe('## top level', () => {
125
319
  test('top level tags are available in the model def', async () => {
126
320
  const model = await runtime
127
321
  .loadModel(`
128
- ## propertyTag
129
- ##" Doc String
130
- `)
322
+ ## propertyTag
323
+ ##" Doc String
324
+ `)
131
325
  .getModel();
132
326
  const modelDesc = model.getTags().getMalloyTags();
133
327
  expect(modelDesc).toEqual({
134
328
  properties: { propertyTag: true },
135
329
  docStrings: ['Doc String\n'],
136
330
  });
331
+ const modelTagLine = model.tagParse().tag;
332
+ expect(modelTagLine.has('propertyTag')).toBeTruthy();
137
333
  });
138
334
  });
139
335
  describe('tags in results', () => {
140
336
  test('nameless query', async () => {
141
337
  const loaded = runtime.loadQuery(`
142
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
143
- # b4query
144
- query: # afterQuery
145
- from_sql(one) -> { project: * }`);
338
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
339
+ # b4query
340
+ query: # afterQuery
341
+ from_sql(one) -> { project: * }`);
146
342
  const query = await loaded.getPreparedQuery();
147
343
  expect(query).toBeDefined();
148
344
  const wantTags = ['# b4query\n', '# afterQuery\n'];
149
345
  expect(query.getTags().getTagList()).toEqual(wantTags);
150
346
  const result = await loaded.run();
151
347
  expect(result.getTags().getTagList()).toEqual(wantTags);
348
+ const queryTags = result.tagParse().tag;
349
+ expect(queryTags).tagsAre({ b4query: {}, afterQuery: {} });
152
350
  });
153
- const wantTags = ['# <Q\n', '# >Q\n', '# >name\n', '# >is\n'];
351
+ const wantTags = ['# BQ\n', '# AQ\n', '# Bis\n', '# Ais\n'];
352
+ const wantTag = { BQ: {}, AQ: {}, Bis: {}, Ais: {} };
154
353
  test('named query', async () => {
155
354
  const loaded = runtime.loadQuery(`
156
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
157
- # <Q
158
- query: # >Q
159
- theName
160
- # >name
161
- is
162
- # >is
163
- from_sql(one) -> { project: * }
164
- query: -> theName`);
355
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
356
+ # BQ
357
+ query: # AQ
358
+ theName
359
+ # Bis
360
+ is
361
+ # Ais
362
+ from_sql(one) -> { project: * }
363
+ query: -> theName`);
165
364
  const query = await loaded.getPreparedQuery();
166
365
  expect(query).toBeDefined();
167
- const wantTags = ['# <Q\n', '# >Q\n', '# >name\n', '# >is\n'];
168
366
  expect(query.getTags().getTagList()).toEqual(wantTags);
169
367
  const result = await loaded.run();
170
368
  expect(result.getTags().getTagList()).toEqual(wantTags);
369
+ expect(result.tagParse().tag).tagsAre(wantTag);
171
370
  });
172
371
  test('turtle query', async () => {
173
372
  const loaded = runtime.loadQuery(`
174
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
175
- query: from_sql(one) + {
176
- # <Q
177
- query: # >Q
178
- in_one
179
- # >name
180
- is
181
- # >is
182
- { project: one }
183
- }
184
- -> in_one`);
373
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
374
+ query: from_sql(one) + {
375
+ # BQ
376
+ query: # AQ
377
+ in_one
378
+ # Bis
379
+ is
380
+ # Ais
381
+ { project: one }
382
+ }
383
+ -> in_one`);
185
384
  const query = await loaded.getPreparedQuery();
186
385
  expect(query).toBeDefined();
187
386
  expect(query.getTags().getTagList()).toEqual(wantTags);
387
+ expect(query.tagParse().tag).tagsAre(wantTag);
188
388
  const result = await loaded.run();
189
- expect(result.getTags().getTagList()).toEqual(wantTags);
389
+ const tl = result.getTags().getTagList();
390
+ expect(tl).toEqual(wantTags);
391
+ expect(result.tagParse().tag).tagsAre(wantTag);
190
392
  });
191
393
  test('atomic field has tag', async () => {
192
394
  const loaded = runtime.loadQuery(`
193
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
194
- query: from_sql(one) -> {
195
- project:
196
- # note1
197
- one
198
- }`);
395
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
396
+ query: from_sql(one) -> {
397
+ project:
398
+ # note1
399
+ one
400
+ }`);
199
401
  const result = await loaded.run();
200
402
  const shape = result.resultExplore;
201
403
  const one = shape.getFieldByName('one');
202
404
  expect(one).toBeDefined();
203
405
  expect(one.getTags().getTagList()).toEqual(['# note1\n']);
406
+ expect(one.tagParse().tag).tagsAre({ note1: {} });
204
407
  });
205
408
  test('nested query has tag', async () => {
206
409
  const loaded = runtime.loadQuery(`
207
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
208
- source: malloy_one is from_sql(one) + {
209
- query: in_one is {
210
- project: one
211
- }
212
- query: one_and_one is {
213
- group_by: one
214
- # note1
215
- nest:
216
- # note2
217
- in_one
410
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
411
+ source: malloy_one is from_sql(one) + {
412
+ query: in_one is {
413
+ project: one
414
+ }
415
+ query: one_and_one is {
416
+ group_by: one
417
+ # note1
418
+ nest:
419
+ # note2
420
+ in_one
421
+ }
218
422
  }
219
- }
220
- query: malloy_one -> one_and_one`);
423
+ query: malloy_one -> one_and_one`);
221
424
  const result = await loaded.run();
222
425
  const shape = result.resultExplore;
223
426
  const one = shape.getFieldByName('in_one');
224
427
  expect(one).toBeDefined();
225
428
  expect(one.getTags().getTagList()).toEqual(['# note1\n', '# note2\n']);
429
+ expect(one.tagParse().tag).tagsAre({ note1: {}, note2: {} });
226
430
  });
227
431
  test('render usage test case', async () => {
228
432
  const loaded = runtime.loadQuery(`
229
- sql: one22 is { connection: "duckdb" select: """SELECT 1""" }
230
- source: ages is from_sql(one22) + {
231
- dimension: name is 'John'
232
- query: height
233
- # barchart
234
- is {
235
- project: heightd is 10
236
- }
433
+ sql: one22 is { connection: "duckdb" select: """SELECT 1""" }
434
+ source: ages is from_sql(one22) + {
435
+ dimension: name is 'John'
436
+ query: height
437
+ # barchart
438
+ is {
439
+ project: heightd is 10
440
+ }
237
441
 
238
- query: age
239
- # barchart
240
- is {
241
- project: aged is 20
242
- }
442
+ query: age
443
+ # barchart
444
+ is {
445
+ project: aged is 20
446
+ }
243
447
 
244
- }
245
- query: ages -> {
246
- group_by: name
247
- nest: height
248
- nest: age
249
- }
250
- `);
448
+ }
449
+ query: ages -> {
450
+ group_by: name
451
+ nest: height
452
+ nest: age
453
+ }
454
+ `);
251
455
  const result = await loaded.run();
252
456
  const shape = result.resultExplore;
253
- const ht = shape.getFieldByName('height').getTags().getMalloyTags();
254
- const at = shape.getFieldByName('age').getTags().getMalloyTags();
255
- expect(ht).toMatchObject({ properties: { barchart: true } });
256
- expect(at).toMatchObject({ properties: { barchart: true } });
457
+ const height = shape.getFieldByName('height');
458
+ const age = shape.getFieldByName('age');
459
+ expect(height.getTags().getMalloyTags()).toMatchObject({
460
+ properties: { barchart: true },
461
+ });
462
+ expect(height.tagParse().tag).tagsAre({ barchart: {} });
463
+ expect(age.getTags().getMalloyTags()).toMatchObject({
464
+ properties: { barchart: true },
465
+ });
466
+ expect(age.tagParse().tag).tagsAre({ barchart: {} });
257
467
  });
258
468
  });
259
469
  //# sourceMappingURL=tags.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tags.spec.js","sourceRoot":"","sources":["../src/tags.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tags.spec.js","sourceRoot":"","sources":["../src/tags.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -18,11 +18,11 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@jest/globals": "^29.4.3",
21
- "@malloydata/db-bigquery": "^0.0.70-dev230810160210",
22
- "@malloydata/db-duckdb": "^0.0.70-dev230810160210",
23
- "@malloydata/db-postgres": "^0.0.70-dev230810160210",
24
- "@malloydata/malloy": "^0.0.70-dev230810160210",
25
- "@malloydata/render": "^0.0.70-dev230810160210",
21
+ "@malloydata/db-bigquery": "^0.0.70-dev230810215741",
22
+ "@malloydata/db-duckdb": "^0.0.70-dev230810215741",
23
+ "@malloydata/db-postgres": "^0.0.70-dev230810215741",
24
+ "@malloydata/malloy": "^0.0.70-dev230810215741",
25
+ "@malloydata/render": "^0.0.70-dev230810215741",
26
26
  "jsdom": "^22.1.0",
27
27
  "luxon": "^1.26.4",
28
28
  "madge": "^6.0.0"
@@ -31,5 +31,5 @@
31
31
  "@types/jsdom": "^21.1.1",
32
32
  "@types/luxon": "^1.26.4"
33
33
  },
34
- "version": "0.0.70-dev230810160210"
34
+ "version": "0.0.70-dev230810215741"
35
35
  }
package/src/tags.spec.ts CHANGED
@@ -21,14 +21,88 @@
21
21
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
23
 
24
- import {Tags, Annotation, MalloyTags} from '@malloydata/malloy';
24
+ import {Tags, Annotation, MalloyTags, TagDict, Tag} from '@malloydata/malloy';
25
+ import {runtimeFor} from './runtimes';
25
26
 
26
- function tstTaglist(a: Annotation): string[] {
27
- return new Tags(a).getTagList();
27
+ declare global {
28
+ // eslint-disable-next-line @typescript-eslint/no-namespace
29
+ namespace jest {
30
+ interface Matchers<R> {
31
+ tagsAre(t: TagDict): R;
32
+ }
33
+ }
34
+ }
35
+
36
+ expect.extend({
37
+ tagsAre(src: string | Tag, result: Tag) {
38
+ if (typeof src === 'string') {
39
+ const {tag, log} = Tag.fromTagline(src, undefined);
40
+ const errs = log.map(e => e.message);
41
+ if (log.length > 0) {
42
+ return {
43
+ pass: false,
44
+ message: () => `${src}: Tag Parsing Error(s)\n${errs.join('\n')}`,
45
+ };
46
+ }
47
+ src = tag;
48
+ }
49
+ const got = src.properties;
50
+ if (this.equals(got, result)) {
51
+ return {
52
+ pass: true,
53
+ message: () => 'Parse returned expected object',
54
+ };
55
+ }
56
+ const expected = this.utils.printExpected(result);
57
+ const received = this.utils.printReceived(got);
58
+ return {
59
+ pass: false,
60
+ message: () => `Expected: ${expected}\nReceived: ${received}`,
61
+ };
62
+ },
63
+ });
64
+
65
+ const runtime = runtimeFor('duckdb');
66
+
67
+ interface TestAnnotation {
68
+ inherits?: TestAnnotation;
69
+ blockNotes?: string[];
70
+ notes: string[];
71
+ }
72
+
73
+ function unTestify(ta: TestAnnotation): Annotation {
74
+ const dloc = {
75
+ url: __filename,
76
+ range: {start: {character: 0, line: 0}, end: {character: 0, line: 0}},
77
+ };
78
+ const ret: Annotation = {
79
+ notes: ta.notes.map(t => {
80
+ return {text: t, at: dloc};
81
+ }),
82
+ };
83
+ if (ta.blockNotes) {
84
+ ret.blockNotes = ta.blockNotes.map(t => {
85
+ return {text: t, at: dloc};
86
+ });
87
+ }
88
+ if (ta.inherits) {
89
+ ret.inherits = unTestify(ta.inherits);
90
+ }
91
+ return ret;
92
+ }
93
+
94
+ class TestTags extends Tags {
95
+ constructor(ta: TestAnnotation) {
96
+ super(unTestify(ta));
97
+ }
98
+ }
99
+
100
+ function tstTaglist(a: TestAnnotation): string[] {
101
+ return new TestTags(a).getTagList();
28
102
  }
29
103
 
30
104
  function tstTagParse(s: string): MalloyTags {
31
- return new Tags({notes: [s]}).getMalloyTags();
105
+ return new TestTags({notes: [s]}).getMalloyTags();
32
106
  }
33
107
 
34
108
  describe('tag utilities', () => {
@@ -122,18 +196,158 @@ describe('tag utilities', () => {
122
196
  });
123
197
  });
124
198
 
125
- import {runtimeFor} from './runtimes';
199
+ type TagTestTuple = [string, TagDict];
200
+ describe('tagParse to Tag', () => {
201
+ const tagTests: TagTestTuple[] = [
202
+ ['just_name', {just_name: {}}],
203
+ ['name=bare_string', {name: {eq: 'bare_string'}}],
204
+ ['name="quoted_string"', {name: {eq: 'quoted_string'}}],
205
+ ['name {prop1}', {name: {properties: {prop1: {}}}}],
206
+ [
207
+ 'name {prop1 prop2=value}',
208
+ {
209
+ name: {
210
+ properties: {
211
+ prop1: {},
212
+ prop2: {eq: 'value'},
213
+ },
214
+ },
215
+ },
216
+ ],
217
+ ['name.prop', {name: {properties: {prop: {}}}}],
218
+ ['name.prop=value', {name: {properties: {prop: {eq: 'value'}}}}],
219
+ [
220
+ 'name.prop.sub=value',
221
+ {name: {properties: {prop: {properties: {sub: {eq: 'value'}}}}}},
222
+ ],
223
+ [
224
+ 'name{first3=[a, b, c]}',
225
+ {name: {properties: {first3: {eq: [{eq: 'a'}, {eq: 'b'}, {eq: 'c'}]}}}},
226
+ ],
227
+ ['name{first1=[a,]}', {name: {properties: {first1: {eq: [{eq: 'a'}]}}}}],
228
+ [
229
+ 'name{first=[a {A}]}',
230
+ {name: {properties: {first: {eq: [{eq: 'a', properties: {A: {}}}]}}}},
231
+ ],
232
+ [
233
+ 'name{first=[{A}]}',
234
+ {name: {properties: {first: {eq: [{properties: {A: {}}}]}}}},
235
+ ],
236
+ ['name=value {prop}', {name: {eq: 'value', properties: {prop: {}}}}],
237
+ [
238
+ 'name.prop={prop2}',
239
+ {name: {properties: {prop: {properties: {prop2: {}}}}}},
240
+ ],
241
+ ['no yes -no', {yes: {}}],
242
+ ['x={y z} -x.y', {x: {properties: {z: {}}}}],
243
+ ['x={y z} x {-y}', {x: {properties: {z: {}}}}],
244
+ ['x=1 x {xx=11}', {x: {eq: '1', properties: {xx: {eq: '11'}}}}],
245
+ ['x.y=xx x=1 {...}', {x: {eq: '1', properties: {y: {eq: 'xx'}}}}],
246
+ ['a {b c} a=1', {a: {eq: '1'}}],
247
+ ['a=1 a=...{b}', {a: {eq: '1', properties: {b: {}}}}],
248
+ [
249
+ 'a=red { shade=dark } color=$(a) shade=$(a.shade)',
250
+ {
251
+ a: {eq: 'red', properties: {shade: {eq: 'dark'}}},
252
+ color: {eq: 'red', properties: {shade: {eq: 'dark'}}},
253
+ shade: {eq: 'dark'},
254
+ },
255
+ ],
256
+ ];
257
+ test.each(tagTests)('tag %s', (expression: string, expected: TagDict) => {
258
+ expect(expression).tagsAre(expected);
259
+ });
260
+ test('uncomment to debug just one of the expressions', () => {
261
+ const x: TagTestTuple = ['a=a b=$(a)', {a: {eq: 'a'}, b: {eq: 'a'}}];
262
+ expect(x[0]).tagsAre(x[1]);
263
+ });
264
+ });
126
265
 
127
- const runtime = runtimeFor('duckdb');
266
+ describe('Tag access', () => {
267
+ test('just text', () => {
268
+ const strToParse = 'a=b';
269
+ const getTags = Tag.fromTagline(strToParse, undefined);
270
+ expect(getTags.log).toEqual([]);
271
+ const a = getTags.tag.tag('a');
272
+ expect(a).toBeDefined();
273
+ expect(a?.text()).toEqual('b');
274
+ });
275
+ test('tag path', () => {
276
+ const strToParse = 'a.b.c.d.e=f';
277
+ const tagParse = Tag.fromTagline(strToParse, undefined);
278
+ expect(tagParse.log).toEqual([]);
279
+ const abcde = tagParse.tag.tag('a', 'b', 'c', 'd', 'e');
280
+ expect(abcde).toBeDefined();
281
+ expect(abcde?.text()).toEqual('f');
282
+ });
283
+ test('just array', () => {
284
+ const strToParse = 'a=[b]';
285
+ const getTags = Tag.fromTagline(strToParse, undefined);
286
+ expect(getTags.log).toEqual([]);
287
+ const a = getTags.tag.tag('a');
288
+ const aval = a?.array();
289
+ expect(aval).toBeDefined();
290
+ if (aval) {
291
+ expect(aval.length).toEqual(1);
292
+ expect(aval[0].text()).toEqual('b');
293
+ }
294
+ });
295
+ test('array as text', () => {
296
+ const strToParse = 'a=[b]';
297
+ const getTags = Tag.fromTagline(strToParse, undefined);
298
+ expect(getTags.log).toEqual([]);
299
+ const a = getTags.tag.tag('a');
300
+ expect(a).toBeDefined();
301
+ expect(a?.text()).toEqual('');
302
+ });
303
+ test('text as array', () => {
304
+ const strToParse = 'a=b';
305
+ const getTags = Tag.fromTagline(strToParse, undefined);
306
+ expect(getTags.log).toEqual([]);
307
+ const a = getTags.tag.tag('a');
308
+ expect(a).toBeDefined();
309
+ expect(a?.array()).toEqual([]);
310
+ });
311
+ test('just numeric', () => {
312
+ const strToParse = 'a=7';
313
+ const getTags = Tag.fromTagline(strToParse, undefined);
314
+ expect(getTags.log).toEqual([]);
315
+ const a = getTags.tag.tag('a');
316
+ expect(a).toBeDefined();
317
+ const n = a?.numeric();
318
+ expect(typeof n).toBe('number');
319
+ expect(n).toEqual(7);
320
+ });
321
+ test('text as numeric', () => {
322
+ const strToParse = 'a=seven';
323
+ const getTags = Tag.fromTagline(strToParse, undefined);
324
+ expect(getTags.log).toEqual([]);
325
+ const a = getTags.tag.tag('a');
326
+ expect(a).toBeDefined();
327
+ const n = a?.numeric();
328
+ expect(typeof n).toBe('number');
329
+ expect(n).toBeNaN();
330
+ });
331
+ test('array as numeric', () => {
332
+ const strToParse = 'a=[seven]';
333
+ const getTags = Tag.fromTagline(strToParse, undefined);
334
+ expect(getTags.log).toEqual([]);
335
+ const a = getTags.tag.tag('a');
336
+ expect(a).toBeDefined();
337
+ const n = a?.numeric();
338
+ expect(typeof n).toBe('number');
339
+ expect(n).toBeNaN();
340
+ });
341
+ });
128
342
 
129
343
  describe('## top level', () => {
130
344
  test('top level tags are available in the model def', async () => {
131
345
  const model = await runtime
132
346
  .loadModel(
133
347
  `
134
- ## propertyTag
135
- ##" Doc String
136
- `
348
+ ## propertyTag
349
+ ##" Doc String
350
+ `
137
351
  )
138
352
  .getModel();
139
353
  const modelDesc = model.getTags().getMalloyTags();
@@ -141,16 +355,18 @@ describe('## top level', () => {
141
355
  properties: {propertyTag: true},
142
356
  docStrings: ['Doc String\n'],
143
357
  });
358
+ const modelTagLine = model.tagParse().tag;
359
+ expect(modelTagLine.has('propertyTag')).toBeTruthy();
144
360
  });
145
361
  });
146
362
  describe('tags in results', () => {
147
363
  test('nameless query', async () => {
148
364
  const loaded = runtime.loadQuery(
149
365
  `
150
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
151
- # b4query
152
- query: # afterQuery
153
- from_sql(one) -> { project: * }`
366
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
367
+ # b4query
368
+ query: # afterQuery
369
+ from_sql(one) -> { project: * }`
154
370
  );
155
371
  const query = await loaded.getPreparedQuery();
156
372
  expect(query).toBeDefined();
@@ -158,120 +374,134 @@ describe('tags in results', () => {
158
374
  expect(query.getTags().getTagList()).toEqual(wantTags);
159
375
  const result = await loaded.run();
160
376
  expect(result.getTags().getTagList()).toEqual(wantTags);
377
+ const queryTags = result.tagParse().tag;
378
+ expect(queryTags).tagsAre({b4query: {}, afterQuery: {}});
161
379
  });
162
- const wantTags = ['# <Q\n', '# >Q\n', '# >name\n', '# >is\n'];
380
+ const wantTags = ['# BQ\n', '# AQ\n', '# Bis\n', '# Ais\n'];
381
+ const wantTag = {BQ: {}, AQ: {}, Bis: {}, Ais: {}};
163
382
  test('named query', async () => {
164
383
  const loaded = runtime.loadQuery(
165
384
  `
166
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
167
- # <Q
168
- query: # >Q
169
- theName
170
- # >name
171
- is
172
- # >is
173
- from_sql(one) -> { project: * }
174
- query: -> theName`
385
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
386
+ # BQ
387
+ query: # AQ
388
+ theName
389
+ # Bis
390
+ is
391
+ # Ais
392
+ from_sql(one) -> { project: * }
393
+ query: -> theName`
175
394
  );
176
395
  const query = await loaded.getPreparedQuery();
177
396
  expect(query).toBeDefined();
178
- const wantTags = ['# <Q\n', '# >Q\n', '# >name\n', '# >is\n'];
179
397
  expect(query.getTags().getTagList()).toEqual(wantTags);
180
398
  const result = await loaded.run();
181
399
  expect(result.getTags().getTagList()).toEqual(wantTags);
400
+ expect(result.tagParse().tag).tagsAre(wantTag);
182
401
  });
183
402
  test('turtle query', async () => {
184
403
  const loaded = runtime.loadQuery(
185
404
  `
186
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
187
- query: from_sql(one) + {
188
- # <Q
189
- query: # >Q
190
- in_one
191
- # >name
192
- is
193
- # >is
194
- { project: one }
195
- }
196
- -> in_one`
405
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
406
+ query: from_sql(one) + {
407
+ # BQ
408
+ query: # AQ
409
+ in_one
410
+ # Bis
411
+ is
412
+ # Ais
413
+ { project: one }
414
+ }
415
+ -> in_one`
197
416
  );
198
417
  const query = await loaded.getPreparedQuery();
199
418
  expect(query).toBeDefined();
200
419
  expect(query.getTags().getTagList()).toEqual(wantTags);
420
+ expect(query.tagParse().tag).tagsAre(wantTag);
201
421
  const result = await loaded.run();
202
- expect(result.getTags().getTagList()).toEqual(wantTags);
422
+ const tl = result.getTags().getTagList();
423
+ expect(tl).toEqual(wantTags);
424
+ expect(result.tagParse().tag).tagsAre(wantTag);
203
425
  });
204
426
  test('atomic field has tag', async () => {
205
427
  const loaded = runtime.loadQuery(
206
428
  `
207
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
208
- query: from_sql(one) -> {
209
- project:
210
- # note1
211
- one
212
- }`
429
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
430
+ query: from_sql(one) -> {
431
+ project:
432
+ # note1
433
+ one
434
+ }`
213
435
  );
214
436
  const result = await loaded.run();
215
437
  const shape = result.resultExplore;
216
438
  const one = shape.getFieldByName('one');
217
439
  expect(one).toBeDefined();
218
440
  expect(one.getTags().getTagList()).toEqual(['# note1\n']);
441
+ expect(one.tagParse().tag).tagsAre({note1: {}});
219
442
  });
220
443
  test('nested query has tag', async () => {
221
444
  const loaded = runtime.loadQuery(
222
445
  `
223
- sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
224
- source: malloy_one is from_sql(one) + {
225
- query: in_one is {
226
- project: one
227
- }
228
- query: one_and_one is {
229
- group_by: one
230
- # note1
231
- nest:
232
- # note2
233
- in_one
446
+ sql: one is {connection: "duckdb" select: """SELECT 1 as one"""}
447
+ source: malloy_one is from_sql(one) + {
448
+ query: in_one is {
449
+ project: one
450
+ }
451
+ query: one_and_one is {
452
+ group_by: one
453
+ # note1
454
+ nest:
455
+ # note2
456
+ in_one
457
+ }
234
458
  }
235
- }
236
- query: malloy_one -> one_and_one`
459
+ query: malloy_one -> one_and_one`
237
460
  );
238
461
  const result = await loaded.run();
239
462
  const shape = result.resultExplore;
240
463
  const one = shape.getFieldByName('in_one');
241
464
  expect(one).toBeDefined();
242
465
  expect(one.getTags().getTagList()).toEqual(['# note1\n', '# note2\n']);
466
+ expect(one.tagParse().tag).tagsAre({note1: {}, note2: {}});
243
467
  });
244
468
  test('render usage test case', async () => {
245
469
  const loaded = runtime.loadQuery(
246
470
  `
247
- sql: one22 is { connection: "duckdb" select: """SELECT 1""" }
248
- source: ages is from_sql(one22) + {
249
- dimension: name is 'John'
250
- query: height
251
- # barchart
252
- is {
253
- project: heightd is 10
254
- }
471
+ sql: one22 is { connection: "duckdb" select: """SELECT 1""" }
472
+ source: ages is from_sql(one22) + {
473
+ dimension: name is 'John'
474
+ query: height
475
+ # barchart
476
+ is {
477
+ project: heightd is 10
478
+ }
255
479
 
256
- query: age
257
- # barchart
258
- is {
259
- project: aged is 20
260
- }
480
+ query: age
481
+ # barchart
482
+ is {
483
+ project: aged is 20
484
+ }
261
485
 
262
- }
263
- query: ages -> {
264
- group_by: name
265
- nest: height
266
- nest: age
267
- }
268
- `
486
+ }
487
+ query: ages -> {
488
+ group_by: name
489
+ nest: height
490
+ nest: age
491
+ }
492
+ `
269
493
  );
270
494
  const result = await loaded.run();
271
495
  const shape = result.resultExplore;
272
- const ht = shape.getFieldByName('height').getTags().getMalloyTags();
273
- const at = shape.getFieldByName('age').getTags().getMalloyTags();
274
- expect(ht).toMatchObject({properties: {barchart: true}});
275
- expect(at).toMatchObject({properties: {barchart: true}});
496
+ const height = shape.getFieldByName('height');
497
+ const age = shape.getFieldByName('age');
498
+ expect(height.getTags().getMalloyTags()).toMatchObject({
499
+ properties: {barchart: true},
500
+ });
501
+ expect(height.tagParse().tag).tagsAre({barchart: {}});
502
+ expect(age.getTags().getMalloyTags()).toMatchObject({
503
+ properties: {barchart: true},
504
+ });
505
+ expect(age.tagParse().tag).tagsAre({barchart: {}});
276
506
  });
277
507
  });