Files
crawl4ai/build-nightly.py

137 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Build script for creating nightly versions of Crawl4AI.
This script temporarily modifies pyproject.toml to build the nightly package.
"""
import shutil
import sys
import os
import tempfile
from pathlib import Path
def modify_files_for_nightly():
"""Modify pyproject.toml and __version__.py for nightly package."""
from datetime import datetime
# Generate date-based version: YY.M.D.HHMMSS
now = datetime.utcnow()
nightly_version = f"{now.year % 100}.{now.month}.{now.day}.{now.strftime('%H%M%S')}"
# 1. Modify pyproject.toml
pyproject_path = Path("pyproject.toml")
if not pyproject_path.exists():
print("Error: pyproject.toml not found!")
sys.exit(1)
with open(pyproject_path, 'r') as f:
content = f.read()
# Create backup
pyproject_backup = pyproject_path.with_suffix('.toml.backup')
shutil.copy2(pyproject_path, pyproject_backup)
print(f"Created backup: {pyproject_backup}")
# Modify content for nightly build
modified_content = content.replace(
'name = "Crawl4AI"',
'name = "crawl4ai-nightly"'
)
# Also update the description
modified_content = modified_content.replace(
'description = "🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & scraper"',
'description = "🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & scraper (Nightly Build)"'
)
# Update the version attribute to use __nightly_version__
modified_content = modified_content.replace(
'version = {attr = "crawl4ai.__version__.__version__"}',
'version = {attr = "crawl4ai.__version__.__nightly_version__"}'
)
# Write modified content
with open(pyproject_path, 'w') as f:
f.write(modified_content)
print("Modified pyproject.toml for nightly build")
# 2. Update __nightly_version__ in __version__.py
version_path = Path("crawl4ai/__version__.py")
if not version_path.exists():
print("Error: crawl4ai/__version__.py not found!")
sys.exit(1)
with open(version_path, 'r') as f:
version_content = f.read()
# Create backup
version_backup = version_path.with_suffix('.py.backup')
shutil.copy2(version_path, version_backup)
print(f"Created backup: {version_backup}")
# Update __nightly_version__
modified_version_content = version_content.replace(
'__nightly_version__ = None',
f'__nightly_version__ = "{nightly_version}"'
)
# Write modified content
with open(version_path, 'w') as f:
f.write(modified_version_content)
print(f"Set nightly version: {nightly_version}")
return pyproject_backup, version_backup
def restore_files(pyproject_backup, version_backup):
"""Restore original files from backups."""
# Restore pyproject.toml
pyproject_path = Path("pyproject.toml")
shutil.move(pyproject_backup, pyproject_path)
print("Restored original pyproject.toml")
# Restore __version__.py
version_path = Path("crawl4ai/__version__.py")
shutil.move(version_backup, version_path)
print("Restored original __version__.py")
def main():
"""Main function to handle build process."""
# Set environment variable for nightly versioning
os.environ['CRAWL4AI_NIGHTLY'] = '1'
try:
# Modify files for nightly
pyproject_backup, version_backup = modify_files_for_nightly()
print("\nReady for nightly build!")
print("Run your build command now (e.g., 'python -m build')")
print(f"\nTo restore original files, run:")
print(f" python build-nightly.py --restore")
except Exception as e:
print(f"Error: {e}")
sys.exit(1)
def restore_mode():
"""Restore original files from backups."""
pyproject_backup = Path("pyproject.toml.backup")
version_backup = Path("crawl4ai/__version__.py.backup")
if pyproject_backup.exists() and version_backup.exists():
restore_files(pyproject_backup, version_backup)
else:
if pyproject_backup.exists():
shutil.move(pyproject_backup, Path("pyproject.toml"))
print("Restored pyproject.toml")
if version_backup.exists():
shutil.move(version_backup, Path("crawl4ai/__version__.py"))
print("Restored __version__.py")
if not pyproject_backup.exists() and not version_backup.exists():
print("No backups found. Nothing to restore.")
if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "--restore":
restore_mode()
else:
main()