modl 0.3.11 → 0.3.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/grammar_tests/base_tests.json +81 -71
- data/lib/modl/parser/class_processor.rb +2 -0
- data/lib/modl/parser/file_importer.rb +5 -1
- data/lib/modl/parser/interpreter.rb +4 -0
- data/lib/modl/parser/object_cache.rb +11 -0
- data/lib/modl/parser/orphan_handler.rb +100 -0
- data/lib/modl/parser/parsed.rb +2 -1
- data/lib/modl/parser/ref_processor.rb +1 -1
- data/lib/modl/parser/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1827bb8abaccc7771bf7ea845006a499b798f37f7697949efec86d539df88815
|
4
|
+
data.tar.gz: c534d0b8a027287698d2a624c664ec19cced108a579b2b52f0518c8d9a09a2c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4d4d737f13ad9508ba7fcdc5a9187d457d6eb03fa445b9f934eaa982c4cb36fd5f114f9b4a039c8dc8015facb2dda1b8816327b56fcd346619ea534ded83b59e
|
7
|
+
data.tar.gz: d668afa32aedf30f3ebf949a1a8f64962986c558a122c5b2d1b0b8c84c495e8fa5bce7b5a729c7a2b4f44044dac6d3bb1871268806f972f8a7967d0916a1d443
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
0.3.12
|
2
|
+
===
|
3
|
+
- Use file cache on load error - GitHub issue #20
|
4
|
+
- Error converting value to number - GitHub issue #21
|
5
|
+
- Problem with punycode - GitHub issue #22
|
6
|
+
- Handle orphan pairs - adopt then into a map
|
7
|
+
|
1
8
|
0.3.11
|
2
9
|
===
|
3
10
|
- Support conditional file loading.
|
@@ -393,7 +393,7 @@
|
|
393
393
|
{
|
394
394
|
"id": "42",
|
395
395
|
"input": "*class(*id=object;*superclass=arr);sales(name=John Smith;telephone=44800 555 555);service(name=Jim Brown;telephone=44800 666 666)",
|
396
|
-
"expected_output": "
|
396
|
+
"expected_output": "{\n \"sales\": {\n \"name\": \"John Smith\",\n \"telephone\": \"44800 555 555\"\n },\n \"service\": {\n \"name\": \"Jim Brown\",\n \"telephone\": \"44800 666 666\"\n }\n}",
|
397
397
|
"tested_features": [
|
398
398
|
"class"
|
399
399
|
],
|
@@ -474,7 +474,7 @@
|
|
474
474
|
{
|
475
475
|
"id": "51",
|
476
476
|
"input": "?=one:two:three;test1=%0;test2=%1;test3=%2;test4=%3;test5=%4;test6=%5;test7=%6;test8=%7;test9=%8",
|
477
|
-
"expected_output": "
|
477
|
+
"expected_output": "{\n \"test1\": \"one\",\n \"test2\": \"two\",\n \"test3\": \"three\",\n \"test4\": \"%3\",\n \"test5\": \"%4\",\n \"test6\": \"%5\",\n \"test7\": \"%6\",\n \"test8\": \"%7\",\n \"test9\": \"%8\"\n}",
|
478
478
|
"tested_features": [
|
479
479
|
"object_ref"
|
480
480
|
],
|
@@ -483,7 +483,7 @@
|
|
483
483
|
{
|
484
484
|
"id": "52",
|
485
485
|
"input": "a=1:2:3;b=4:5:6",
|
486
|
-
"expected_output": "
|
486
|
+
"expected_output": "{\n \"a\": [\n 1,\n 2,\n 3\n ],\n \"b\": [\n 4,\n 5,\n 6\n ]\n}",
|
487
487
|
"tested_features": [
|
488
488
|
"nbArray"
|
489
489
|
],
|
@@ -510,7 +510,7 @@
|
|
510
510
|
{
|
511
511
|
"id": "55",
|
512
512
|
"input": "a=1:2:3;\nb=4:5:6",
|
513
|
-
"expected_output": "
|
513
|
+
"expected_output": "{\n \"a\": [\n 1,\n 2,\n 3\n ],\n \"b\": [\n 4,\n 5,\n 6\n ]\n}",
|
514
514
|
"tested_features": [
|
515
515
|
"nbArray"
|
516
516
|
],
|
@@ -528,7 +528,7 @@
|
|
528
528
|
{
|
529
529
|
"id": "57",
|
530
530
|
"input": "a=1:2:3\n;\nb=4:5:6",
|
531
|
-
"expected_output": "
|
531
|
+
"expected_output": "{\n \"a\": [\n 1,\n 2,\n 3\n ],\n \"b\": [\n 4,\n 5,\n 6\n ]\n}",
|
532
532
|
"tested_features": [
|
533
533
|
"nbArray"
|
534
534
|
],
|
@@ -546,7 +546,7 @@
|
|
546
546
|
{
|
547
547
|
"id": "59",
|
548
548
|
"input": "a(b(c(d(e(f=1)))));\ntesting=%a.b.c.d.e.f",
|
549
|
-
"expected_output": "
|
549
|
+
"expected_output": "{\n \"a\": {\n \"b\": {\n \"c\": {\n \"d\": {\n \"e\": {\n \"f\": 1\n }\n }\n }\n }\n },\n \"testing\": 1\n}",
|
550
550
|
"tested_features": [
|
551
551
|
"object_ref"
|
552
552
|
],
|
@@ -564,7 +564,7 @@
|
|
564
564
|
{
|
565
565
|
"id": "61",
|
566
566
|
"input": "a=\nb\n=c;\nd=e",
|
567
|
-
"expected_output": "
|
567
|
+
"expected_output": "{\n \"a\": {\n \"b\": \"c\"\n },\n \"d\": \"e\"\n}",
|
568
568
|
"tested_features": [
|
569
569
|
"map"
|
570
570
|
],
|
@@ -573,7 +573,7 @@
|
|
573
573
|
{
|
574
574
|
"id": "62",
|
575
575
|
"input": "test=this is a #hashtag test;test2=#testing 123",
|
576
|
-
"expected_output": "
|
576
|
+
"expected_output": "{\n \"test\": \"this is a #hashtag test\",\n \"test2\": \"#testing 123\"\n}",
|
577
577
|
"tested_features": [
|
578
578
|
"pair"
|
579
579
|
],
|
@@ -609,7 +609,7 @@
|
|
609
609
|
{
|
610
610
|
"id": "66",
|
611
611
|
"input": "country=gb;\nx=[{ country=gb ? this /country=us? that }]",
|
612
|
-
"expected_output": "
|
612
|
+
"expected_output": "{\n \"country\": \"gb\",\n \"x\": [\n \"this\"\n ]\n}",
|
613
613
|
"tested_features": [
|
614
614
|
"object_ref",
|
615
615
|
"conditional"
|
@@ -628,12 +628,12 @@
|
|
628
628
|
},
|
629
629
|
{
|
630
630
|
"id": "68",
|
631
|
-
"input": "a=1;b=2;
|
632
|
-
"expected_output": "
|
631
|
+
"input": "a=1;b=2;c={{a=1}|{b=2}?true/?false}",
|
632
|
+
"expected_output": "{\n \"a\": 1,\n \"b\": 2,\n \"c\": true\n}",
|
633
633
|
"tested_features": [
|
634
634
|
"conditional"
|
635
635
|
],
|
636
|
-
"minimised_modl": "a=1;b=2;
|
636
|
+
"minimised_modl": "a=1;b=2;c={{a=1}|{b=2}?true/?false}"
|
637
637
|
},
|
638
638
|
{
|
639
639
|
"id": "69",
|
@@ -658,7 +658,7 @@
|
|
658
658
|
{
|
659
659
|
"id": "71",
|
660
660
|
"input": "_testing = quick-test of John's variable_methods;\nupcase_example = %testing.u;\ndowncase_example = %testing.d;\ninitcap_example = %testing.i;\nsentence_example = %testing.s;\nurl_encode_example = %testing.u.e",
|
661
|
-
"expected_output": "
|
661
|
+
"expected_output": "{\n \"upcase_example\": \"QUICK-TEST OF JOHN'S VARIABLE_METHODS\",\n \"downcase_example\": \"quick-test of john's variable_methods\",\n \"initcap_example\": \"Quick-test Of John's Variable_methods\",\n \"sentence_example\": \"Quick-test of John's variable_methods\",\n \"url_encode_example\": \"QUICK-TEST+OF+JOHN%27S+VARIABLE_METHODS\"\n}",
|
662
662
|
"tested_features": [
|
663
663
|
"string_method"
|
664
664
|
],
|
@@ -746,7 +746,7 @@
|
|
746
746
|
{
|
747
747
|
"id": "80",
|
748
748
|
"input": "_root=tesco.com;\n_branch=direct.;\nnamespace1=%branch%numrecord.%root;\nnamespace2=%branch%_%root%.numq.net",
|
749
|
-
"expected_output": "
|
749
|
+
"expected_output": "{\n \"namespace1\": \"direct.numrecord.tesco.com\",\n \"namespace2\": \"direct._tesco.com.numq.net\"\n}",
|
750
750
|
"tested_features": [
|
751
751
|
"object_ref",
|
752
752
|
"graves"
|
@@ -882,7 +882,7 @@
|
|
882
882
|
{
|
883
883
|
"id": "94",
|
884
884
|
"input": "_co=at;\n_l=de;\n{\n co=at?\n country=Austria\n language={\n l=fr?\n French\n /l=de?\n German\n /?\n Other\n }\n /?\n country=Other\n}",
|
885
|
-
"expected_output": "
|
885
|
+
"expected_output": "{\n \"country\": \"Austria\",\n \"language\": \"German\"\n}",
|
886
886
|
"tested_features": [
|
887
887
|
"conditional"
|
888
888
|
],
|
@@ -891,7 +891,7 @@
|
|
891
891
|
{
|
892
892
|
"id": "95",
|
893
893
|
"input": "true2 = 01;\ntrue1 = true;\nfalse2 = 00;\nfalse1 = false;\nnull2 = 000;\nnull1 = null",
|
894
|
-
"expected_output": "
|
894
|
+
"expected_output": "{\n \"true2\": true,\n \"true1\": true,\n \"false2\": false,\n \"false1\": false,\n \"null2\": null,\n \"null1\": null\n}",
|
895
895
|
"tested_features": [
|
896
896
|
"bool",
|
897
897
|
"map",
|
@@ -1075,7 +1075,7 @@
|
|
1075
1075
|
{
|
1076
1076
|
"id": "114",
|
1077
1077
|
"input": "?[[a;b;c];[one;two;three]];letters=%0;numbers=%1",
|
1078
|
-
"expected_output": "
|
1078
|
+
"expected_output": "{\n \"letters\": [\n \"a\",\n \"b\",\n \"c\"\n ],\n \"numbers\": [\n \"one\",\n \"two\",\n \"three\"\n ]\n}",
|
1079
1079
|
"tested_features": [
|
1080
1080
|
"object_ref"
|
1081
1081
|
],
|
@@ -1084,7 +1084,7 @@
|
|
1084
1084
|
{
|
1085
1085
|
"id": "115",
|
1086
1086
|
"input": "?=[a;b;c]:[one;two;three];letters=%0;numbers=%1",
|
1087
|
-
"expected_output": "
|
1087
|
+
"expected_output": "{\n \"letters\": [\n \"a\",\n \"b\",\n \"c\"\n ],\n \"numbers\": [\n \"one\",\n \"two\",\n \"three\"\n ]\n}",
|
1088
1088
|
"tested_features": [
|
1089
1089
|
"object_ref"
|
1090
1090
|
],
|
@@ -1130,7 +1130,7 @@
|
|
1130
1130
|
{
|
1131
1131
|
"id": "120",
|
1132
1132
|
"input": "?[zero;one;two];\nfirst_var=%0;\nsecond_var=%1;\nthird_var=%2",
|
1133
|
-
"expected_output": "
|
1133
|
+
"expected_output": "{\n \"first_var\": \"zero\",\n \"second_var\": \"one\",\n \"third_var\": \"two\"\n}",
|
1134
1134
|
"tested_features": [
|
1135
1135
|
"object_ref"
|
1136
1136
|
],
|
@@ -1321,7 +1321,7 @@
|
|
1321
1321
|
{
|
1322
1322
|
"id": "140",
|
1323
1323
|
"input": "?=0:1:2;\nzero=%0;\none=%1;\ntwo=%2",
|
1324
|
-
"expected_output": "
|
1324
|
+
"expected_output": "{\n \"zero\": 0,\n \"one\": 1,\n \"two\": 2\n}",
|
1325
1325
|
"tested_features": [
|
1326
1326
|
"object_ref"
|
1327
1327
|
],
|
@@ -1330,7 +1330,7 @@
|
|
1330
1330
|
{
|
1331
1331
|
"id": "141",
|
1332
1332
|
"input": "?=a:b:c;\nzero=%0;\none=%1;\ntwo=%2\n",
|
1333
|
-
"expected_output": "
|
1333
|
+
"expected_output": "{\n \"zero\": \"a\",\n \"one\": \"b\",\n \"two\": \"c\"\n}",
|
1334
1334
|
"tested_features": [
|
1335
1335
|
"object_ref"
|
1336
1336
|
],
|
@@ -1505,7 +1505,7 @@
|
|
1505
1505
|
{
|
1506
1506
|
"id": "159",
|
1507
1507
|
"input": "COUNTRY=gb;\ncountry=The country is %COUNTRY",
|
1508
|
-
"expected_output": "
|
1508
|
+
"expected_output": "{\n \"COUNTRY\": \"gb\",\n \"country\": \"The country is gb\"\n}",
|
1509
1509
|
"tested_features": [
|
1510
1510
|
"object_ref"
|
1511
1511
|
],
|
@@ -1658,12 +1658,12 @@
|
|
1658
1658
|
},
|
1659
1659
|
{
|
1660
1660
|
"id": "175",
|
1661
|
-
"input": "*L=\"https://www.modl.uk/tests/message-thread.txt\";\n\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool
|
1661
|
+
"input": "*L=\"https://www.modl.uk/tests/message-thread.txt\";\n[\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool!\n]",
|
1662
1662
|
"expected_output": "[\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Hello, how are you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi, good thanks\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"How about you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Yes, fine thanks. What are you up to?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Just testing out MODL\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Cool!\",\n \"method\": \"sms\"\n }\n }\n]",
|
1663
1663
|
"tested_features": [
|
1664
1664
|
"load"
|
1665
1665
|
],
|
1666
|
-
"minimised_modl": "*L=\"https://www.modl.uk/demo/message-thread.txt\";m=out:2018-03-22 15~:25:Hi;m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!"
|
1666
|
+
"minimised_modl": "*L=\"https://www.modl.uk/demo/message-thread.txt\";[m=out:2018-03-22 15~:25:Hi;m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!]"
|
1667
1667
|
},
|
1668
1668
|
{
|
1669
1669
|
"id": "176",
|
@@ -1746,18 +1746,18 @@
|
|
1746
1746
|
},
|
1747
1747
|
{
|
1748
1748
|
"id": "184",
|
1749
|
-
"input": "*L=grammar_tests/demo_config;\n\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool
|
1749
|
+
"input": "*L=grammar_tests/demo_config;\n[\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool!\n]",
|
1750
1750
|
"expected_output": "[\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Hello, how are you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi, good thanks\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"How about you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Yes, fine thanks. What are you up to?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Just testing out MODL\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Cool!\",\n \"method\": \"sms\"\n }\n }\n]",
|
1751
1751
|
"tested_features": [
|
1752
1752
|
"object_ref",
|
1753
1753
|
"load"
|
1754
1754
|
],
|
1755
|
-
"minimised_modl": "*L=grammar_tests/demo_config;m=out:2018-03-22 15~:25:Hi;m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!"
|
1755
|
+
"minimised_modl": "*L=grammar_tests/demo_config;m=out:2018-03-22 15~:25:Hi;[m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!]"
|
1756
1756
|
},
|
1757
1757
|
{
|
1758
1758
|
"id": "185",
|
1759
1759
|
"input": "## country\n_c = us;\n## language\n_l = en;\n\n*L=grammar_tests/import_config.modl;\n\ncountry = %c;\nlanguage = %l;\ntime_zone = %tz",
|
1760
|
-
"expected_output": "
|
1760
|
+
"expected_output": "{\n \"country\": \"us\",\n \"language\": \"en\",\n \"time_zone\": \"EST\"\n}",
|
1761
1761
|
"tested_features": [
|
1762
1762
|
"object_ref",
|
1763
1763
|
"load",
|
@@ -1767,13 +1767,13 @@
|
|
1767
1767
|
},
|
1768
1768
|
{
|
1769
1769
|
"id": "186",
|
1770
|
-
"input": "*L=grammar_tests/test_import_dir/test_import.txt;\n\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool
|
1770
|
+
"input": "*L=grammar_tests/test_import_dir/test_import.txt;\n[\nm=out:2018-03-22 15\\:25:Hi;\nm=in:2018-03-22 15\\:26:Hello, how are you?;\nm=out:2018-03-22 15\\:25:Hi, good thanks;\nm=out:2018-03-22 15\\:26:How about you?;\nm=in:2018-03-22 15\\:26:Yes, fine thanks. What are you up to?;\nm=out:2018-03-22 15\\:25:Just testing out MODL;\nm=in:2018-03-22 15\\:26:Cool!\n]",
|
1771
1771
|
"expected_output": "[\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Hello, how are you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Hi, good thanks\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"How about you?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Yes, fine thanks. What are you up to?\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"out\",\n \"date_time\": \"2018-03-22 15:25\",\n \"message\": \"Just testing out MODL\",\n \"method\": \"sms\"\n }\n },\n {\n \"message\": {\n \"direction\": \"in\",\n \"date_time\": \"2018-03-22 15:26\",\n \"message\": \"Cool!\",\n \"method\": \"sms\"\n }\n }\n]",
|
1772
1772
|
"tested_features": [
|
1773
1773
|
"object_ref",
|
1774
1774
|
"load"
|
1775
1775
|
],
|
1776
|
-
"minimised_modl": "*L=grammar_tests/test_import_dir/test_import.txt;m=out:2018-03-22 15~:25:Hi;m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!"
|
1776
|
+
"minimised_modl": "*L=grammar_tests/test_import_dir/test_import.txt;[m=out:2018-03-22 15~:25:Hi;m=in:2018-03-22 15~:26:Hello, how are you?;m=out:2018-03-22 15~:25:Hi, good thanks;m=out:2018-03-22 15~:26:How about you?;m=in:2018-03-22 15~:26:Yes, fine thanks. What are you up to?;m=out:2018-03-22 15~:25:Just testing out MODL;m=in:2018-03-22 15~:26:Cool!]"
|
1777
1777
|
},
|
1778
1778
|
{
|
1779
1779
|
"id": "187",
|
@@ -1817,7 +1817,7 @@
|
|
1817
1817
|
{
|
1818
1818
|
"id": "191",
|
1819
1819
|
"input": "one=1;two=2;three=3",
|
1820
|
-
"expected_output": "
|
1820
|
+
"expected_output": "{\n \"one\": 1,\n \"two\": 2,\n \"three\": 3\n}",
|
1821
1821
|
"tested_features": [
|
1822
1822
|
"map",
|
1823
1823
|
"pair"
|
@@ -1836,14 +1836,14 @@
|
|
1836
1836
|
},
|
1837
1837
|
{
|
1838
1838
|
"id": "193",
|
1839
|
-
"input": "R=0;\
|
1840
|
-
"expected_output": "
|
1839
|
+
"input": "R=0;\nnumber1=1;number2=2;number3=3",
|
1840
|
+
"expected_output": "{\n \"R\": 0,\n \"number1\": 1,\n \"number2\": 2,\n \"number3\": 3\n}",
|
1841
1841
|
"tested_features": [
|
1842
1842
|
"map",
|
1843
1843
|
"array",
|
1844
1844
|
"pair"
|
1845
1845
|
],
|
1846
|
-
"minimised_modl": "R=0;
|
1846
|
+
"minimised_modl": "R=0;number1=1;number2=2;number3=3"
|
1847
1847
|
},
|
1848
1848
|
{
|
1849
1849
|
"id": "194",
|
@@ -1935,23 +1935,23 @@
|
|
1935
1935
|
},
|
1936
1936
|
{
|
1937
1937
|
"id": "203",
|
1938
|
-
"input": "
|
1939
|
-
"expected_output": "
|
1938
|
+
"input": "o1(n=test);\no2(n=test2)",
|
1939
|
+
"expected_output": "{\n \"o1\": {\n \"n\": \"test\"\n },\n \"o2\": {\n \"n\": \"test2\"\n }\n}",
|
1940
1940
|
"tested_features": [
|
1941
1941
|
"map",
|
1942
1942
|
"array"
|
1943
1943
|
],
|
1944
|
-
"minimised_modl": "
|
1944
|
+
"minimised_modl": "o1(n=test);o2(n=test2)"
|
1945
1945
|
},
|
1946
1946
|
{
|
1947
1947
|
"id": "204",
|
1948
|
-
"input": "
|
1949
|
-
"expected_output": "
|
1948
|
+
"input": "o1(n=test);o2(n=test2)",
|
1949
|
+
"expected_output": "{\n \"o1\": {\n \"n\": \"test\"\n },\n \"o2\": {\n \"n\": \"test2\"\n }\n}",
|
1950
1950
|
"tested_features": [
|
1951
1951
|
"map",
|
1952
1952
|
"array"
|
1953
1953
|
],
|
1954
|
-
"minimised_modl": "
|
1954
|
+
"minimised_modl": "o1(n=test);o2(n=test2)"
|
1955
1955
|
},
|
1956
1956
|
{
|
1957
1957
|
"id": "205",
|
@@ -2139,8 +2139,8 @@
|
|
2139
2139
|
},
|
2140
2140
|
{
|
2141
2141
|
"id": "224",
|
2142
|
-
"input": "b=2
|
2143
|
-
"expected_output": "
|
2142
|
+
"input": "b=2;\nc=2;\nd=2;\ne=2;\na={\n {b=c & d=e}?\n v1:v2:v3\n /?\n v4:v5:v6\n }",
|
2143
|
+
"expected_output": "{\n \"b\": 2,\n \"c\": 2,\n \"d\": 2,\n \"e\": 2,\n \"a\": [\n \"v1\",\n \"v2\",\n \"v3\"\n ]\n}",
|
2144
2144
|
"tested_features": [
|
2145
2145
|
"conditional"
|
2146
2146
|
],
|
@@ -2310,13 +2310,13 @@
|
|
2310
2310
|
},
|
2311
2311
|
{
|
2312
2312
|
"id": "243",
|
2313
|
-
"input": "tony=hungry;\nneeds_food_1={tony=hungry?true/?false};\nneeds_food_2={!tony=hungry?false/?true};\nneeds_food_3={tony!=hungry?false/?true};\
|
2314
|
-
"expected_output": "
|
2313
|
+
"input": "tony=hungry;\nneeds_food_1={tony=hungry?true/?false};\nneeds_food_2={!tony=hungry?false/?true};\nneeds_food_3={tony!=hungry?false/?true};\nneeds_food_4={!tony!=hungry?true/?false}",
|
2314
|
+
"expected_output": "{\n \"tony\": \"hungry\",\n \"needs_food_1\": true,\n \"needs_food_2\": true,\n \"needs_food_3\": true,\n \"needs_food_4\": true\n}",
|
2315
2315
|
"tested_features": [
|
2316
2316
|
"object_ref",
|
2317
2317
|
"conditional"
|
2318
2318
|
],
|
2319
|
-
"minimised_modl": "tony=hungry
|
2319
|
+
"minimised_modl": "tony=hungry;needs_food_1={tony=hungry?true/?false};needs_food_2={!tony=hungry?false/?true};needs_food_3={tony!=hungry?false/?true};needs_food_4={!tony!=hungry?true/?false}"
|
2320
2320
|
},
|
2321
2321
|
{
|
2322
2322
|
"id": "244",
|
@@ -2370,12 +2370,12 @@
|
|
2370
2370
|
},
|
2371
2371
|
{
|
2372
2372
|
"id": "249",
|
2373
|
-
"input": "*class(\n *id=p;\n *name=person;\n *superclass=map;\n actions=[call;email]\n);\n*class(\n *id=c;\n *name=customer;\n *superclass=person;\n *assign=[\n [title;name;email]\n ]\n);\n*class(\n *id=e;\n *name=employee;\n *superclass=person;\n *assign=[\n [title;name;job_title;email]\n ]\n);\n\n## An employee:\ne=Mr:John Smith:Sales Director:john.smith@example.com;\n## A customer:\nc=Mr:Joe Bloggs:joe.bloggs@example.com;\n## Another customer:\nc=Mrs:Jane Wilson:jane.wilson@example.com",
|
2373
|
+
"input": "*class(\n *id=p;\n *name=person;\n *superclass=map;\n actions=[call;email]\n);\n*class(\n *id=c;\n *name=customer;\n *superclass=person;\n *assign=[\n [title;name;email]\n ]\n);\n*class(\n *id=e;\n *name=employee;\n *superclass=person;\n *assign=[\n [title;name;job_title;email]\n ]\n);\n[\n## An employee:\ne=Mr:John Smith:Sales Director:john.smith@example.com;\n## A customer:\nc=Mr:Joe Bloggs:joe.bloggs@example.com;\n## Another customer:\nc=Mrs:Jane Wilson:jane.wilson@example.com\n]",
|
2374
2374
|
"expected_output": "[\n {\n \"employee\": {\n \"title\": \"Mr\",\n \"name\": \"John Smith\",\n \"job_title\": \"Sales Director\",\n \"email\": \"john.smith@example.com\",\n \"actions\": [\n \"call\",\n \"email\"\n ]\n }\n },\n {\n \"customer\": {\n \"title\": \"Mr\",\n \"name\": \"Joe Bloggs\",\n \"email\": \"joe.bloggs@example.com\",\n \"actions\": [\n \"call\",\n \"email\"\n ]\n }\n },\n {\n \"customer\": {\n \"title\": \"Mrs\",\n \"name\": \"Jane Wilson\",\n \"email\": \"jane.wilson@example.com\",\n \"actions\": [\n \"call\",\n \"email\"\n ]\n }\n }\n]",
|
2375
2375
|
"tested_features": [
|
2376
2376
|
"class"
|
2377
2377
|
],
|
2378
|
-
"minimised_modl": "*class(*id=p;*name=person;*superclass=map;actions=[call;email]);*class(*id=c;*name=customer;*superclass=person;*assign=[[title;name;email]]);*class(*id=e;*name=employee;*superclass=person;*assign=[[title;name;job_title;email]])
|
2378
|
+
"minimised_modl": "*class(*id=p;*name=person;*superclass=map;actions=[call;email]);*class(*id=c;*name=customer;*superclass=person;*assign=[[title;name;email]]);*class(*id=e;*name=employee;*superclass=person;*assign=[[title;name;job_title;email]]);[## An employee:;e=Mr:John Smith:Sales Director:john.smith@example.com;## A customer:;c=Mr:Joe Bloggs:joe.bloggs@example.com;## Another customer:;c=Mrs:Jane Wilson:jane.wilson@example.com]"
|
2379
2379
|
},
|
2380
2380
|
{
|
2381
2381
|
"id": "250",
|
@@ -2429,7 +2429,7 @@
|
|
2429
2429
|
{
|
2430
2430
|
"id": "255",
|
2431
2431
|
"input": "*class(*id=a;*name=alpha);a=[1;2;3];b=4:5:6",
|
2432
|
-
"expected_output": "
|
2432
|
+
"expected_output": "{\n \"alpha\": [\n 1,\n 2,\n 3\n ],\n \"b\": [\n 4,\n 5,\n 6\n ]\n}",
|
2433
2433
|
"tested_features": [
|
2434
2434
|
"class",
|
2435
2435
|
"superclass_inference"
|
@@ -2596,7 +2596,7 @@
|
|
2596
2596
|
{
|
2597
2597
|
"id": "272",
|
2598
2598
|
"input": "ref=123;\nkey=%ref%%",
|
2599
|
-
"expected_output": "
|
2599
|
+
"expected_output": "{\n \"ref\": 123,\n \"key\": \"123%\"\n}",
|
2600
2600
|
"tested_features": [
|
2601
2601
|
"object_ref"
|
2602
2602
|
],
|
@@ -2624,7 +2624,7 @@
|
|
2624
2624
|
{
|
2625
2625
|
"id": "275",
|
2626
2626
|
"input": "vat=20;\ns=VAT at %vat% added",
|
2627
|
-
"expected_output": "
|
2627
|
+
"expected_output": "{\n \"vat\": 20,\n \"s\": \"VAT at 20 added\"\n}",
|
2628
2628
|
"tested_features": [
|
2629
2629
|
"object_ref"
|
2630
2630
|
],
|
@@ -2633,7 +2633,7 @@
|
|
2633
2633
|
{
|
2634
2634
|
"id": "276",
|
2635
2635
|
"input": "vat=20;\ns=VAT at %vat%% added",
|
2636
|
-
"expected_output": "
|
2636
|
+
"expected_output": "{\n \"vat\": 20,\n \"s\": \"VAT at 20% added\"\n}",
|
2637
2637
|
"tested_features": [
|
2638
2638
|
"object_ref"
|
2639
2639
|
],
|
@@ -2669,7 +2669,7 @@
|
|
2669
2669
|
{
|
2670
2670
|
"id": "280",
|
2671
2671
|
"input": "_a=one;\n_b=two;\n_c=three;\n\nd=%a:%b:%c;\ne=[%a;%b;%c]",
|
2672
|
-
"expected_output": "
|
2672
|
+
"expected_output": "{\n \"d\": [\n \"one\",\n \"two\",\n \"three\"\n ],\n \"e\": [\n \"one\",\n \"two\",\n \"three\"\n ]\n}",
|
2673
2673
|
"tested_features": [
|
2674
2674
|
"object_ref"
|
2675
2675
|
],
|
@@ -2714,7 +2714,7 @@
|
|
2714
2714
|
{
|
2715
2715
|
"id": "285",
|
2716
2716
|
"input": "_replace_me=new value;\n\none=%replace_me.u;\n\ntwo=`replace_me`.u;\n\nthree=`replace_me.u`;\n\nfour=`%replace_me.u`;\n\nfive=`%replace_me`.u;\n\nsix=%replace_me.u%_added;\n\nseven=replace_me.u;\n\neight=%`replace_me`.u;\n\nnine=%`replace_me`.u%;",
|
2717
|
-
"expected_output": "
|
2717
|
+
"expected_output": "{\n \"one\": \"NEW VALUE\",\n \"two\": \"`replace_me`.u\",\n \"three\": \"replace_me.u\",\n \"four\": \"NEW VALUE\",\n \"five\": \"`new value`.u\",\n \"six\": \"NEW VALUE_added\",\n \"seven\": \"replace_me.u\",\n \"eight\": \"REPLACE_ME\",\n \"nine\": \"REPLACE_ME\"\n}",
|
2718
2718
|
"tested_features": [
|
2719
2719
|
"object_ref"
|
2720
2720
|
],
|
@@ -2789,7 +2789,7 @@
|
|
2789
2789
|
{
|
2790
2790
|
"id": "293",
|
2791
2791
|
"input": "key=\"string including ` a single grave\"",
|
2792
|
-
"expected_output": "{\n
|
2792
|
+
"expected_output": "{\n \"key\": \"string including ` a single grave\"\n}",
|
2793
2793
|
"tested_features": [
|
2794
2794
|
"quotes",
|
2795
2795
|
"graves"
|
@@ -2799,7 +2799,7 @@
|
|
2799
2799
|
{
|
2800
2800
|
"id": "294",
|
2801
2801
|
"input": "key=\"string including some `graved text` here\"",
|
2802
|
-
"expected_output": "{\n
|
2802
|
+
"expected_output": "{\n \"key\": \"string including some `graved text` here\"\n}",
|
2803
2803
|
"tested_features": [
|
2804
2804
|
"quotes",
|
2805
2805
|
"graves"
|
@@ -2809,7 +2809,7 @@
|
|
2809
2809
|
{
|
2810
2810
|
"id": "295",
|
2811
2811
|
"input": "key=`string including \" a quote`",
|
2812
|
-
"expected_output": "{\n
|
2812
|
+
"expected_output": "{\n \"key\": \"string including \\\" a quote\"\n}",
|
2813
2813
|
"tested_features": [
|
2814
2814
|
"quotes",
|
2815
2815
|
"graves"
|
@@ -2819,7 +2819,7 @@
|
|
2819
2819
|
{
|
2820
2820
|
"id": "296",
|
2821
2821
|
"input": "key=`a string including a quote from Winston: \"We'll fight them on the beaches\"`",
|
2822
|
-
"expected_output": "{\n
|
2822
|
+
"expected_output": "{\n \"key\": \"a string including a quote from Winston: \\\"We'll fight them on the beaches\\\"\"\n}",
|
2823
2823
|
"tested_features": [
|
2824
2824
|
"quotes",
|
2825
2825
|
"graves"
|
@@ -2829,7 +2829,7 @@
|
|
2829
2829
|
{
|
2830
2830
|
"id": "297",
|
2831
2831
|
"input": "key=lots of `graved` text is in `this` value",
|
2832
|
-
"expected_output": "{\n
|
2832
|
+
"expected_output": "{\n \"key\": \"lots of `graved` text is in `this` value\"\n}",
|
2833
2833
|
"tested_features": [
|
2834
2834
|
"quotes",
|
2835
2835
|
"graves"
|
@@ -2839,7 +2839,7 @@
|
|
2839
2839
|
{
|
2840
2840
|
"id": "298",
|
2841
2841
|
"input": "key=`this `could` be `a` controversial `test` because `the` grammar `splits` this `string` in `a` different `way``",
|
2842
|
-
"expected_output": "{\n
|
2842
|
+
"expected_output": "{\n \"key\": \"this `could` be `a` controversial `test` because `the` grammar `splits` this `string` in `a` different `way`\"\n}",
|
2843
2843
|
"tested_features": [
|
2844
2844
|
"quotes",
|
2845
2845
|
"graves"
|
@@ -2849,7 +2849,7 @@
|
|
2849
2849
|
{
|
2850
2850
|
"id": "299",
|
2851
2851
|
"input": "_test=abc;\nkey=%test.u",
|
2852
|
-
"expected_output": "{\n
|
2852
|
+
"expected_output": "{\n \"key\": \"ABC\"\n}",
|
2853
2853
|
"tested_features": [
|
2854
2854
|
"object_ref"
|
2855
2855
|
],
|
@@ -2858,7 +2858,7 @@
|
|
2858
2858
|
{
|
2859
2859
|
"id": "300",
|
2860
2860
|
"input": "_test=replace the word this in this string;\ntesting=%test.replace<`this`,`that`>",
|
2861
|
-
"expected_output": "{\n
|
2861
|
+
"expected_output": "{\n \"testing\": \"replace the word that in that string\"\n}",
|
2862
2862
|
"tested_features": [
|
2863
2863
|
"methods",
|
2864
2864
|
"object_ref",
|
@@ -2869,7 +2869,7 @@
|
|
2869
2869
|
{
|
2870
2870
|
"id": "301",
|
2871
2871
|
"input": "_test=replace the word this in this string;\ntesting=%test.replace<this,``>",
|
2872
|
-
"expected_output": "{\n
|
2872
|
+
"expected_output": "{\n \"testing\": \"replace the word in string\"\n}",
|
2873
2873
|
"tested_features": [
|
2874
2874
|
"methods",
|
2875
2875
|
"object_ref",
|
@@ -2880,7 +2880,7 @@
|
|
2880
2880
|
{
|
2881
2881
|
"id": "302",
|
2882
2882
|
"input": "key=%`this`.replace<is,at>",
|
2883
|
-
"expected_output": "{\n
|
2883
|
+
"expected_output": "{\n \"key\": \"that\"\n}",
|
2884
2884
|
"tested_features": [
|
2885
2885
|
"methods",
|
2886
2886
|
"object_ref",
|
@@ -2891,7 +2891,7 @@
|
|
2891
2891
|
{
|
2892
2892
|
"id": "303",
|
2893
2893
|
"input": "key=`this \"is\" a \"string\" with \"lots\" of \"quoted\" strings`",
|
2894
|
-
"expected_output": "{\n
|
2894
|
+
"expected_output": "{\n \"key\": \"this \\\"is\\\" a \\\"string\\\" with \\\"lots\\\" of \\\"quoted\\\" strings\"\n}",
|
2895
2895
|
"tested_features": [
|
2896
2896
|
"graves",
|
2897
2897
|
"quotes"
|
@@ -2901,7 +2901,7 @@
|
|
2901
2901
|
{
|
2902
2902
|
"id": "304",
|
2903
2903
|
"input": "_vat=20;\nkey=vat rate is %vat%%",
|
2904
|
-
"expected_output": "{\n
|
2904
|
+
"expected_output": "{\n \"key\": \"vat rate is 20%\"\n}",
|
2905
2905
|
"tested_features": [
|
2906
2906
|
"object_ref"
|
2907
2907
|
],
|
@@ -2910,7 +2910,7 @@
|
|
2910
2910
|
{
|
2911
2911
|
"id": "305",
|
2912
2912
|
"input": "_vat=20;\nkey=vat rate is %vat%",
|
2913
|
-
"expected_output": "{\n
|
2913
|
+
"expected_output": "{\n \"key\": \"vat rate is 20\"\n}",
|
2914
2914
|
"tested_features": [
|
2915
2915
|
"object_ref"
|
2916
2916
|
],
|
@@ -2919,7 +2919,7 @@
|
|
2919
2919
|
{
|
2920
2920
|
"id": "306",
|
2921
2921
|
"input": "_vat=20;\nkey=vat rate is %vat%%",
|
2922
|
-
"expected_output": "{\n
|
2922
|
+
"expected_output": "{\n \"key\": \"vat rate is 20%\"\n}",
|
2923
2923
|
"tested_features": [
|
2924
2924
|
"object_ref",
|
2925
2925
|
"escapes"
|
@@ -2938,7 +2938,7 @@
|
|
2938
2938
|
{
|
2939
2939
|
"id": "308",
|
2940
2940
|
"input": "_vat=20;\nkey=vat rate is %vat %",
|
2941
|
-
"expected_output": "{\n
|
2941
|
+
"expected_output": "{\n \"key\": \"vat rate is 20 %\"\n}",
|
2942
2942
|
"tested_features": [
|
2943
2943
|
"object_ref"
|
2944
2944
|
],
|
@@ -2947,7 +2947,7 @@
|
|
2947
2947
|
{
|
2948
2948
|
"id": "309",
|
2949
2949
|
"input": "_vat=20;\nkey=`vat rate is %vat%%`",
|
2950
|
-
"expected_output": "{\n
|
2950
|
+
"expected_output": "{\n \"key\": \"vat rate is 20%\"\n}",
|
2951
2951
|
"tested_features": [
|
2952
2952
|
"object_ref",
|
2953
2953
|
"graves"
|
@@ -2957,7 +2957,7 @@
|
|
2957
2957
|
{
|
2958
2958
|
"id": "310",
|
2959
2959
|
"input": "_vat=20;\nkey=\"vat rate is %vat%%\"",
|
2960
|
-
"expected_output": "{\n
|
2960
|
+
"expected_output": "{\n \"key\": \"vat rate is 20%\"\n}",
|
2961
2961
|
"tested_features": [
|
2962
2962
|
"object_ref",
|
2963
2963
|
"quotes"
|
@@ -2967,7 +2967,7 @@
|
|
2967
2967
|
{
|
2968
2968
|
"id": "311",
|
2969
2969
|
"input": "_vat=20;\nkey=\"vat rate is %vat%`%`\"",
|
2970
|
-
"expected_output": "{\n
|
2970
|
+
"expected_output": "{\n \"key\": \"vat rate is 20`%`\"\n}",
|
2971
2971
|
"tested_features": [
|
2972
2972
|
"objetct_ref",
|
2973
2973
|
"graves"
|
@@ -2977,11 +2977,21 @@
|
|
2977
2977
|
{
|
2978
2978
|
"id": "312",
|
2979
2979
|
"input": "_vat=20;\nkey=\"vat rate is %vat`%`\"",
|
2980
|
-
"expected_output": "{\n
|
2980
|
+
"expected_output": "{\n \"key\": \"vat rate is 20`%`\"\n}",
|
2981
2981
|
"tested_features": [
|
2982
2982
|
"object_ref",
|
2983
2983
|
"graves"
|
2984
2984
|
],
|
2985
2985
|
"minimised_modl": "_vat=20;key=\"vat rate is %vat`%`\""
|
2986
|
+
},
|
2987
|
+
{
|
2988
|
+
"id": "313",
|
2989
|
+
"input": "_test1=e1afmkfd;\nrussian1=%test1.p;\n\n_test2=\"e1afmkfd\";\nrussian2=%test2.p;\n\n_test3=`e1afmkfd`;\nrussian3=%test3.p;",
|
2990
|
+
"expected_output": "{\n \"russian1\": \"пример\",\n \"russian2\": \"пример\",\n \"russian3\": \"пример\"\n}",
|
2991
|
+
"tested_features": [
|
2992
|
+
"punycode",
|
2993
|
+
"methods"
|
2994
|
+
],
|
2995
|
+
"minimised_modl": "_test1=e1afmkfd;russian1=%test1.p;_test2=\"e1afmkfd\";russian2=%test2.p;_test3=`e1afmkfd`;russian3=%test3.p;"
|
2986
2996
|
}
|
2987
2997
|
]
|
@@ -164,6 +164,8 @@ module MODL
|
|
164
164
|
elsif tc == 'num'
|
165
165
|
if (v.is_a? String) && (v.to_i.to_s == v.to_s)
|
166
166
|
new_value = v.to_i
|
167
|
+
elsif (v.is_a? String) && (v.to_f.to_s == v.to_s)
|
168
|
+
new_value = v.to_f
|
167
169
|
elsif v.is_a? TrueClass
|
168
170
|
new_value = 1
|
169
171
|
elsif v.is_a? FalseClass
|
@@ -71,7 +71,11 @@ module MODL
|
|
71
71
|
txt = File.readlines(file_name).join
|
72
72
|
end
|
73
73
|
rescue StandardError => e
|
74
|
-
|
74
|
+
# Force load from the cache if possible
|
75
|
+
parsed = @cache.force_get(file_name)
|
76
|
+
if parsed.nil?
|
77
|
+
raise InterpreterError, 'File not found: ' + file_name + ', error: ' + e.message
|
78
|
+
end
|
75
79
|
end
|
76
80
|
global.loaded_file(file_name)
|
77
81
|
|
@@ -27,6 +27,7 @@ require 'modl/parser/MODLParserVisitor'
|
|
27
27
|
require 'modl/parser/MODLLexer'
|
28
28
|
require 'modl/parser/MODLParser'
|
29
29
|
require 'modl/parser/class_processor'
|
30
|
+
require 'modl/parser/orphan_handler'
|
30
31
|
require 'modl/parser/parser'
|
31
32
|
require 'json'
|
32
33
|
|
@@ -59,6 +60,9 @@ module MODL
|
|
59
60
|
# Parse the MODL string into a MODL::Parser::Parsed object.
|
60
61
|
parsed = MODL::Parser::Parser.parse(string)
|
61
62
|
|
63
|
+
# Check for orphan pairs and adopt them.
|
64
|
+
parsed.structures = MODL::Parser::OrphanHandler.adopt(parsed.global, parsed.structures)
|
65
|
+
|
62
66
|
# Convert the Parsed object into a simpler structure of and Array or Hash
|
63
67
|
interpreted = parsed.extract_hash
|
64
68
|
|
@@ -70,6 +70,17 @@ module MODL
|
|
70
70
|
return if entry.expired?
|
71
71
|
|
72
72
|
# Otherwise return the cached object.
|
73
|
+
# We don't delete the cached entry because we might need to force its use if its expired and offline
|
74
|
+
entry.object
|
75
|
+
end
|
76
|
+
|
77
|
+
# If the file is offline this can be used to retrieve the cached version if we have one.
|
78
|
+
def force_get(key)
|
79
|
+
# Return nothing if not in the cache or it has expired.
|
80
|
+
return if key.nil?
|
81
|
+
|
82
|
+
entry = @cache[key]
|
83
|
+
return unless entry
|
73
84
|
entry.object
|
74
85
|
end
|
75
86
|
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# The MIT License (MIT)
|
4
|
+
#
|
5
|
+
# Copyright (c) 2019 NUM Technology Ltd
|
6
|
+
#
|
7
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
# of this software and associated documentation files (the "Software"), to deal
|
9
|
+
# in the Software without restriction, including without limitation the rights
|
10
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
# copies of the Software, and to permit persons to whom the Software is
|
12
|
+
# furnished to do so, subject to the following conditions:
|
13
|
+
#
|
14
|
+
# The above copyright notice and this permission notice shall be included in
|
15
|
+
# all copies or substantial portions of the Software.
|
16
|
+
#
|
17
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
# THE SOFTWARE.
|
24
|
+
|
25
|
+
module MODL
|
26
|
+
module Parser
|
27
|
+
class OrphanHandler
|
28
|
+
#
|
29
|
+
# Return true if all strings start with '_'
|
30
|
+
#
|
31
|
+
def self.all_hidden(str_array)
|
32
|
+
if str_array && str_array.length > 0
|
33
|
+
str_array.each do |s|
|
34
|
+
return false unless s.start_with?('_')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# Look for any orphan pairs at the top level and adopt them into a map
|
42
|
+
# Its an error if there are duplicate keys or mixed types at the top.
|
43
|
+
#
|
44
|
+
def self.adopt(global, structures)
|
45
|
+
#
|
46
|
+
# Separate out any top-level pairs into a separate hash, checking for duplicates on the way.
|
47
|
+
#
|
48
|
+
if structures
|
49
|
+
pairs = Hash.new
|
50
|
+
|
51
|
+
# This will replace the existing structures array
|
52
|
+
new_structures = []
|
53
|
+
|
54
|
+
structures.each do |s|
|
55
|
+
if s.pair
|
56
|
+
# skip hidden pairs and instructions
|
57
|
+
if s.pair.key.start_with?('*') || s.pair.key.start_with?('_') || s.pair.key == '?'
|
58
|
+
new_structures.push(s)
|
59
|
+
next
|
60
|
+
end
|
61
|
+
|
62
|
+
if pairs.has_key?(s.pair.key)
|
63
|
+
# TODO: raise an exception
|
64
|
+
puts 'Duplicate top level key.'
|
65
|
+
else
|
66
|
+
pairs[s.pair.key] = s
|
67
|
+
end
|
68
|
+
else
|
69
|
+
if pairs.length > 0 && !all_hidden(pairs.keys)
|
70
|
+
# TODO: raise an exception
|
71
|
+
puts 'Mixed top-level types.'
|
72
|
+
else
|
73
|
+
new_structures.push(s)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
if pairs.length > 0
|
79
|
+
#
|
80
|
+
# Create a map for the pairs and insert them into it.
|
81
|
+
#
|
82
|
+
new_map = MODL::Parser::Parsed::ParsedMap.new(global)
|
83
|
+
pairs.values.each do |p|
|
84
|
+
new_map.mapItems.push p unless p.pair.key.start_with?('_')
|
85
|
+
end
|
86
|
+
|
87
|
+
# Add the map to a new structure and insert it at the front of the structures list
|
88
|
+
new_struct = MODL::Parser::Parsed::ParsedStructure.new(global)
|
89
|
+
new_struct.map = new_map
|
90
|
+
new_structures.unshift(new_struct)
|
91
|
+
|
92
|
+
# Replace the existing structures with the new structures.
|
93
|
+
return new_structures
|
94
|
+
end
|
95
|
+
end
|
96
|
+
structures
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
data/lib/modl/parser/parsed.rb
CHANGED
@@ -64,7 +64,7 @@ module MODL
|
|
64
64
|
@structures << structure
|
65
65
|
end
|
66
66
|
|
67
|
-
@structures = global.structures + structures
|
67
|
+
@structures = @global.structures + @structures
|
68
68
|
|
69
69
|
@global
|
70
70
|
end
|
@@ -1041,6 +1041,7 @@ module MODL
|
|
1041
1041
|
end
|
1042
1042
|
end
|
1043
1043
|
end
|
1044
|
+
item.structures = OrphanHandler.adopt(@global, item.structures)
|
1044
1045
|
return item.extract_hash
|
1045
1046
|
end
|
1046
1047
|
return unless @topLevelConditionalReturns.length > @conditionTests.length
|
@@ -162,7 +162,7 @@ module MODL
|
|
162
162
|
prop = result.find_property(p)
|
163
163
|
if result.text && !prop
|
164
164
|
if StandardMethods.valid_method?(p)
|
165
|
-
StandardMethods.run_method(p, result.text)
|
165
|
+
StandardMethods.run_method(p, Sutil.unquote(result.text))
|
166
166
|
else
|
167
167
|
mthd = global.user_method(p)
|
168
168
|
if !mthd.nil?
|
data/lib/modl/parser/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: modl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Walmsley
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: antlr4-runtime
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/modl/parser/modl_keylist.rb
|
139
139
|
- lib/modl/parser/modl_method.rb
|
140
140
|
- lib/modl/parser/object_cache.rb
|
141
|
+
- lib/modl/parser/orphan_handler.rb
|
141
142
|
- lib/modl/parser/parsed.rb
|
142
143
|
- lib/modl/parser/parser.rb
|
143
144
|
- lib/modl/parser/ref_processor.rb
|