136 lines
4.8 KiB
Python
136 lines
4.8 KiB
Python
import importlib.util
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
REPO_ROOT = Path(__file__).resolve().parents[3]
|
|
TOOLS_SCRIPTS_DIR = REPO_ROOT / "tools" / "scripts"
|
|
if str(TOOLS_SCRIPTS_DIR) not in sys.path:
|
|
sys.path.insert(0, str(TOOLS_SCRIPTS_DIR))
|
|
|
|
|
|
def load_module(relative_path: str, module_name: str):
|
|
module_path = REPO_ROOT / relative_path
|
|
spec = importlib.util.spec_from_file_location(module_name, module_path)
|
|
module = importlib.util.module_from_spec(spec)
|
|
assert spec.loader is not None
|
|
sys.modules[module_name] = module
|
|
spec.loader.exec_module(module)
|
|
return module
|
|
|
|
|
|
sync_contributors = load_module(
|
|
"tools/scripts/sync_contributors.py",
|
|
"sync_contributors_test",
|
|
)
|
|
|
|
|
|
class SyncContributorsTests(unittest.TestCase):
|
|
def test_parse_existing_contributor_links_preserves_custom_urls(self):
|
|
content = """## Repo Contributors
|
|
|
|
- [@alice](https://github.com/alice)
|
|
- [@github-actions[bot]](https://github.com/apps/github-actions)
|
|
- [@Copilot](https://github.com/apps/copilot-swe-agent)
|
|
"""
|
|
links = sync_contributors.parse_existing_contributor_links(content)
|
|
|
|
self.assertEqual(links["alice"], "https://github.com/alice")
|
|
self.assertEqual(links["github-actions[bot]"], "https://github.com/apps/github-actions")
|
|
self.assertEqual(links["Copilot"], "https://github.com/apps/copilot-swe-agent")
|
|
|
|
def test_update_repo_contributors_section_renders_latest_contributors(self):
|
|
content = """## Repo Contributors
|
|
|
|
<a href="https://github.com/sickn33/antigravity-awesome-skills/graphs/contributors">
|
|
<img src="https://contrib.rocks/image?repo=sickn33/antigravity-awesome-skills" alt="Repository contributors" />
|
|
</a>
|
|
|
|
Made with [contrib.rocks](https://contrib.rocks).
|
|
|
|
We officially thank the following contributors for their help in making this repository awesome!
|
|
|
|
- [@alice](https://github.com/alice)
|
|
- [@Copilot](https://github.com/apps/copilot-swe-agent)
|
|
|
|
## License
|
|
"""
|
|
|
|
updated = sync_contributors.update_repo_contributors_section(
|
|
content,
|
|
["alice", "github-actions[bot]", "Copilot", "new-user"],
|
|
)
|
|
|
|
self.assertIn("- [@alice](https://github.com/alice)", updated)
|
|
self.assertIn("- [@github-actions[bot]](https://github.com/apps/github-actions)", updated)
|
|
self.assertIn("- [@Copilot](https://github.com/apps/copilot-swe-agent)", updated)
|
|
self.assertIn("- [@new-user](https://github.com/new-user)", updated)
|
|
self.assertEqual(updated.count("## Repo Contributors"), 1)
|
|
self.assertEqual(updated.count("## License"), 1)
|
|
|
|
def test_order_contributors_for_render_preserves_existing_order_and_appends_new(self):
|
|
ordered = sync_contributors.order_contributors_for_render(
|
|
["new-z", "bob", "alice", "new-a", "github-actions[bot]"],
|
|
["alice", "github-actions[bot]", "bob", "removed-user"],
|
|
)
|
|
|
|
self.assertEqual(
|
|
ordered,
|
|
["alice", "github-actions[bot]", "bob", "new-a", "new-z"],
|
|
)
|
|
|
|
def test_update_repo_contributors_section_avoids_reordering_existing_entries(self):
|
|
content = """## Repo Contributors
|
|
|
|
<a href="https://github.com/sickn33/antigravity-awesome-skills/graphs/contributors">
|
|
<img src="https://contrib.rocks/image?repo=sickn33/antigravity-awesome-skills" alt="Repository contributors" />
|
|
</a>
|
|
|
|
Made with [contrib.rocks](https://contrib.rocks).
|
|
|
|
We officially thank the following contributors for their help in making this repository awesome!
|
|
|
|
- [@alice](https://github.com/alice)
|
|
- [@github-actions[bot]](https://github.com/apps/github-actions)
|
|
- [@bob](https://github.com/bob)
|
|
|
|
## License
|
|
"""
|
|
|
|
updated = sync_contributors.update_repo_contributors_section(
|
|
content,
|
|
["bob", "new-user", "alice", "github-actions[bot]"],
|
|
)
|
|
|
|
contributor_block = updated.split(
|
|
"We officially thank the following contributors for their help in making this repository awesome!\n\n",
|
|
1,
|
|
)[1].split("\n## License", 1)[0]
|
|
|
|
self.assertEqual(
|
|
contributor_block.strip().splitlines(),
|
|
[
|
|
"- [@alice](https://github.com/alice)",
|
|
"- [@github-actions[bot]](https://github.com/apps/github-actions)",
|
|
"- [@bob](https://github.com/bob)",
|
|
"- [@new-user](https://github.com/new-user)",
|
|
],
|
|
)
|
|
|
|
def test_parse_contributors_response_dedupes_and_sorts_order(self):
|
|
payload = [
|
|
{"login": "alice"},
|
|
{"login": "bob"},
|
|
{"login": "alice"},
|
|
{"login": "github-actions[bot]"},
|
|
]
|
|
|
|
contributors = sync_contributors.parse_contributors_response(payload)
|
|
|
|
self.assertEqual(contributors, ["alice", "bob", "github-actions[bot]"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|