nyl 0.9.1__tar.gz → 0.9.2__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 (133) hide show
  1. nyl-0.9.2/.changelog/0.9.2.toml +13 -0
  2. nyl-0.9.2/DEPRECATION_NOTICE.md +7 -0
  3. {nyl-0.9.1 → nyl-0.9.2}/PKG-INFO +1 -1
  4. {nyl-0.9.1 → nyl-0.9.2}/docs/content/changelog.md +11 -0
  5. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/basics.md +3 -2
  6. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/locals.md +3 -3
  7. {nyl-0.9.1 → nyl-0.9.2}/pyproject.toml +1 -1
  8. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/__init__.py +7 -0
  9. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/template.py +6 -2
  10. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/profiles/config.py +9 -2
  11. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/templating.py +9 -2
  12. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.7.0.toml +0 -0
  13. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.7.1.toml +0 -0
  14. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.7.2.toml +0 -0
  15. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.8.0.toml +0 -0
  16. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.8.1.toml +0 -0
  17. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.9.0.toml +0 -0
  18. {nyl-0.9.1 → nyl-0.9.2}/.changelog/0.9.1.toml +0 -0
  19. {nyl-0.9.1 → nyl-0.9.2}/.envrc +0 -0
  20. {nyl-0.9.1 → nyl-0.9.2}/.github/workflows/docker.yaml +0 -0
  21. {nyl-0.9.1 → nyl-0.9.2}/.github/workflows/docs.yaml +0 -0
  22. {nyl-0.9.1 → nyl-0.9.2}/.github/workflows/python.yaml +0 -0
  23. {nyl-0.9.1 → nyl-0.9.2}/.github/workflows/update-flake-lock.yaml +0 -0
  24. {nyl-0.9.1 → nyl-0.9.2}/.gitignore +0 -0
  25. {nyl-0.9.1 → nyl-0.9.2}/README.md +0 -0
  26. {nyl-0.9.1 → nyl-0.9.2}/argocd-cmp/Dockerfile +0 -0
  27. {nyl-0.9.1 → nyl-0.9.2}/argocd-cmp/README.md +0 -0
  28. {nyl-0.9.1 → nyl-0.9.2}/argocd-cmp/plugin.yaml +0 -0
  29. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/.envrc +0 -0
  30. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/.secrets.yaml +0 -0
  31. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/.sops.yaml +0 -0
  32. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/README.md +0 -0
  33. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/argocd.yaml +0 -0
  34. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/nyl-project.yaml +0 -0
  35. {nyl-0.9.1 → nyl-0.9.2}/argocd-with-nyl/nyl-secrets.yaml +0 -0
  36. {nyl-0.9.1 → nyl-0.9.2}/docs/content/index.md +0 -0
  37. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/applysets.md +0 -0
  38. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/argocd-plugin.md +0 -0
  39. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/cluster-connectivity.md +0 -0
  40. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration/environment.md +0 -0
  41. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration/profiles.md +0 -0
  42. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration/projects.md +0 -0
  43. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration/secrets.md +0 -0
  44. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration-api/profiles.md +0 -0
  45. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/configuration-api/secrets.md +0 -0
  46. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/glossary.md +0 -0
  47. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/components.md +0 -0
  48. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/inlining/helmcharts.md +0 -0
  49. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/inlining/overview.md +0 -0
  50. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/inlining/postprocessor.md +0 -0
  51. {nyl-0.9.1 → nyl-0.9.2}/docs/content/reference/templating/secrets.md +0 -0
  52. {nyl-0.9.1 → nyl-0.9.2}/docs/mkdocs.yml +0 -0
  53. {nyl-0.9.1 → nyl-0.9.2}/docs/pyproject.toml +0 -0
  54. {nyl-0.9.1 → nyl-0.9.2}/docs/uv.lock +0 -0
  55. {nyl-0.9.1 → nyl-0.9.2}/example/manifests/postgres.yaml +0 -0
  56. {nyl-0.9.1 → nyl-0.9.2}/example/nyl-profiles.toml +0 -0
  57. {nyl-0.9.1 → nyl-0.9.2}/example/nyl-profiles.yaml +0 -0
  58. {nyl-0.9.1 → nyl-0.9.2}/example/nyl-secrets.yaml +0 -0
  59. {nyl-0.9.1 → nyl-0.9.2}/example/secrets.yaml +0 -0
  60. {nyl-0.9.1 → nyl-0.9.2}/flake.lock +0 -0
  61. {nyl-0.9.1 → nyl-0.9.2}/flake.nix +0 -0
  62. {nyl-0.9.1 → nyl-0.9.2}/nix/uv.nix +0 -0
  63. {nyl-0.9.1 → nyl-0.9.2}/renovate.json +0 -0
  64. {nyl-0.9.1 → nyl-0.9.2}/slap.toml +0 -0
  65. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/README.md +0 -0
  66. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/__init__.pyi +0 -0
  67. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/dynamic/__init__.pyi +0 -0
  68. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/dynamic/client.pyi +0 -0
  69. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/dynamic/discovery.pyi +0 -0
  70. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/dynamic/exceptions.pyi +0 -0
  71. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/dynamic/resource.pyi +0 -0
  72. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/watch/__init__.pyi +0 -0
  73. {nyl-0.9.1 → nyl-0.9.2}/src/kubernetes/watch/watch.pyi +0 -0
  74. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/__init__.py +0 -0
  75. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/add.py +0 -0
  76. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/argocd.py +0 -0
  77. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/crds.py +0 -0
  78. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/new.py +0 -0
  79. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/profile.py +0 -0
  80. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/run.py +0 -0
  81. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/secrets.py +0 -0
  82. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/tools/__init__.py +0 -0
  83. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/tools/bcrypt.py +0 -0
  84. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/tools/sops.py +0 -0
  85. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/commands/tun.py +0 -0
  86. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/__init__.py +0 -0
  87. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/components.py +0 -0
  88. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/dispatch.py +0 -0
  89. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/dispatch_test.py +0 -0
  90. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/helmchart.py +0 -0
  91. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/helmchart_test.py +0 -0
  92. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/generator/statefulsecret.py +0 -0
  93. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/profiles/__init__.py +0 -0
  94. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/profiles/config_test.py +0 -0
  95. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/profiles/kubeconfig.py +0 -0
  96. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/profiles/tunnel.py +0 -0
  97. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/project/config.py +0 -0
  98. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/__init__.py +0 -0
  99. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/applyset.py +0 -0
  100. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/applyset_test.py +0 -0
  101. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/helmchart.py +0 -0
  102. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/helmchart_test.py +0 -0
  103. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/placeholder.py +0 -0
  104. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/postprocessor.py +0 -0
  105. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/postprocessor_test.py +0 -0
  106. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/resources/statefulsecret.py +0 -0
  107. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/__init__.py +0 -0
  108. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/config.py +0 -0
  109. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/config_test.py +0 -0
  110. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/kubernetes.py +0 -0
  111. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/null.py +0 -0
  112. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/sops.py +0 -0
  113. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/secrets/sops_test.py +0 -0
  114. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/templating_test.py +0 -0
  115. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/di.py +0 -0
  116. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/fs.py +0 -0
  117. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/fs_test.py +0 -0
  118. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/kubectl.py +0 -0
  119. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/kubernetes.py +0 -0
  120. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/kvstore.py +0 -0
  121. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/loads.py +0 -0
  122. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/logging.py +0 -0
  123. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/shell.py +0 -0
  124. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/testing.py +0 -0
  125. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/typer.py +0 -0
  126. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/types.py +0 -0
  127. {nyl-0.9.1 → nyl-0.9.2}/src/nyl/tools/yaml.py +0 -0
  128. {nyl-0.9.1 → nyl-0.9.2}/testdata/helm-test-chart/Chart.yaml +0 -0
  129. {nyl-0.9.1 → nyl-0.9.2}/testdata/helm-test-chart/templates/sa.yaml +0 -0
  130. {nyl-0.9.1 → nyl-0.9.2}/testdata/helm-test-chart/values.yaml +0 -0
  131. {nyl-0.9.1 → nyl-0.9.2}/tests/__init__.py +0 -0
  132. {nyl-0.9.1 → nyl-0.9.2}/tests/conftest.py +0 -0
  133. {nyl-0.9.1 → nyl-0.9.2}/uv.lock +0 -0
@@ -0,0 +1,13 @@
1
+ release-date = "2025-04-22"
2
+
3
+ [[entries]]
4
+ id = "469033a3-ec4d-4a54-9294-b1608735bacb"
5
+ type = "improvement"
6
+ description = "Introduce new `values` object into templating evaluation namespace, replacing the `locals` object going forward. The `locals` name is still available but will be removed in an upcoming release."
7
+ author = "@NiklasRosenstein"
8
+
9
+ [[entries]]
10
+ id = "7cd10ee2-9c5a-4c23-8fe4-9f4d9291ceb4"
11
+ type = "feature"
12
+ description = "Allow defining parameters in the \"values\" of a profile, accessible via `${{ values.PARAM }}` throughout manifest rendering with the profile."
13
+ author = "@NiklasRosenstein"
@@ -0,0 +1,7 @@
1
+ The following is a list of features and functionalities that are deprecated and will be removed in a future version
2
+ of Nyl. This file serves as an announcement as well as reminder before cutting a new release.
3
+
4
+ ## Deprecated Features
5
+
6
+ * `locals` in templates: The use of `locals` in templates is deprecated and will be removed in Nyl 0.10.x. Please
7
+ use `values` instead.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nyl
3
- Version: 0.9.1
3
+ Version: 0.9.2
4
4
  Summary: Advanced templating engine for Kubernetes and GitOps.
5
5
  Author-email: Niklas Rosenstein <rosensteinniklas@gmail.com>
6
6
  License: MIT
@@ -1,3 +1,14 @@
1
+ ## 0.9.2 (2025-04-22)
2
+
3
+ <table><tr><th>Type</th><th>Description</th><th>PR</th><th>Issues</th><th>Author</th></tr>
4
+ <tr><td>Improvement</td><td>
5
+
6
+ Introduce new `values` object into templating evaluation namespace, replacing the `locals` object going forward. The `locals` name is still available but will be removed in an upcoming release.</td><td></td><td></td><td>@NiklasRosenstein</td></tr>
7
+ <tr><td>Feature</td><td>
8
+
9
+ Allow defining parameters in the "values" of a profile, accessible via `${{ values.PARAM }}` throughout manifest rendering with the profile.</td><td></td><td></td><td>@NiklasRosenstein</td></tr>
10
+ </table>
11
+
1
12
  ## 0.9.1 (2025-04-20)
2
13
 
3
14
  <table><tr><th>Type</th><th>Description</th><th>PR</th><th>Issues</th><th>Author</th></tr>
@@ -17,5 +17,6 @@ Currently, only the following names are available in the scope of the expression
17
17
 
18
18
  - `secrets`: A reference to the secrets provider. This is used to retrieve secrets from the configured secrets
19
19
  provider. See [Secrets](./secrets.md) for more information.
20
- - `locals`: A container for local variables defined in the same manifest. See [Local Variables](./locals.md) for more
21
- information.
20
+ - `values`: A container for values defined on the profile-level (see [Profiles](../configuration/profiles.md)) or in the
21
+ manifest (see [Local Variables](./locals.md)). (Note that the use of `locals` instead of `values` is deprecated and
22
+ will be removed in Nyl 0.10.x).
@@ -2,10 +2,10 @@
2
2
 
3
3
  You may define a YAML object in your Kubernetes manifest that is used to define variables that can later be accessed
4
4
  in the same manifest to achieve some level of DRY-ness. This is done by not setting any `apiVersion` or `kind`, and
5
- instead just define variables prefixed with `$`. Variables can later be accessed using the `${{ locals.var }}`.
5
+ instead just define variables prefixed with `$`. Variables can later be accessed using the `${{ values.var }}`.
6
6
 
7
7
  Note that expressions in values assigned to variables are not currently supported. This means that you cannot use e.g.
8
- `${{ secrets.get("my-secret") }}` in the value of a variable, nor can you use `${{ locals.var }}`.
8
+ `${{ secrets.get("my-secret") }}` in the value of a variable, nor can you use `${{ values.var }}`.
9
9
 
10
10
  ## Example
11
11
 
@@ -17,7 +17,7 @@ $name: my-app
17
17
  apiVersion: apps/v1
18
18
  kind: Deployment
19
19
  metadata:
20
- name: ${{ locals.name }}
20
+ name: ${{ values.name }}
21
21
  # ...
22
22
  ```
23
23
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nyl"
7
- version = "0.9.1"
7
+ version = "0.9.2"
8
8
  description = "Advanced templating engine for Kubernetes and GitOps."
9
9
  authors = [
10
10
  {name = "Niklas Rosenstein", email = "rosensteinniklas@gmail.com"},
@@ -20,6 +20,7 @@ from typer import Option, Typer
20
20
  from kubernetes.client.api_client import ApiClient
21
21
  from nyl import __version__
22
22
  from nyl.profiles import ProfileManager
23
+ from nyl.profiles.config import Profile
23
24
  from nyl.project.config import ProjectConfig
24
25
  from nyl.secrets.config import SecretsConfig
25
26
  from nyl.tools.di import DependenciesProvider
@@ -110,6 +111,12 @@ def _callback(
110
111
  PROVIDER.get(ProfileManager), PROVIDER.get(ApiClientConfig).profile
111
112
  ),
112
113
  )
114
+ PROVIDER.set_lazy(
115
+ Profile,
116
+ lambda: PROVIDER.get(ProfileManager).config.profiles[
117
+ PROVIDER.get(ApiClientConfig).profile or template.DEFAULT_PROFILE
118
+ ],
119
+ )
113
120
 
114
121
 
115
122
  @app.command()
@@ -16,6 +16,7 @@ from nyl.commands import PROVIDER, ApiClientConfig, app
16
16
  from nyl.generator import reconcile_generator
17
17
  from nyl.generator.dispatch import DispatchingGenerator
18
18
  from nyl.profiles import ProfileManager
19
+ from nyl.profiles.config import Profile
19
20
  from nyl.project.config import ProjectConfig
20
21
  from nyl.resources import API_VERSION_INLINE, NylResource
21
22
  from nyl.resources.applyset import APPLYSET_LABEL_PART_OF, ApplySet
@@ -64,7 +65,7 @@ def get_profile_kubernetes_client(profiles: ProfileManager, profile: str | None)
64
65
 
65
66
  If no *profile* is specified, but the profile manager contains at least one profile, the *profile* argument will
66
67
  default to the value of :data:`DEFAULT_PROFILE` (which is `"default"`). Otherwise, if no profile is selected and
67
- none is configured, the standard Kubernetes config load takes place (i.e. try `KUBECONFIG` and then
68
+ none is configured, the standard Kubernetes config loading is used (i.e. try `KUBECONFIG` and then
68
69
  `~/.kube/config`).
69
70
  """
70
71
 
@@ -210,6 +211,9 @@ def template(
210
211
  else project.config.settings.on_lookup_failure,
211
212
  )
212
213
 
214
+ # Seed the template engine with the profile values.
215
+ vars(template_engine.values).update(PROVIDER.get(Profile).values)
216
+
213
217
  # Look for objects that contain local variables and feed them into the template engine.
214
218
  for manifest in source.manifests[:]:
215
219
  if "apiVersion" in manifest or "kind" in manifest:
@@ -227,7 +231,7 @@ def template(
227
231
  exit(1)
228
232
  for key, value in manifest.items():
229
233
  assert key.startswith("$"), key
230
- setattr(template_engine.locals, key[1:], value)
234
+ setattr(template_engine.values, key[1:], value)
231
235
  source.manifests.remove(manifest)
232
236
 
233
237
  # Begin populating the default namespace to resources.
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass, field
4
4
  from pathlib import Path
5
- from typing import Literal
5
+ from typing import Any, Literal
6
6
 
7
7
  from loguru import logger
8
8
 
@@ -13,7 +13,14 @@ from nyl.tools.loads import loadf
13
13
  @dataclass
14
14
  class Profile:
15
15
  """
16
- Represents a Kubernetes connection profile.
16
+ A profile embodies a set of configurations for a Kubernetes cluster that resources will be deployed to using Nyl.
17
+ It defines the Kubeconfig to use, whether to use an SSH tunnel to reach the cluster, as well as global values that
18
+ are accessible during rendering any manifest with the profile activated.
19
+ """
20
+
21
+ values: dict[str, Any] = field(default_factory=dict)
22
+ """
23
+ Global values that are accessible during manifest rendering under the `values` object.
17
24
  """
18
25
 
19
26
  kubeconfig: LocalKubeconfig | KubeconfigFromSsh = field(default_factory=lambda: LocalKubeconfig())
@@ -173,7 +173,7 @@ class NylTemplateEngine:
173
173
 
174
174
  secrets: SecretProvider
175
175
  client: ApiClient
176
- locals: Namespace = field(default_factory=Namespace)
176
+ values: Namespace = field(default_factory=Namespace)
177
177
  on_lookup_failure: Literal["Error", "CreatePlaceholder", "SkipResource"] = "Error"
178
178
 
179
179
  def __post_init__(self) -> None:
@@ -196,7 +196,14 @@ class NylTemplateEngine:
196
196
  NylTemplateEngine.current = prev
197
197
 
198
198
  def _new_engine(self) -> _TemplateEngine:
199
- return _TemplateEngine({"secrets": self.secrets, "locals": self.locals, **registered_functions})
199
+ return _TemplateEngine(
200
+ {
201
+ "secrets": self.secrets,
202
+ "locals": self.values, # TODO: Deprecate in 0.10.x
203
+ "values": self.values,
204
+ **registered_functions,
205
+ }
206
+ )
200
207
 
201
208
  def evaluate(self, value: Manifests, recursive: bool = True) -> Manifests:
202
209
  result = []
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes