fluidattacks_core_models 14.1.0__tar.gz → 14.3.0__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 (40) hide show
  1. fluidattacks_core_models-14.3.0/.envrc +1 -0
  2. fluidattacks_core_models-14.3.0/.gitignore +11 -0
  3. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/PKG-INFO +1 -1
  4. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/__init__.py +4 -0
  5. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/cspm_config.py +14 -4
  6. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/loader.py +4 -1
  7. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/scan_config.py +2 -0
  8. fluidattacks_core_models-14.3.0/fluidattacks_core/models/scanners/sspm_config.py +34 -0
  9. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/pyproject.toml +1 -1
  10. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/test_loader_env.py +74 -2
  11. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/test_model_scanner.py +18 -0
  12. fluidattacks_core_models-14.1.0/.envrc +0 -1
  13. fluidattacks_core_models-14.1.0/.gitignore +0 -9
  14. fluidattacks_core_models-14.1.0/build/default.nix +0 -19
  15. fluidattacks_core_models-14.1.0/build/filter.nix +0 -13
  16. fluidattacks_core_models-14.1.0/flake.lock +0 -303
  17. fluidattacks_core_models-14.1.0/flake.nix +0 -29
  18. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/__init__.py +0 -0
  19. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/py.typed +0 -0
  20. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/apk_config.py +0 -0
  21. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/common_config.py +0 -0
  22. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/containers_sca_config.py +0 -0
  23. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/dast_config.py +0 -0
  24. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/resolves_config.py +0 -0
  25. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/sast_config.py +0 -0
  26. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/sbom_config.py +0 -0
  27. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/sca_config.py +0 -0
  28. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/scanners/sniffs_config.py +0 -0
  29. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/state_machines/__init__.py +0 -0
  30. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/state_machines/component_orchestrator.py +0 -0
  31. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/state_machines/root_scanner.py +0 -0
  32. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/fluidattacks_core/models/state_machines/types.py +0 -0
  33. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/import-linter.cfg +0 -0
  34. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/mypy.ini +0 -0
  35. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/ruff.toml +0 -0
  36. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/__init__.py +0 -0
  37. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/test_component_orchestrator.py +0 -0
  38. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/test_root_scanner.py +0 -0
  39. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/tests/test_state_machines.py +0 -0
  40. {fluidattacks_core_models-14.1.0 → fluidattacks_core_models-14.3.0}/uv.lock +0 -0
@@ -0,0 +1 @@
1
+ use flake ../../..#fluidattacks-core-models
@@ -0,0 +1,11 @@
1
+ dist/
2
+ dist-*/
3
+ /.cargo-cache
4
+ target/
5
+ .direnv/
6
+ .venv/
7
+ .vscode/settings.json
8
+ .zed/settings.json
9
+ # each package's shell writes its own, beside the package rather than here
10
+ **/.vscode/settings.json
11
+ *.so
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fluidattacks_core_models
3
- Version: 14.1.0
3
+ Version: 14.3.0
4
4
  Summary: Fluid Attacks Core Models Library
5
5
  Author-email: Development <development@fluidattacks.com>
6
6
  License: MPL-2.0
@@ -33,6 +33,7 @@ from fluidattacks_core.models.scanners.sbom_config import (
33
33
  from fluidattacks_core.models.scanners.sca_config import ScaConfig
34
34
  from fluidattacks_core.models.scanners.scan_config import ScanConfig
35
35
  from fluidattacks_core.models.scanners.sniffs_config import SniffsConfig
36
+ from fluidattacks_core.models.scanners.sspm_config import GithubApp, GithubPat, SspmConfig
36
37
 
37
38
  __all__ = [
38
39
  "ApkConfig",
@@ -50,6 +51,8 @@ __all__ = [
50
51
  "DockerCredentialsConfig",
51
52
  "EcrCredentialsConfig",
52
53
  "FalsePositivesConfig",
54
+ "GithubApp",
55
+ "GithubPat",
53
56
  "LocalesEnum",
54
57
  "OutputConfig",
55
58
  "OutputFormat",
@@ -64,6 +67,7 @@ __all__ = [
64
67
  "ScanConfig",
65
68
  "SniffsConfig",
66
69
  "SourceType",
70
+ "SspmConfig",
67
71
  "build_config",
68
72
  "load_yaml_mapping",
69
73
  ]
@@ -6,15 +6,20 @@ from fluidattacks_core.models.scanners.loader import LoaderValidationInfo, resol
6
6
  class AwsCredentials(BaseModel):
7
7
  model_config = {"extra": "forbid"}
8
8
  access_key_id: str
9
- secret_access_key: str
10
- session_token: str | None = None
9
+ secret_access_key: str = Field(repr=False)
10
+ session_token: str | None = Field(default=None, repr=False)
11
11
  environment_id: str | None = None
12
12
 
13
- @field_validator("access_key_id", "secret_access_key", "session_token", mode="before")
13
+ @field_validator("access_key_id", "secret_access_key", mode="before")
14
14
  @classmethod
15
15
  def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
16
16
  return resolve_env_var(v, info)
17
17
 
18
+ @field_validator("session_token", mode="before")
19
+ @classmethod
20
+ def _resolve_optional_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
21
+ return resolve_env_var(v, info, required=False)
22
+
18
23
  @model_validator(mode="after")
19
24
  def _validate_key_session_token_pairing(self) -> "AwsCredentials":
20
25
  is_temporary = self.access_key_id.startswith("ASIA")
@@ -33,11 +38,16 @@ class AwsRole(BaseModel):
33
38
  external_id: str | None = Field(default=None, repr=False)
34
39
  environment_id: str | None = None
35
40
 
36
- @field_validator("role", "external_id", mode="before")
41
+ @field_validator("role", mode="before")
37
42
  @classmethod
38
43
  def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
39
44
  return resolve_env_var(v, info)
40
45
 
46
+ @field_validator("external_id", mode="before")
47
+ @classmethod
48
+ def _resolve_optional_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
49
+ return resolve_env_var(v, info, required=False)
50
+
41
51
 
42
52
  class CspmConfig(BaseModel):
43
53
  model_config = {"extra": "forbid"}
@@ -28,7 +28,7 @@ def _sub_env_var(m: re.Match[str]) -> str:
28
28
  return value
29
29
 
30
30
 
31
- def resolve_env_var(v: object, info: LoaderValidationInfo) -> object:
31
+ def resolve_env_var(v: object, info: LoaderValidationInfo, *, required: bool = True) -> object:
32
32
  if not isinstance(v, str) or not (info.context or {}).get("resolve_env"):
33
33
  return v
34
34
  matches = list(_ENV_PLACEHOLDER.finditer(v))
@@ -39,6 +39,9 @@ def resolve_env_var(v: object, info: LoaderValidationInfo) -> object:
39
39
  var_name = matches[0].group(1)
40
40
  value = os.environ.get(var_name)
41
41
  if value is None:
42
+ if required:
43
+ msg = f"environment variable '{var_name}' referenced in the scan config is not set"
44
+ raise ValueError(msg)
42
45
  LOGGER.warning("env var '%s' not set; field will be None", var_name)
43
46
  return None
44
47
  LOGGER.info("env var '%s' set", var_name)
@@ -14,6 +14,7 @@ from fluidattacks_core.models.scanners.sast_config import SastConfig
14
14
  from fluidattacks_core.models.scanners.sbom_config import SbomConfig
15
15
  from fluidattacks_core.models.scanners.sca_config import ScaConfig
16
16
  from fluidattacks_core.models.scanners.sniffs_config import SniffsConfig
17
+ from fluidattacks_core.models.scanners.sspm_config import SspmConfig
17
18
 
18
19
 
19
20
  class ScanConfig(BaseModel):
@@ -35,6 +36,7 @@ class ScanConfig(BaseModel):
35
36
  sbom: SbomConfig | None = None
36
37
  dast: DastConfig | None = None
37
38
  cspm: CspmConfig | None = None
39
+ sspm: SspmConfig | None = None
38
40
  apk: ApkConfig | None = None
39
41
  false_positives_identified: FalsePositivesConfig | None = None
40
42
  ss: SniffsConfig | None = None
@@ -0,0 +1,34 @@
1
+ from pydantic import BaseModel, Field, field_validator
2
+
3
+ from fluidattacks_core.models.scanners.loader import LoaderValidationInfo, resolve_env_var
4
+
5
+
6
+ class GithubPat(BaseModel):
7
+ model_config = {"extra": "forbid"}
8
+ organization: str
9
+ pat_token: str = Field(repr=False)
10
+ environment_id: str | None = None
11
+
12
+ @field_validator("pat_token", mode="before")
13
+ @classmethod
14
+ def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
15
+ return resolve_env_var(v, info)
16
+
17
+
18
+ class GithubApp(BaseModel):
19
+ model_config = {"extra": "forbid"}
20
+ organization: str
21
+ app_id: str
22
+ installation_id: str
23
+ private_key: str = Field(repr=False)
24
+ environment_id: str | None = None
25
+
26
+ @field_validator("private_key", mode="before")
27
+ @classmethod
28
+ def _resolve_credentials(cls, v: object, info: LoaderValidationInfo) -> object:
29
+ return resolve_env_var(v, info)
30
+
31
+
32
+ class SspmConfig(BaseModel):
33
+ model_config = {"extra": "forbid"}
34
+ github_credentials: list[GithubPat | GithubApp] = []
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fluidattacks_core_models"
3
- version = "14.1.0"
3
+ version = "14.3.0"
4
4
  description = "Fluid Attacks Core Models Library"
5
5
  authors = [{ name = "Development", email = "development@fluidattacks.com" }]
6
6
  license = { text = "MPL-2.0" }
@@ -1,8 +1,9 @@
1
1
  from pathlib import Path
2
2
 
3
3
  import pytest
4
- from pydantic import BaseModel, field_validator
4
+ from pydantic import BaseModel, ValidationError, field_validator
5
5
 
6
+ from fluidattacks_core.models.scanners import AwsCredentials, AwsRole, CspmConfig
6
7
  from fluidattacks_core.models.scanners.loader import (
7
8
  LoaderValidationInfo,
8
9
  build_config,
@@ -22,6 +23,16 @@ class _SecretFixture(BaseModel):
22
23
  value: str | None = None
23
24
  namespace: str = ""
24
25
 
26
+ @field_validator("value", mode="before")
27
+ @classmethod
28
+ def _resolve_value(cls, v: object, info: LoaderValidationInfo) -> object:
29
+ return resolve_env_var(v, info, required=False)
30
+
31
+
32
+ class _RequiredSecretFixture(BaseModel):
33
+ model_config = {"extra": "forbid"}
34
+ value: str
35
+
25
36
  @field_validator("value", mode="before")
26
37
  @classmethod
27
38
  def _resolve_value(cls, v: object, info: LoaderValidationInfo) -> object:
@@ -45,7 +56,7 @@ def test_build_config_resolves_sensitive_field(
45
56
  assert cfg.value == "resolved-value"
46
57
 
47
58
 
48
- def test_build_config_missing_var_resolves_to_none(
59
+ def test_build_config_missing_var_on_optional_field_resolves_to_none(
49
60
  tmp_path: Path, monkeypatch: pytest.MonkeyPatch
50
61
  ) -> None:
51
62
  monkeypatch.delenv("TOKEN", raising=False)
@@ -54,6 +65,58 @@ def test_build_config_missing_var_resolves_to_none(
54
65
  assert cfg.value is None
55
66
 
56
67
 
68
+ def test_build_config_set_var_on_required_field_resolves(
69
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
70
+ ) -> None:
71
+ monkeypatch.setenv("TOKEN", "resolved-value")
72
+ path = _write(tmp_path, "value: ${TOKEN}\n")
73
+ cfg = build_config(path, _RequiredSecretFixture)
74
+ assert cfg.value == "resolved-value"
75
+
76
+
77
+ def test_build_config_missing_var_on_required_field_names_the_variable(
78
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
79
+ ) -> None:
80
+ monkeypatch.delenv("TOKEN", raising=False)
81
+ path = _write(tmp_path, "value: ${TOKEN}\n")
82
+ with pytest.raises(ValidationError) as exc_info:
83
+ build_config(path, _RequiredSecretFixture)
84
+ assert "environment variable 'TOKEN' referenced in the scan config is not set" in str(
85
+ exc_info.value
86
+ )
87
+
88
+
89
+ def test_build_config_missing_var_on_cspm_external_id_resolves_to_none(
90
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
91
+ ) -> None:
92
+ monkeypatch.delenv("CSPM_AWS_EXTERNAL_ID", raising=False)
93
+ path = _write(
94
+ tmp_path,
95
+ "aws_credentials:\n"
96
+ " - role: arn:aws:iam::123456789012:role/MyRole\n"
97
+ " external_id: ${CSPM_AWS_EXTERNAL_ID}\n",
98
+ )
99
+ role = build_config(path, CspmConfig).aws_credentials[0]
100
+ assert isinstance(role, AwsRole)
101
+ assert role.external_id is None
102
+
103
+
104
+ def test_build_config_missing_var_on_cspm_session_token_resolves_to_none(
105
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
106
+ ) -> None:
107
+ monkeypatch.delenv("CSPM_AWS_SESSION_TOKEN", raising=False)
108
+ path = _write(
109
+ tmp_path,
110
+ "aws_credentials:\n"
111
+ " - access_key_id: AKIA-fake-key\n"
112
+ " secret_access_key: secret\n"
113
+ " session_token: ${CSPM_AWS_SESSION_TOKEN}\n",
114
+ )
115
+ cred = build_config(path, CspmConfig).aws_credentials[0]
116
+ assert isinstance(cred, AwsCredentials)
117
+ assert cred.session_token is None
118
+
119
+
57
120
  def test_build_config_non_sensitive_field_stays_literal(
58
121
  tmp_path: Path, monkeypatch: pytest.MonkeyPatch
59
122
  ) -> None:
@@ -87,6 +150,15 @@ def test_partial_missing_var_substitutes_empty_string(
87
150
  assert cfg.value == "https:///api"
88
151
 
89
152
 
153
+ def test_partial_missing_var_on_required_field_substitutes_empty_string(
154
+ tmp_path: Path, monkeypatch: pytest.MonkeyPatch
155
+ ) -> None:
156
+ monkeypatch.delenv("HOST", raising=False)
157
+ path = _write(tmp_path, "value: https://${HOST}/api\n")
158
+ cfg = build_config(path, _RequiredSecretFixture)
159
+ assert cfg.value == "https:///api"
160
+
161
+
90
162
  def test_multi_var_resolved(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None:
91
163
  monkeypatch.setenv("A", "foo")
92
164
  monkeypatch.setenv("B", "bar")
@@ -99,6 +99,11 @@ cspm:
99
99
  - role: arn:aws:iam::123456789012:role/ScanRole
100
100
  external_id: ext-123
101
101
  environment_id: prod
102
+ sspm:
103
+ github_credentials:
104
+ - organization: octo-org
105
+ pat_token: ghp-token
106
+ environment_id: scm
102
107
  apk:
103
108
  environments:
104
109
  - apk_file_path: app.apk
@@ -230,6 +235,19 @@ def test_build_config_cspm(yaml_file: Path) -> None:
230
235
  assert role.environment_id == "prod"
231
236
 
232
237
 
238
+ def test_build_config_sspm(yaml_file: Path) -> None:
239
+ config = build_config(str(yaml_file), ScanConfig)
240
+ assert config.sspm is not None
241
+ assert config.sspm.github_credentials[0].organization == "octo-org"
242
+
243
+
244
+ def test_unknown_nested_key_sspm(tmp_path: Path) -> None:
245
+ f = tmp_path / "config.yaml"
246
+ f.write_text("sspm:\n github_credentals: []\n")
247
+ with pytest.raises(ValidationError):
248
+ build_config(str(f), ScanConfig)
249
+
250
+
233
251
  def test_build_config_apk(yaml_file: Path) -> None:
234
252
  config = build_config(str(yaml_file), ScanConfig)
235
253
  assert config.apk is not None
@@ -1 +0,0 @@
1
- use_flake ".#python311.devShell"
@@ -1,9 +0,0 @@
1
- dist/
2
- dist-*/
3
- /.cargo-cache
4
- target/
5
- .direnv/
6
- .venv/
7
- .vscode/settings.json
8
- .zed/settings.json
9
- *.so
@@ -1,19 +0,0 @@
1
- { src, workspace_root }:
2
- {
3
- inherit src workspace_root;
4
- root_path = "develops/fluidattacks-core/python/models";
5
- module_name = "fluidattacks_core";
6
- pypi_token = {
7
- method = "oidc";
8
- };
9
- override = {
10
- checks = {
11
- basedpyright = false;
12
- };
13
- configs = {
14
- import_linter = ../import-linter.cfg;
15
- mypy = ../mypy.ini;
16
- ruff = ../ruff.toml;
17
- };
18
- };
19
- }
@@ -1,13 +0,0 @@
1
- path_filter: src:
2
- path_filter {
3
- root = src;
4
- include = [
5
- "fluidattacks_core"
6
- "tests"
7
- "import-linter.cfg"
8
- "mypy.ini"
9
- "pyproject.toml"
10
- "ruff.toml"
11
- "uv.lock"
12
- ];
13
- }
@@ -1,303 +0,0 @@
1
- {
2
- "nodes": {
3
- "flake-parts": {
4
- "inputs": {
5
- "nixpkgs-lib": "nixpkgs-lib"
6
- },
7
- "locked": {
8
- "lastModified": 1762810396,
9
- "narHash": "sha256-dxFVgQPG+R72dkhXTtqUm7KpxElw3u6E+YlQ2WaDgt8=",
10
- "owner": "hercules-ci",
11
- "repo": "flake-parts",
12
- "rev": "0bdadb1b265fb4143a75bd1ec7d8c915898a9923",
13
- "type": "github"
14
- },
15
- "original": {
16
- "owner": "hercules-ci",
17
- "repo": "flake-parts",
18
- "type": "github"
19
- }
20
- },
21
- "nix_filter": {
22
- "locked": {
23
- "lastModified": 1757882181,
24
- "narHash": "sha256-+cCxYIh2UNalTz364p+QYmWHs0P+6wDhiWR4jDIKQIU=",
25
- "owner": "numtide",
26
- "repo": "nix-filter",
27
- "rev": "59c44d1909c72441144b93cf0f054be7fe764de5",
28
- "type": "github"
29
- },
30
- "original": {
31
- "owner": "numtide",
32
- "repo": "nix-filter",
33
- "type": "github"
34
- }
35
- },
36
- "nixpkgs": {
37
- "locked": {
38
- "lastModified": 1758690382,
39
- "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
40
- "owner": "nixos",
41
- "repo": "nixpkgs",
42
- "rev": "e643668fd71b949c53f8626614b21ff71a07379d",
43
- "type": "github"
44
- },
45
- "original": {
46
- "owner": "nixos",
47
- "ref": "nixos-unstable",
48
- "repo": "nixpkgs",
49
- "type": "github"
50
- }
51
- },
52
- "nixpkgs-lib": {
53
- "locked": {
54
- "lastModified": 1761765539,
55
- "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=",
56
- "owner": "nix-community",
57
- "repo": "nixpkgs.lib",
58
- "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc",
59
- "type": "github"
60
- },
61
- "original": {
62
- "owner": "nix-community",
63
- "repo": "nixpkgs.lib",
64
- "type": "github"
65
- }
66
- },
67
- "nixpkgs_2": {
68
- "locked": {
69
- "lastModified": 1758690382,
70
- "narHash": "sha256-NY3kSorgqE5LMm1LqNwGne3ZLMF2/ILgLpFr1fS4X3o=",
71
- "owner": "nixos",
72
- "repo": "nixpkgs",
73
- "rev": "e643668fd71b949c53f8626614b21ff71a07379d",
74
- "type": "github"
75
- },
76
- "original": {
77
- "owner": "nixos",
78
- "ref": "nixos-unstable",
79
- "repo": "nixpkgs",
80
- "type": "github"
81
- }
82
- },
83
- "nixpkgs_3": {
84
- "locked": {
85
- "lastModified": 1761373498,
86
- "narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
87
- "owner": "nixos",
88
- "repo": "nixpkgs",
89
- "rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
90
- "type": "github"
91
- },
92
- "original": {
93
- "owner": "nixos",
94
- "ref": "nixos-unstable",
95
- "repo": "nixpkgs",
96
- "type": "github"
97
- }
98
- },
99
- "nixpkgs_flake": {
100
- "locked": {
101
- "lastModified": 1778253243,
102
- "narHash": "sha256-KkH2QvU6iRLDTGGEwH5jnMqHWj4zMTuHxi1S1zdr01w=",
103
- "owner": "nixos",
104
- "repo": "nixpkgs",
105
- "rev": "4fcda7103530b23c5ca44286344912082aad4220",
106
- "type": "github"
107
- },
108
- "original": {
109
- "owner": "nixos",
110
- "repo": "nixpkgs",
111
- "type": "github"
112
- }
113
- },
114
- "pyproject-build-systems": {
115
- "inputs": {
116
- "nixpkgs": "nixpkgs",
117
- "pyproject-nix": "pyproject-nix",
118
- "uv2nix": "uv2nix"
119
- },
120
- "locked": {
121
- "lastModified": 1761781027,
122
- "narHash": "sha256-YDvxPAm2WnxrznRqWwHLjryBGG5Ey1ATEJXrON+TWt8=",
123
- "owner": "pyproject-nix",
124
- "repo": "build-system-pkgs",
125
- "rev": "795a980d25301e5133eca37adae37283ec3c8e66",
126
- "type": "github"
127
- },
128
- "original": {
129
- "owner": "pyproject-nix",
130
- "repo": "build-system-pkgs",
131
- "type": "github"
132
- }
133
- },
134
- "pyproject-nix": {
135
- "inputs": {
136
- "nixpkgs": [
137
- "python_builder",
138
- "pyproject-build-systems",
139
- "nixpkgs"
140
- ]
141
- },
142
- "locked": {
143
- "lastModified": 1758265079,
144
- "narHash": "sha256-amLaLNwKSZPShQHzfgmc/9o76dU8xzN0743dWgvYlr8=",
145
- "owner": "nix-community",
146
- "repo": "pyproject.nix",
147
- "rev": "02e9418fd4af638447dca4b17b1280da95527fc9",
148
- "type": "github"
149
- },
150
- "original": {
151
- "owner": "nix-community",
152
- "repo": "pyproject.nix",
153
- "type": "github"
154
- }
155
- },
156
- "pyproject-nix_2": {
157
- "inputs": {
158
- "nixpkgs": "nixpkgs_2"
159
- },
160
- "locked": {
161
- "lastModified": 1762427963,
162
- "narHash": "sha256-CkPlAbIQ87wmjy5qHibfzk4DmMGBNqFer+lLfXjpP5M=",
163
- "owner": "pyproject-nix",
164
- "repo": "pyproject.nix",
165
- "rev": "4540ea004e04fcd12dd2738d51383d10f956f7b9",
166
- "type": "github"
167
- },
168
- "original": {
169
- "owner": "pyproject-nix",
170
- "repo": "pyproject.nix",
171
- "type": "github"
172
- }
173
- },
174
- "pyproject-nix_3": {
175
- "inputs": {
176
- "nixpkgs": [
177
- "python_builder",
178
- "uv2nix",
179
- "nixpkgs"
180
- ]
181
- },
182
- "locked": {
183
- "lastModified": 1760402624,
184
- "narHash": "sha256-jF6UKLs2uGc2rtved8Vrt58oTWjTQoAssuYs/0578Z4=",
185
- "owner": "pyproject-nix",
186
- "repo": "pyproject.nix",
187
- "rev": "84c4ea102127c77058ea1ed7be7300261fafc7d2",
188
- "type": "github"
189
- },
190
- "original": {
191
- "owner": "pyproject-nix",
192
- "repo": "pyproject.nix",
193
- "type": "github"
194
- }
195
- },
196
- "python_builder": {
197
- "inputs": {
198
- "nix_filter": "nix_filter",
199
- "nixpkgs_flake": "nixpkgs_flake",
200
- "pyproject-build-systems": "pyproject-build-systems",
201
- "pyproject-nix": "pyproject-nix_2",
202
- "shell-helpers": "shell-helpers",
203
- "uv2nix": "uv2nix_2"
204
- },
205
- "locked": {
206
- "dir": "common/utils/python-builder",
207
- "lastModified": 1787078362,
208
- "narHash": "sha256-HYL7Rn6SuNjYxkt/PwFLksZjsauCiY+ENbOWryLsIlw=",
209
- "ref": "refs/heads/trunk",
210
- "rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
211
- "shallow": true,
212
- "type": "git",
213
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
214
- },
215
- "original": {
216
- "dir": "common/utils/python-builder",
217
- "rev": "09fd25a13309eb5e3b5b2a061bb340df3ae5d281",
218
- "shallow": true,
219
- "type": "git",
220
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
221
- }
222
- },
223
- "root": {
224
- "inputs": {
225
- "python_builder": "python_builder"
226
- }
227
- },
228
- "shell-helpers": {
229
- "inputs": {
230
- "flake-parts": "flake-parts",
231
- "nixpkgs": [
232
- "python_builder",
233
- "nixpkgs_flake"
234
- ]
235
- },
236
- "locked": {
237
- "dir": "common/utils/shell-helpers",
238
- "lastModified": 1762806066,
239
- "narHash": "sha256-Wz99Fl7SpPU1NkTHJ36XOo6DjOEAMXCw3ThRABOS2Hs=",
240
- "ref": "refs/heads/trunk",
241
- "rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
242
- "shallow": true,
243
- "type": "git",
244
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
245
- },
246
- "original": {
247
- "dir": "common/utils/shell-helpers",
248
- "rev": "d73cfdc7ae9e7f547e22a4481d4c2ccce38b26a8",
249
- "shallow": true,
250
- "type": "git",
251
- "url": "ssh://git@gitlab.com/fluidattacks/universe"
252
- }
253
- },
254
- "uv2nix": {
255
- "inputs": {
256
- "nixpkgs": [
257
- "python_builder",
258
- "pyproject-build-systems",
259
- "nixpkgs"
260
- ],
261
- "pyproject-nix": [
262
- "python_builder",
263
- "pyproject-build-systems",
264
- "pyproject-nix"
265
- ]
266
- },
267
- "locked": {
268
- "lastModified": 1758933732,
269
- "narHash": "sha256-HAmm1GBS1myZCFuog0DC2ZLaynvZtiUI2Crmo+cdQI0=",
270
- "owner": "pyproject-nix",
271
- "repo": "uv2nix",
272
- "rev": "273ce18f913d8559e0d04f820d724308966d7c4d",
273
- "type": "github"
274
- },
275
- "original": {
276
- "owner": "pyproject-nix",
277
- "repo": "uv2nix",
278
- "type": "github"
279
- }
280
- },
281
- "uv2nix_2": {
282
- "inputs": {
283
- "nixpkgs": "nixpkgs_3",
284
- "pyproject-nix": "pyproject-nix_3"
285
- },
286
- "locked": {
287
- "lastModified": 1761872265,
288
- "narHash": "sha256-i25GRgp2vUOebY70L3NTAgkd+Pr1hnn5xM3qHxH0ONU=",
289
- "owner": "pyproject-nix",
290
- "repo": "uv2nix",
291
- "rev": "74dfb62871be152ad3673b143b0cc56105a4f3c5",
292
- "type": "github"
293
- },
294
- "original": {
295
- "owner": "pyproject-nix",
296
- "repo": "uv2nix",
297
- "type": "github"
298
- }
299
- }
300
- },
301
- "root": "root",
302
- "version": 7
303
- }
@@ -1,29 +0,0 @@
1
- {
2
- description = "Fluid Attacks Core models package.";
3
-
4
- inputs = {
5
- python_builder = {
6
- url = "git+ssh://git@gitlab.com/fluidattacks/universe?shallow=1&rev=09fd25a13309eb5e3b5b2a061bb340df3ae5d281&dir=common/utils/python-builder";
7
- };
8
- };
9
-
10
- outputs =
11
- { self, ... }@inputs:
12
- let
13
- build_args =
14
- {
15
- system,
16
- python_version,
17
- nixpkgs,
18
- builders,
19
- scripts,
20
- }:
21
- import ./build {
22
- src = import ./build/filter.nix nixpkgs.nix-filter self;
23
- workspace_root = ./.;
24
- };
25
- in
26
- {
27
- packages = inputs.python_builder.outputs.build build_args;
28
- };
29
- }