Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature : provide Path accesssors #11585

Merged
merged 1 commit into from Jul 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions conans/client/loader.py
Expand Up @@ -8,6 +8,8 @@

import yaml

from pathlib import Path

from conan.tools.cmake import cmake_layout
from conan.tools.google import bazel_layout
from conan.tools.microsoft import vs_layout
Expand Down Expand Up @@ -73,6 +75,7 @@ def load_basic_module(self, conanfile_path, lock_python_requires=None, user=None
self._pyreq_loader.load_py_requires(conanfile, lock_python_requires, self)

conanfile.recipe_folder = os.path.dirname(conanfile_path)
conanfile.recipe_path = Path(conanfile.recipe_folder)

# If the scm is inherited, create my own instance
if hasattr(conanfile, "scm") and "scm" not in conanfile.__class__.__dict__:
Expand Down
31 changes: 31 additions & 0 deletions conans/model/conan_file.py
@@ -1,6 +1,7 @@
import os
import platform
from contextlib import contextmanager
from pathlib import Path

import six
from six import string_types
Expand Down Expand Up @@ -258,25 +259,50 @@ def new_cpp_info(self):
def source_folder(self):
return self.folders.source_folder

@property
def source_path(self) -> Path:
assert self.source_folder is not None, "`source_folder` is `None`"
return Path(self.source_folder)

@property
def export_sources_folder(self):
"""points to the base source folder when calling source() and to the cache export sources
folder while calling the exports_sources() method. Prepared in case we want to introduce a
'no_copy_export_sources' and point to the right location always."""
return self.folders.base_export_sources

@property
def export_sources_path(self) -> Path:
assert self.export_sources_folder is not None, "`export_sources_folder` is `None`"
return Path(self.export_sources_folder)

@property
def export_folder(self):
return self.folders.base_export

@property
def export_path(self) -> Path:
assert self.export_folder is not None, "`export_folder` is `None`"
return Path(self.export_folder)

@property
def build_folder(self):
return self.folders.build_folder

@property
def build_path(self) -> Path:
assert self.build_folder is not None, "`build_folder` is `None`"
return Path(self.build_folder)

@property
def package_folder(self):
return self.folders.base_package

@property
def package_path(self) -> Path:
assert self.package_folder is not None, "`package_folder` is `None`"
return Path(self.package_folder)

@property
def install_folder(self):
# FIXME: Remove in 2.0, no self.install_folder
Expand All @@ -287,6 +313,11 @@ def generators_folder(self):
# FIXME: Remove in 2.0, no self.install_folder
return self.folders.generators_folder if self.folders.generators else self.install_folder

@property
def generators_path(self) -> Path:
assert self.generators_folder is not None, "`generators_folder` is `None`"
return Path(self.generators_folder)

@property
def imports_folder(self):
return self.folders.imports_folder
Expand Down
6 changes: 6 additions & 0 deletions conans/model/conanfile_interface.py
@@ -1,3 +1,4 @@
from pathlib import Path
from conans.client.graph.graph import CONTEXT_BUILD


Expand Down Expand Up @@ -29,6 +30,11 @@ def __ne__(self, other):
def package_folder(self):
return self._conanfile.package_folder

@property
def package_path(self) -> Path:
assert self.package_folder is not None, "`package_folder` is `None`"
return Path(self.package_folder)

@property
def ref(self):
return self._conanfile.ref
Expand Down
11 changes: 11 additions & 0 deletions conans/test/integration/conanfile/folders_access_test.py
Expand Up @@ -22,6 +22,7 @@ def package_info(self):

conanfile = """
import os
from pathlib import Path
from conans import ConanFile
class AConan(ConanFile):
Expand All @@ -45,6 +46,8 @@ def assert_in_local_cache(self):
def source(self):
assert(self.source_folder == os.getcwd())
assert(isinstance(self.source_path, Path))
assert(str(self.source_path) == self.source_folder)
self.assert_in_local_cache()
# Prevented to use them, it's dangerous, because the source is run only for the first
Expand All @@ -65,6 +68,8 @@ def assert_deps_infos(self):
def build(self):
assert(self.build_folder == os.getcwd())
assert(isinstance(self.build_path, Path))
assert(str(self.build_path) == self.build_folder)
self.assert_in_local_cache()
self.assert_deps_infos()
Expand All @@ -77,11 +82,15 @@ def build(self):
self.install_folder
assert(self.package_folder is not None)
assert(isinstance(self.package_path, Path))
assert(str(self.package_path) == self.package_folder)
self.copy_build_folder = self.build_folder
def package(self):
assert(self.install_folder is not None)
assert(self.build_folder == os.getcwd())
assert(isinstance(self.build_path, Path))
assert(str(self.build_path) == self.build_folder)
self.assert_in_local_cache()
self.assert_deps_infos()
Expand All @@ -97,6 +106,8 @@ def package(self):
def package_info(self):
assert(self.package_folder == os.getcwd())
assert(isinstance(self.package_path, Path))
assert(str(self.package_path) == self.package_folder)
assert(self.in_local_cache == True)
assert(self.source_folder is None)
Expand Down