etlplus 0.15.0__py3-none-any.whl → 0.16.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 (118) hide show
  1. etlplus/README.md +3 -3
  2. etlplus/api/README.md +31 -0
  3. etlplus/api/auth.py +1 -1
  4. etlplus/api/config.py +5 -10
  5. etlplus/api/endpoint_client.py +4 -4
  6. etlplus/api/pagination/config.py +1 -1
  7. etlplus/api/pagination/paginator.py +6 -7
  8. etlplus/api/rate_limiting/config.py +4 -4
  9. etlplus/api/rate_limiting/rate_limiter.py +1 -1
  10. etlplus/api/retry_manager.py +2 -2
  11. etlplus/api/transport.py +1 -1
  12. etlplus/api/types.py +99 -0
  13. etlplus/api/utils.py +1 -1
  14. etlplus/cli/commands.py +75 -42
  15. etlplus/cli/constants.py +1 -1
  16. etlplus/cli/handlers.py +31 -13
  17. etlplus/cli/io.py +2 -2
  18. etlplus/cli/main.py +2 -2
  19. etlplus/cli/state.py +4 -7
  20. etlplus/connector/__init__.py +43 -0
  21. etlplus/connector/api.py +161 -0
  22. etlplus/connector/connector.py +26 -0
  23. etlplus/connector/core.py +132 -0
  24. etlplus/connector/database.py +122 -0
  25. etlplus/connector/enums.py +52 -0
  26. etlplus/connector/file.py +120 -0
  27. etlplus/connector/types.py +40 -0
  28. etlplus/connector/utils.py +122 -0
  29. etlplus/database/ddl.py +2 -2
  30. etlplus/database/engine.py +19 -3
  31. etlplus/database/orm.py +2 -0
  32. etlplus/enums.py +1 -33
  33. etlplus/file/_imports.py +1 -0
  34. etlplus/file/_io.py +52 -4
  35. etlplus/file/accdb.py +3 -2
  36. etlplus/file/arrow.py +3 -2
  37. etlplus/file/avro.py +3 -2
  38. etlplus/file/bson.py +3 -2
  39. etlplus/file/cbor.py +3 -2
  40. etlplus/file/cfg.py +3 -2
  41. etlplus/file/conf.py +3 -2
  42. etlplus/file/core.py +11 -8
  43. etlplus/file/csv.py +3 -2
  44. etlplus/file/dat.py +3 -2
  45. etlplus/file/dta.py +3 -2
  46. etlplus/file/duckdb.py +3 -2
  47. etlplus/file/enums.py +1 -1
  48. etlplus/file/feather.py +3 -2
  49. etlplus/file/fwf.py +3 -2
  50. etlplus/file/gz.py +3 -2
  51. etlplus/file/hbs.py +3 -2
  52. etlplus/file/hdf5.py +3 -2
  53. etlplus/file/ini.py +3 -2
  54. etlplus/file/ion.py +3 -2
  55. etlplus/file/jinja2.py +3 -2
  56. etlplus/file/json.py +5 -16
  57. etlplus/file/log.py +3 -2
  58. etlplus/file/mat.py +3 -2
  59. etlplus/file/mdb.py +3 -2
  60. etlplus/file/msgpack.py +3 -2
  61. etlplus/file/mustache.py +3 -2
  62. etlplus/file/nc.py +3 -2
  63. etlplus/file/ndjson.py +3 -2
  64. etlplus/file/numbers.py +3 -2
  65. etlplus/file/ods.py +3 -2
  66. etlplus/file/orc.py +3 -2
  67. etlplus/file/parquet.py +3 -2
  68. etlplus/file/pb.py +3 -2
  69. etlplus/file/pbf.py +3 -2
  70. etlplus/file/properties.py +3 -2
  71. etlplus/file/proto.py +3 -2
  72. etlplus/file/psv.py +3 -2
  73. etlplus/file/rda.py +3 -2
  74. etlplus/file/rds.py +3 -2
  75. etlplus/file/sas7bdat.py +3 -2
  76. etlplus/file/sav.py +3 -2
  77. etlplus/file/sqlite.py +3 -2
  78. etlplus/file/stub.py +1 -0
  79. etlplus/file/sylk.py +3 -2
  80. etlplus/file/tab.py +3 -2
  81. etlplus/file/toml.py +3 -2
  82. etlplus/file/tsv.py +3 -2
  83. etlplus/file/txt.py +4 -3
  84. etlplus/file/vm.py +3 -2
  85. etlplus/file/wks.py +3 -2
  86. etlplus/file/xls.py +3 -2
  87. etlplus/file/xlsm.py +3 -2
  88. etlplus/file/xlsx.py +3 -2
  89. etlplus/file/xml.py +9 -3
  90. etlplus/file/xpt.py +3 -2
  91. etlplus/file/yaml.py +5 -16
  92. etlplus/file/zip.py +3 -2
  93. etlplus/file/zsav.py +3 -2
  94. etlplus/ops/extract.py +13 -1
  95. etlplus/ops/load.py +15 -2
  96. etlplus/ops/run.py +4 -4
  97. etlplus/ops/transform.py +2 -2
  98. etlplus/ops/utils.py +6 -35
  99. etlplus/ops/validate.py +3 -3
  100. etlplus/types.py +3 -2
  101. etlplus/utils.py +163 -29
  102. etlplus/workflow/__init__.py +0 -11
  103. etlplus/workflow/jobs.py +84 -27
  104. etlplus/workflow/pipeline.py +48 -48
  105. {etlplus-0.15.0.dist-info → etlplus-0.16.0.dist-info}/METADATA +4 -4
  106. etlplus-0.16.0.dist-info/RECORD +141 -0
  107. {etlplus-0.15.0.dist-info → etlplus-0.16.0.dist-info}/WHEEL +1 -1
  108. etlplus/config/README.md +0 -50
  109. etlplus/config/__init__.py +0 -33
  110. etlplus/config/types.py +0 -140
  111. etlplus/dag.py +0 -103
  112. etlplus/workflow/connector.py +0 -373
  113. etlplus/workflow/types.py +0 -115
  114. etlplus/workflow/utils.py +0 -120
  115. etlplus-0.15.0.dist-info/RECORD +0 -139
  116. {etlplus-0.15.0.dist-info → etlplus-0.16.0.dist-info}/entry_points.txt +0 -0
  117. {etlplus-0.15.0.dist-info → etlplus-0.16.0.dist-info}/licenses/LICENSE +0 -0
  118. {etlplus-0.15.0.dist-info → etlplus-0.16.0.dist-info}/top_level.txt +0 -0
etlplus/workflow/types.py DELETED
@@ -1,115 +0,0 @@
1
- """
2
- :mod:`etlplus.workflow.types` module.
3
-
4
- Type aliases and editor-only :class:`TypedDict`s for :mod:`etlplus.config`.
5
-
6
- These types improve IDE autocomplete and static analysis while the runtime
7
- parsers remain permissive.
8
-
9
- Notes
10
- -----
11
- - TypedDicts in this module are intentionally ``total=False`` and are not
12
- enforced at runtime.
13
- - :meth:`*.from_obj` constructors accept :class:`Mapping[str, Any]` and perform
14
- tolerant parsing and light casting. This keeps the runtime permissive while
15
- improving autocomplete and static analysis for contributors.
16
-
17
- Examples
18
- --------
19
- >>> from etlplus.workflow import Connector
20
- >>> src: Connector = {
21
- >>> "type": "file",
22
- >>> "path": "/data/input.csv",
23
- >>> }
24
- >>> tgt: Connector = {
25
- >>> "type": "database",
26
- >>> "connection_string": "postgresql://user:pass@localhost/db",
27
- >>> }
28
- >>> from etlplus.api import RetryPolicy
29
- >>> rp: RetryPolicy = {"max_attempts": 3, "backoff": 0.5}
30
- """
31
-
32
- from __future__ import annotations
33
-
34
- from typing import Literal
35
- from typing import TypedDict
36
-
37
- from ..api import PaginationConfigMap
38
- from ..api import RateLimitConfigMap
39
- from ..types import StrAnyMap
40
-
41
- # SECTION: EXPORTS ========================================================= #
42
-
43
-
44
- __all__ = [
45
- # Type Aliases
46
- 'ConnectorType',
47
- # Typed Dicts
48
- 'ConnectorApiConfigMap',
49
- 'ConnectorDbConfigMap',
50
- 'ConnectorFileConfigMap',
51
- ]
52
-
53
-
54
- # SECTION: TYPE ALIASES ===================================================== #
55
-
56
-
57
- # Literal type for supported connector kinds
58
- type ConnectorType = Literal['api', 'database', 'file']
59
-
60
-
61
- # SECTION: TYPED DICTS ====================================================== #
62
-
63
-
64
- class ConnectorApiConfigMap(TypedDict, total=False):
65
- """
66
- Shape accepted by :meth:`ConnectorApi.from_obj` (all keys optional).
67
-
68
- See Also
69
- --------
70
- - :meth:`etlplus.workflow.connector.ConnectorApi.from_obj`
71
- """
72
-
73
- name: str
74
- type: ConnectorType
75
- url: str
76
- method: str
77
- headers: StrAnyMap
78
- query_params: StrAnyMap
79
- pagination: PaginationConfigMap
80
- rate_limit: RateLimitConfigMap
81
- api: str
82
- endpoint: str
83
-
84
-
85
- class ConnectorDbConfigMap(TypedDict, total=False):
86
- """
87
- Shape accepted by :meth:`ConnectorDb.from_obj` (all keys optional).
88
-
89
- See Also
90
- --------
91
- - :meth:`etlplus.workflow.connector.ConnectorDb.from_obj`
92
- """
93
-
94
- name: str
95
- type: ConnectorType
96
- connection_string: str
97
- query: str
98
- table: str
99
- mode: str
100
-
101
-
102
- class ConnectorFileConfigMap(TypedDict, total=False):
103
- """
104
- Shape accepted by :meth:`ConnectorFile.from_obj` (all keys optional).
105
-
106
- See Also
107
- --------
108
- - :meth:`etlplus.workflow.connector.ConnectorFile.from_obj`
109
- """
110
-
111
- name: str
112
- type: ConnectorType
113
- format: str
114
- path: str
115
- options: StrAnyMap
etlplus/workflow/utils.py DELETED
@@ -1,120 +0,0 @@
1
- """
2
- :mod:`etlplus.config.utils` module.
3
-
4
- A module defining utility helpers for ETL pipeline configuration.
5
-
6
- Notes
7
- -----
8
- - Inputs to parsers favor ``Mapping[str, Any]`` to remain permissive and
9
- avoid unnecessary copies; normalization returns concrete types.
10
- - Substitution is shallow for strings and recursive for containers.
11
- - Numeric coercion helpers are intentionally forgiving: invalid values
12
- become ``None`` rather than raising.
13
- """
14
-
15
- from __future__ import annotations
16
-
17
- from collections.abc import Iterable
18
- from collections.abc import Mapping
19
- from typing import Any
20
-
21
- from ..types import StrAnyMap
22
-
23
- # SECTION: EXPORTS ========================================================== #
24
-
25
-
26
- __all__ = [
27
- # Functions
28
- 'deep_substitute',
29
- ]
30
-
31
-
32
- # SECTION: FUNCTIONS ======================================================== #
33
-
34
-
35
- def deep_substitute(
36
- value: Any,
37
- vars_map: StrAnyMap | None,
38
- env_map: Mapping[str, str] | None,
39
- ) -> Any:
40
- """
41
- Recursively substitute ``${VAR}`` tokens in nested structures.
42
-
43
- Only strings are substituted; other types are returned as-is.
44
-
45
- Parameters
46
- ----------
47
- value : Any
48
- The value to perform substitutions on.
49
- vars_map : StrAnyMap | None
50
- Mapping of variable names to replacement values (lower precedence).
51
- env_map : Mapping[str, str] | None
52
- Mapping of environment variables overriding ``vars_map`` values (higher
53
- precedence).
54
-
55
- Returns
56
- -------
57
- Any
58
- New structure with substitutions applied where tokens were found.
59
- """
60
- substitutions = _prepare_substitutions(vars_map, env_map)
61
-
62
- def _apply(node: Any) -> Any:
63
- match node:
64
- case str():
65
- return _replace_tokens(node, substitutions)
66
- case Mapping():
67
- return {k: _apply(v) for k, v in node.items()}
68
- case list() | tuple() as seq:
69
- apply = [_apply(item) for item in seq]
70
- return apply if isinstance(seq, list) else tuple(apply)
71
- case set():
72
- return {_apply(item) for item in node}
73
- case frozenset():
74
- return frozenset(_apply(item) for item in node)
75
- case _:
76
- return node
77
-
78
- return _apply(value)
79
-
80
-
81
- # SECTION: INTERNAL FUNCTIONS ============================================== #
82
-
83
-
84
- def _prepare_substitutions(
85
- vars_map: StrAnyMap | None,
86
- env_map: Mapping[str, Any] | None,
87
- ) -> tuple[tuple[str, Any], ...]:
88
- """Merge variable and environment maps into an ordered substitutions list.
89
-
90
- Parameters
91
- ----------
92
- vars_map : StrAnyMap | None
93
- Mapping of variable names to replacement values (lower precedence).
94
- env_map : Mapping[str, Any] | None
95
- Environment-backed values that override entries from ``vars_map``.
96
-
97
- Returns
98
- -------
99
- tuple[tuple[str, Any], ...]
100
- Immutable sequence of ``(name, value)`` pairs suitable for token
101
- replacement.
102
- """
103
- if not vars_map and not env_map:
104
- return ()
105
- merged: dict[str, Any] = {**(vars_map or {}), **(env_map or {})}
106
- return tuple(merged.items())
107
-
108
-
109
- def _replace_tokens(
110
- text: str,
111
- substitutions: Iterable[tuple[str, Any]],
112
- ) -> str:
113
- if not substitutions:
114
- return text
115
- out = text
116
- for name, replacement in substitutions:
117
- token = f'${{{name}}}'
118
- if token in out:
119
- out = out.replace(token, str(replacement))
120
- return out
@@ -1,139 +0,0 @@
1
- etlplus/README.md,sha256=NwnsMajz2_afAXgYDnTIwVU6uBoOKQn8f6UJHUY-Xe8,1461
2
- etlplus/__init__.py,sha256=mgTP4PJmRmsEjTCAizzzdtzAmhuHtarmPzphzdjvLgM,277
3
- etlplus/__main__.py,sha256=btoROneNiigyfBU7BSzPKZ1R9gzBMpxcpsbPwmuHwTM,479
4
- etlplus/__version__.py,sha256=1E0GMK_yUWCMQFKxXjTvyMwofi0qT2k4CDNiHWiymWE,327
5
- etlplus/dag.py,sha256=4EYmBsJax3y4clHv10jjdp3GrBBD_WblvtxUb_JxGCQ,2464
6
- etlplus/enums.py,sha256=ZxObavNilITJNT4Mf2hBy1s4kKtTFUTmrc8_whkxKNg,7541
7
- etlplus/mixins.py,sha256=ifGpHwWv7U00yqGf-kN93vJax2IiK4jaGtTsPsO3Oak,1350
8
- etlplus/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- etlplus/types.py,sha256=LhyKU67CW7CcLEshE_1OIvEqWr-QVMJVYByf1221miY,6161
10
- etlplus/utils.py,sha256=BMLTWAvCJj3zLEcffBgURYnu0UGhhXsfH2WWpAt7fV8,13363
11
- etlplus/api/README.md,sha256=Glxz9Y5RagqJomCPc8q3Nagm-23Owj9aAd8fM0H-Ph8,7917
12
- etlplus/api/__init__.py,sha256=PK2lQv1FbsE7ZZS_ejevFZQSuOUHGApBc22YfHAzMqA,4615
13
- etlplus/api/auth.py,sha256=GOO5on-LoMS1GXTAhtK9rFcfpjbBcNeA6NE5UZwIq0g,12158
14
- etlplus/api/config.py,sha256=Xi1_FUaogQxAAx7LUTGwYr5vEB_SIFvjU_xgMGF2Fsc,17913
15
- etlplus/api/endpoint_client.py,sha256=OPAvw3NkpSzeITqgRP1reyqX9Nc_XC8lAj6Yp7nV4Tw,30705
16
- etlplus/api/enums.py,sha256=Tvkru6V8fzQh2JM2FDLcA_yaPENOKz5JgzxLhieqEvc,1141
17
- etlplus/api/errors.py,sha256=XjI2xW-sypMUNUbqfc2S57-IGyWnH3oCDFhCmKYYI_Q,4648
18
- etlplus/api/request_manager.py,sha256=fhzPV5x7DqpKqoLvfDR8GKhBX_QBMtvZsRXxVnQQElY,18674
19
- etlplus/api/retry_manager.py,sha256=0GDhJVyIlb1Ww35JUWlYoa8QYUPjKLBtxQeZj3TdLbY,11306
20
- etlplus/api/transport.py,sha256=DVWzWFZLfQQXaTJ60w-SzdXRxiOE8llPprpUB5CtSyg,9410
21
- etlplus/api/types.py,sha256=ijHgREN5akEFF3th2yNdWbhJhXvAxh_24qQgg_sMB4w,4653
22
- etlplus/api/utils.py,sha256=U39OXcrPiLD9m0Y03pACXIIOyuuDPO6RRKuTcwEayBE,26249
23
- etlplus/api/pagination/__init__.py,sha256=a4UX2J0AG8RMvmHt_CCofUm5vSmFo6GAfkb8XnSXypM,1395
24
- etlplus/api/pagination/client.py,sha256=yMEpWqRxTCD4zRc9OYtEyUtShpGH5atiHFEAt95v2FE,5394
25
- etlplus/api/pagination/config.py,sha256=3dXDJ-nMbO9Zk6i344n4roBFbUlHsa294D1_plPmm6E,13579
26
- etlplus/api/pagination/paginator.py,sha256=wtdY_er4yfjx5yTUQJ1gPq-IuWmpLAHeG5buBQZJm54,24453
27
- etlplus/api/rate_limiting/__init__.py,sha256=ZySB1dZettEDnWvI1EHf_TZ9L08M_kKsNR-Y_lbU6kI,1070
28
- etlplus/api/rate_limiting/config.py,sha256=eB-dSOG-c5awYeEpnDsQJ5pO8BJtEpGYxOunBetWiB0,9775
29
- etlplus/api/rate_limiting/rate_limiter.py,sha256=heAasm1KLeBFmoJKPz6W-eQbNuahMgG1E9-z8zGEUro,7035
30
- etlplus/cli/README.md,sha256=8H_G2d3HteYIU6ReX9K9DM485QjWDT5vHMQbGD_vv20,1237
31
- etlplus/cli/__init__.py,sha256=J97-Rv931IL1_b4AXnB7Fbbd7HKnHBpx18NQfC_kE6c,299
32
- etlplus/cli/commands.py,sha256=g8_m3A8HEMyTRu2HctNiRoi2gtB5oSZCUEcyq-PIXos,24669
33
- etlplus/cli/constants.py,sha256=E6Uy4WauLa_0zkzxqImXh-bb1gKdb9sBZQVc8QOzr2Q,1943
34
- etlplus/cli/handlers.py,sha256=mILI386pf2RzfI7WJfXJ13huIGwsqFfcYx4sNIf1aWU,18174
35
- etlplus/cli/io.py,sha256=EFaBPYaBOyOllfMQWXgTjy-MPiGfNejicpD7ROrPyAE,7840
36
- etlplus/cli/main.py,sha256=IgeqxypixfwLHR-QcpgVMQ7vMZ865bXOh2oO9v-BWeM,5234
37
- etlplus/cli/options.py,sha256=vfXT3YLh7wG1iC-aTdSg6ItMC8l6n0Lozmy53XjqLbA,1199
38
- etlplus/cli/state.py,sha256=Pfd8ru0wYIN7eGp1_A0tioqs1LiCDZCuJ6AnjZb6yYQ,8027
39
- etlplus/cli/types.py,sha256=tclhKVJXDqHzlTQBYKARfqMgDOcuBJ-Zej2pvFy96WM,652
40
- etlplus/config/README.md,sha256=CBeUW6IBfS8_U1iW4LzMQiAshcaTr2hgMDW3bos3BUY,1467
41
- etlplus/config/__init__.py,sha256=rjUC-OUH_dXqG11B5r0hlJuss1J_nSinkvoygfuqId8,921
42
- etlplus/config/types.py,sha256=3EyibjzqjK3GQu0fsvbmkfHERDtubEmtOU_lXsgXQuQ,3603
43
- etlplus/database/README.md,sha256=3Af5BEGLkBmMoGOLtS1GQuj4wKPh_CwSp5NEPMf2uaY,1435
44
- etlplus/database/__init__.py,sha256=AKJsDl2RHuRGPS-eXgNJeh4aSncJP5Y0yLApBF6i7i8,1052
45
- etlplus/database/ddl.py,sha256=0dEM9SJMMabkhI_h-Fc0j9a1Sl5lSyZdI0bIeBVGm10,7913
46
- etlplus/database/engine.py,sha256=PUxXLvLPyc-KaxuW7fXe12wYci7EvUp-Ad1H3bGhUog,4058
47
- etlplus/database/orm.py,sha256=gCSqH-CjQz6tV9133-VqgiwokK5ylun0BwXaIWfImAo,10008
48
- etlplus/database/schema.py,sha256=813C0Dd3WE53KTYot4dgjAxctgKXLXx-8_Rk_4r2e28,7022
49
- etlplus/database/types.py,sha256=_pkQyC14TzAlgyeIqZG4F5LWYknZbHw3TW68Auk7Ya0,795
50
- etlplus/file/README.md,sha256=ivU8svVs1fktQiW5ozvh1N-IOSLCAQ3oM9bW8DUFwIw,3630
51
- etlplus/file/__init__.py,sha256=X03bosSM-uSd6dh3ur0un6_ozFRw2Tm4PE6kVUjtXK8,475
52
- etlplus/file/_imports.py,sha256=9e8CWjyNIRcmiULEPuwtnJELUOXd4EvVv_vDnDYiB9c,3121
53
- etlplus/file/_io.py,sha256=GXTcvjfXQX4rSdyu1JNhFmqQJlirDqd8dEGCN3dHvNg,2968
54
- etlplus/file/accdb.py,sha256=xdBLrXHDonVJ1Z6-qZRrLBXpUwqw5nZYxDuxYMJHzVs,1681
55
- etlplus/file/arrow.py,sha256=rYPqoCAI3cBHETYN3c0Xi7R5Nq7_prIdyESm3ll3Zos,1694
56
- etlplus/file/avro.py,sha256=yFQMnWPcvC0CbDCyagoB9SHRIuvl2SXIoQJTBIlw4dA,4437
57
- etlplus/file/bson.py,sha256=okCWQveCnaRxJ47Oy7-HpByEkiwmiSLSWc0a9eISuVg,1613
58
- etlplus/file/cbor.py,sha256=hpXTqQ-ei4jYKt6-zq3frDXy-SWRpx1ThQUce6b01xU,1667
59
- etlplus/file/cfg.py,sha256=cT2RKFgEMsAJaT9_EIPvYCzS4F9HdRJhEZTDMCVMZ4s,1710
60
- etlplus/file/conf.py,sha256=TKkiuGf_r4pNlxKEgxn8d1Pza-4oeWZiYjvlpMk-un4,1768
61
- etlplus/file/core.py,sha256=71AFsVwvAP6crsAphMkAmhqTwk_-TkEw9eByG6gwzpA,8862
62
- etlplus/file/csv.py,sha256=6zXt7OKXm_6k8MrDyw8DdEwpQQrmrxG6myrDplF87_E,1744
63
- etlplus/file/dat.py,sha256=j-GpY49SmkZtDUzZK6CbrHY9k6N83pyGcMqVGgJZ9cs,1642
64
- etlplus/file/dta.py,sha256=cEprcahuYEncDYEBZiEoHyg-1jgBsr9eCHPLdI-naXM,1616
65
- etlplus/file/duckdb.py,sha256=hQ8PWcvYILpkgPEtWeqbT_0yhQpJN9bJh1OwQQCcRD4,1631
66
- etlplus/file/enums.py,sha256=d3VGF1IbI2Vye3A9WLeMyo5dqlo2Q1TrUp9GaG7a62g,11067
67
- etlplus/file/feather.py,sha256=U19T5V_08ooK1STclE9nDvsnUFzu7nvQvi6J09iC-_0,2669
68
- etlplus/file/fwf.py,sha256=WLbvL94cyLCOYfhABJvoIQc1fljtz3yOuA7X4Fc4QGo,1589
69
- etlplus/file/gz.py,sha256=NKsvIV7TIWn8USbvuZmRH9hr6OrXh4TzTfDykHD41Kk,2631
70
- etlplus/file/hbs.py,sha256=iz0tIVNmsCYjTLnE5x-m3Smh5QKbfuQA-sgOHOZ_T3g,1614
71
- etlplus/file/hdf5.py,sha256=SZ-UbXTJGOYA82hdma7AFulWo9emH5Kih_RXC7f-Bfk,1624
72
- etlplus/file/ini.py,sha256=HlvQyQC00oBD8KFBfznPjBx9wF1ZwXH7Yo1JaXqCq8I,1701
73
- etlplus/file/ion.py,sha256=9q938jROTAcuUT5sRYvS1qIeoz9p8KkVWYDDS2-2A_4,1710
74
- etlplus/file/jinja2.py,sha256=FFqGQjBnRgPQ-oJ3WqiKspJMj6g_J0fDKGwsoOJAEzk,1630
75
- etlplus/file/json.py,sha256=6EWsOI4RZo366FYsnPp-VkHdgAVBRVUwix-hAJZQM10,2537
76
- etlplus/file/log.py,sha256=OmsGijXZn1VhN7BUklF8saoktxkmHh1MPLI_BbGDLyc,1681
77
- etlplus/file/mat.py,sha256=u3jWMK8c4k9L0uVRiQSd7JgVQF-efoJj3QiKYtt1arA,1654
78
- etlplus/file/mdb.py,sha256=hSCaxBbc_b9dGTBpR-Gb0UTY2r3zYUxoEiKuwpnx0kI,1657
79
- etlplus/file/msgpack.py,sha256=9PTitVGnZM0yB2iiwsgLokai6DRmp2l2zfhyjEcajg8,1658
80
- etlplus/file/mustache.py,sha256=F-xVUH69evPQkunUx746B4rnOHxgAUP6KVpexK3zI_Q,1647
81
- etlplus/file/nc.py,sha256=3RFCl7OvCFAiwyVJJHF5_oa3UdGtDGsVU69OTMpiOdk,1670
82
- etlplus/file/ndjson.py,sha256=fSMAAdyucGIVl6zVqylWSBosOg899wgIpIWCGm2HOWU,2432
83
- etlplus/file/numbers.py,sha256=RSRC6sFYyWxmeTHWM7-D14MQQlDaz-FVehbSyG9u9Ds,1610
84
- etlplus/file/ods.py,sha256=6XsWkcrBsvQxzMdeMulqwExl3BjRe8gR-kNu0-hiRPE,1800
85
- etlplus/file/orc.py,sha256=fOO2jQwUr5FHbDve7ztmrE1Mb8uBMQtDo0yp-elVn8Q,2602
86
- etlplus/file/parquet.py,sha256=nzMrUNQux7Of8Nn0c4d2WYuIJQwZY_xQiO_AuVMCzrI,2758
87
- etlplus/file/pb.py,sha256=sg72vrjbp7azgEK_oRigmNdSqtEnsrBF24VjOohZhow,1615
88
- etlplus/file/pbf.py,sha256=lcdehGK_g2drs0VFqTAxZO9-sv65SAkW894ttmlBG8I,1620
89
- etlplus/file/properties.py,sha256=zsdaIWbSGGXH1bvlI8XPtc0eQCb-CeeA5CHJaqupNrE,1718
90
- etlplus/file/proto.py,sha256=QnZMGYHmr6jyiQ08W7hx_MHzNDrPEmMmnbttNRlY4Pg,1668
91
- etlplus/file/psv.py,sha256=-pfGvLSNOMWVl1mGoKJ_Rh5p5wDyCaxLEd09U23Iub0,1726
92
- etlplus/file/rda.py,sha256=oFbnf6SQrbgKdNDvQ94aeubwVlSEY0K_2BMIEqp22pY,1668
93
- etlplus/file/rds.py,sha256=9E2IfTaI6XRqfwdy-m-6laG7cTq9tlm8kMhldLJznPw,1625
94
- etlplus/file/sas7bdat.py,sha256=y_SOBwGPksIvMdO60PoYIVrmppWKvZQfhJSHMABDDlg,1706
95
- etlplus/file/sav.py,sha256=9cd1curI6gkhXNJPTQP30CUwXdH45qGmPau5JCNmxqg,1597
96
- etlplus/file/sqlite.py,sha256=3YRGMB5cRwdZeUVq3J_jSKauad7s8wWHWviqx7yfrUw,1652
97
- etlplus/file/stub.py,sha256=UPiKD_CYkz66X6bZtSqWX3ShBFrMlf-Se83z4qYnIR4,1733
98
- etlplus/file/sylk.py,sha256=ZqWNAuJenydVYG75a4atRtSQ1iPAscvx-v6lUqdDqvg,1657
99
- etlplus/file/tab.py,sha256=yIbgIM8jkbOmCmewYnDeL4751tHSjVszMIxNlm9C3q8,1984
100
- etlplus/file/toml.py,sha256=Z9UgUJ-PKdlA78osRyARK5AVN7AepSuq4dbUUXTGNAE,1626
101
- etlplus/file/tsv.py,sha256=hKlJd8Q7waZs9_jhRANhmb-fQdPsbvaVG46gYuNVtq0,1766
102
- etlplus/file/txt.py,sha256=46gSCxPn3SsixtR3RQ-kziaY5cnApHgRbW7UP__9ryE,2313
103
- etlplus/file/vm.py,sha256=_EiHtFOxcSwoLb5qegZ0sDr5z9TwKQPbB-MQolb6I2A,1589
104
- etlplus/file/wks.py,sha256=QwsjgcIpaYMZb-NEzgNSRKdBEqhahuoTeAVA5VEmsag,1655
105
- etlplus/file/xls.py,sha256=P94lEH8ZMex_G5x1hotidcj-dvGHAnUY7ouzvSYaV7o,1772
106
- etlplus/file/xlsm.py,sha256=6meoukAvpEIm_mvVomIo2oefPYfmHHXfE1XmFfeFpvY,1738
107
- etlplus/file/xlsx.py,sha256=vtiAS8Ng9FV1vCWYTd1YO2ORKIJG3HDfmqy3NkVpt0A,2182
108
- etlplus/file/xml.py,sha256=p5P60DiV6hyiz-t970d0d0ZXB41gVvAm3MT7dTMULa8,4360
109
- etlplus/file/xpt.py,sha256=JLqOkZ60awNsPXSqLKcPUwqZLPhPR05zk4EVRdEfvoU,1702
110
- etlplus/file/yaml.py,sha256=8BEqCELaTQ_nRu1iksLBHVj19P6JmcUf5__fe0yVigw,2449
111
- etlplus/file/zip.py,sha256=nd26V3S0edklriKnKOGDTLlO8RBXTda_zLLEQrJgKL4,4185
112
- etlplus/file/zsav.py,sha256=2WxjXamvzj0adDbWGMWM3-cj_LsCRjyZz4J907lNkPk,1664
113
- etlplus/ops/README.md,sha256=8omi7DYZhelc26JKk8Cm8QR8I3OGwziysPj1ivx41iQ,1380
114
- etlplus/ops/__init__.py,sha256=NIIr2f-AZj5B0piBt6gjv46Yn0SzGYxEe6BPoopRh38,1702
115
- etlplus/ops/extract.py,sha256=OJozX25qTjME7m9aTdVPJScT3GHHgopGM8uHo_rHm1Y,5783
116
- etlplus/ops/load.py,sha256=RgEKnVygRN2cPDpzihU8UsIhd4eVoj0cPe0jBuNC0u4,8328
117
- etlplus/ops/run.py,sha256=JOPQxrciRUQ67FJhUcZ-pW1aiYGZUdxHLwhzWLNCaDo,13528
118
- etlplus/ops/transform.py,sha256=1P43WYUaw872JDU86FhbbbkP8xnBWpgEPn2Q-z4ywls,25421
119
- etlplus/ops/utils.py,sha256=tbV-s3NjIGO-GfdyJFxPYIYihPibNo-4TbdRq9vWVWs,11480
120
- etlplus/ops/validate.py,sha256=gLa5zcwhxGbaIhH-OqTwDsQAgAYZSajLVGwwyeT2OZk,13257
121
- etlplus/templates/README.md,sha256=IfPXlj1TGVA-uFWosHJhE2rabFW-znxOlOMazO9Z5cE,1361
122
- etlplus/templates/__init__.py,sha256=tsniN7XJYs3NwYxJ6c2HD5upHP3CDkLx-bQCMt97UOM,106
123
- etlplus/templates/ddl.sql.j2,sha256=s8fMWvcb4eaJVXkifuib1aQPljtZ8buuyB_uA-ZdU3Q,4734
124
- etlplus/templates/view.sql.j2,sha256=Iy8DHfhq5yyvrUKDxqp_aHIEXY4Tm6j4wT7YDEFWAhk,2180
125
- etlplus/workflow/README.md,sha256=D1oloiJCOHiqpqgv3m3qpRSIUOMIQcWtIsOPv7KkNI0,1652
126
- etlplus/workflow/__init__.py,sha256=LxI9VGlDBUc9ADoK8JNn3oVsGeaz1Uhjonn4Y5KIJdM,967
127
- etlplus/workflow/connector.py,sha256=9b4KF2uNKaJtsQadwT7Id8OujfJM8GLJHqI-n4kFsGA,9851
128
- etlplus/workflow/dag.py,sha256=kp31dORgk0GHbct_bipU5hu_0elwBtwLsXGjMWuhFHI,2503
129
- etlplus/workflow/jobs.py,sha256=yFNj4S7ORMtpYSA0nCAUgb4E5msW7dyvtQVPBb-CAK8,7938
130
- etlplus/workflow/pipeline.py,sha256=DL6XsX47gGPiURH8Qj1Ixm0RctI3taqo3e6Asg8fpto,9624
131
- etlplus/workflow/profile.py,sha256=dZ6P50k_ZqXnrbgrbODUqgVkymbchcEqfZR-ExjTd3M,1935
132
- etlplus/workflow/types.py,sha256=kVdOMT8qwnWlD7C4qWv-uF7r6-Kk-RlMZmoY8tnIo7A,2769
133
- etlplus/workflow/utils.py,sha256=4SUHMkt5bKBhMhiJm-DrnmE2Q4TfOgdNCKz8PJDS27o,3443
134
- etlplus-0.15.0.dist-info/licenses/LICENSE,sha256=MuNO63i6kWmgnV2pbP2SLqP54mk1BGmu7CmbtxMmT-U,1069
135
- etlplus-0.15.0.dist-info/METADATA,sha256=YdRPU6L9SNAYpfB6fypG3-KewetI_QoyDlE2WnS2wPQ,28115
136
- etlplus-0.15.0.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
137
- etlplus-0.15.0.dist-info/entry_points.txt,sha256=6w-2-jzuPa55spzK34h-UKh2JTEShh38adFRONNP9QE,45
138
- etlplus-0.15.0.dist-info/top_level.txt,sha256=aWWF-udn_sLGuHTM6W6MLh99ArS9ROkUWO8Mi8y1_2U,8
139
- etlplus-0.15.0.dist-info/RECORD,,