workbench 0.8.185__py3-none-any.whl → 0.8.187__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 workbench might be problematic. Click here for more details.

@@ -993,9 +993,9 @@ class EndpointCore(Artifact):
993
993
  self.upsert_workbench_meta({"workbench_input": input})
994
994
 
995
995
  def delete(self):
996
- """ "Delete an existing Endpoint: Underlying Models, Configuration, and Endpoint"""
996
+ """Delete an existing Endpoint: Underlying Models, Configuration, and Endpoint"""
997
997
  if not self.exists():
998
- self.log.warning(f"Trying to delete an Model that doesn't exist: {self.name}")
998
+ self.log.warning(f"Trying to delete an Endpoint that doesn't exist: {self.name}")
999
999
 
1000
1000
  # Remove this endpoint from the list of registered endpoints
1001
1001
  self.log.info(f"Removing {self.name} from the list of registered endpoints...")
@@ -899,7 +899,7 @@ class ModelCore(Artifact):
899
899
  def delete(self):
900
900
  """Delete the Model Packages and the Model Group"""
901
901
  if not self.exists():
902
- self.log.warning(f"Trying to delete an Model that doesn't exist: {self.name}")
902
+ self.log.warning(f"Trying to delete a Model that doesn't exist: {self.name}")
903
903
 
904
904
  # Call the Class Method to delete the Model Group
905
905
  ModelCore.managed_delete(model_group_name=self.name)
@@ -19,7 +19,7 @@ from typing import List, Tuple
19
19
  # Template Placeholders
20
20
  TEMPLATE_PARAMS = {
21
21
  "target": "udm_asy_res_free_percent",
22
- "features": ['naromatom', 'minabspartialcharge', 'bcut2d_mrhi', 'smr_vsa10', 'vsa_estate2', 'minpartialcharge', 'xpc_5d', 'sps', 'xc_3dv', 'smr_vsa7', 'bcut2d_logplow', 'mollogp', 'vsa_estate1', 'num_s_centers', 'vsa_estate4', 'peoe_vsa13', 'fr_nh2', 'bertzct', 'estate_vsa4', 'vsa_estate9', 'smr_vsa3', 'fr_nh1', 'molwt', 'estate_vsa5', 'slogp_vsa5', 'maxpartialcharge', 'estate_vsa1', 'fr_hoccn', 'xc_5d', 'nbase', 'chi1v', 'peoe_vsa10', 'tpsa', 'vsa_estate3', 'chi2v', 'estate_vsa8', 'numheteroatoms', 'estate_vsa2', 'peoe_vsa1', 'labuteasa', 'axp_4d', 'xch_7dv', 'chi0n', 'num_r_centers', 'vsa_estate8', 'minabsestateindex', 'bcut2d_chglo', 'bcut2d_mwhi', 'fr_nh0', 'chi4n', 'estate_vsa9', 'smr_vsa5', 'peoe_vsa2', 'peoe_vsa7', 'peoe_vsa9', 'kappa3', 'slogp_vsa3', 'fr_arn', 'estate_vsa3', 'avgipc', 'axp_5d', 'xpc_6d', 'c2sp2', 'peoe_vsa5', 'vsa_estate5', 'balabanj', 'maxabspartialcharge', 'fr_aniline', 'fr_piperdine', 'vsa_estate6', 'bcut2d_mwlow', 'numsaturatedheterocycles', 'vsa_estate10', 'smr_vsa1', 'estate_vsa6', 'smr_vsa6', 'fpdensitymorgan1', 'peoe_vsa3', 'peoe_vsa8', 'smr_vsa9', 'slogp_vsa2', 'nocount', 'fpdensitymorgan3', 'axp_6d', 'bcut2d_mrlow', 'bcut2d_logphi', 'axp_4dv', 'fpdensitymorgan2', 'mp', 'xp_5d', 'fr_nhpyrrole', 'mz', 'mv', 'vsa_estate7', 'axp_7dv', 'mi', 'c1sp2', 'xpc_6dv', 'slogp_vsa10', 'xp_7d', 'axp_3dv', 'peoe_vsa4', 'peoe_vsa6', 'axp_2dv', 'xch_5dv', 'qed', 'estate_vsa7', 'numaromaticrings', 'chi1n', 'axp_0d', 'axp_6dv', 'numrotatablebonds', 'hallkieralpha', 'c1sp3', 'xc_4dv', 'kappa2', 'bcut2d_chghi', 'xch_7d', 'axp_0dv', 'slogp_vsa7', 'axp_7d', 'minestateindex', 'axp_2d', 'axp_1d', 'chi0', 'fractioncsp3', 'slogp_vsa6', 'axp_1dv', 'chi2n', 'xp_6dv', 'maxestateindex', 'xpc_4d', 'numaliphaticheterocycles', 'chi1', 'phi', 'chi3n', 'xc_4d', 'xc_3d', 'peoe_vsa12', 'xp_6d', 'chi3v', 'axp_3d', 'axp_5dv', 'fr_benzene', 'slogp_vsa4', 'fr_pyridine', 'fr_aryl_methyl', 'xp_5dv', 'c3sp3', 'xp_7dv', 'slogp_vsa1', 'peoe_vsa11', 'mse', 'xc_5dv', 'xpc_5dv', 'xc_6dv', 'xp_0dv', 'xch_5d', 'c3sp2', 'numatomstereocenters', 'numhacceptors', 'fr_imidazole', 'numsaturatedrings', 'xpc_4dv', 'chi0v', 'numheterocycles', 'xch_6dv', 'estate_vsa10', 'chi4v', 'mare', 'numhdonors', 'xch_6d', 'xp_4d', 'fr_ar_n', 'numunspecifiedatomstereocenters', 'numspiroatoms', 'xch_4dv', 'fr_morpholine', 'fr_methoxy', 'mm', 'fr_piperzine'],
22
+ "features": ['naromatom', 'fr_nh2', 'mollogp', 'numheterocycles', 'bcut2d_mrhi', 'numaromaticrings', 'smr_vsa7', 'peoe_vsa4', 'slogp_vsa6', 'peoe_vsa8', 'vsa_estate3', 'maxabspartialcharge', 'fr_arn', 'bcut2d_logplow', 'chi1v', 'axp_6d', 'bcut2d_chglo', 'balabanj', 'slogp_vsa10', 'hallkieralpha', 'vsa_estate6', 'fpdensitymorgan1', 'sps', 'qed', 'peoe_vsa7', 'maxestateindex', 'estate_vsa8', 'vsa_estate9', 'fr_nhpyrrole', 'mz', 'mp', 'bcut2d_mwhi', 'peoe_vsa13', 'c2sp2', 'numrotatablebonds', 'kappa3', 'peoe_vsa1', 'slogp_vsa2', 'xc_5dv', 'bertzct', 'estate_vsa10', 'axp_0d', 'estate_vsa2', 'xc_4d', 'smr_vsa1', 'phi', 'estate_vsa3', 'vsa_estate2', 'mv', 'estate_vsa4', 'mm', 'fr_nh1', 'slogp_vsa7', 'chi4n', 'estate_vsa6', 'fpdensitymorgan2', 'molmr', 'mse', 'bcut2d_mwlow', 'bcut2d_mrlow', 'chi2v', 'minestateindex', 'xpc_4dv', 'fr_nh0', 'axp_2d', 'vsa_estate8', 'nhohcount', 'smr_vsa6', 'peoe_vsa9', 'smr_vsa5', 'num_r_centers', 'xpc_6dv', 'xc_3d', 'slogp_vsa5', 'axp_7dv', 'minabsestateindex', 'xc_5d', 'vsa_estate10', 'fr_hoccn', 'smr_vsa3', 'vsa_estate1', 'axp_5d', 'num_s_centers', 'axp_1d', 'estate_vsa1', 'fpdensitymorgan3', 'axp_5dv', 'chi3n', 'peoe_vsa6', 'labuteasa', 'chi2n', 'xc_6d', 'xp_7d', 'tpsa', 'xpc_4d', 'avgipc', 'xp_5d', 'vsa_estate5', 'xch_7d', 'xch_5d', 'axp_4dv', 'nbase', 'xc_3dv', 'kappa2', 'axp_3d', 'c1sp3', 'numhacceptors', 'bcut2d_logphi', 'smr_vsa10', 'fr_piperzine', 'peoe_vsa11', 'axp_6dv', 'peoe_vsa10', 'estate_vsa9', 'bcut2d_chghi', 'xp_6d', 'xch_6dv', 'chi0', 'vsa_estate7', 'mi', 'xpc_5d', 'fractioncsp3', 'xp_0dv', 'kappa1', 'minpartialcharge', 'xp_6dv', 'peoe_vsa2', 'chi3v', 'axp_0dv', 'mare', 'xch_5dv', 'vsa_estate4', 'xp_4dv', 'estate_vsa7', 'xp_3d', 'numaliphaticheterocycles', 'chi1', 'xp_3dv', 'fr_ether', 'xch_6d', 'peoe_vsa12', 'xch_7dv', 'axp_1dv', 'axp_7d', 'fr_ndealkylation2', 'smr_vsa9', 'axp_2dv', 'estate_vsa5', 'mpe', 'molwt', 'xch_4d', 'axp_3dv', 'xp_5dv', 'chi4v', 'heavyatommolwt', 'fr_al_oh', 'xpc_5dv', 'xpc_6d', 'maxpartialcharge', 'numatomstereocenters', 'peoe_vsa3', 'fr_aniline', 'minabspartialcharge', 'c3sp3', 'slogp_vsa1', 'exactmolwt', 'chi1n', 'xp_7dv', 'chi0n', 'xp_2d', 'xch_4dv', 'fr_bicyclic', 'xc_4dv', 'axp_4d', 'slogp_vsa4', 'fr_benzene', 'numaromaticheterocycles', 'fr_aryl_methyl', 'fr_pyridine', 'fr_imine', 'chi0v', 'slogp_vsa12'],
23
23
  "compressed_features": [],
24
24
  "train_all_data": True,
25
25
  "hyperparameters": {},
@@ -466,7 +466,7 @@ def predict_fn(df, models) -> pd.DataFrame:
466
466
  df["q_50"] = df["prediction"]
467
467
 
468
468
  # Calculate a pseudo-standard deviation from the 68% interval width
469
- df["prediction_std"] = (df["q_84"] - df["q_16"]) / 2.0
469
+ df["prediction_std"] = (df["q_84"] - df["q_16"]).abs() / 2.0
470
470
 
471
471
  # Reorder the quantile columns for easier reading
472
472
  quantile_cols = ["q_025", "q_05", "q_10", "q_16", "q_25", "q_75", "q_84", "q_90", "q_95", "q_975"]
@@ -466,7 +466,7 @@ def predict_fn(df, models) -> pd.DataFrame:
466
466
  df["q_50"] = df["prediction"]
467
467
 
468
468
  # Calculate a pseudo-standard deviation from the 68% interval width
469
- df["prediction_std"] = (df["q_84"] - df["q_16"]) / 2.0
469
+ df["prediction_std"] = (df["q_84"] - df["q_16"]).abs() / 2.0
470
470
 
471
471
  # Reorder the quantile columns for easier reading
472
472
  quantile_cols = ["q_025", "q_05", "q_10", "q_16", "q_25", "q_75", "q_84", "q_90", "q_95", "q_975"]
@@ -0,0 +1,39 @@
1
+ import sys
2
+ import os
3
+ import importlib.util
4
+
5
+
6
+ def main():
7
+ if len(sys.argv) != 2:
8
+ print("Usage: lambda_launcher <handler_module_name>")
9
+ sys.exit(1)
10
+
11
+ handler_file = sys.argv[1]
12
+
13
+ # Add .py if not present
14
+ if not handler_file.endswith(".py"):
15
+ handler_file += ".py"
16
+
17
+ # Check if file exists
18
+ if not os.path.exists(handler_file):
19
+ print(f"Error: File '{handler_file}' not found")
20
+ sys.exit(1)
21
+
22
+ # Load the module dynamically
23
+ spec = importlib.util.spec_from_file_location("lambda_module", handler_file)
24
+ lambda_module = importlib.util.module_from_spec(spec)
25
+ spec.loader.exec_module(lambda_module)
26
+
27
+ # Call the lambda_handler
28
+ print(f"Invoking lambda_handler from {handler_file}...")
29
+ print("-" * 50)
30
+
31
+ result = lambda_module.lambda_handler({}, {})
32
+
33
+ print("-" * 50)
34
+ print("Result:")
35
+ print(result)
36
+
37
+
38
+ if __name__ == "__main__":
39
+ main()
@@ -13,14 +13,21 @@ cm = ConfigManager()
13
13
  workbench_bucket = cm.get_config("WORKBENCH_BUCKET")
14
14
 
15
15
 
16
- def submit_to_sqs(script_path: str, size: str = "small", realtime: bool = False, recreate: bool = False) -> None:
16
+ def submit_to_sqs(
17
+ script_path: str, size: str = "small", realtime: bool = False, dt: bool = False, promote: bool = False
18
+ ) -> None:
17
19
  """
18
20
  Upload script to S3 and submit message to SQS queue for processing.
21
+
19
22
  Args:
20
23
  script_path: Local path to the ML pipeline script
21
24
  size: Job size tier - "small" (default), "medium", or "large"
22
- realtime: If True, sets serverless=False for real-time processing (default: False, meaning serverless=True)
23
- recreate: If True, sets RECREATE=True in environment (default: False)
25
+ realtime: If True, sets serverless=False for real-time processing (default: False)
26
+ dt: If True, sets DT=True in environment (default: False)
27
+ promote: If True, sets PROMOTE=True in environment (default: False)
28
+
29
+ Raises:
30
+ ValueError: If size is invalid or script file not found
24
31
  """
25
32
  print(f"\n{'=' * 60}")
26
33
  print("🚀 SUBMITTING ML PIPELINE JOB")
@@ -36,7 +43,8 @@ def submit_to_sqs(script_path: str, size: str = "small", realtime: bool = False,
36
43
  print(f"📄 Script: {script_file.name}")
37
44
  print(f"📏 Size tier: {size}")
38
45
  print(f"⚡ Mode: {'Real-time' if realtime else 'Serverless'} (serverless={'False' if realtime else 'True'})")
39
- print(f"🔄 Recreate: {recreate}")
46
+ print(f"🔄 DynamicTraining: {dt}")
47
+ print(f"🆕 Promote: {promote}")
40
48
  print(f"🪣 Bucket: {workbench_bucket}")
41
49
  sqs = AWSAccountClamp().boto3_session.client("sqs")
42
50
  script_name = script_file.name
@@ -94,14 +102,15 @@ def submit_to_sqs(script_path: str, size: str = "small", realtime: bool = False,
94
102
  message = {"script_path": s3_path, "size": size}
95
103
 
96
104
  # Set environment variables
97
- message["environment"] = {"SERVERLESS": "False" if realtime else "True"}
98
- if recreate:
99
- message["environment"]["RECREATE"] = "True"
100
-
101
- print("\n📨 Sending message to SQS...")
105
+ message["environment"] = {
106
+ "SERVERLESS": "False" if realtime else "True",
107
+ "DT": str(dt),
108
+ "PROMOTE": str(promote),
109
+ }
102
110
 
103
111
  # Send the message to SQS
104
112
  try:
113
+ print("\n📨 Sending message to SQS...")
105
114
  response = sqs.send_message(
106
115
  QueueUrl=queue_url,
107
116
  MessageBody=json.dumps(message, indent=2),
@@ -121,7 +130,8 @@ def submit_to_sqs(script_path: str, size: str = "small", realtime: bool = False,
121
130
  print(f"📄 Script: {script_name}")
122
131
  print(f"📏 Size: {size}")
123
132
  print(f"⚡ Mode: {'Real-time' if realtime else 'Serverless'} (SERVERLESS={'False' if realtime else 'True'})")
124
- print(f"🔄 Recreate: {recreate}")
133
+ print(f"🔄 DynamicTraining: {dt}")
134
+ print(f"🆕 Promote: {promote}")
125
135
  print(f"🆔 Message ID: {message_id}")
126
136
  print("\n🔍 MONITORING LOCATIONS:")
127
137
  print(f" • SQS Queue: AWS Console → SQS → {queue_name}")
@@ -144,13 +154,18 @@ def main():
144
154
  help="Create realtime endpoints (default is serverless)",
145
155
  )
146
156
  parser.add_argument(
147
- "--recreate",
157
+ "--dt",
158
+ action="store_true",
159
+ help="Set DT=True (models and endpoints will have '-dt' suffix)",
160
+ )
161
+ parser.add_argument(
162
+ "--promote",
148
163
  action="store_true",
149
- help="Set RECREATE=True (will force recreation of resources)",
164
+ help="Set Promote=True (models and endpoints will use promoted naming",
150
165
  )
151
166
  args = parser.parse_args()
152
167
  try:
153
- submit_to_sqs(args.script_file, args.size, realtime=args.realtime, recreate=args.recreate)
168
+ submit_to_sqs(args.script_file, args.size, realtime=args.realtime, dt=args.dt, promote=args.promote)
154
169
  except Exception as e:
155
170
  print(f"\n❌ ERROR: {e}")
156
171
  log.error(f"Error: {e}")
@@ -4,16 +4,13 @@ import os
4
4
  import sys
5
5
  import platform
6
6
  import logging
7
- import importlib.resources as resources # noqa: F401 Python 3.9 compatibility
8
7
  from typing import Any, Dict
8
+ from importlib.resources import files, as_file
9
9
 
10
10
  # Workbench imports
11
11
  from workbench.utils.license_manager import LicenseManager
12
12
  from workbench_bridges.utils.execution_environment import running_as_service
13
13
 
14
- # Python 3.9 compatibility
15
- from workbench.utils.resource_utils import get_resource_path
16
-
17
14
 
18
15
  class FatalConfigError(Exception):
19
16
  """Exception raised for errors in the configuration."""
@@ -172,8 +169,7 @@ class ConfigManager:
172
169
  Returns:
173
170
  str: The open source API key.
174
171
  """
175
- # Python 3.9 compatibility
176
- with get_resource_path("workbench.resources", "open_source_api.key") as open_source_key_path:
172
+ with as_file(files("workbench.resources").joinpath("open_source_api.key")) as open_source_key_path:
177
173
  with open(open_source_key_path, "r") as key_file:
178
174
  return key_file.read().strip()
179
175
 
@@ -6,15 +6,12 @@ import json
6
6
  import logging
7
7
  import requests
8
8
  from typing import Union
9
- import importlib.resources as resources # noqa: F401 Python 3.9 compatibility
10
9
  from datetime import datetime
11
10
  from cryptography.hazmat.primitives import hashes
12
11
  from cryptography.hazmat.primitives.asymmetric import padding
13
12
  from cryptography.hazmat.primitives import serialization
14
13
  from cryptography.hazmat.backends import default_backend
15
-
16
- # Python 3.9 compatibility
17
- from workbench.utils.resource_utils import get_resource_path
14
+ from importlib.resources import files, as_file
18
15
 
19
16
 
20
17
  class FatalLicenseError(Exception):
@@ -140,8 +137,7 @@ class LicenseManager:
140
137
  Returns:
141
138
  The public key as an object.
142
139
  """
143
- # Python 3.9 compatibility
144
- with get_resource_path("workbench.resources", "signature_verify_pub.pem") as public_key_path:
140
+ with as_file(files("workbench.resources").joinpath("signature_verify_pub.pem")) as public_key_path:
145
141
  with open(public_key_path, "rb") as key_file:
146
142
  public_key_data = key_file.read()
147
143
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: workbench
3
- Version: 0.8.185
3
+ Version: 0.8.187
4
4
  Summary: Workbench: A Dashboard and Python API for creating and deploying AWS SageMaker Model Pipelines
5
5
  Author-email: SuperCowPowers LLC <support@supercowpowers.com>
6
6
  License-Expression: MIT
@@ -10,6 +10,7 @@ Classifier: Development Status :: 4 - Beta
10
10
  Classifier: Programming Language :: Python :: 3.10
11
11
  Classifier: Programming Language :: Python :: 3.11
12
12
  Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
13
14
  Classifier: Topic :: Scientific/Engineering
14
15
  Requires-Python: >=3.10
15
16
  Description-Content-Type: text/markdown
@@ -54,9 +54,9 @@ workbench/core/artifacts/cached_artifact_mixin.py,sha256=ngqFLZ4cQx_TFouXZgXZQsv
54
54
  workbench/core/artifacts/data_capture_core.py,sha256=q8f79rRTYiZ7T4IQRWXl8ZvPpcvZyNxYERwvo8o0OQc,14858
55
55
  workbench/core/artifacts/data_source_abstract.py,sha256=5IRCzFVK-17cd4NXPMRfx99vQAmQ0WHE5jcm5RfsVTg,10619
56
56
  workbench/core/artifacts/data_source_factory.py,sha256=YL_tA5fsgubbB3dPF6T4tO0rGgz-6oo3ge4i_YXVC-M,2380
57
- workbench/core/artifacts/endpoint_core.py,sha256=gQdOHtjEeC1WCHbKZNaDQ0eeOka1sCO-zcABDO4_Egk,51965
57
+ workbench/core/artifacts/endpoint_core.py,sha256=FUBs8z5l0D3UsVqmQzjlzkVDzN0fhMcqKXTLAAG1gmc,51966
58
58
  workbench/core/artifacts/feature_set_core.py,sha256=7b1o_PzxtwaYC-W2zxlkltiO0fYULA8CVGWwHNmqgtI,31457
59
- workbench/core/artifacts/model_core.py,sha256=wjoa2GQnzrrTM-E2VgYZHT9Ixebl3LaKbJL0YvEdrJY,51546
59
+ workbench/core/artifacts/model_core.py,sha256=x_FloG9bMUTqUBDYdfl68AaakwNMBCl-BcP-1E9ZpuQ,51545
60
60
  workbench/core/artifacts/monitor_core.py,sha256=M307yz7tEzOEHgv-LmtVy9jKjSbM98fHW3ckmNYrwlU,27897
61
61
  workbench/core/cloud_platform/cloud_meta.py,sha256=-g4-LTC3D0PXb3VfaXdLR1ERijKuHdffeMK_zhD-koQ,8809
62
62
  workbench/core/cloud_platform/aws/README.md,sha256=QT5IQXoUHbIA0qQ2wO6_2P2lYjYQFVYuezc22mWY4i8,97
@@ -156,8 +156,8 @@ workbench/model_scripts/pytorch_model/requirements.txt,sha256=ICS5nW0wix44EJO2tJ
156
156
  workbench/model_scripts/scikit_learn/generated_model_script.py,sha256=c73ZpJBlU5k13Nx-ZDkLXu7da40CYyhwjwwmuPq6uLg,12870
157
157
  workbench/model_scripts/scikit_learn/requirements.txt,sha256=aVvwiJ3LgBUhM_PyFlb2gHXu_kpGPho3ANBzlOkfcvs,107
158
158
  workbench/model_scripts/scikit_learn/scikit_learn.template,sha256=QQvqx-eX9ZTbYmyupq6R6vIQwosmsmY_MRBPaHyfjdk,12586
159
- workbench/model_scripts/uq_models/generated_model_script.py,sha256=gJb_5jBb4mcf41jb6578H9uYYH6Y-uFtPp1MNKXNFQQ,21231
160
- workbench/model_scripts/uq_models/mapie.template,sha256=8VzoP-Wp3ECVIDqXVkiTS6bwmn3cd3dDZ2WjYPzXTi8,18955
159
+ workbench/model_scripts/uq_models/generated_model_script.py,sha256=U4_41APyNISnJ3EHnXiaSIEdb3E1M1JT7ECNjsoX4fI,21197
160
+ workbench/model_scripts/uq_models/mapie.template,sha256=2HIwB_658IsZiLIV1RViIZBIGgXxDsJPZinDUu8SchU,18961
161
161
  workbench/model_scripts/uq_models/requirements.txt,sha256=fw7T7t_YJAXK3T6Ysbesxh_Agx_tv0oYx72cEBTqRDY,98
162
162
  workbench/model_scripts/xgb_model/generated_model_script.py,sha256=Tbn7EMXxZZO8rDdKQ5fYCbpltACsMXNvuusLL9p-U5c,22319
163
163
  workbench/model_scripts/xgb_model/requirements.txt,sha256=jWlGc7HH7vqyukTm38LN4EyDi8jDUPEay4n45z-30uc,104
@@ -168,8 +168,9 @@ workbench/resources/open_source_api.key,sha256=3S0OTblsmC0msUPdE_dbBmI83xJNmYscu
168
168
  workbench/resources/signature_verify_pub.pem,sha256=V3-u-3_z2PH-805ybkKvzDOBwAbvHxcKn0jLBImEtzM,272
169
169
  workbench/scripts/check_double_bond_stereo.py,sha256=p5hnL54Weq77ES0HCELq9JeoM-PyUGkvVSeWYF2dKyo,7776
170
170
  workbench/scripts/glue_launcher.py,sha256=bIKQvfGxpAhzbeNvTnHfRW_5kQhY-169_868ZnCejJk,10692
171
+ workbench/scripts/lambda_launcher.py,sha256=U5HevvWdwN0SUrN2kpbkf0doY-5Ih_LzjJTH-45LBJ8,925
171
172
  workbench/scripts/ml_pipeline_batch.py,sha256=1T5JnLlUJR7bwAGBLHmLPOuj1xFRqVIQX8PsuDhHy8o,4907
172
- workbench/scripts/ml_pipeline_sqs.py,sha256=s1861q4zuvV-aSOhwy8xW1xid9yDVNGioDHxba80Qpg,6185
173
+ workbench/scripts/ml_pipeline_sqs.py,sha256=ebe8clE6dMONF43_JiX5Qx1WESPfGlF2-AifvJOde50,6578
173
174
  workbench/scripts/monitor_cloud_watch.py,sha256=s7MY4bsHts0nup9G0lWESCvgJZ9Mw1Eo-c8aKRgLjMw,9235
174
175
  workbench/scripts/redis_expire.py,sha256=DxI_RKSNlrW2BsJZXcsSbaWGBgPZdPhtzHjV9SUtElE,1120
175
176
  workbench/scripts/redis_report.py,sha256=iaJSuGPyLCs6e0TMcZDoT0YyJ43xJ1u74YD8FLnnUg4,990
@@ -202,7 +203,7 @@ workbench/utils/cache.py,sha256=0R5RXYEz_XHARK3anmQC4VRMawMks_cJ8S4vwC2roAE,5524
202
203
  workbench/utils/cloudwatch_handler.py,sha256=t0L280Qa1nMq95dwnf8lB5g8FHrQAyGY5S4JwP3yIa8,5165
203
204
  workbench/utils/cloudwatch_utils.py,sha256=wXSqKcJlSnHyC0D6d4RsH8wwmx_0CsffcetUgXlZ_78,4828
204
205
  workbench/utils/color_utils.py,sha256=TmDGLK44t975lkfjt_1O-ee02QxrKfke7vPuXb-V-Uo,11779
205
- workbench/utils/config_manager.py,sha256=SBBmO1RGCQ_Zyh91tDxL1HOm5B0v38ImlLnOsEKzXPU,17649
206
+ workbench/utils/config_manager.py,sha256=UPP9SHTLfPyPKEfsgH2YXp9WlImmVZ5zqFft4BxRdlo,17499
206
207
  workbench/utils/dashboard_metrics.py,sha256=cNFI0GIAjd_IiDzM1oebsJ2QkRZuW068W_66ZC3J100,7398
207
208
  workbench/utils/datetime_utils.py,sha256=r3G_KB2euu26lwVbDXYXPJEpJCZwin2Iph7BiBIoybg,4454
208
209
  workbench/utils/deprecated_utils.py,sha256=qniHVpDGuwOnhxn65LofDQ_EA2OhSUcZLPxAXtx7FgA,3540
@@ -216,7 +217,7 @@ workbench/utils/graph_utils.py,sha256=T4aslYVbzPmFe0_qKCQP6PZnaw1KATNXQNVO-yDGBx
216
217
  workbench/utils/ipython_utils.py,sha256=skbdbBwUT-iuY3FZwy3ACS7-FWSe9M2qVXfLlQWnikE,700
217
218
  workbench/utils/json_utils.py,sha256=FSxzcD88TbIEJDw0FHue5-ZGny94wm5NeLs4zYlLLpU,4881
218
219
  workbench/utils/lambda_utils.py,sha256=7GhGRPyXn9o-toWb9HBGSnI8-DhK9YRkwhCSk_mNKMI,1893
219
- workbench/utils/license_manager.py,sha256=sDuhk1mZZqUbFmnuFXehyGnui_ALxrmYBg7gYwoo7ho,6975
220
+ workbench/utils/license_manager.py,sha256=lNE9zZIglmX3zqqCKBdN1xqTgHCEZgJDxavF6pdG7fc,6825
220
221
  workbench/utils/log_utils.py,sha256=7n1NJXO_jUX82e6LWAQug6oPo3wiPDBYsqk9gsYab_A,3167
221
222
  workbench/utils/markdown_utils.py,sha256=4lEqzgG4EVmLcvvKKNUwNxVCySLQKJTJmWDiaDroI1w,8306
222
223
  workbench/utils/model_utils.py,sha256=5z4E_F_uDUhuz5_0ZNqNXvretImF1c49LX158RP6yfI,13588
@@ -229,7 +230,6 @@ workbench/utils/plugin_manager.py,sha256=JWfyFHQih_J_MMtAT1cgjGVnNVPk9bM917LkfH8
229
230
  workbench/utils/prox_utils.py,sha256=V0YSxI6lboZl8Bed1GUobFqfMhfpehn2FtgqHpkuhDQ,6170
230
231
  workbench/utils/redis_cache.py,sha256=39LFSWmOlNNcah02D3sBnmibc-DPeKC3SNq71K4HaB4,12893
231
232
  workbench/utils/repl_utils.py,sha256=rWOMv2HiEIp8ZL6Ps6DlwiJlGr-pOhv9OZQhm3aR-1A,4668
232
- workbench/utils/resource_utils.py,sha256=EM4SrMmRUQnG80aR5M7hmzw86hYdP_S7fRPuqhpDSVo,1435
233
233
  workbench/utils/s3_utils.py,sha256=Xme_o_cftC_jWnw6R9YKS6-6C11zaCBAoQDlY3dZb5o,7337
234
234
  workbench/utils/shap_utils.py,sha256=dtjSIwSyvYSaQjjvIp5A9LGS7pr-5Vt907rvVKOrqNY,12651
235
235
  workbench/utils/shapley_values.py,sha256=3DvQz4HIPnxW42idgtuQ5vtzU-oF4_lToaWzLRjU-E4,3673
@@ -287,9 +287,9 @@ workbench/web_interface/page_views/main_page.py,sha256=X4-KyGTKLAdxR-Zk2niuLJB2Y
287
287
  workbench/web_interface/page_views/models_page_view.py,sha256=M0bdC7bAzLyIaE2jviY12FF4abdMFZmg6sFuOY_LaGI,2650
288
288
  workbench/web_interface/page_views/page_view.py,sha256=Gh6YnpOGlUejx-bHZAf5pzqoQ1H1R0OSwOpGhOBO06w,455
289
289
  workbench/web_interface/page_views/pipelines_page_view.py,sha256=v2pxrIbsHBcYiblfius3JK766NZ7ciD2yPx0t3E5IJo,2656
290
- workbench-0.8.185.dist-info/licenses/LICENSE,sha256=z4QMMPlLJkZjU8VOKqJkZiQZCEZ--saIU2Z8-p3aVc0,1080
291
- workbench-0.8.185.dist-info/METADATA,sha256=4S2A5vuZPlJZpRqFGQFe7nL4DzQjTsKIo-V2x0WzDF0,9210
292
- workbench-0.8.185.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
293
- workbench-0.8.185.dist-info/entry_points.txt,sha256=zPFPruY9uayk8-wsKrhfnIyIB6jvZOW_ibyllEIsLWo,356
294
- workbench-0.8.185.dist-info/top_level.txt,sha256=Dhy72zTxaA_o_yRkPZx5zw-fwumnjGaeGf0hBN3jc_w,10
295
- workbench-0.8.185.dist-info/RECORD,,
290
+ workbench-0.8.187.dist-info/licenses/LICENSE,sha256=z4QMMPlLJkZjU8VOKqJkZiQZCEZ--saIU2Z8-p3aVc0,1080
291
+ workbench-0.8.187.dist-info/METADATA,sha256=1lRWJw94dqcolsHhaAxcUbu0JdeJB2ETVOoMxhJqpcI,9261
292
+ workbench-0.8.187.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
293
+ workbench-0.8.187.dist-info/entry_points.txt,sha256=o7ohD4D2oygnHp7i9-C0LfcHDuPW5Tv0JXGAg97DpGk,413
294
+ workbench-0.8.187.dist-info/top_level.txt,sha256=Dhy72zTxaA_o_yRkPZx5zw-fwumnjGaeGf0hBN3jc_w,10
295
+ workbench-0.8.187.dist-info/RECORD,,
@@ -1,6 +1,7 @@
1
1
  [console_scripts]
2
2
  cloud_watch = workbench.scripts.monitor_cloud_watch:main
3
3
  glue_launcher = workbench.scripts.glue_launcher:main
4
+ lambda_launcher = workbench.scripts.lambda_launcher:main
4
5
  ml_pipeline_batch = workbench.scripts.ml_pipeline_batch:main
5
6
  ml_pipeline_sqs = workbench.scripts.ml_pipeline_sqs:main
6
7
  workbench = workbench.repl.workbench_shell:launch_shell
@@ -1,39 +0,0 @@
1
- """Resource utilities for Workbench"""
2
-
3
- import sys
4
- import importlib.resources as resources
5
- import pathlib
6
- import pkg_resources
7
-
8
-
9
- def get_resource_path(package: str, resource: str) -> pathlib.Path:
10
- """Get the path to a resource file, compatible with Python 3.9 and higher.
11
-
12
- Args:
13
- package (str): The package where the resource is located.
14
- resource (str): The name of the resource file.
15
-
16
- Returns:
17
- pathlib.Path: The path to the resource file.
18
- """
19
- if sys.version_info >= (3, 10):
20
- # Python 3.10 and higher: use importlib.resources.path
21
- with resources.path(package, resource) as path:
22
- return path
23
- else:
24
- # Python 3.9 and lower: manually construct the path based on package location
25
- # Get the location of the installed package
26
- package_location = pathlib.Path(pkg_resources.get_distribution(package.split(".")[0]).location)
27
- resource_path = package_location / package.replace(".", "/") / resource
28
-
29
- if resource_path.exists():
30
- return resource_path
31
- else:
32
- raise FileNotFoundError(f"Resource '{resource}' not found in package '{package}'.")
33
-
34
-
35
- if __name__ == "__main__":
36
- # Test the resource utilities
37
- with get_resource_path("workbench.resources", "open_source_api.key") as open_source_key_path:
38
- with open(open_source_key_path, "r") as key_file:
39
- print(key_file.read().strip())