datatailr 0.1.8__py3-none-any.whl → 0.1.11__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.
Potentially problematic release.
This version of datatailr might be problematic. Click here for more details.
- datatailr/group.py +1 -3
- datatailr/logging.py +4 -10
- datatailr/sbin/datatailr_run.py +4 -0
- datatailr/sbin/datatailr_run_app.py +12 -3
- datatailr/sbin/datatailr_run_excel.py +34 -0
- datatailr/sbin/datatailr_run_service.py +34 -0
- datatailr/scheduler/base.py +2 -12
- datatailr/scheduler/batch.py +3 -3
- datatailr/user.py +1 -14
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/METADATA +43 -1
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/RECORD +15 -13
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/entry_points.txt +2 -0
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/WHEEL +0 -0
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/licenses/LICENSE +0 -0
- {datatailr-0.1.8.dist-info → datatailr-0.1.11.dist-info}/top_level.txt +0 -0
datatailr/group.py
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
from typing import Optional, Union
|
|
12
12
|
|
|
13
|
-
from datatailr.wrapper import dt__Group
|
|
13
|
+
from datatailr.wrapper import dt__Group
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
# Datatailr Group API Client
|
|
@@ -75,8 +75,6 @@ class Group:
|
|
|
75
75
|
def __refresh__(self):
|
|
76
76
|
if not self.name:
|
|
77
77
|
raise ValueError("Name is not set. Cannot refresh group.")
|
|
78
|
-
if isinstance(__client__, mock_cli_tool):
|
|
79
|
-
return
|
|
80
78
|
group = __client__.get(self.name)
|
|
81
79
|
if group:
|
|
82
80
|
self.__name = group["name"]
|
datatailr/logging.py
CHANGED
|
@@ -14,7 +14,7 @@ from logging import StreamHandler
|
|
|
14
14
|
from logging.handlers import RotatingFileHandler
|
|
15
15
|
from typing import Optional
|
|
16
16
|
from datatailr import User
|
|
17
|
-
from datatailr.wrapper import dt__Tag
|
|
17
|
+
from datatailr.wrapper import dt__Tag
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def get_log_level() -> int:
|
|
@@ -34,15 +34,9 @@ def get_log_level() -> int:
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
tag = dt__Tag()
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
job_name = "local_job"
|
|
41
|
-
|
|
42
|
-
else:
|
|
43
|
-
node_name = tag.get("node_name")
|
|
44
|
-
node_ip = tag.get("node_ip")
|
|
45
|
-
job_name = os.getenv("DATATAILR_JOB_NAME", "unknown_job")
|
|
37
|
+
node_name = tag.get("node_name") or "local"
|
|
38
|
+
node_ip = tag.get("node_ip")
|
|
39
|
+
job_name = os.getenv("DATATAILR_JOB_NAME", "unknown_job")
|
|
46
40
|
|
|
47
41
|
try:
|
|
48
42
|
user = User.signed_user().name
|
datatailr/sbin/datatailr_run.py
CHANGED
|
@@ -111,10 +111,12 @@ def main():
|
|
|
111
111
|
}
|
|
112
112
|
run_command_as_user("datatailr_run_batch", user, env)
|
|
113
113
|
elif job_type == "service":
|
|
114
|
+
port = get_env_var("DATATAILR_SERVICE_PORT")
|
|
114
115
|
env = {
|
|
115
116
|
"DATATAILR_JOB_NAME": job_name,
|
|
116
117
|
"DATATAILR_JOB_ID": job_id,
|
|
117
118
|
"DATATAILR_ENTRYPOINT": entrypoint,
|
|
119
|
+
"DATATAILR_SERVICE_PORT": port,
|
|
118
120
|
}
|
|
119
121
|
run_command_as_user("datatailr_run_service", user, env)
|
|
120
122
|
elif job_type == "app":
|
|
@@ -125,10 +127,12 @@ def main():
|
|
|
125
127
|
}
|
|
126
128
|
run_command_as_user("datatailr_run_app", user, env)
|
|
127
129
|
elif job_type == "excel":
|
|
130
|
+
host = get_env_var("DATATAILR_HOST")
|
|
128
131
|
env = {
|
|
129
132
|
"DATATAILR_JOB_NAME": job_name,
|
|
130
133
|
"DATATAILR_JOB_ID": job_id,
|
|
131
134
|
"DATATAILR_ENTRYPOINT": entrypoint,
|
|
135
|
+
"DATATAILR_HOST": host,
|
|
132
136
|
}
|
|
133
137
|
run_command_as_user("datatailr_run_excel", user, env)
|
|
134
138
|
elif job_type == "IDE":
|
|
@@ -11,18 +11,27 @@
|
|
|
11
11
|
# *************************************************************************
|
|
12
12
|
|
|
13
13
|
import os
|
|
14
|
+
import sys
|
|
15
|
+
import runpy
|
|
16
|
+
from importlib.resources import files
|
|
14
17
|
|
|
15
18
|
from datatailr.logging import DatatailrLogger
|
|
16
19
|
|
|
20
|
+
|
|
17
21
|
logger = DatatailrLogger(os.path.abspath(__file__)).get_logger()
|
|
18
22
|
|
|
19
23
|
|
|
20
24
|
def run():
|
|
21
25
|
logger.info("Starting Datatailr app...")
|
|
22
26
|
entrypoint = os.environ.get("DATATAILR_ENTRYPOINT")
|
|
27
|
+
if entrypoint is None or ":" not in entrypoint:
|
|
28
|
+
raise ValueError(
|
|
29
|
+
"Environment variable 'DATATAILR_ENTRYPOINT' is not in the format 'module_name:file_name'."
|
|
30
|
+
)
|
|
23
31
|
|
|
24
|
-
|
|
25
|
-
raise ValueError("Environment variable 'DATATAILR_ENTRYPOINT' is not set.")
|
|
32
|
+
module_name, file_name = entrypoint.split(":")
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
script = files(module_name).joinpath(file_name)
|
|
35
|
+
sys.argv = ["streamlit", "run", str(script), *sys.argv[1:]]
|
|
28
36
|
logger.info(f"Running entrypoint: {entrypoint}")
|
|
37
|
+
runpy.run_module("streamlit", run_name="__main__")
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# *************************************************************************
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 - Datatailr Inc.
|
|
6
|
+
# All Rights Reserved.
|
|
7
|
+
#
|
|
8
|
+
# This file is part of Datatailr and subject to the terms and conditions
|
|
9
|
+
# defined in 'LICENSE.txt'. Unauthorized copying and/or distribution
|
|
10
|
+
# of this file, in parts or full, via any medium is strictly prohibited.
|
|
11
|
+
# *************************************************************************
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import subprocess
|
|
15
|
+
|
|
16
|
+
from datatailr.logging import DatatailrLogger
|
|
17
|
+
|
|
18
|
+
logger = DatatailrLogger(os.path.abspath(__file__)).get_logger()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def run():
|
|
22
|
+
logger.info("Starting Datatailr excel add-in...")
|
|
23
|
+
entrypoint = os.environ.get("DATATAILR_ENTRYPOINT")
|
|
24
|
+
hostname = os.environ.get("DATATAILR_HOST")
|
|
25
|
+
|
|
26
|
+
if entrypoint is None:
|
|
27
|
+
raise ValueError("Environment variable 'DATATAILR_ENTRYPOINT' is not set.")
|
|
28
|
+
|
|
29
|
+
if hostname is None:
|
|
30
|
+
raise ValueError("Environment variable 'DATATAILR_HOST' is not set.")
|
|
31
|
+
|
|
32
|
+
entrypoint = f'./dt-excel.sh -n -H "{hostname}" -p 8080 "{entrypoint}"'
|
|
33
|
+
logger.info(f"Running entrypoint: {entrypoint}")
|
|
34
|
+
subprocess.run(entrypoint, shell=True)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
# *************************************************************************
|
|
4
|
+
#
|
|
5
|
+
# Copyright (c) 2025 - Datatailr Inc.
|
|
6
|
+
# All Rights Reserved.
|
|
7
|
+
#
|
|
8
|
+
# This file is part of Datatailr and subject to the terms and conditions
|
|
9
|
+
# defined in 'LICENSE.txt'. Unauthorized copying and/or distribution
|
|
10
|
+
# of this file, in parts or full, via any medium is strictly prohibited.
|
|
11
|
+
# *************************************************************************
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import importlib
|
|
15
|
+
|
|
16
|
+
from datatailr.logging import DatatailrLogger
|
|
17
|
+
|
|
18
|
+
logger = DatatailrLogger(os.path.abspath(__file__)).get_logger()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def run():
|
|
22
|
+
logger.info("Starting Datatailr service...")
|
|
23
|
+
entrypoint = os.environ.get("DATATAILR_ENTRYPOINT")
|
|
24
|
+
port = os.environ.get("DATATAILR_SERVICE_PORT")
|
|
25
|
+
|
|
26
|
+
if entrypoint is None:
|
|
27
|
+
raise ValueError("Environment variable 'DATATAILR_ENTRYPOINT' is not set.")
|
|
28
|
+
|
|
29
|
+
if port is None:
|
|
30
|
+
raise ValueError("Environment variable 'DATATAILR_SERVICE_PORT' is not set.")
|
|
31
|
+
|
|
32
|
+
entrypoint_module = importlib.import_module(entrypoint)
|
|
33
|
+
logger.info(f"Running entrypoint: {entrypoint}")
|
|
34
|
+
entrypoint_module.__service_main__(int(port))
|
datatailr/scheduler/base.py
CHANGED
|
@@ -15,7 +15,6 @@ import importlib
|
|
|
15
15
|
import inspect
|
|
16
16
|
import json
|
|
17
17
|
import os
|
|
18
|
-
import subprocess
|
|
19
18
|
import tempfile
|
|
20
19
|
import uuid
|
|
21
20
|
from dataclasses import dataclass
|
|
@@ -139,7 +138,7 @@ class Job:
|
|
|
139
138
|
name: str,
|
|
140
139
|
environment: Optional[Environment] = Environment.DEV,
|
|
141
140
|
image: Optional[Image] = None,
|
|
142
|
-
run_as: Optional[Union[str, User]] =
|
|
141
|
+
run_as: Optional[Union[str, User]] = None,
|
|
143
142
|
resources: Resources = Resources(memory="100m", cpu=1),
|
|
144
143
|
acl: Optional[ACL] = None,
|
|
145
144
|
python_requirements: str = "",
|
|
@@ -293,16 +292,7 @@ class Job:
|
|
|
293
292
|
"Please commit your changes before running the job."
|
|
294
293
|
)
|
|
295
294
|
|
|
296
|
-
remote_commit = (
|
|
297
|
-
subprocess.run(
|
|
298
|
-
("remote_commit = $(git ls-remote origin HEAD)"),
|
|
299
|
-
shell=True,
|
|
300
|
-
capture_output=True,
|
|
301
|
-
text=True,
|
|
302
|
-
)
|
|
303
|
-
.stdout.strip()
|
|
304
|
-
.split("\t")[0]
|
|
305
|
-
)
|
|
295
|
+
remote_commit = run_shell_command("git ls-remote origin HEAD")[0].split("\t")[0]
|
|
306
296
|
|
|
307
297
|
if local_commit != remote_commit:
|
|
308
298
|
raise RepoValidationError(
|
datatailr/scheduler/batch.py
CHANGED
|
@@ -302,7 +302,7 @@ class Batch(Job):
|
|
|
302
302
|
environment: Optional[Environment] = Environment.DEV,
|
|
303
303
|
schedule: Optional[Schedule] = None,
|
|
304
304
|
image: Optional[Image] = None,
|
|
305
|
-
run_as: Optional[Union[str, User]] =
|
|
305
|
+
run_as: Optional[Union[str, User]] = None,
|
|
306
306
|
resources: Resources = Resources(memory="100m", cpu=1),
|
|
307
307
|
acl: Optional[ACL] = None,
|
|
308
308
|
local_run: bool = False,
|
|
@@ -440,9 +440,9 @@ class Batch(Job):
|
|
|
440
440
|
def get_schedule_args(self) -> Dict[str, Any]:
|
|
441
441
|
if isinstance(self.__schedule, Schedule):
|
|
442
442
|
args = {
|
|
443
|
-
"
|
|
443
|
+
"at_minutes": self.__schedule.at_minutes,
|
|
444
444
|
"every_minute": self.__schedule.every_minute,
|
|
445
|
-
"
|
|
445
|
+
"at_hours": self.__schedule.at_hours,
|
|
446
446
|
"every_hour": self.__schedule.every_hour,
|
|
447
447
|
"weekdays": self.__schedule.weekdays,
|
|
448
448
|
"day_of_month": self.__schedule.day_of_month,
|
datatailr/user.py
CHANGED
|
@@ -9,10 +9,9 @@
|
|
|
9
9
|
# *************************************************************************
|
|
10
10
|
|
|
11
11
|
from __future__ import annotations
|
|
12
|
-
import sys
|
|
13
12
|
from typing import Optional
|
|
14
13
|
|
|
15
|
-
from datatailr.wrapper import dt__User
|
|
14
|
+
from datatailr.wrapper import dt__User
|
|
16
15
|
|
|
17
16
|
# Datatailr User API Client
|
|
18
17
|
__client__ = dt__User()
|
|
@@ -93,10 +92,6 @@ class User:
|
|
|
93
92
|
def __refresh__(self):
|
|
94
93
|
if not self.name:
|
|
95
94
|
raise ValueError("Name is not set. Cannot refresh user.")
|
|
96
|
-
if isinstance(__client__, mock_cli_tool) or any(
|
|
97
|
-
"unit" in arg for arg in sys.argv
|
|
98
|
-
):
|
|
99
|
-
return
|
|
100
95
|
user = __client__.get(self.name)
|
|
101
96
|
if user:
|
|
102
97
|
self.__name = user["name"]
|
|
@@ -149,14 +144,6 @@ class User:
|
|
|
149
144
|
|
|
150
145
|
@staticmethod
|
|
151
146
|
def signed_user() -> User:
|
|
152
|
-
if isinstance(__client__, mock_cli_tool) or any(
|
|
153
|
-
"unit" in arg for arg in sys.argv
|
|
154
|
-
):
|
|
155
|
-
user = User(name="test_user")
|
|
156
|
-
user.__expiry__ = "mock_expiry"
|
|
157
|
-
user.__signature__ = "mock_signature"
|
|
158
|
-
return user
|
|
159
|
-
|
|
160
147
|
user_signature_and_expiry = __client__.signed_user()
|
|
161
148
|
if user_signature_and_expiry:
|
|
162
149
|
user = User(name=user_signature_and_expiry["name"])
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datatailr
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.11
|
|
4
4
|
Summary: Ready-to-Use Platform That Drives Business Insights
|
|
5
5
|
Author-email: Datatailr <info@datatailr.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -104,5 +104,47 @@ with Batch(name="MY test DAG", local_run=True) as dag:
|
|
|
104
104
|
Running this code will create a graph of jobs and execute it.
|
|
105
105
|
Each node on the graph represents a job, which in turn is a call to a function decorated with `@batch()`.
|
|
106
106
|
|
|
107
|
+
Since this is a local run then the execution of each node will happen sequentially in the same process.
|
|
108
|
+
|
|
109
|
+
To take advantage of the datatailr platform and execute the graph at scale, you can run it using the job scheduler as presented in the next section.
|
|
110
|
+
|
|
111
|
+
### Execution at Scale
|
|
112
|
+
To execute the graph at scale, you can use the Datatailr job scheduler. This allows you to run your jobs in parallel, taking advantage of the underlying infrastructure.
|
|
113
|
+
|
|
114
|
+
You will first need to separate your function definitions from the DAG definition. This means you should define your functions as a separate module, which can be imported into the DAG definition.
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
# my_module.py
|
|
119
|
+
|
|
120
|
+
from datatailr.scheduler import batch, Batch
|
|
121
|
+
|
|
122
|
+
@batch()
|
|
123
|
+
def func_no_args() -> str:
|
|
124
|
+
return "no_args"
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
@batch()
|
|
128
|
+
def func_with_args(a: int, b: float) -> str:
|
|
129
|
+
return f"args: {a}, {b}"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
To use these functions in a batch job, you just need to import them and run in a DAG context:
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
from my_module import func_no_args, func_with_args
|
|
136
|
+
from datatailr.scheduler import Schedule
|
|
137
|
+
|
|
138
|
+
schedule = Schedule(at_hour=0)
|
|
139
|
+
|
|
140
|
+
with Batch(name="MY test DAG", schedule=schedule) as dag:
|
|
141
|
+
for n in range(2):
|
|
142
|
+
res1 = func_no_args().alias(f"func_{n}")
|
|
143
|
+
res2 = func_with_args(1, res1).alias(f"func_with_args_{n}")
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
This will submit the entire DAG for execution, and the scheduler will take care of running the jobs in parallel and managing the resources.
|
|
147
|
+
The DAG in the example above will be scheduled to run daily at 00:00.
|
|
148
|
+
|
|
107
149
|
___
|
|
108
150
|
Visit [our website](https://www.datatailr.com/) for more!
|
|
@@ -3,28 +3,30 @@ datatailr/acl.py,sha256=tlDy6VlHinSy5W1FbVxcNQNi7FliWUXy3ssIbzaPp28,4157
|
|
|
3
3
|
datatailr/blob.py,sha256=xkXT6RZcMww4YfLVjOyqvvPxWc-Ku6fTJ_PeCXyBys4,3159
|
|
4
4
|
datatailr/dt_json.py,sha256=3xmTqDBk68oPl2UW8UVOYPaBw4lAsVg6nDLwcen5nuo,2252
|
|
5
5
|
datatailr/errors.py,sha256=p_e4ao3sFEfz1g4LvEDqw6bVzHJPJSINLjJ8H6_PqOo,751
|
|
6
|
-
datatailr/group.py,sha256=
|
|
7
|
-
datatailr/logging.py,sha256=
|
|
8
|
-
datatailr/user.py,sha256=
|
|
6
|
+
datatailr/group.py,sha256=ExsrkqUooAfFLWKvnkp1ZxisSJD1yCp9TKqoCXDCwhs,4360
|
|
7
|
+
datatailr/logging.py,sha256=4Rsx3wf2tAr1334E2goBjhC877RwbUNaFgBlh902vU4,3270
|
|
8
|
+
datatailr/user.py,sha256=o0k80JNahhWK4RqKXPLTuPQAcyN9i2fNKunh0MrdPBI,6612
|
|
9
9
|
datatailr/utils.py,sha256=mqnnERMyHNAuAgFY4Ry4O4yW0ZjCRtJbjfI5fXVqt2s,1524
|
|
10
10
|
datatailr/version.py,sha256=N9K8ZxlwFFSz8XSgbgaTWZY4k2J0JKfj698nZ_O2pIU,536
|
|
11
11
|
datatailr/wrapper.py,sha256=K9ZD76cWey_ikA6C5sKejwRaYBDln4QMg-RcoRGiuFc,7991
|
|
12
12
|
datatailr/build/__init__.py,sha256=_dA7b4L6wsaAFaSxUoYSJ1oaRqDHDMR20kqoCocSOss,487
|
|
13
13
|
datatailr/build/image.py,sha256=xeYKPR6usg0pqJNpbhsYI8t_BB2iWxhY0KBNTWqpb_Q,4939
|
|
14
|
-
datatailr/sbin/datatailr_run.py,sha256=
|
|
15
|
-
datatailr/sbin/datatailr_run_app.py,sha256=
|
|
14
|
+
datatailr/sbin/datatailr_run.py,sha256=0kCs5XZMBRc3M6lnoVguVMP09uQ9d0-NNl55NUyoH80,5934
|
|
15
|
+
datatailr/sbin/datatailr_run_app.py,sha256=AOkutzv4DeKfWZs-ZBciAMKnK4A05SfkVf1ZJnSSFwA,1231
|
|
16
16
|
datatailr/sbin/datatailr_run_batch.py,sha256=UWnp96j_G66R_Cape7Bb-rbK6UBLF7Y5_mTlWyGJAVQ,1818
|
|
17
|
+
datatailr/sbin/datatailr_run_excel.py,sha256=Gr_QZgqJrwgRVD9_o4v-2tbvU-QMvNHL7xUvFGhftFc,1163
|
|
18
|
+
datatailr/sbin/datatailr_run_service.py,sha256=R8eNLN2SGnMtyfLy3vq9isUHr3dRzeBqESTquNK9Iho,1156
|
|
17
19
|
datatailr/scheduler/__init__.py,sha256=qydHYVtEP6SUWd2CQ6FRdTdRWNz3SbYPJy4FK_wOvMk,1772
|
|
18
20
|
datatailr/scheduler/arguments_cache.py,sha256=CydYR9o2pqfa4KsPTA1mJSBN-0YF47Q6AmODm4zAJQ4,6254
|
|
19
|
-
datatailr/scheduler/base.py,sha256=
|
|
20
|
-
datatailr/scheduler/batch.py,sha256=
|
|
21
|
+
datatailr/scheduler/base.py,sha256=UcIyProXBeUHunw2JCCgQTIa0G-hrLyQr1gOX8nhAOQ,12323
|
|
22
|
+
datatailr/scheduler/batch.py,sha256=77iUufBqRBau9Ku4IivLOKqh-lknclEak8jg2YhsX3c,16437
|
|
21
23
|
datatailr/scheduler/batch_decorator.py,sha256=LqL1bsupWLn-YEQUvFJYae7R3ogrL5-VodyiiScrkRw,5806
|
|
22
24
|
datatailr/scheduler/constants.py,sha256=5WWTsfwZ_BA8gVDOTa2AQX9DJ0NzfaWgtY3vrODS2-8,606
|
|
23
25
|
datatailr/scheduler/schedule.py,sha256=vzXaBBKMVJeCGD0VxsRPeW80sYReJ83XxWzDHVgLibY,3734
|
|
24
26
|
datatailr/scheduler/utils.py,sha256=up6oR2iwe6G52LkvgfO394xchXgCYNjOMGRQW3e8PQk,1082
|
|
25
|
-
datatailr-0.1.
|
|
26
|
-
datatailr-0.1.
|
|
27
|
-
datatailr-0.1.
|
|
28
|
-
datatailr-0.1.
|
|
29
|
-
datatailr-0.1.
|
|
30
|
-
datatailr-0.1.
|
|
27
|
+
datatailr-0.1.11.dist-info/licenses/LICENSE,sha256=ikKP4_O-UD_b8FuNdKmbzTb6odd0JX085ZW_FAPN3VI,1066
|
|
28
|
+
datatailr-0.1.11.dist-info/METADATA,sha256=U6YY4cGUx61N2WKJzh97CQqWUlHAvuzpb4czK2Z1jGE,5118
|
|
29
|
+
datatailr-0.1.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
30
|
+
datatailr-0.1.11.dist-info/entry_points.txt,sha256=YqXfk2At-olW4PUSRkqvy_O3Mbv7uTKCCPuAAiz3Qbg,312
|
|
31
|
+
datatailr-0.1.11.dist-info/top_level.txt,sha256=75gntW0X_SKpqxLL6hAPipvpk28GAhJBvoyqN_HohWU,10
|
|
32
|
+
datatailr-0.1.11.dist-info/RECORD,,
|
|
@@ -2,3 +2,5 @@
|
|
|
2
2
|
datatailr_run = datatailr.sbin.datatailr_run:main
|
|
3
3
|
datatailr_run_app = datatailr.sbin.datatailr_run_app:run
|
|
4
4
|
datatailr_run_batch = datatailr.sbin.datatailr_run_batch:run
|
|
5
|
+
datatailr_run_excel = datatailr.sbin.datatailr_run_excel:run
|
|
6
|
+
datatailr_run_service = datatailr.sbin.datatailr_run_service:run
|
|
File without changes
|
|
File without changes
|
|
File without changes
|