pytrilogy 0.0.2.57__py3-none-any.whl → 0.0.3.0__py3-none-any.whl

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.
Files changed (75) hide show
  1. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/METADATA +9 -2
  2. pytrilogy-0.0.3.0.dist-info/RECORD +99 -0
  3. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/WHEEL +1 -1
  4. trilogy/__init__.py +2 -2
  5. trilogy/core/enums.py +1 -7
  6. trilogy/core/env_processor.py +17 -5
  7. trilogy/core/environment_helpers.py +11 -25
  8. trilogy/core/exceptions.py +4 -0
  9. trilogy/core/functions.py +695 -261
  10. trilogy/core/graph_models.py +10 -10
  11. trilogy/core/internal.py +11 -2
  12. trilogy/core/models/__init__.py +0 -0
  13. trilogy/core/models/author.py +2110 -0
  14. trilogy/core/models/build.py +1845 -0
  15. trilogy/core/models/build_environment.py +151 -0
  16. trilogy/core/models/core.py +370 -0
  17. trilogy/core/models/datasource.py +297 -0
  18. trilogy/core/models/environment.py +696 -0
  19. trilogy/core/models/execute.py +931 -0
  20. trilogy/core/optimization.py +17 -22
  21. trilogy/core/optimizations/base_optimization.py +1 -1
  22. trilogy/core/optimizations/inline_constant.py +6 -6
  23. trilogy/core/optimizations/inline_datasource.py +17 -11
  24. trilogy/core/optimizations/predicate_pushdown.py +17 -16
  25. trilogy/core/processing/concept_strategies_v3.py +181 -146
  26. trilogy/core/processing/graph_utils.py +1 -1
  27. trilogy/core/processing/node_generators/basic_node.py +19 -18
  28. trilogy/core/processing/node_generators/common.py +51 -45
  29. trilogy/core/processing/node_generators/filter_node.py +26 -13
  30. trilogy/core/processing/node_generators/group_node.py +26 -21
  31. trilogy/core/processing/node_generators/group_to_node.py +13 -10
  32. trilogy/core/processing/node_generators/multiselect_node.py +60 -43
  33. trilogy/core/processing/node_generators/node_merge_node.py +76 -38
  34. trilogy/core/processing/node_generators/rowset_node.py +59 -36
  35. trilogy/core/processing/node_generators/select_helpers/datasource_injection.py +27 -34
  36. trilogy/core/processing/node_generators/select_merge_node.py +161 -64
  37. trilogy/core/processing/node_generators/select_node.py +13 -13
  38. trilogy/core/processing/node_generators/union_node.py +12 -11
  39. trilogy/core/processing/node_generators/unnest_node.py +9 -7
  40. trilogy/core/processing/node_generators/window_node.py +19 -16
  41. trilogy/core/processing/nodes/__init__.py +21 -18
  42. trilogy/core/processing/nodes/base_node.py +92 -77
  43. trilogy/core/processing/nodes/filter_node.py +19 -13
  44. trilogy/core/processing/nodes/group_node.py +55 -40
  45. trilogy/core/processing/nodes/merge_node.py +47 -38
  46. trilogy/core/processing/nodes/select_node_v2.py +54 -40
  47. trilogy/core/processing/nodes/union_node.py +5 -7
  48. trilogy/core/processing/nodes/unnest_node.py +7 -11
  49. trilogy/core/processing/nodes/window_node.py +9 -4
  50. trilogy/core/processing/utility.py +108 -80
  51. trilogy/core/query_processor.py +67 -49
  52. trilogy/core/statements/__init__.py +0 -0
  53. trilogy/core/statements/author.py +413 -0
  54. trilogy/core/statements/build.py +0 -0
  55. trilogy/core/statements/common.py +30 -0
  56. trilogy/core/statements/execute.py +42 -0
  57. trilogy/dialect/base.py +152 -111
  58. trilogy/dialect/common.py +9 -10
  59. trilogy/dialect/duckdb.py +1 -1
  60. trilogy/dialect/enums.py +4 -2
  61. trilogy/dialect/presto.py +1 -1
  62. trilogy/dialect/sql_server.py +1 -1
  63. trilogy/executor.py +44 -32
  64. trilogy/hooks/base_hook.py +6 -4
  65. trilogy/hooks/query_debugger.py +110 -93
  66. trilogy/parser.py +1 -1
  67. trilogy/parsing/common.py +303 -64
  68. trilogy/parsing/parse_engine.py +263 -617
  69. trilogy/parsing/render.py +50 -26
  70. trilogy/scripts/trilogy.py +2 -1
  71. pytrilogy-0.0.2.57.dist-info/RECORD +0 -87
  72. trilogy/core/models.py +0 -4960
  73. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/LICENSE.md +0 -0
  74. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/entry_points.txt +0 -0
  75. {pytrilogy-0.0.2.57.dist-info → pytrilogy-0.0.3.0.dist-info}/top_level.txt +0 -0
trilogy/parsing/render.py CHANGED
@@ -6,48 +6,54 @@ from jinja2 import Template
6
6
 
7
7
  from trilogy.constants import DEFAULT_NAMESPACE, VIRTUAL_CONCEPT_PREFIX, MagicConstants
8
8
  from trilogy.core.enums import ConceptSource, DatePart, FunctionType, Modifier, Purpose
9
- from trilogy.core.models import (
10
- Address,
9
+ from trilogy.core.models.author import (
11
10
  AggregateWrapper,
12
11
  AlignClause,
13
12
  AlignItem,
14
13
  CaseElse,
15
14
  CaseWhen,
16
- ColumnAssignment,
17
15
  Comparison,
18
16
  Concept,
19
- ConceptDeclarationStatement,
20
- ConceptDerivation,
21
17
  ConceptRef,
22
- ConceptTransform,
23
18
  Conditional,
24
- CopyStatement,
25
- Datasource,
26
- DataType,
27
- Environment,
28
19
  FilterItem,
29
20
  Function,
30
21
  Grain,
31
- ImportStatement,
32
- ListType,
33
- ListWrapper,
34
- MergeStatementV2,
35
- MultiSelectStatement,
36
- NumericType,
37
22
  OrderBy,
38
23
  OrderItem,
39
24
  Parenthetical,
40
- PersistStatement,
25
+ SubselectComparison,
26
+ WhereClause,
27
+ WindowItem,
28
+ )
29
+ from trilogy.core.models.core import (
30
+ DataType,
31
+ ListType,
32
+ ListWrapper,
33
+ NumericType,
34
+ TupleWrapper,
35
+ )
36
+ from trilogy.core.models.datasource import (
37
+ Address,
38
+ ColumnAssignment,
39
+ Datasource,
41
40
  Query,
42
41
  RawColumnExpr,
42
+ )
43
+ from trilogy.core.models.environment import Environment, Import
44
+ from trilogy.core.statements.author import (
45
+ ConceptDeclarationStatement,
46
+ ConceptDerivationStatement,
47
+ ConceptTransform,
48
+ CopyStatement,
49
+ ImportStatement,
50
+ MergeStatementV2,
51
+ MultiSelectStatement,
52
+ PersistStatement,
43
53
  RawSQLStatement,
44
54
  RowsetDerivationStatement,
45
55
  SelectItem,
46
56
  SelectStatement,
47
- SubselectComparison,
48
- TupleWrapper,
49
- WhereClause,
50
- WindowItem,
51
57
  )
52
58
 
53
59
  QUERY_TEMPLATE = Template(
@@ -59,13 +65,17 @@ HAVING
59
65
  {{ having }}
60
66
  {% endif %}{%- if order_by %}
61
67
  ORDER BY{% for order in order_by %}
62
- {{ order }}{% if not loop.last %},{% endif %}{% endfor %}
63
- {% endif %}{%- if limit is not none %}
64
- LIMIT {{ limit }}{% endif %};"""
68
+ {{ order }}{% if not loop.last %},{% endif %}{% endfor %}{% endif %}{%- if limit is not none %}
69
+ LIMIT {{ limit }}{% endif %}
70
+ ;"""
65
71
  )
66
72
 
67
73
 
68
74
  class Renderer:
75
+
76
+ def __init__(self, environment: Environment | None = None):
77
+ self.environment = environment
78
+
69
79
  @singledispatchmethod
70
80
  def to_string(self, arg):
71
81
  raise NotImplementedError("Cannot render type {}".format(type(arg)))
@@ -294,7 +304,7 @@ class Renderer:
294
304
  return f"'{arg.isoformat()}'::datetime"
295
305
 
296
306
  @to_string.register
297
- def _(self, arg: ConceptDerivation):
307
+ def _(self, arg: ConceptDerivationStatement):
298
308
  # this is identical rendering;
299
309
  return self.to_string(ConceptDeclarationStatement(concept=arg.concept))
300
310
 
@@ -328,7 +338,7 @@ class Renderer:
328
338
 
329
339
  @to_string.register
330
340
  def _(self, arg: MultiSelectStatement):
331
- base = "\nMERGE\n".join([self.to_string(select)[:-1] for select in arg.selects])
341
+ base = "\nMERGE\n".join([self.to_string(select)[:-2] for select in arg.selects])
332
342
  base += self.to_string(arg.align)
333
343
  if arg.where_clause:
334
344
  base += f"\nWHERE\n{self.to_string(arg.where_clause)}"
@@ -393,6 +403,8 @@ class Renderer:
393
403
 
394
404
  @to_string.register
395
405
  def _(self, arg: "ConceptRef"):
406
+ if arg.name.startswith(VIRTUAL_CONCEPT_PREFIX) and self.environment:
407
+ return self.to_string(self.environment.concepts[arg.address])
396
408
  ns, base = arg.address.rsplit(".", 1)
397
409
  if ns == DEFAULT_NAMESPACE:
398
410
  return base
@@ -410,6 +422,18 @@ class Renderer:
410
422
  return f"import {path};"
411
423
  return f"import {path} as {arg.alias};"
412
424
 
425
+ @to_string.register
426
+ def _(self, arg: "Import"):
427
+ path: str = str(arg.path).replace("\\", ".")
428
+ path = path.replace("/", ".")
429
+ if path.endswith(".preql"):
430
+ path = path.rsplit(".", 1)[0]
431
+ if path.startswith("."):
432
+ path = path[1:]
433
+ if arg.alias == DEFAULT_NAMESPACE or not arg.alias:
434
+ return f"import {path};"
435
+ return f"import {path} as {arg.alias};"
436
+
413
437
  @to_string.register
414
438
  def _(self, arg: "Concept"):
415
439
  if arg.name.startswith(VIRTUAL_CONCEPT_PREFIX):
@@ -3,8 +3,9 @@ from pathlib import Path as PathlibPath
3
3
 
4
4
  from click import UNPROCESSED, Path, argument, group, option, pass_context
5
5
 
6
- from trilogy import Environment, Executor, parse
6
+ from trilogy import Executor, parse
7
7
  from trilogy.constants import DEFAULT_NAMESPACE
8
+ from trilogy.core.models.environment import Environment
8
9
  from trilogy.dialect.enums import Dialects
9
10
  from trilogy.hooks.query_debugger import DebuggingHook
10
11
  from trilogy.parsing.render import Renderer
@@ -1,87 +0,0 @@
1
- trilogy/__init__.py,sha256=YgiCOJgZfH7Ciz9GfXgtxr5_r5NkhAaRoFEru-cSoQs,291
2
- trilogy/compiler.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- trilogy/constants.py,sha256=qZ1d0hoKPPV2HHCoFwPYTVB7b6bXjpWvXd3lE-zEhy8,1494
4
- trilogy/engine.py,sha256=yOPnR7XCjWG82Gym_LLZBkYKKJdLCvqdCyt8zguNcnM,1103
5
- trilogy/executor.py,sha256=SbReI_xWd081WZeRt_YAyVTdMOGg2XPrsaOKgMS7YUY,15969
6
- trilogy/parser.py,sha256=UtuqSiGiCjpMAYgo1bvNq-b7NSzCA5hzbUW31RXaMII,281
7
- trilogy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- trilogy/utility.py,sha256=euQccZLKoYBz0LNg5tzLlvv2YHvXh9HArnYp1V3uXsM,763
9
- trilogy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
- trilogy/core/constants.py,sha256=7XaCpZn5mQmjTobbeBn56SzPWq9eMNDfzfsRU-fP0VE,171
11
- trilogy/core/enums.py,sha256=6pGjEXNJPB1ngbDQRJjxRi4NmKM8NZQ5-iwnZhrdo5U,7281
12
- trilogy/core/env_processor.py,sha256=Pt4lmJfbShBbeSe5M7_FrTk5krrOziiAA__Slnettvc,2585
13
- trilogy/core/environment_helpers.py,sha256=ugKDnPYQNxKzc1Weq_kj9IVppNdgT8iS1RTS_f5hHxc,7905
14
- trilogy/core/ergonomics.py,sha256=ASLDd0RqKWrZiG3XcKHo8nyTjaB_8xfE9t4NZ1UvGpc,1639
15
- trilogy/core/exceptions.py,sha256=1c1lQCwSw4_5CQS3q7scOkXU8GQvullJXfPHubprl90,617
16
- trilogy/core/functions.py,sha256=8auZhInqnY28zg7Kil4LbvDT7jD4JggwS6HzK6ZIemE,10867
17
- trilogy/core/graph_models.py,sha256=mameUTiuCajtihDw_2-W218xyJlvTusOWrEKP1yAWgk,2003
18
- trilogy/core/internal.py,sha256=FQWbuETKPfzjALMmdXJwlOMlESfm2Z5gmErSsq3BX9c,1173
19
- trilogy/core/models.py,sha256=FO1JUeUN8N3qqIjytLimayNLQWczq0aAYwephZyq7Ec,165389
20
- trilogy/core/optimization.py,sha256=Jy3tVJNeqhpK6VSyTvgIWKCao6y-VCZ7mYA69MIF6L0,7989
21
- trilogy/core/query_processor.py,sha256=JUtsDh64mWwQHM3HFZMPtVCu-Yw7WsK3cx4NxiMACSM,18584
22
- trilogy/core/optimizations/__init__.py,sha256=EBanqTXEzf1ZEYjAneIWoIcxtMDite5-n2dQ5xcfUtg,356
23
- trilogy/core/optimizations/base_optimization.py,sha256=P4kF-eCXkBxO-5c6tLHhMZ4ODRH1A04hb_6ovkaVyLw,505
24
- trilogy/core/optimizations/inline_constant.py,sha256=c-YHOg6eAufL4EaCf4-0PbY_D4skBHW0ldR55_phsMA,1277
25
- trilogy/core/optimizations/inline_datasource.py,sha256=LsngRKBy-LYcx1sfo1-rnDym_ly73YV9WkEngSjpFx8,3943
26
- trilogy/core/optimizations/predicate_pushdown.py,sha256=XPWEBv8jXnc0OL2JDPNwFvJ5AtOE7dLzJK0LzdmdZMo,9252
27
- trilogy/core/processing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- trilogy/core/processing/concept_strategies_v3.py,sha256=hgxQ5nrlLYfx02yM--7GN8MoYYX06iLBFujjPoZaxGI,37683
29
- trilogy/core/processing/graph_utils.py,sha256=stbYnDxnK-1kbo9L4XNU85FQhWCP-oZYO7LCXhAdC5M,1198
30
- trilogy/core/processing/utility.py,sha256=JpyPScfD8i4CgsTZSR0siWdXVhQDHizBAiQc81d7lbw,19769
31
- trilogy/core/processing/node_generators/__init__.py,sha256=s_YV1OYc336DuS9591259qjI_K_CtOCuhkf4t2aOgYs,733
32
- trilogy/core/processing/node_generators/basic_node.py,sha256=pExVmLDQK9okXNeC1-jQgDwpj8JWAgQfejd2lMt8L4U,3157
33
- trilogy/core/processing/node_generators/common.py,sha256=dHycWu9iiRxH3WIkkyibsnYD5mJfXvdEOhsTvyaO8fg,9128
34
- trilogy/core/processing/node_generators/filter_node.py,sha256=aWR82yAZOAnUrJejTj6yD4jpqH6cSPzyJMd1V-M0Kj0,7883
35
- trilogy/core/processing/node_generators/group_node.py,sha256=k57SVWHSVvTqCd47tyLUGCsSZaP7UQqMCJYTSz1S7oQ,5566
36
- trilogy/core/processing/node_generators/group_to_node.py,sha256=Hz17vZ1EjKVa275CZPF12FkLdrc916PA5T6OsfgryRQ,2928
37
- trilogy/core/processing/node_generators/multiselect_node.py,sha256=9bQPla367WT85iWGZxlZM4EWkWFGM0i6jgBuA4O0QvQ,6464
38
- trilogy/core/processing/node_generators/node_merge_node.py,sha256=3GzuiTiorFVe9MyLhoz2PDyI0x9XL7bQ8ucEbV54le8,14627
39
- trilogy/core/processing/node_generators/rowset_node.py,sha256=aSk1Ltv1S6aSRKHpWGjEjgrNTbJXuIXkFiGQVZOyb1o,5139
40
- trilogy/core/processing/node_generators/select_merge_node.py,sha256=yfNeuc24Ejn7j07szwJif60qmU6OVk3wfa7C2_RJ39k,15996
41
- trilogy/core/processing/node_generators/select_node.py,sha256=bjTylBa-vYbmzpuSpphmIo_Oi78YZpI8ppHnN9KDYDk,1795
42
- trilogy/core/processing/node_generators/union_node.py,sha256=MfJjF2m0ARl0oUH9QT1awzPv0e3yA3mXK1XqAvUTgKw,2504
43
- trilogy/core/processing/node_generators/unnest_node.py,sha256=8El2B1mzC9vIUSk-m94xHvaJwAf5GtCAGfTxGDSiqmU,2229
44
- trilogy/core/processing/node_generators/window_node.py,sha256=5htRRxaxw6EnS-2TVoQIiy4bkNSoBefBpj2DVBtBo-w,3484
45
- trilogy/core/processing/node_generators/select_helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
- trilogy/core/processing/node_generators/select_helpers/datasource_injection.py,sha256=hJZS7GT0dl7sK0riweEwVAVRv5LCXOnMD1hF0XY9hpE,6548
47
- trilogy/core/processing/nodes/__init__.py,sha256=WNUmYmZF3uqF2qiJ1L7y0u9qiVD9YnluKds0wA5opJE,4813
48
- trilogy/core/processing/nodes/base_node.py,sha256=utIs_c5V7SIRDPrIVlHJ7zD4caRFmffhuJQSM4cVYoY,16104
49
- trilogy/core/processing/nodes/filter_node.py,sha256=j7icDAXJ7oFPkHTOQVmm9QbZxrhhYEUGJj2lSiguXKA,2292
50
- trilogy/core/processing/nodes/group_node.py,sha256=-dx_g1b6j3zygLKWp8yPYtnFxwLtKT9wHv62-U7GBZQ,7273
51
- trilogy/core/processing/nodes/merge_node.py,sha256=kU4JChblGEoule-qKyXAwlQ2UtLXZsvugL50iUVQvQQ,14760
52
- trilogy/core/processing/nodes/select_node_v2.py,sha256=t3ln9Kxeml8mVTnLgtNPvavb5TLTRtfkJ0nyxh7UYUs,8212
53
- trilogy/core/processing/nodes/union_node.py,sha256=1QgOWkjJ-ADFdanoRzi0EM5buhuzJbmlda9BAUGp4mM,1352
54
- trilogy/core/processing/nodes/unnest_node.py,sha256=0TFANwqVPaVpUR6SF5uweGTlXfEnagXRBBZU6dUwtcY,2101
55
- trilogy/core/processing/nodes/window_node.py,sha256=yYwWuOq1Uwm-xEl8lFH_urm-YXaAGAgNhE20MEoD5QQ,1163
56
- trilogy/dialect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
- trilogy/dialect/base.py,sha256=jRHr_LrI0M7Pak3HizuBcbeTnAJ2e0NoYLMpGHXJhUw,38590
58
- trilogy/dialect/bigquery.py,sha256=mKC3zoEU232h9RtIXJjqiZ72lWH8a6S28p6wAZKrAfg,2952
59
- trilogy/dialect/common.py,sha256=b0E6JqdKaaSzThLiFa9jwUg4YnXahf-3bqmzOn5z-6E,3827
60
- trilogy/dialect/config.py,sha256=UiBY2tBbNk9owx-zxP_3lN9lErEUXhXIU_bcXA18AvU,2992
61
- trilogy/dialect/duckdb.py,sha256=O-2k0zaJKnr_McdU6iqBHcufCtHwsIKanAnpBD5o33A,3685
62
- trilogy/dialect/enums.py,sha256=iaghGgOl6zRr4RxRn4TxRnxZU9iSYJG6hN5wqYiBRNQ,3948
63
- trilogy/dialect/postgres.py,sha256=VH4EB4myjIeZTHeFU6vK00GxY9c53rCBjg2mLbdaCEE,3254
64
- trilogy/dialect/presto.py,sha256=y2BMOXvpKh1_cXnpGhG0sjhGP-pNVLkf760Hz_pNw_s,3386
65
- trilogy/dialect/snowflake.py,sha256=wmao9p26jX5yIX5SC8sRAZTXkPGTvq6ixO693QTfhz8,2989
66
- trilogy/dialect/sql_server.py,sha256=7iFpo2xztQ4ZJVwJ5n8kntWreymRzz035iClGZp3Nyc,3117
67
- trilogy/hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- trilogy/hooks/base_hook.py,sha256=gD6_sjzTzchpLIn3CvJzkM9IvaWNfQUra3yDh9-s8qQ,1125
69
- trilogy/hooks/graph_hook.py,sha256=c-vC-IXoJ_jDmKQjxQyIxyXPOuUcLIURB573gCsAfzQ,2940
70
- trilogy/hooks/query_debugger.py,sha256=FoDh2bu2NiwLusVhKa5El_l8EKaqfET7zn55GP0TkOE,4644
71
- trilogy/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- trilogy/parsing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- trilogy/parsing/common.py,sha256=iPpnSkiKUtoSTsfrMCHZOexu9H6-eIQznbVsKNEPbT8,12032
74
- trilogy/parsing/config.py,sha256=Z-DaefdKhPDmSXLgg5V4pebhSB0h590vI0_VtHnlukI,111
75
- trilogy/parsing/exceptions.py,sha256=92E5i2frv5hj9wxObJZsZqj5T6bglvPzvdvco_vW1Zk,38
76
- trilogy/parsing/helpers.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
77
- trilogy/parsing/parse_engine.py,sha256=rxbCR-gIK5EQsHUYCj1r0n73NiKOAt-vJq21-qXVPks,66131
78
- trilogy/parsing/render.py,sha256=o4C12a407iZvlRGUJDiuJUezrLLo4QEaLtu60ZQX3gk,16942
79
- trilogy/parsing/trilogy.lark,sha256=EazfEvYPuvkPkNjUnVzFi0uD9baavugbSI8CyfawShk,12573
80
- trilogy/scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
- trilogy/scripts/trilogy.py,sha256=DQDW81E5mDMWFP8oPw8q-IyrR2JGxQSDWgUWe2VTSRQ,3731
82
- pytrilogy-0.0.2.57.dist-info/LICENSE.md,sha256=5ZRvtTyCCFwz1THxDTjAu3Lidds9WjPvvzgVwPSYNDo,1042
83
- pytrilogy-0.0.2.57.dist-info/METADATA,sha256=--PBPmro81sFziRia1QJYSp1zQBGRmEUo46DYa-xBgg,8823
84
- pytrilogy-0.0.2.57.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
85
- pytrilogy-0.0.2.57.dist-info/entry_points.txt,sha256=0petKryjvvtEfTlbZC1AuMFumH_WQ9v8A19LvoS6G6c,54
86
- pytrilogy-0.0.2.57.dist-info/top_level.txt,sha256=cAy__NW_eMAa_yT9UnUNlZLFfxcg6eimUAZ184cdNiE,8
87
- pytrilogy-0.0.2.57.dist-info/RECORD,,