Spaces:
Configuration error
Configuration error
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
# ========= Copyright 2023-2024 @ CAMEL-AI.org. All Rights Reserved. ========= | |
import os | |
import re | |
import sys | |
from pathlib import Path | |
from typing import List | |
# The license template file is hard-coded with specific start and end lines | |
def fine_license_start_line(lines: List[str], start_with: str) -> int: | |
for i in range(len(lines)): | |
if lines[i].startswith(start_with): | |
return i | |
return None | |
def find_license_end_line(lines: List[str], start_with: str) -> int: | |
for i in range(len(lines) - 1, -1, -1): | |
if lines[i].startswith(start_with): | |
return i | |
return None | |
def update_license_in_file( | |
file_path: str, | |
license_template_path: str, | |
start_line_start_with: str, | |
end_line_start_with: str, | |
) -> bool: | |
with open( | |
file_path, 'r', encoding='utf-8' | |
) as f: # for windows compatibility | |
content = f.read() | |
with open(license_template_path, 'r', encoding='utf-8') as f: | |
new_license = f.read().strip() | |
maybe_existing_licenses = re.findall( | |
r'^#.*?(?=\n)', content, re.MULTILINE | re.DOTALL | |
) | |
start_index = fine_license_start_line( | |
maybe_existing_licenses, start_line_start_with | |
) | |
end_index = find_license_end_line( | |
maybe_existing_licenses, end_line_start_with | |
) | |
if start_index is not None and end_index is not None: | |
maybe_existing_licenses = maybe_existing_licenses[ | |
start_index : end_index + 1 | |
] | |
else: | |
maybe_existing_licenses = None | |
if maybe_existing_licenses: | |
maybe_old_licenses = '\n'.join(maybe_existing_licenses) | |
if maybe_old_licenses.strip() != new_license.strip(): | |
replaced_content = content.replace(maybe_old_licenses, new_license) | |
with open(file_path, 'w') as f: | |
f.write(replaced_content) | |
print(f'Replaced license in {file_path}') | |
return True | |
else: | |
return False | |
else: | |
with open(file_path, 'w') as f: | |
f.write(new_license + '\n' + content) | |
print(f'Added license to {file_path}') | |
return True | |
def update_license_in_directory( | |
directory_path: str, | |
license_template_path: str, | |
start_line_start_with: str, | |
end_line_start_with: str, | |
) -> None: | |
# Check if directory exists | |
if not os.path.isdir(directory_path): | |
raise NotADirectoryError(f'{directory_path} is not a directory') | |
# Check if license template exists | |
if not os.path.isfile(license_template_path): | |
raise FileNotFoundError(f'{license_template_path} not found') | |
file_count = 0 | |
for py_files in Path(directory_path).rglob("*.py"): | |
if py_files.name.startswith('.'): | |
continue | |
if any(part.startswith('.') for part in py_files.parts): | |
continue | |
if update_license_in_file( | |
py_files, | |
license_template_path, | |
start_line_start_with, | |
end_line_start_with, | |
): | |
file_count += 1 | |
print(f'License updated in {file_count} files') | |
if __name__ == '__main__': | |
if len(sys.argv) < 3: | |
print( | |
"Usage from command line: " | |
"python update_license.py <directory_path> <license_template_path>" | |
"No valid input arguments found, please enter manually." | |
) | |
directory_path = input("Enter directory path: ") | |
license_template_path = input("Enter license template path: ") | |
else: | |
directory_path = sys.argv[1] | |
license_template_path = sys.argv[2] | |
start_line_start_with = "# ========= Copyright" | |
end_line_start_with = "# ========= Copyright" | |
update_license_in_directory( | |
directory_path, | |
license_template_path, | |
start_line_start_with, | |
end_line_start_with, | |
) | |