salesforce-data-customcode 0.1.26__tar.gz → 0.1.27__tar.gz

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 (63) hide show
  1. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/PKG-INFO +1 -1
  2. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/pyproject.toml +1 -1
  3. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/cmd.py +6 -2
  4. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/deploy.py +16 -14
  5. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/LICENSE.txt +0 -0
  6. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/README.md +0 -0
  7. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/__init__.py +0 -0
  8. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/auth.py +0 -0
  9. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/cli.py +0 -0
  10. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/client.py +0 -0
  11. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/config.py +0 -0
  12. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/config.yaml +0 -0
  13. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/credentials.py +0 -0
  14. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/file/__init__.py +0 -0
  15. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/file/base.py +0 -0
  16. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/file/path/__init__.py +0 -0
  17. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/file/path/default.py +0 -0
  18. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/__init__.py +0 -0
  19. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/base.py +0 -0
  20. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/reader/__init__.py +0 -0
  21. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/reader/base.py +0 -0
  22. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/reader/query_api.py +0 -0
  23. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/reader/sf_cli.py +0 -0
  24. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/reader/utils.py +0 -0
  25. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/writer/__init__.py +0 -0
  26. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/writer/base.py +0 -0
  27. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/writer/csv.py +0 -0
  28. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/io/writer/print.py +0 -0
  29. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/mixin.py +0 -0
  30. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/proxy/__init__.py +0 -0
  31. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/proxy/base.py +0 -0
  32. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/proxy/client/LocalProxyClientProvider.py +0 -0
  33. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/proxy/client/__init__.py +0 -0
  34. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/proxy/client/base.py +0 -0
  35. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/py.typed +0 -0
  36. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/run.py +0 -0
  37. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/scan.py +0 -0
  38. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/spark/__init__.py +0 -0
  39. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/spark/base.py +0 -0
  40. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/spark/default.py +0 -0
  41. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/template.py +0 -0
  42. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/.devcontainer/devcontainer.json +0 -0
  43. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/Dockerfile.dependencies +0 -0
  44. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/README.md +0 -0
  45. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/build_native_dependencies.sh +0 -0
  46. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/payload/config.json +0 -0
  47. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/payload/entrypoint.py +0 -0
  48. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/requirements-dev.txt +0 -0
  49. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/function/requirements.txt +0 -0
  50. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/.devcontainer/devcontainer.json +0 -0
  51. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/Dockerfile +0 -0
  52. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/Dockerfile.dependencies +0 -0
  53. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/README.md +0 -0
  54. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/account.ipynb +0 -0
  55. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/build_native_dependencies.sh +0 -0
  56. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/examples/employee_hierarchy/employee_data.csv +0 -0
  57. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/examples/employee_hierarchy/entrypoint.py +0 -0
  58. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/jupyterlab.sh +0 -0
  59. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/payload/config.json +0 -0
  60. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/payload/entrypoint.py +0 -0
  61. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/requirements-dev.txt +0 -0
  62. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/templates/script/requirements.txt +0 -0
  63. {salesforce_data_customcode-0.1.26 → salesforce_data_customcode-0.1.27}/src/datacustomcode/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: salesforce-data-customcode
3
- Version: 0.1.26
3
+ Version: 0.1.27
4
4
  Summary: Data Cloud Custom Code SDK
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE.txt
@@ -18,7 +18,7 @@ license = "Apache-2.0"
18
18
  name = "salesforce-data-customcode"
19
19
  readme = "README.md"
20
20
  requires-python = ">=3.10,<3.12"
21
- version = "0.1.26"
21
+ version = "0.1.27"
22
22
 
23
23
  [tool.black]
24
24
  exclude = '''
@@ -85,9 +85,13 @@ def _cmd_output(
85
85
  **kwargs: Any,
86
86
  ) -> tuple[int, bytes, Union[bytes, None]]:
87
87
  _setdefault_kwargs(kwargs)
88
+ kwargs.setdefault("shell", True)
89
+ # On Windows, Popen with shell=True and a sequence uses list2cmdline() which
90
+ # quotes the entire string, causing cmd.exe to fail. Joining to a plain string
91
+ # works correctly on both Unix (/bin/sh -c "...") and Windows (cmd.exe /c ...).
92
+ cmd_arg: Union[tuple[str, ...], str] = " ".join(cmd) if kwargs.get("shell") else cmd
88
93
  try:
89
- kwargs.setdefault("shell", True)
90
- proc = subprocess.Popen(cmd, **kwargs)
94
+ proc = subprocess.Popen(cmd_arg, **kwargs)
91
95
  except OSError as e:
92
96
  returncode, stdout_b, stderr_b = _oserror_to_output(e)
93
97
  else:
@@ -272,7 +272,7 @@ def create_deployment(
272
272
  raise
273
273
 
274
274
 
275
- PLATFORM_ENV_VAR = "DOCKER_DEFAULT_PLATFORM=linux/amd64"
275
+ PLATFORM_ENV = {"DOCKER_DEFAULT_PLATFORM": "linux/amd64"}
276
276
  DOCKER_IMAGE_NAME = "datacloud-custom-code-dependency-builder"
277
277
  DEPENDENCIES_ARCHIVE_NAME = "native_dependencies"
278
278
  DEPENDENCIES_ARCHIVE_FULL_NAME = f"{DEPENDENCIES_ARCHIVE_NAME}.tar.gz"
@@ -286,19 +286,25 @@ def prepare_dependency_archive(directory: str, docker_network: str) -> None:
286
286
  cmd = f"docker images -q {DOCKER_IMAGE_NAME}"
287
287
  image_exists = cmd_output(cmd)
288
288
 
289
+ docker_env = {**os.environ, **PLATFORM_ENV}
290
+
289
291
  if not image_exists:
290
292
  logger.info(f"Building docker image with docker network: {docker_network}...")
291
293
  cmd = docker_build_cmd(docker_network)
292
- cmd_output(cmd)
294
+ cmd_output(cmd, env=docker_env)
293
295
 
294
- with tempfile.TemporaryDirectory() as temp_dir:
296
+ # ignore_cleanup_errors=True: on Windows, Docker creates files inside the
297
+ # mounted volume whose permissions prevent the host from deleting them.
298
+ # The archive has already been copied out, so silently skipping leftover
299
+ # files is safe and avoids a fatal error on context-manager exit.
300
+ with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as temp_dir:
295
301
  logger.info(
296
302
  f"Building dependencies archive with docker network: {docker_network}"
297
303
  )
298
304
  shutil.copy("requirements.txt", temp_dir)
299
305
  shutil.copy("build_native_dependencies.sh", temp_dir)
300
306
  cmd = docker_run_cmd(docker_network, temp_dir)
301
- cmd_output(cmd)
307
+ cmd_output(cmd, env=docker_env)
302
308
  archives_temp_path = os.path.join(temp_dir, DEPENDENCIES_ARCHIVE_FULL_NAME)
303
309
  os.makedirs(os.path.dirname(DEPENDENCIES_ARCHIVE_PATH), exist_ok=True)
304
310
  shutil.copy(archives_temp_path, DEPENDENCIES_ARCHIVE_PATH)
@@ -307,10 +313,7 @@ def prepare_dependency_archive(directory: str, docker_network: str) -> None:
307
313
 
308
314
 
309
315
  def docker_build_cmd(network: str) -> str:
310
- cmd = (
311
- f"{PLATFORM_ENV_VAR} docker build -t {DOCKER_IMAGE_NAME} "
312
- f"--file Dockerfile.dependencies . "
313
- )
316
+ cmd = f"docker build -t {DOCKER_IMAGE_NAME} --file Dockerfile.dependencies . "
314
317
 
315
318
  if network != "default":
316
319
  cmd = cmd + f"--network {network}"
@@ -318,12 +321,11 @@ def docker_build_cmd(network: str) -> str:
318
321
  return cmd
319
322
 
320
323
 
321
- def docker_run_cmd(network: str, temp_dir) -> str:
322
- cmd = (
323
- f"{PLATFORM_ENV_VAR} docker run --rm "
324
- f"-v {temp_dir}:/workspace "
325
- f"{DOCKER_IMAGE_NAME} "
326
- )
324
+ def docker_run_cmd(network: str, temp_dir: str) -> str:
325
+ # Normalise path separators: Docker expects forward slashes even on Windows,
326
+ # and quoting handles paths that contain spaces.
327
+ docker_path = temp_dir.replace("\\", "/")
328
+ cmd = f'docker run --rm -v "{docker_path}:/workspace" {DOCKER_IMAGE_NAME} '
327
329
 
328
330
  if network != "default":
329
331
  cmd = cmd + f"--network {network} "