Skip to content

Commit

Permalink
[PackageMetadata] Where are the sources?
Browse files Browse the repository at this point in the history
This file (top_level.txt) is written by setuptools to indicate where the sources of the package are found.

It can be either a folder or a python module.
  • Loading branch information
gforcada committed Dec 13, 2017
1 parent bc39905 commit cd01f8b
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 1 deletion.
38 changes: 38 additions & 0 deletions z3c/dependencychecker/package.py
Expand Up @@ -24,6 +24,7 @@ def __init__(self, path):
self.egg_info_dir = self._get_egg_info_dir()
self.name = self._get_package_name()
self._working_set = self._generate_working_set_with_ourselves()
self.top_level = self._get_sources_top_level()

@staticmethod
def _get_distribution_root(path):
Expand Down Expand Up @@ -138,3 +139,40 @@ def get_extras_dependencies(self):
for req in extra_requirements
)
yield extra_name, dotted_names

def _get_sources_top_level(self):
path = os.path.join(
self.egg_info_dir,
'top_level.txt',
)
if not os.path.exists(path):
logger.error(
'top_level.txt could not be found on %s.\n'
'It is needed for dependencychecker to work properly.',
self.egg_info_dir,
)
sys.exit(1)

with open(path) as top_level_file:
content = top_level_file.read().strip()

sources_top_level = os.path.join(
self.package_dir,
content,
)

if os.path.exists(sources_top_level):
return sources_top_level

single_module_top_level = '{0}.py'.format(sources_top_level)
if os.path.exists(single_module_top_level):
return single_module_top_level

logger.error(
'%s does not exist but %s%stop_level.txt points there.\n'
'Maybe you need to put the package in development again?',
sources_top_level,
self.egg_info_dir,
os.sep,
)
sys.exit(1)
17 changes: 17 additions & 0 deletions z3c/dependencychecker/tests/conftest.py
Expand Up @@ -80,6 +80,7 @@ def _add_egg_info(folder):

_write_pkg_info_file(egg_info_folder_path)
_write_requires_file(egg_info_folder_path)
_write_top_level_file(egg_info_folder_path, package_name)

return package_name

Expand All @@ -101,3 +102,19 @@ def _write_requires_file(folder):
'two',
])
requires_file.write(lines)


def _write_top_level_file(folder_path, package_name):
file_path = os.path.join(folder_path, 'top_level.txt')
with open(file_path, 'w') as top_level_file:
lines = '\n'.join([
package_name,
])
top_level_file.write(lines)

sources_top_folder = os.path.join(
folder_path,
'..',
package_name,
)
os.makedirs(sources_top_folder)
@@ -0,0 +1 @@
sample1
78 changes: 77 additions & 1 deletion z3c/dependencychecker/tests/test_package_metadata.py
Expand Up @@ -39,10 +39,26 @@ def test_package_dir_on_distribution_root(minimal_structure):


def test_package_dir_on_src_folder(minimal_structure):
def move_top_level_to_src(package_path, egg_folder, src_path):
top_level_file_path = os.path.join(
egg_folder,
'top_level.txt'
)
with open(top_level_file_path) as top_level_file:
top_level_folder = top_level_file.read().strip()

top_level_sources = os.path.join(package_path, top_level_folder)

shutil.move(top_level_sources, src_path)
shutil.move(egg_folder, src_path)

path, package_name = minimal_structure

egg_info_folder = os.path.join(path, '{0}.egg-info'.format(package_name))
src_folder = os.path.join(path, 'src')
shutil.move(egg_info_folder, src_folder)

move_top_level_to_src(path, egg_info_folder, src_folder)

metadata = PackageMetadata(path)

assert metadata.package_dir == src_folder
Expand Down Expand Up @@ -260,3 +276,63 @@ def test_no_extras(minimal_structure):

extras = [x for x in metadata.get_extras_dependencies()]
assert len(extras) == 0


def test_top_level_txt_file_found(minimal_structure):
path, package_name = minimal_structure
metadata = PackageMetadata(path)

assert metadata.top_level == os.path.join(path, package_name)


def test_no_top_level_txt_file_found(minimal_structure):
path, package_name = minimal_structure
os.remove(
os.path.join(
path,
'{0}.egg-info'.format(package_name),
'top_level.txt'
)
)

sys_exit = False
try:
PackageMetadata(path)
except SystemExit:
sys_exit = True

assert sys_exit


def test_no_sources_top_level_folder_found(minimal_structure):
path, package_name = minimal_structure
os.removedirs(
os.path.join(
path,
package_name
)
)

sys_exit = False
try:
PackageMetadata(path)
except SystemExit:
sys_exit = True

assert sys_exit


def test_top_level_is_module(minimal_structure):
path, package_name = minimal_structure
top_level_path = os.path.join(
path,
package_name
)
os.removedirs(top_level_path)
top_level_module_path = '{0}.py'.format(top_level_path)
with open(top_level_module_path, 'w') as top_level_file:
top_level_file.write('Does not matter')

metadata = PackageMetadata(path)

assert metadata.top_level == top_level_module_path

0 comments on commit cd01f8b

Please sign in to comment.