dataflow-core 2.1.17rc1__py3-none-any.whl → 2.1.18rc1__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 dataflow-core might be problematic. Click here for more details.

@@ -31,9 +31,12 @@ class ConnectionBase(BaseModel):
31
31
  raise ValueError("Connection ID must be a string.")
32
32
  if len(v) > 30:
33
33
  raise ValueError("Connection ID must be at most 30 characters long.")
34
- if not re.fullmatch(r"[A-Za-z0-9_-]+", v):
34
+ # Must start with letter, end with letter or digit
35
+ # Can contain letters, numbers, and underscores
36
+ if not re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]|[A-Za-z]", v):
35
37
  raise ValueError(
36
- "Connection ID can only contain letters, numbers, underscores (_), and hyphens (-)!"
38
+ "Connection ID must start with a letter, end with a letter or digit, "
39
+ "and contain only letters, numbers, and underscores (_)!"
37
40
  )
38
41
  return v
39
42
 
@@ -17,9 +17,12 @@ class SSHBase(BaseModel):
17
17
  raise ValueError("SSH key name must be a string.")
18
18
  if len(v) > 20:
19
19
  raise ValueError("SSH key name must be at most 20 characters long.")
20
- if not re.fullmatch(r"[A-Za-z0-9-]+", v):
20
+ # Must start with letter, end with letter or digit
21
+ # Can contain letters, numbers, and underscores
22
+ if not re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]|[A-Za-z]", v):
21
23
  raise ValueError(
22
- "SSH key name can only contain letters, numbers, and hyphens (-)!"
24
+ "SSH key name must start with a letter, end with a letter or digit, "
25
+ "and contain only letters, numbers, and underscores (_)!"
23
26
  )
24
27
  return v
25
28
 
@@ -18,9 +18,12 @@ class SecretBase(BaseModel):
18
18
  raise ValueError("Secret key must be a string.")
19
19
  if len(v) > 30:
20
20
  raise ValueError("Secret key must be at most 30 characters long.")
21
- if not re.fullmatch(r"[A-Za-z0-9_-]+", v):
21
+ # Must start with letter, end with letter or digit
22
+ # Can contain letters, numbers, and underscores
23
+ if not re.fullmatch(r"[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]|[A-Za-z]", v):
22
24
  raise ValueError(
23
- "Secret key can only contain letters, numbers, underscores (_), and hyphens (-)!"
25
+ "Secret key must start with a letter, end with a letter or digit, "
26
+ "and contain only letters, numbers, and underscores (_)!"
24
27
  )
25
28
  return v
26
29
 
@@ -5,7 +5,7 @@ set -e
5
5
  # Accept new parameters
6
6
  yaml_file_path=$1
7
7
  conda_env_path=$2
8
- py_version=$4
8
+ py_version=$3
9
9
 
10
10
  # Validate inputs
11
11
  if [ -z "$yaml_file_path" ] || [ -z "$conda_env_path" ]; then
@@ -1,4 +1,5 @@
1
1
  from .interface import SecretManager
2
+ from .utils import encode_vault_key
2
3
  from ..schemas.connection import ConnectionSave, ConnectionUpdate, ConnectionRead
3
4
  from ..schemas.secret import SecretSave, SecretUpdate, SecretRead
4
5
  from ..schemas.git_ssh import SSHSave, SSHRead
@@ -124,13 +125,16 @@ class _RuntimeAccessor(_BaseAccessor):
124
125
  self.slug = slug
125
126
 
126
127
  def _get_vault_path(self, secret_type: str, key: str) -> str:
128
+ # Encode the key for cloud compatibility
129
+ encoded_key = encode_vault_key(key)
130
+
127
131
  # Special case for git-ssh in runtime context
128
132
  if secret_type == "git-ssh":
129
133
  return f"{self.org_id}-{self.runtime_env}-{secret_type}-{self.slug}"
130
134
 
131
135
  # Standard format for all other secret types
132
136
  context = self.slug if self.slug else "global"
133
- return f"{self.org_id}-{self.runtime_env}-{context}-{secret_type}-{key}"
137
+ return f"{self.org_id}-{self.runtime_env}-{context}-{secret_type}-{encoded_key}"
134
138
 
135
139
  class _StudioAccessor(_BaseAccessor):
136
140
  def __init__(self, secret_manager: SecretManager, org_id: str, user_name: str):
@@ -139,7 +143,9 @@ class _StudioAccessor(_BaseAccessor):
139
143
  self.user_name = user_name
140
144
 
141
145
  def _get_vault_path(self, secret_type: str, key: str) -> str:
142
- return f"{self.org_id}-{self.user_name}-{secret_type}-{key}"
146
+ # Encode the key for cloud compatibility
147
+ encoded_key = encode_vault_key(key)
148
+ return f"{self.org_id}-{self.user_name}-{secret_type}-{encoded_key}"
143
149
 
144
150
  # --------------------------------------------------------------------------
145
151
  # PUBLIC INTERFACE CLASS
@@ -0,0 +1,58 @@
1
+ """
2
+ Utility functions for secrets manager.
3
+ """
4
+
5
+
6
+ def encode_vault_key(key: str) -> str:
7
+ """
8
+ Encode key for cloud-safe storage.
9
+
10
+ Converts to lowercase and replaces underscores with hyphens
11
+ to ensure compatibility with all cloud providers (AWS, Azure, GCP).
12
+
13
+ Cloud providers have different naming restrictions:
14
+ - AWS: Allows a-z, A-Z, 0-9, /_+=.@-
15
+ - Azure: Only lowercase letters, digits, and hyphens (a-z, 0-9, -)
16
+ Must START with letter, END with letter or digit
17
+ - GCP: Lowercase letters, digits, hyphens, and underscores (a-z, 0-9, -, _)
18
+ Must START with letter or underscore
19
+
20
+ This encoding ensures compatibility with the most restrictive provider (Azure).
21
+
22
+ Input validation (done in schemas) ensures:
23
+ - Key starts with a letter (A-Z, a-z)
24
+ - Key ends with a letter or digit (A-Z, a-z, 0-9)
25
+ - Key contains only letters, numbers, and underscores
26
+
27
+ After encoding (lowercase + underscore→hyphen):
28
+ - Starts with lowercase letter (a-z) ✓
29
+ - Ends with lowercase letter or digit (a-z, 0-9) ✓
30
+ - Contains only lowercase letters, digits, and hyphens ✓
31
+
32
+ Args:
33
+ key: Original key name (e.g., "My_Secret", "DB_CONNECTION")
34
+ Must start with letter and end with letter/digit
35
+
36
+ Returns:
37
+ Encoded key in lowercase with hyphens (e.g., "my-secret", "db-connection")
38
+
39
+ Examples:
40
+ >>> encode_vault_key("My_Secret")
41
+ 'my-secret'
42
+ >>> encode_vault_key("DB_CONNECTION")
43
+ 'db-connection'
44
+ >>> encode_vault_key("apiKey123")
45
+ 'apikey123'
46
+ >>> encode_vault_key("test_API_v2")
47
+ 'test-api-v2'
48
+ >>> encode_vault_key("A")
49
+ 'a'
50
+
51
+ Note:
52
+ This encoding is case-insensitive. Both "My_Secret" and "my_secret"
53
+ will map to the same vault path. The original key (with case) is
54
+ preserved in the secret's data payload for reference.
55
+ """
56
+ # Simple encoding: lowercase and replace underscores with hyphens
57
+ # No need for prefix/suffix handling since validation ensures correct start/end
58
+ return key.lower().replace('_', '-')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dataflow-core
3
- Version: 2.1.17rc1
3
+ Version: 2.1.18rc1
4
4
  Summary: Dataflow core package
5
5
  Author: Dataflow
6
6
  Author-email:
@@ -34,16 +34,17 @@ dataflow/models/user.py,sha256=ggJftOVLBEs_6fhn1_13Joe9aL32KMnJwHfBMzeMAOA,2959
34
34
  dataflow/models/user_team.py,sha256=vD6BsiMfx1iIMQiT8fpwhsQ8AGuPuBO83F22Cy7j-nU,524
35
35
  dataflow/models/variables.py,sha256=qCyiVbzC3Wd2onLx-eCY36VWiVytxxWvYld6_3ki5H8,1572
36
36
  dataflow/schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
- dataflow/schemas/connection.py,sha256=ut2sqz06yOjmFKzHry92FEt7DN09Bj30GYse35__Cuw,2467
38
- dataflow/schemas/git_ssh.py,sha256=N1O7HM6ZbygIBZn2rKvNR0e7IM3ZJMAH6aJtjaghDr0,1283
39
- dataflow/schemas/secret.py,sha256=wMSCn6zoBHS-R4NoKwljq2JUad8p9JY542UNJFa86X8,1183
37
+ dataflow/schemas/connection.py,sha256=Cks3VaWX8dUab455lwoLMX--wRRvEIthMJ8Pa3P3-Zc,2669
38
+ dataflow/schemas/git_ssh.py,sha256=9yB5N426CAsPGE3pfvKSVf-4vcdzCKvw4CiHcIbN_IU,1503
39
+ dataflow/schemas/secret.py,sha256=DPzXk3EI9Gjig5EO7ymiFB3_oFW0YKPJA54gkbBlSuA,1385
40
40
  dataflow/scripts/clone_environment.sh,sha256=Qy0GylsA3kUVUL_L1MirxIWujOFhT1tikKqXNtCTWd4,506
41
- dataflow/scripts/create_environment.sh,sha256=lmtQZuEj4SIdN9HGgitZv1V5CaamciFTz6P_m0p4Nug,976
41
+ dataflow/scripts/create_environment.sh,sha256=ClKdsHcN8JkGVjYpVbOnCLVKFjeg6w0JG-ldU2TR7RQ,976
42
42
  dataflow/scripts/update_environment.sh,sha256=2dtn2xlNi6frpig-sqlGE1_IKRbbkqYOCpf_qyMKKII,992
43
43
  dataflow/secrets_manager/__init__.py,sha256=idGqIDtYl0De2WIK9Obl-N7SDPSYtVM0D-wXfZjCiy4,559
44
44
  dataflow/secrets_manager/factory.py,sha256=LblshkGG9q2C3RHYp0QykianUtpOOQz7sBdlerutyWY,2479
45
45
  dataflow/secrets_manager/interface.py,sha256=HhrKpQrprWIbDsVfU_qc59OXmSIuHXv106OXv6-Epqc,506
46
- dataflow/secrets_manager/service.py,sha256=A4PgiSS1bzlzXPi_GvsiepChULqAa5yONGkaU-d5MLM,7419
46
+ dataflow/secrets_manager/service.py,sha256=8j5extt3_XtYjVqSZKhxnNXUfYRzNHYU0I2gtHVnhEo,7666
47
+ dataflow/secrets_manager/utils.py,sha256=7gteDjWgiWplnjxJeRa5QjT2WAiUUS5Ia1PZVUWK50M,2159
47
48
  dataflow/secrets_manager/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
49
  dataflow/secrets_manager/providers/aws_manager.py,sha256=16peXyKeuAjv2RVTMUjrzArPYENK9Zu7jREWVgMfScA,8671
49
50
  dataflow/secrets_manager/providers/azure_manager.py,sha256=sWOz-7ALnLt6vyM3lt14GBpzpmDnlH3hkdqtuApqkgU,9430
@@ -56,8 +57,8 @@ dfmigration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
57
  dfmigration/env.py,sha256=w_3Kzr3LJCU5l1zBGsNcoNGZyR8fZEtMRsxE-cEqfHQ,1110
57
58
  dfmigration/versions/001_initial_baseline_migration.py,sha256=lxjs7LZLs9-c7FQj7t7t49EOfLPPHMLI6iNp0PIBMRA,299
58
59
  dfmigration/versions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- dataflow_core-2.1.17rc1.dist-info/METADATA,sha256=1Q7tsB2BtWm1Z9ooF1WK--rRbQKll8nxBgwXB5Z5MZs,466
60
- dataflow_core-2.1.17rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
61
- dataflow_core-2.1.17rc1.dist-info/entry_points.txt,sha256=ppj_EIbYrJJwCPg1kfdsZk5q1N-Ejfis1neYrnjhO8o,117
62
- dataflow_core-2.1.17rc1.dist-info/top_level.txt,sha256=-gGoIBh-bUMtzOdna2jsDOdkE2CRu3w3aA7yEFCmNAI,35
63
- dataflow_core-2.1.17rc1.dist-info/RECORD,,
60
+ dataflow_core-2.1.18rc1.dist-info/METADATA,sha256=L27ISBpQ8ffzgfxkwXifxYIREQXMrSz6onWna-X6MVs,466
61
+ dataflow_core-2.1.18rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
+ dataflow_core-2.1.18rc1.dist-info/entry_points.txt,sha256=ppj_EIbYrJJwCPg1kfdsZk5q1N-Ejfis1neYrnjhO8o,117
63
+ dataflow_core-2.1.18rc1.dist-info/top_level.txt,sha256=-gGoIBh-bUMtzOdna2jsDOdkE2CRu3w3aA7yEFCmNAI,35
64
+ dataflow_core-2.1.18rc1.dist-info/RECORD,,