python-package-folder 3.0.0__tar.gz → 3.0.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 (48) hide show
  1. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/PKG-INFO +1 -1
  2. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/manager.py +43 -0
  3. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/subfolder_build.py +14 -0
  4. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.copier-answers.yml +0 -0
  5. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.cursor/rules/general.mdc +0 -0
  6. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.cursor/rules/python.mdc +0 -0
  7. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.github/workflows/ci.yml +0 -0
  8. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.github/workflows/publish.yml +0 -0
  9. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.gitignore +0 -0
  10. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/.vscode/settings.json +0 -0
  11. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/LICENSE +0 -0
  12. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/Makefile +0 -0
  13. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/README.md +0 -0
  14. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/coverage.svg +0 -0
  15. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/development.md +0 -0
  16. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/installation.md +0 -0
  17. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/publishing.md +0 -0
  18. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/pyproject.toml +0 -0
  19. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/__init__.py +0 -0
  20. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/__main__.py +0 -0
  21. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/analyzer.py +0 -0
  22. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/finder.py +0 -0
  23. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/publisher.py +0 -0
  24. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/py.typed +0 -0
  25. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/python_package_folder.py +0 -0
  26. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/types.py +0 -0
  27. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/utils.py +0 -0
  28. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/src/python_package_folder/version.py +0 -0
  29. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/conftest.py +0 -0
  30. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/some_globals.py +0 -0
  31. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/subfolder_to_build/README.md +0 -0
  32. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/subfolder_to_build/__init__.py +0 -0
  33. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/subfolder_to_build/some_function.py +0 -0
  34. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/subfolder_to_build/some_globals.py +0 -0
  35. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/utility_folder/_SS/some_superseded_file.py +0 -0
  36. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/folder_structure/utility_folder/some_utility.py +0 -0
  37. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_build_with_external_deps.py +0 -0
  38. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_linting.py +0 -0
  39. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_preserve_directory_structure.py +0 -0
  40. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_publisher.py +0 -0
  41. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_shared_subdirectory_imports.py +0 -0
  42. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_spreadsheet_creation_imports.py +0 -0
  43. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_subfolder_build.py +0 -0
  44. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_third_party_dependencies.py +0 -0
  45. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_utils.py +0 -0
  46. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/test_version_manager.py +0 -0
  47. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/tests/tests.py +0 -0
  48. {python_package_folder-3.0.0 → python_package_folder-3.0.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-package-folder
3
- Version: 3.0.0
3
+ Version: 3.0.2
4
4
  Summary: Python package to automatically package and build a folder, fetching all relevant dependencies.
5
5
  Project-URL: Repository, https://github.com/alelom/python-package-folder
6
6
  Author-email: Alessio Lombardi <work@alelom.com>
@@ -339,6 +339,13 @@ class BuildManager:
339
339
  shutil.copy2(source, target)
340
340
  self.copied_files.append(target)
341
341
  print(f"Copied external file: {source} -> {target}")
342
+ # If copying a Python file, ensure parent directory has __init__.py
343
+ # This helps type checkers resolve imports correctly
344
+ if source.suffix == ".py" and target.parent != self.src_dir:
345
+ init_file = target.parent / "__init__.py"
346
+ if not init_file.exists():
347
+ init_file.write_text("", encoding="utf-8")
348
+ self.copied_files.append(init_file)
342
349
  elif source.is_dir():
343
350
  if target.exists():
344
351
  shutil.rmtree(target)
@@ -354,6 +361,8 @@ class BuildManager:
354
361
  Copy a directory tree, excluding certain patterns.
355
362
 
356
363
  Excludes directories matching patterns like _SS, __SS, _sandbox, etc.
364
+ Ensures __init__.py files exist in directories containing Python files
365
+ so that type checkers can resolve imports correctly.
357
366
 
358
367
  Args:
359
368
  src: Source directory
@@ -385,6 +394,9 @@ class BuildManager:
385
394
  # Create destination directory
386
395
  dst.mkdir(parents=True, exist_ok=True)
387
396
 
397
+ has_python_files = False
398
+ copied_python_files = []
399
+
388
400
  # Copy files and subdirectories, excluding patterns
389
401
  for item in src.iterdir():
390
402
  if should_exclude(item):
@@ -395,8 +407,39 @@ class BuildManager:
395
407
 
396
408
  if src_item.is_file():
397
409
  shutil.copy2(src_item, dst_item)
410
+ if src_item.suffix == ".py":
411
+ has_python_files = True
412
+ copied_python_files.append(dst_item)
398
413
  elif src_item.is_dir():
399
414
  self._copytree_excluding(src_item, dst_item)
415
+ # Check if the subdirectory has Python files
416
+ if any(dst_item.rglob("*.py")):
417
+ has_python_files = True
418
+
419
+ # Ensure __init__.py exists in directories containing Python files
420
+ # This is needed for type checkers to resolve imports correctly
421
+ # Also ensure all parent directories in the path have __init__.py
422
+ if has_python_files:
423
+ init_file = dst / "__init__.py"
424
+ if not init_file.exists():
425
+ # Create an empty __init__.py file
426
+ init_file.write_text("", encoding="utf-8")
427
+ self.copied_files.append(init_file)
428
+
429
+ # Ensure all parent directories up to src_dir also have __init__.py
430
+ # This helps type checkers resolve nested imports like:
431
+ # from empty_drawing_detection.models.Information_extraction._shared_ie.ie_enums import ...
432
+ current = dst
433
+ while current != self.src_dir and current.is_relative_to(self.src_dir):
434
+ parent_init = current.parent / "__init__.py"
435
+ if (
436
+ parent_init.parent != self.src_dir
437
+ and not parent_init.exists()
438
+ and any(current.parent.rglob("*.py"))
439
+ ):
440
+ parent_init.write_text("", encoding="utf-8")
441
+ self.copied_files.append(parent_init)
442
+ current = current.parent
400
443
 
401
444
  def _get_package_name_from_import(self, module_name: str) -> str | None:
402
445
  """
@@ -251,6 +251,13 @@ class SubfolderBuildConfig:
251
251
  temp_pyproject_path.write_text(adjusted_content, encoding="utf-8")
252
252
  self.temp_pyproject = temp_pyproject_path
253
253
 
254
+ # Print the temporary pyproject.toml content for debugging
255
+ print("\n" + "=" * 80)
256
+ print("Temporary pyproject.toml content (from subfolder pyproject.toml):")
257
+ print("=" * 80)
258
+ print(adjusted_content)
259
+ print("=" * 80 + "\n")
260
+
254
261
  # If original pyproject.toml exists, temporarily move it
255
262
  if original_pyproject.exists():
256
263
  backup_path = self.project_root / "pyproject.toml.original"
@@ -357,6 +364,13 @@ class SubfolderBuildConfig:
357
364
  temp_pyproject_path = self.project_root / "pyproject.toml.temp"
358
365
  temp_pyproject_path.write_text(modified_content, encoding="utf-8")
359
366
 
367
+ # Print the temporary pyproject.toml content for debugging
368
+ print("\n" + "=" * 80)
369
+ print("Temporary pyproject.toml content (created from parent):")
370
+ print("=" * 80)
371
+ print(modified_content)
372
+ print("=" * 80 + "\n")
373
+
360
374
  # Move temp file to pyproject.toml for the build
361
375
  temp_pyproject_path.rename(original_pyproject)
362
376
  self.temp_pyproject = original_pyproject