odoo-dev 0.1.0__tar.gz → 0.2.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.
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/PKG-INFO +1 -1
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/pyproject.toml +1 -1
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/__init__.py +1 -1
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/commands/setup.py +99 -14
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/config.py +6 -2
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/test_config.py +1 -1
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/test_integration.py +1 -1
- odoo_dev-0.2.0/tests/test_setup.py +53 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/.gitignore +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/.gitmodules +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/.python-version +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/README.md +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/cli.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/commands/__init__.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/commands/db.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/commands/docker.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/commands/run.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/utils/__init__.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/src/odoo_dev/utils/console.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/__init__.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/__init__.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.git +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.gitignore +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.gitlab-ci.yml +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.gitmodules +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/.git +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/.gitignore +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/Dockerfile +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/Makefile +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/README.md +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/compose.yaml +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/docker-entrypoint.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/install.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/odoo-dev.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/odoo.conf +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/vscode/launch.json +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/vscode/settings.json +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/vscode/tasks.json +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/uninstall.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.repos/.gitkeep +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/Notes/Warning Upgrade all +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/README.md +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/addons/.gitkeep +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/note.txt +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/requirements.txt +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/abstorelsymlink.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/adaptation.md +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/after_migration.sh +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/checkout2 +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/cleanup.sql +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/deploy +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/fix_mail_templates.sql +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/gitpull +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/main.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/modules_cleanup.sql +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/post-upgrade steps.md +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/pre_commit_hook.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/requirements.txt +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/test +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/tools/update_addon_versions.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/test_cli.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/test_db.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/test_run.py +0 -0
- {odoo_dev-0.1.0 → odoo_dev-0.2.0}/uv.lock +0 -0
|
@@ -1,21 +1,91 @@
|
|
|
1
1
|
"""Setup commands for initializing Odoo development environment."""
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import subprocess
|
|
4
5
|
from pathlib import Path
|
|
5
|
-
from typing import Annotated
|
|
6
6
|
|
|
7
7
|
import typer
|
|
8
8
|
|
|
9
|
-
from odoo_dev.config import
|
|
10
|
-
|
|
9
|
+
from odoo_dev.config import (
|
|
10
|
+
DEFAULT_ODOO_VERSION,
|
|
11
|
+
DEFAULT_PYTHON_VERSION,
|
|
12
|
+
find_project_root,
|
|
13
|
+
load_config,
|
|
14
|
+
load_dotenv,
|
|
15
|
+
)
|
|
16
|
+
from odoo_dev.utils.console import info, success, warning
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _prompt_for_versions() -> None:
|
|
20
|
+
"""Prompt for ODOO_VERSION and PYTHON_VERSION if not set.
|
|
21
|
+
|
|
22
|
+
Checks environment and .env file. If not found, prompts interactively
|
|
23
|
+
and optionally saves to .env.
|
|
24
|
+
"""
|
|
25
|
+
project_dir = find_project_root()
|
|
26
|
+
env_file = project_dir / ".env"
|
|
27
|
+
|
|
28
|
+
# Load existing .env
|
|
29
|
+
load_dotenv(env_file)
|
|
30
|
+
|
|
31
|
+
odoo_version = os.getenv("ODOO_VERSION")
|
|
32
|
+
python_version = os.getenv("PYTHON_VERSION")
|
|
33
|
+
|
|
34
|
+
updates = {}
|
|
35
|
+
|
|
36
|
+
if not odoo_version:
|
|
37
|
+
odoo_version = typer.prompt(
|
|
38
|
+
"Odoo version",
|
|
39
|
+
default=DEFAULT_ODOO_VERSION,
|
|
40
|
+
)
|
|
41
|
+
os.environ["ODOO_VERSION"] = odoo_version
|
|
42
|
+
updates["ODOO_VERSION"] = odoo_version
|
|
43
|
+
|
|
44
|
+
if not python_version:
|
|
45
|
+
python_version = typer.prompt(
|
|
46
|
+
"Python version",
|
|
47
|
+
default=DEFAULT_PYTHON_VERSION,
|
|
48
|
+
)
|
|
49
|
+
os.environ["PYTHON_VERSION"] = python_version
|
|
50
|
+
updates["PYTHON_VERSION"] = python_version
|
|
51
|
+
|
|
52
|
+
# Offer to save to .env if we prompted for anything
|
|
53
|
+
if updates:
|
|
54
|
+
if typer.confirm("Save these settings to .env?", default=True):
|
|
55
|
+
_update_env_file(env_file, updates)
|
|
56
|
+
success(f"Settings saved to {env_file}")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _update_env_file(env_file: Path, updates: dict[str, str]) -> None:
|
|
60
|
+
"""Update or create .env file with new values."""
|
|
61
|
+
existing = {}
|
|
62
|
+
|
|
63
|
+
if env_file.exists():
|
|
64
|
+
for line in env_file.read_text().splitlines():
|
|
65
|
+
line = line.strip()
|
|
66
|
+
if line and not line.startswith("#") and "=" in line:
|
|
67
|
+
key, _, value = line.partition("=")
|
|
68
|
+
existing[key.strip()] = value.strip()
|
|
69
|
+
|
|
70
|
+
# Merge updates
|
|
71
|
+
existing.update(updates)
|
|
72
|
+
|
|
73
|
+
# Write back
|
|
74
|
+
content = "\n".join(f"{k}={v}" for k, v in sorted(existing.items()))
|
|
75
|
+
env_file.write_text(content + "\n")
|
|
11
76
|
|
|
12
77
|
|
|
13
78
|
def setup(
|
|
14
79
|
community: bool = typer.Option(
|
|
15
|
-
False,
|
|
80
|
+
False,
|
|
81
|
+
"--community",
|
|
82
|
+
help="Set up Community edition only (skip Enterprise repos)",
|
|
16
83
|
),
|
|
17
84
|
) -> None:
|
|
18
85
|
"""Complete setup: clone Odoo repos, configure VSCode, build image."""
|
|
86
|
+
# Prompt for versions if not configured
|
|
87
|
+
_prompt_for_versions()
|
|
88
|
+
|
|
19
89
|
cfg = load_config()
|
|
20
90
|
|
|
21
91
|
success("Setting up complete Odoo development environment...")
|
|
@@ -34,7 +104,9 @@ def setup(
|
|
|
34
104
|
|
|
35
105
|
# Set up local virtual environment
|
|
36
106
|
success("\nSetting up local Python virtual environment...")
|
|
37
|
-
warning(
|
|
107
|
+
warning(
|
|
108
|
+
f"This will install system dependencies and Python {cfg.python_version} if needed"
|
|
109
|
+
)
|
|
38
110
|
setup_venv()
|
|
39
111
|
|
|
40
112
|
# Prompt for Docker setup
|
|
@@ -42,6 +114,7 @@ def setup(
|
|
|
42
114
|
if typer.confirm("Continue with Docker setup?", default=True):
|
|
43
115
|
success("\nBuilding Docker image...")
|
|
44
116
|
from odoo_dev.commands.docker import build
|
|
117
|
+
|
|
45
118
|
build(community=community)
|
|
46
119
|
else:
|
|
47
120
|
warning("Skipping Docker setup. Run 'odoo-dev build' later.")
|
|
@@ -72,7 +145,9 @@ def setup_venv() -> None:
|
|
|
72
145
|
stdout=subprocess.PIPE,
|
|
73
146
|
)
|
|
74
147
|
# Would pipe to sh, but let's be explicit
|
|
75
|
-
warning(
|
|
148
|
+
warning(
|
|
149
|
+
"Please install uv manually: curl -LsSf https://astral.sh/uv/install.sh | sh"
|
|
150
|
+
)
|
|
76
151
|
|
|
77
152
|
# Create virtual environment
|
|
78
153
|
if not cfg.venv_path.exists():
|
|
@@ -88,7 +163,13 @@ def setup_venv() -> None:
|
|
|
88
163
|
_update_python_path(cfg)
|
|
89
164
|
|
|
90
165
|
# Install requirements
|
|
91
|
-
venv_pip = [
|
|
166
|
+
venv_pip = [
|
|
167
|
+
"uv",
|
|
168
|
+
"pip",
|
|
169
|
+
"install",
|
|
170
|
+
"--python",
|
|
171
|
+
str(cfg.venv_path / "bin" / "python"),
|
|
172
|
+
]
|
|
92
173
|
|
|
93
174
|
# Install Odoo requirements
|
|
94
175
|
odoo_requirements = cfg.project_dir / "odoo" / "requirements.txt"
|
|
@@ -110,7 +191,9 @@ def setup_venv() -> None:
|
|
|
110
191
|
|
|
111
192
|
# Install dev tools
|
|
112
193
|
success("Installing development tools...")
|
|
113
|
-
subprocess.run(
|
|
194
|
+
subprocess.run(
|
|
195
|
+
[*venv_pip, "pytest", "pytest-odoo", "debugpy", "manifestoo", "coverage"]
|
|
196
|
+
)
|
|
114
197
|
|
|
115
198
|
success("\nVirtual environment setup complete!")
|
|
116
199
|
success(f"To activate: source {cfg.venv_path}/bin/activate")
|
|
@@ -193,10 +276,12 @@ def _setup_odoo_config(cfg, community_only: bool = False) -> None:
|
|
|
193
276
|
if not community_only:
|
|
194
277
|
addons_paths.append(str(cfg.project_dir / "enterprise"))
|
|
195
278
|
|
|
196
|
-
addons_paths.extend(
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
279
|
+
addons_paths.extend(
|
|
280
|
+
[
|
|
281
|
+
str(cfg.project_dir / "design-themes"),
|
|
282
|
+
str(cfg.project_dir / "addons"),
|
|
283
|
+
]
|
|
284
|
+
)
|
|
200
285
|
|
|
201
286
|
# Filter to only existing paths
|
|
202
287
|
addons_paths = [p for p in addons_paths if Path(p).exists()]
|
|
@@ -335,7 +420,7 @@ def _update_python_path(cfg) -> None:
|
|
|
335
420
|
if "# Odoo PYTHONPATH setup" in content:
|
|
336
421
|
return
|
|
337
422
|
|
|
338
|
-
pythonpath_setup =
|
|
423
|
+
pythonpath_setup = """
|
|
339
424
|
# Odoo PYTHONPATH setup
|
|
340
425
|
if [ -z "$_OLD_VIRTUAL_PYTHONPATH" ]; then
|
|
341
426
|
_OLD_VIRTUAL_PYTHONPATH="$PYTHONPATH"
|
|
@@ -357,7 +442,7 @@ if [ -n "$ODOO_PYTHONPATH" ]; then
|
|
|
357
442
|
export PYTHONPATH
|
|
358
443
|
fi
|
|
359
444
|
# End Odoo PYTHONPATH setup
|
|
360
|
-
|
|
445
|
+
"""
|
|
361
446
|
|
|
362
447
|
content += pythonpath_setup
|
|
363
448
|
activate_script.write_text(content)
|
|
@@ -4,6 +4,10 @@ import os
|
|
|
4
4
|
from dataclasses import dataclass
|
|
5
5
|
from pathlib import Path
|
|
6
6
|
|
|
7
|
+
# Default versions
|
|
8
|
+
DEFAULT_ODOO_VERSION = "19.0"
|
|
9
|
+
DEFAULT_PYTHON_VERSION = "3.12"
|
|
10
|
+
|
|
7
11
|
|
|
8
12
|
@dataclass
|
|
9
13
|
class ProjectConfig:
|
|
@@ -95,7 +99,7 @@ def load_config(project_dir: Path | None = None) -> ProjectConfig:
|
|
|
95
99
|
return ProjectConfig(
|
|
96
100
|
project_dir=project_dir,
|
|
97
101
|
script_dir=project_dir / ".odoo-deploy",
|
|
98
|
-
odoo_version=os.getenv("ODOO_VERSION",
|
|
99
|
-
python_version=os.getenv("PYTHON_VERSION",
|
|
102
|
+
odoo_version=os.getenv("ODOO_VERSION", DEFAULT_ODOO_VERSION),
|
|
103
|
+
python_version=os.getenv("PYTHON_VERSION", DEFAULT_PYTHON_VERSION),
|
|
100
104
|
project_name=project_dir.name,
|
|
101
105
|
)
|
|
@@ -114,7 +114,7 @@ class TestLoadConfig:
|
|
|
114
114
|
cfg = load_config(tmp_path)
|
|
115
115
|
|
|
116
116
|
assert cfg.project_dir == tmp_path
|
|
117
|
-
assert cfg.odoo_version == "
|
|
117
|
+
assert cfg.odoo_version == "19.0" # default
|
|
118
118
|
assert cfg.python_version == "3.12" # default
|
|
119
119
|
assert cfg.project_name == tmp_path.name
|
|
120
120
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Tests for setup command utilities."""
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from odoo_dev.commands.setup import _update_env_file
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class TestUpdateEnvFile:
|
|
9
|
+
"""Test .env file updating."""
|
|
10
|
+
|
|
11
|
+
def test_creates_new_env_file(self, tmp_path: Path):
|
|
12
|
+
env_file = tmp_path / ".env"
|
|
13
|
+
|
|
14
|
+
_update_env_file(env_file, {"ODOO_VERSION": "18.0", "PYTHON_VERSION": "3.12"})
|
|
15
|
+
|
|
16
|
+
assert env_file.exists()
|
|
17
|
+
content = env_file.read_text()
|
|
18
|
+
assert "ODOO_VERSION=18.0" in content
|
|
19
|
+
assert "PYTHON_VERSION=3.12" in content
|
|
20
|
+
|
|
21
|
+
def test_updates_existing_env_file(self, tmp_path: Path):
|
|
22
|
+
env_file = tmp_path / ".env"
|
|
23
|
+
env_file.write_text("EXISTING_VAR=hello\nODOO_VERSION=17.0\n")
|
|
24
|
+
|
|
25
|
+
_update_env_file(env_file, {"ODOO_VERSION": "18.0"})
|
|
26
|
+
|
|
27
|
+
content = env_file.read_text()
|
|
28
|
+
assert "ODOO_VERSION=18.0" in content
|
|
29
|
+
assert "EXISTING_VAR=hello" in content
|
|
30
|
+
# Old version should be replaced
|
|
31
|
+
assert "17.0" not in content
|
|
32
|
+
|
|
33
|
+
def test_preserves_other_vars(self, tmp_path: Path):
|
|
34
|
+
env_file = tmp_path / ".env"
|
|
35
|
+
env_file.write_text("DB_HOST=localhost\nDB_PORT=5432\n")
|
|
36
|
+
|
|
37
|
+
_update_env_file(env_file, {"ODOO_VERSION": "18.0"})
|
|
38
|
+
|
|
39
|
+
content = env_file.read_text()
|
|
40
|
+
assert "DB_HOST=localhost" in content
|
|
41
|
+
assert "DB_PORT=5432" in content
|
|
42
|
+
assert "ODOO_VERSION=18.0" in content
|
|
43
|
+
|
|
44
|
+
def test_skips_comments(self, tmp_path: Path):
|
|
45
|
+
env_file = tmp_path / ".env"
|
|
46
|
+
env_file.write_text("# This is a comment\nVAR=value\n")
|
|
47
|
+
|
|
48
|
+
_update_env_file(env_file, {"NEW_VAR": "new"})
|
|
49
|
+
|
|
50
|
+
content = env_file.read_text()
|
|
51
|
+
assert "NEW_VAR=new" in content
|
|
52
|
+
assert "VAR=value" in content
|
|
53
|
+
# Comments are not preserved (simplification)
|
|
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
|
{odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/docker-entrypoint.sh
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/odoo.conf
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{odoo_dev-0.1.0 → odoo_dev-0.2.0}/tests/fixtures/odoo-empty/.odoo-deploy/templates/vscode/tasks.json
RENAMED
|
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
|