synapse-sdk 2025.9.3__py3-none-any.whl → 2025.9.4__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 synapse-sdk might be problematic. Click here for more details.

@@ -12,6 +12,7 @@ from synapse_sdk.plugins.enums import RunMethod
12
12
  from synapse_sdk.plugins.exceptions import ActionError
13
13
  from synapse_sdk.plugins.models import PluginRelease, Run
14
14
  from synapse_sdk.plugins.upload import archive_and_upload, build_and_upload, download_and_upload
15
+ from synapse_sdk.shared import init_sentry, needs_sentry_init
15
16
  from synapse_sdk.utils.module_loading import import_string
16
17
  from synapse_sdk.utils.pydantic.errors import pydantic_to_drf_error
17
18
 
@@ -182,8 +183,8 @@ class Action:
182
183
  runtime_env[self.plugin_package_manager][key] = value
183
184
 
184
185
  # Sentry init if SENTRY_DSN is set
185
- if self.envs.get('SENTRY_INIT_FUNCTION') is not None:
186
- runtime_env['worker_process_setup_hook'] = self.envs.pop('SENTRY_INIT_FUNCTION')
186
+ if needs_sentry_init():
187
+ runtime_env['worker_process_setup_hook'] = init_sentry
187
188
 
188
189
  # 맨 마지막에 진행되어야 함
189
190
  runtime_env['env_vars'] = self.envs
@@ -312,27 +313,10 @@ class Action:
312
313
 
313
314
  return JobSubmissionClient(address=self.envs.get('RAY_DASHBOARD_URL'))
314
315
 
315
- def _sentry_init(self, sentry_dsn):
316
- import sentry_sdk
317
- from sentry_sdk.integrations.ray import RayIntegration
318
-
319
- sentry_sdk.init(
320
- dsn=sentry_dsn,
321
- environment=os.getenv('DEPLOYMENT_TARGET', 'development'),
322
- integrations=[RayIntegration()],
323
- send_default_pii=True,
324
- )
325
-
326
- def sentry_init(self):
327
- sentry_dsn = os.getenv('SENTRY_DSN', self.envs.get('SENTRY_DSN') if self.envs else None)
328
- if sentry_dsn:
329
- self._sentry_init(sentry_dsn)
330
- self.envs['SENTRY_INIT_FUNCTION'] = self._sentry_init
331
-
332
316
  def ray_init(self):
333
317
  import ray
334
318
 
335
- self.sentry_init()
319
+ init_sentry()
336
320
 
337
321
  if not ray.is_initialized():
338
322
  ray.init(address=self.envs['RAY_ADDRESS'], ignore_reinit_error=True)
@@ -52,26 +52,40 @@ class RecursiveFileDiscoveryStrategy(FileDiscoveryStrategy):
52
52
  for spec_name, dir_path in type_dirs.items():
53
53
  dir_path_str = path_cache[dir_path]
54
54
  if file_path_str.startswith(dir_path_str):
55
- file_name = file_path.stem
55
+ # Create unique dataset key using relative path from spec directory
56
+ relative_path = file_path.relative_to(dir_path)
57
+ # Use parent directory + stem as unique key to group related files
58
+ if relative_path.parent != Path('.'):
59
+ dataset_key = f'{relative_path.parent}_{file_path.stem}'
60
+ else:
61
+ dataset_key = file_path.stem
56
62
 
57
- if file_name not in dataset_files:
58
- dataset_files[file_name] = {}
63
+ if dataset_key not in dataset_files:
64
+ dataset_files[dataset_key] = {}
59
65
 
60
- if spec_name not in dataset_files[file_name]:
61
- dataset_files[file_name][spec_name] = file_path
66
+ if spec_name not in dataset_files[dataset_key]:
67
+ dataset_files[dataset_key][spec_name] = file_path
62
68
  else:
63
69
  # Keep the most recent file - only stat when needed
64
- existing_file = dataset_files[file_name][spec_name]
70
+ existing_file = dataset_files[dataset_key][spec_name]
65
71
  try:
66
72
  if file_path.stat().st_mtime > existing_file.stat().st_mtime:
67
- dataset_files[file_name][spec_name] = file_path
73
+ dataset_files[dataset_key][spec_name] = file_path
68
74
  except (OSError, IOError):
69
75
  # If stat fails, keep existing file
70
76
  pass
71
77
 
72
78
  # Create organized files for datasets with all required files
73
- for file_name, files_dict in sorted(dataset_files.items()):
79
+ for dataset_key, files_dict in sorted(dataset_files.items()):
74
80
  if all(req in files_dict for req in required_specs):
81
+ # Extract original file stem from dataset_key
82
+ # If dataset_key contains path info (parent_stem), extract just the stem part
83
+ if '_' in dataset_key and len(dataset_key.split('_')) >= 2:
84
+ # Extract the last part after the last underscore as the original stem
85
+ original_stem = dataset_key.split('_')[-1]
86
+ else:
87
+ original_stem = dataset_key
88
+
75
89
  # Calculate most common file extension (optimized)
76
90
  file_extensions = {}
77
91
  for file_path in files_dict.values():
@@ -82,14 +96,15 @@ class RecursiveFileDiscoveryStrategy(FileDiscoveryStrategy):
82
96
  origin_file_extension = max(file_extensions, key=file_extensions.get) if file_extensions else ''
83
97
 
84
98
  meta_data = {
85
- 'origin_file_stem': file_name,
99
+ 'origin_file_stem': original_stem,
86
100
  'origin_file_extension': origin_file_extension,
87
101
  'created_at': datetime.now().isoformat(),
102
+ 'dataset_key': dataset_key, # Add dataset key for debugging
88
103
  }
89
104
 
90
105
  # Add metadata if available - using optimized index lookup
91
106
  if metadata_index:
92
- matched_metadata = self._find_matching_metadata_optimized(file_name, files_dict, metadata_index)
107
+ matched_metadata = self._find_matching_metadata_optimized(original_stem, files_dict, metadata_index)
93
108
  if matched_metadata:
94
109
  meta_data.update(matched_metadata)
95
110
 
@@ -6,6 +6,7 @@ from synapse_sdk.clients.backend import BackendClient
6
6
  from synapse_sdk.devtools.config import get_backend_config
7
7
  from synapse_sdk.loggers import BackendLogger, ConsoleLogger
8
8
  from synapse_sdk.plugins.utils import read_plugin_config
9
+ from synapse_sdk.shared import init_sentry, needs_sentry_init
9
10
  from synapse_sdk.shared.enums import Context
10
11
  from synapse_sdk.utils.storage import get_storage
11
12
  from synapse_sdk.utils.string import hash_text
@@ -84,8 +85,8 @@ class PluginRelease:
84
85
 
85
86
  extra_runtime_env = {}
86
87
 
87
- if self.envs.get('SENTRY_INIT_FUNCTION') is not None:
88
- extra_runtime_env['worker_process_setup_hook'] = self.envs['SENTRY_INIT_FUNCTION']
88
+ if needs_sentry_init():
89
+ extra_runtime_env['worker_process_setup_hook'] = init_sentry
89
90
 
90
91
  nodes = list_nodes(address=self.envs['RAY_DASHBOARD_URL'])
91
92
  node_ids = [n['node_id'] for n in nodes]
@@ -99,6 +100,7 @@ class PluginRelease:
99
100
  ** self.package_manager_options
100
101
  },
101
102
  'working_dir': self.get_url(self.envs['SYNAPSE_PLUGIN_STORAGE']),
103
+ **extra_runtime_env,
102
104
  },
103
105
  scheduling_strategy=strategy,
104
106
  ).remote()
@@ -0,0 +1,21 @@
1
+ import os
2
+
3
+
4
+ def needs_sentry_init():
5
+ return os.getenv('SENTRY_DSN') is not None
6
+
7
+
8
+ def init_sentry():
9
+ import sentry_sdk
10
+ from sentry_sdk.integrations.ray import RayIntegration
11
+
12
+ dsn = os.getenv('SENTRY_DSN')
13
+ if dsn is None:
14
+ return
15
+
16
+ sentry_sdk.init(
17
+ dsn=dsn,
18
+ environment=os.getenv('DEPLOYMENT_TARGET', 'development'),
19
+ integrations=[RayIntegration()],
20
+ send_default_pii=True,
21
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: synapse-sdk
3
- Version: 2025.9.3
3
+ Version: 2025.9.4
4
4
  Summary: synapse sdk
5
5
  Author-email: datamaker <developer@datamaker.io>
6
6
  License: MIT
@@ -183,10 +183,10 @@ synapse_sdk/plugins/README.md,sha256=S0xowL7ukJZf0_zjNnWz0g_-b731GrIkdkwaS2ubpz0
183
183
  synapse_sdk/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
184
  synapse_sdk/plugins/enums.py,sha256=ibixwqA3sCNSriG1jAtL54JQc_Zwo3MufwYUqGhVncc,523
185
185
  synapse_sdk/plugins/exceptions.py,sha256=Qs7qODp_RRLO9y2otU2T4ryj5LFwIZODvSIXkAh91u0,691
186
- synapse_sdk/plugins/models.py,sha256=HHwK61zl1Q3Fx7zTE1ao7fjmOetml8sk5gyHe7Jv1nM,5873
186
+ synapse_sdk/plugins/models.py,sha256=g1qvgzLL63LVZ_tIc2gUGw4j7zKr0BPYeLtddrHsS_U,5924
187
187
  synapse_sdk/plugins/upload.py,sha256=VJOotYMayylOH0lNoAGeGHRkLdhP7jnC_A0rFQMvQpQ,3228
188
188
  synapse_sdk/plugins/categories/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
- synapse_sdk/plugins/categories/base.py,sha256=6CN8ybErhsOQX2VwJB2yhrDSDelQT8L3sBVOxLENe3I,12155
189
+ synapse_sdk/plugins/categories/base.py,sha256=7zRkZw3_oTF2n69Lv85ztKADXn6Qei5-vcpJHDUOS8M,11555
190
190
  synapse_sdk/plugins/categories/decorators.py,sha256=Gw6T-UHwpCKrSt596X-g2sZbY_Z1zbbogowClj7Pr5Q,518
191
191
  synapse_sdk/plugins/categories/registry.py,sha256=KdQR8SUlLT-3kgYzDNWawS1uJnAhrcw2j4zFaTpilRs,636
192
192
  synapse_sdk/plugins/categories/templates.py,sha256=FF5FerhkZMeW1YcKLY5cylC0SkWSYdJODA_Qcm4OGYQ,887
@@ -273,7 +273,7 @@ synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/batch.
273
273
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/data_unit/single.py,sha256=bjvWu5t_nAK9Z8AWM_n1uwusMWd9G-7ddqSmwsH39l0,1344
274
274
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/__init__.py,sha256=ELVncVuhTFvPrbGUjZZAD7upvV3IEsaRi9eTXyjaOU8,42
275
275
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/flat.py,sha256=OW_EyZJYi40Qgri4MhRKGj98M-0SOUz58ldM-de00Cc,9866
276
- synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py,sha256=kq7_T_WS_4Rp73iFkNlaMgNM3juZ1bsxoTxQINAjm1A,10098
276
+ synapse_sdk/plugins/categories/upload/actions/upload/strategies/file_discovery/recursive.py,sha256=gdIaOFB9QyO7MZTQTnX_iI_fn_ysEfRLKQRyRHzZkLE,11072
277
277
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/__init__.py,sha256=d3sSL9boHCmYmbWupbJ7s8LOBakGCgjiPKRQIbfDCs8,36
278
278
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/excel.py,sha256=LlykEvwfyuRRCWozExQoolvIfHH1-B4vHOu7dykSTnQ,7333
279
279
  synapse_sdk/plugins/categories/upload/actions/upload/strategies/metadata/none.py,sha256=RGcSmc4N9JnqxC8R-AEo_4_wmg1KS0lij1PxXij9ipk,507
@@ -302,7 +302,7 @@ synapse_sdk/plugins/utils/actions.py,sha256=QjzISxUMyrcFtOphaYP8tdAkAAzOUZlfnMbV
302
302
  synapse_sdk/plugins/utils/config.py,sha256=uyGp9GhphQE-b6sla3NwMUH0DeBunvi7szycRj-TMsE,6735
303
303
  synapse_sdk/plugins/utils/legacy.py,sha256=UWEk5FHk_AqU4GxhfyKJ76VgBUHS-ktKV6_jTJCgT8k,2689
304
304
  synapse_sdk/plugins/utils/registry.py,sha256=HKALzYcPQSFsdLAzodYXMdfFnKOcg6oHYBrx7EwVqNU,1484
305
- synapse_sdk/shared/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
305
+ synapse_sdk/shared/__init__.py,sha256=kvO_PloP92smK7mA9D2hUwfGiMZd3916BVSsbmRIzco,440
306
306
  synapse_sdk/shared/enums.py,sha256=5uy4HGKtGCAvrBMuVSzwloJ6f41sOk0ty__605zF8hg,3538
307
307
  synapse_sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
308
308
  synapse_sdk/utils/dataset.py,sha256=zWTzFmv589izFr62BDuApi3r5FpTsdm-5AmriC0AEdM,1865
@@ -347,9 +347,9 @@ synapse_sdk/utils/storage/providers/gcp.py,sha256=i2BQCu1Kej1If9SuNr2_lEyTcr5M_n
347
347
  synapse_sdk/utils/storage/providers/http.py,sha256=2DhIulND47JOnS5ZY7MZUex7Su3peAPksGo1Wwg07L4,5828
348
348
  synapse_sdk/utils/storage/providers/s3.py,sha256=ZmqekAvIgcQBdRU-QVJYv1Rlp6VHfXwtbtjTSphua94,2573
349
349
  synapse_sdk/utils/storage/providers/sftp.py,sha256=_8s9hf0JXIO21gvm-JVS00FbLsbtvly4c-ETLRax68A,1426
350
- synapse_sdk-2025.9.3.dist-info/licenses/LICENSE,sha256=bKzmC5YAg4V1Fhl8OO_tqY8j62hgdncAkN7VrdjmrGk,1101
351
- synapse_sdk-2025.9.3.dist-info/METADATA,sha256=OTYFTKNnAWBehxH-lsQtXdRpr9H6q8Gs6AB09DEr2Ns,3815
352
- synapse_sdk-2025.9.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
353
- synapse_sdk-2025.9.3.dist-info/entry_points.txt,sha256=VNptJoGoNJI8yLXfBmhgUefMsmGI0m3-0YoMvrOgbxo,48
354
- synapse_sdk-2025.9.3.dist-info/top_level.txt,sha256=ytgJMRK1slVOKUpgcw3LEyHHP7S34J6n_gJzdkcSsw8,12
355
- synapse_sdk-2025.9.3.dist-info/RECORD,,
350
+ synapse_sdk-2025.9.4.dist-info/licenses/LICENSE,sha256=bKzmC5YAg4V1Fhl8OO_tqY8j62hgdncAkN7VrdjmrGk,1101
351
+ synapse_sdk-2025.9.4.dist-info/METADATA,sha256=Z6dOGBiTPybtGy3xbfmsr-Z7QpFYF4HHDauxoRCb-OA,3815
352
+ synapse_sdk-2025.9.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
353
+ synapse_sdk-2025.9.4.dist-info/entry_points.txt,sha256=VNptJoGoNJI8yLXfBmhgUefMsmGI0m3-0YoMvrOgbxo,48
354
+ synapse_sdk-2025.9.4.dist-info/top_level.txt,sha256=ytgJMRK1slVOKUpgcw3LEyHHP7S34J6n_gJzdkcSsw8,12
355
+ synapse_sdk-2025.9.4.dist-info/RECORD,,