python-package-folder 3.1.0__tar.gz → 3.1.1__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.1.0 → python_package_folder-3.1.1}/PKG-INFO +1 -1
  2. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/coverage.svg +2 -2
  3. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/subfolder_build.py +44 -74
  4. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_subfolder_build.py +27 -34
  5. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.copier-answers.yml +0 -0
  6. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.cursor/rules/general.mdc +0 -0
  7. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.cursor/rules/python.mdc +0 -0
  8. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.github/workflows/ci.yml +0 -0
  9. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.github/workflows/publish.yml +0 -0
  10. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.gitignore +0 -0
  11. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/.vscode/settings.json +0 -0
  12. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/LICENSE +0 -0
  13. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/Makefile +0 -0
  14. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/README.md +0 -0
  15. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/development.md +0 -0
  16. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/installation.md +0 -0
  17. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/publishing.md +0 -0
  18. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/pyproject.toml +0 -0
  19. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/__init__.py +0 -0
  20. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/__main__.py +0 -0
  21. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/analyzer.py +0 -0
  22. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/finder.py +0 -0
  23. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/manager.py +0 -0
  24. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/publisher.py +0 -0
  25. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/py.typed +0 -0
  26. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/python_package_folder.py +0 -0
  27. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/types.py +0 -0
  28. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/utils.py +0 -0
  29. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/src/python_package_folder/version.py +0 -0
  30. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/conftest.py +0 -0
  31. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/some_globals.py +0 -0
  32. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/subfolder_to_build/README.md +0 -0
  33. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/subfolder_to_build/__init__.py +0 -0
  34. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/subfolder_to_build/some_function.py +0 -0
  35. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/subfolder_to_build/some_globals.py +0 -0
  36. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/utility_folder/_SS/some_superseded_file.py +0 -0
  37. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/folder_structure/utility_folder/some_utility.py +0 -0
  38. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_build_with_external_deps.py +0 -0
  39. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_linting.py +0 -0
  40. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_preserve_directory_structure.py +0 -0
  41. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_publisher.py +0 -0
  42. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_shared_subdirectory_imports.py +0 -0
  43. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_spreadsheet_creation_imports.py +0 -0
  44. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_third_party_dependencies.py +0 -0
  45. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_utils.py +0 -0
  46. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/test_version_manager.py +0 -0
  47. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/tests/tests.py +0 -0
  48. {python_package_folder-3.1.0 → python_package_folder-3.1.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-package-folder
3
- Version: 3.1.0
3
+ Version: 3.1.1
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>
@@ -14,7 +14,7 @@
14
14
  <g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11">
15
15
  <text x="31.5" y="15" fill="#010101" fill-opacity=".3">coverage</text>
16
16
  <text x="31.5" y="14">coverage</text>
17
- <text x="81" y="15" fill="#010101" fill-opacity=".3">69%</text>
18
- <text x="81" y="14">69%</text>
17
+ <text x="81" y="15" fill="#010101" fill-opacity=".3">68%</text>
18
+ <text x="81" y="14">68%</text>
19
19
  </g>
20
20
  </svg>
@@ -141,8 +141,9 @@ class SubfolderBuildConfig:
141
141
  result = []
142
142
  in_hatch_build = False
143
143
  in_hatch_build_section = False
144
+ in_sdist_section = False
144
145
  packages_set = False
145
- paths_exclude_set = False
146
+ only_include_set = False
146
147
 
147
148
  for line in lines:
148
149
  # Detect hatch build section
@@ -165,10 +166,20 @@ class SubfolderBuildConfig:
165
166
  # End of hatch build section
166
167
  in_hatch_build_section = False
167
168
  result.append(line)
169
+ elif line.strip().startswith("[tool.hatch.build.targets.sdist]"):
170
+ in_sdist_section = True
171
+ result.append(line)
172
+ continue
173
+ elif line.strip().startswith("[") and in_sdist_section:
174
+ # End of sdist section
175
+ in_sdist_section = False
176
+ result.append(line)
177
+ elif in_sdist_section:
178
+ # Track if only-include already exists
179
+ if re.match(r"^\s*only-include\s*=", line):
180
+ only_include_set = True
181
+ result.append(line)
168
182
  elif in_hatch_build_section:
169
- # Track if paths-exclude already exists
170
- if re.match(r"^\s*paths-exclude\s*=", line):
171
- paths_exclude_set = True
172
183
  result.append(line)
173
184
  elif in_hatch_build:
174
185
  # Modify packages path if found
@@ -209,42 +220,21 @@ class SubfolderBuildConfig:
209
220
  packages_str = f'"{correct_packages_path}"'
210
221
  result.append(f"packages = [{packages_str}]")
211
222
 
212
- # Add file exclusion patterns to prevent including non-package files
213
- # Only add if paths-exclude wasn't already set (we merged it above)
214
- if not paths_exclude_set:
223
+ # Use only-include for source distributions to ensure only the subfolder is included
224
+ # This prevents including files from the project root
225
+ if correct_packages_path and not only_include_set:
215
226
  result.append("")
216
- result.append("[tool.hatch.build]")
217
- result.append("paths-exclude = [")
218
- result.append(' ".cursor/**",')
219
- result.append(' ".github/**",')
220
- result.append(' ".vscode/**",')
221
- result.append(' ".idea/**",')
222
- result.append(' "data/**",')
223
- result.append(' "docs/**",')
224
- result.append(' "references/**",')
225
- result.append(' "reports/**",')
226
- result.append(' "scripts/**",')
227
- result.append(' "tests/**",')
228
- result.append(' "test/**",')
229
- result.append(' "dist/**",')
230
- result.append(' "build/**",')
231
- result.append(' "*.egg-info/**",')
232
- result.append(' "__pycache__/**",')
233
- result.append(' ".pytest_cache/**",')
234
- result.append(' ".mypy_cache/**",')
235
- result.append(' ".venv/**",')
236
- result.append(' "venv/**",')
237
- result.append(' ".git/**",')
238
- result.append(' ".gitignore",')
239
- result.append(' ".gitattributes",')
240
- result.append(' "Dockerfile",')
241
- result.append(' ".dockerignore",')
242
- result.append(' ".pylintrc",')
243
- result.append(' "pyrightconfig.json",')
244
- result.append(' "git-filter-repo",')
245
- result.append(' "pyproject.toml.original",')
246
- result.append(' "README.md.backup",')
247
- result.append("]")
227
+ result.append("[tool.hatch.build.targets.sdist]")
228
+ # Include only the subfolder directory and necessary files
229
+ only_include_paths = [correct_packages_path]
230
+ # Also include pyproject.toml and README if they exist
231
+ only_include_paths.append("pyproject.toml")
232
+ only_include_paths.append("README.md")
233
+ only_include_paths.append("README.rst")
234
+ only_include_paths.append("README.txt")
235
+ only_include_paths.append("README")
236
+ only_include_str = ", ".join(f'"{p}"' for p in only_include_paths)
237
+ result.append(f"only-include = [{only_include_str}]")
248
238
 
249
239
  return "\n".join(result)
250
240
 
@@ -584,41 +574,21 @@ class SubfolderBuildConfig:
584
574
  packages_str = ", ".join(f'"{p}"' for p in package_dirs)
585
575
  result.append(f"packages = [{packages_str}]")
586
576
 
587
- # Add file exclusion patterns to prevent including non-package files
588
- # This ensures only the subfolder code is included, not project root files
589
- result.append("")
590
- result.append("[tool.hatch.build]")
591
- result.append("paths-exclude = [")
592
- result.append(' ".cursor/**",')
593
- result.append(' ".github/**",')
594
- result.append(' ".vscode/**",')
595
- result.append(' ".idea/**",')
596
- result.append(' "data/**",')
597
- result.append(' "docs/**",')
598
- result.append(' "references/**",')
599
- result.append(' "reports/**",')
600
- result.append(' "scripts/**",')
601
- result.append(' "tests/**",')
602
- result.append(' "test/**",')
603
- result.append(' "dist/**",')
604
- result.append(' "build/**",')
605
- result.append(' "*.egg-info/**",')
606
- result.append(' "__pycache__/**",')
607
- result.append(' ".pytest_cache/**",')
608
- result.append(' ".mypy_cache/**",')
609
- result.append(' ".venv/**",')
610
- result.append(' "venv/**",')
611
- result.append(' ".git/**",')
612
- result.append(' ".gitignore",')
613
- result.append(' ".gitattributes",')
614
- result.append(' "Dockerfile",')
615
- result.append(' ".dockerignore",')
616
- result.append(' ".pylintrc",')
617
- result.append(' "pyrightconfig.json",')
618
- result.append(' "git-filter-repo",')
619
- result.append(' "pyproject.toml.original",')
620
- result.append(' "README.md.backup",')
621
- result.append("]")
577
+ # Use only-include for source distributions to ensure only the subfolder is included
578
+ # This prevents including files from the project root
579
+ if package_dirs:
580
+ result.append("")
581
+ result.append("[tool.hatch.build.targets.sdist]")
582
+ # Include only the subfolder directory and necessary files
583
+ only_include_paths = [package_dirs[0]]
584
+ # Also include pyproject.toml and README if they exist
585
+ only_include_paths.append("pyproject.toml")
586
+ only_include_paths.append("README.md")
587
+ only_include_paths.append("README.rst")
588
+ only_include_paths.append("README.txt")
589
+ only_include_paths.append("README")
590
+ only_include_str = ", ".join(f'"{p}"' for p in only_include_paths)
591
+ result.append(f"only-include = [{only_include_str}]")
622
592
 
623
593
  # Add dependency group if specified
624
594
  if dependency_group:
@@ -711,30 +711,24 @@ class TestSubfolderBuildTemporaryPyprojectCreation:
711
711
  assert pyproject_path.exists()
712
712
  content = pyproject_path.read_text()
713
713
 
714
- # Verify [tool.hatch.build] section exists
715
- assert "[tool.hatch.build]" in content
716
-
717
- # Verify paths-exclude is present
718
- assert "paths-exclude = [" in content
719
-
720
- # Verify common exclusion patterns are included
721
- assert '".cursor/**"' in content
722
- assert '".github/**"' in content
723
- assert '".vscode/**"' in content
724
- assert '"data/**"' in content
725
- assert '"docs/**"' in content
726
- assert '"references/**"' in content
727
- assert '"reports/**"' in content
728
- assert '"scripts/**"' in content
729
- assert '"tests/**"' in content
730
- assert '"dist/**"' in content
731
- assert '"build/**"' in content
732
- assert '"*.egg-info/**"' in content
733
- assert '"__pycache__/**"' in content
734
- assert '".pytest_cache/**"' in content
735
- assert '".git/**"' in content
736
- assert '"Dockerfile"' in content
737
- assert '".gitignore"' in content
714
+ # Verify [tool.hatch.build.targets.sdist] section exists
715
+ assert "[tool.hatch.build.targets.sdist]" in content
716
+
717
+ # Verify only-include is present
718
+ assert "only-include = [" in content
719
+
720
+ # Verify the subfolder is included
721
+ assert '"subfolder"' in content
722
+
723
+ # Verify necessary files are included
724
+ assert '"pyproject.toml"' in content
725
+ assert '"README.md"' in content
726
+
727
+ # Verify non-package directories are NOT explicitly included
728
+ assert '".cursor"' not in content or '".cursor"' not in content.split("only-include")[1]
729
+ assert '".github"' not in content or '".github"' not in content.split("only-include")[1]
730
+ assert '"data"' not in content or '"data"' not in content.split("only-include")[1]
731
+ assert '"docs"' not in content or '"docs"' not in content.split("only-include")[1]
738
732
 
739
733
  # Cleanup
740
734
  config.restore()
@@ -771,18 +765,17 @@ description = "Subfolder package"
771
765
  assert pyproject_path.exists()
772
766
  content = pyproject_path.read_text()
773
767
 
774
- # Verify [tool.hatch.build] section exists
775
- assert "[tool.hatch.build]" in content
768
+ # Verify [tool.hatch.build.targets.sdist] section exists
769
+ assert "[tool.hatch.build.targets.sdist]" in content
770
+
771
+ # Verify only-include is present
772
+ assert "only-include = [" in content
776
773
 
777
- # Verify paths-exclude is present
778
- assert "paths-exclude = [" in content
774
+ # Verify the subfolder is included
775
+ assert '"subfolder-package"' in content or '"subfolder"' in content
779
776
 
780
- # Verify common exclusion patterns are included
781
- assert '".cursor/**"' in content
782
- assert '"data/**"' in content
783
- assert '"docs/**"' in content
784
- assert '"dist/**"' in content
785
- assert '"build/**"' in content
777
+ # Verify necessary files are included
778
+ assert '"pyproject.toml"' in content
786
779
 
787
780
  # Cleanup
788
781
  config.restore()