datatailr 0.1.8__py3-none-any.whl → 0.1.10__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 CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  from typing import Optional, Union
12
12
 
13
- from datatailr.wrapper import dt__Group, mock_cli_tool
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, mock_cli_tool
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
- if isinstance(tag, mock_cli_tool):
38
- node_name = "local"
39
- node_ip = "0.0.0.0"
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
@@ -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
- if entrypoint is None:
25
- raise ValueError("Environment variable 'DATATAILR_ENTRYPOINT' is not set.")
32
+ module_name, file_name = entrypoint.split(":")
26
33
 
27
- os.system(entrypoint)
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
+ entrypoint_module.__service_main__(int(port))
34
+ logger.info(f"Running entrypoint: {entrypoint}")
@@ -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]] = User.signed_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(
@@ -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]] = User.signed_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
- "at_minute": self.__schedule.at_minutes,
443
+ "at_minutes": self.__schedule.at_minutes,
444
444
  "every_minute": self.__schedule.every_minute,
445
- "at_hour": self.__schedule.at_hours,
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, mock_cli_tool
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.8
3
+ Version: 0.1.10
4
4
  Summary: Ready-to-Use Platform That Drives Business Insights
5
5
  Author-email: Datatailr <info@datatailr.com>
6
6
  License-Expression: MIT
@@ -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=34unhas6jQH_KgQSz7N42AIT-4wAHtS9T8x-_W7AkA8,4444
7
- datatailr/logging.py,sha256=IkucGsHfkxaiy8Ul4Qy6U3fHbqCq3mChTDoaBNovYeA,3403
8
- datatailr/user.py,sha256=uIRMDdR_vey2r0d7aVEoq5WHb6tKLP8jBtEPc2n-xBY,7046
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
14
  datatailr/sbin/datatailr_run.py,sha256=3WuvzdRrRFA0nWX9v-nShwoqjOQSnvzgZRvRvWdKJPI,5756
15
- datatailr/sbin/datatailr_run_app.py,sha256=67Y3RQPCZ2N9LIErEdXOsnYQ_4UzTmQygjyIfMhEkyk,891
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=eonttiYU0TJTRSNuTZCFdRVsNpPGdR2ZJw4OFww-UJA,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=OkoMxTjSzpFIFikWRctN9kuZM85oJDbNET8xKe8YUQY,12558
20
- datatailr/scheduler/batch.py,sha256=CK57jS6MvFrSj14q9ZTrD15akoBdAeTJ130MFb_aIN4,16449
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.8.dist-info/licenses/LICENSE,sha256=ikKP4_O-UD_b8FuNdKmbzTb6odd0JX085ZW_FAPN3VI,1066
26
- datatailr-0.1.8.dist-info/METADATA,sha256=rviYJtuu-teMbR_toxDPyC3ANi5sGzWeFFxH1PhijSM,3608
27
- datatailr-0.1.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
- datatailr-0.1.8.dist-info/entry_points.txt,sha256=VVBtNTDhrPMkcqrU3XjTHrfEdPQXwbJW9kgH1C-rT7U,186
29
- datatailr-0.1.8.dist-info/top_level.txt,sha256=75gntW0X_SKpqxLL6hAPipvpk28GAhJBvoyqN_HohWU,10
30
- datatailr-0.1.8.dist-info/RECORD,,
27
+ datatailr-0.1.10.dist-info/licenses/LICENSE,sha256=ikKP4_O-UD_b8FuNdKmbzTb6odd0JX085ZW_FAPN3VI,1066
28
+ datatailr-0.1.10.dist-info/METADATA,sha256=mv429ztuqJrUj4lCxU5JYBk3JWxfPAV5v1r1UJWPNyE,3609
29
+ datatailr-0.1.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
30
+ datatailr-0.1.10.dist-info/entry_points.txt,sha256=YqXfk2At-olW4PUSRkqvy_O3Mbv7uTKCCPuAAiz3Qbg,312
31
+ datatailr-0.1.10.dist-info/top_level.txt,sha256=75gntW0X_SKpqxLL6hAPipvpk28GAhJBvoyqN_HohWU,10
32
+ datatailr-0.1.10.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