mirror of
https://github.com/mustbeperfect/definitive-opensource.git
synced 2026-04-18 04:54:06 +02:00
Added stats updator functionality w. GH actions
This commit is contained in:
@@ -1,74 +0,0 @@
|
||||
import os
|
||||
import json
|
||||
import requests
|
||||
from urllib.parse import urlparse
|
||||
|
||||
JSON_FILE = "applications.json"
|
||||
|
||||
# Get GitHub token from environment variable.
|
||||
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
||||
if not GITHUB_TOKEN:
|
||||
raise EnvironmentError("Please set your GITHUB_TOKEN environment variable.")
|
||||
|
||||
HEADERS = {
|
||||
"Authorization": f"token {GITHUB_TOKEN}",
|
||||
"Accept": "application/vnd.github.v3+json",
|
||||
}
|
||||
|
||||
def format_stars(stars):
|
||||
|
||||
# Star count format
|
||||
if stars < 1000:
|
||||
return str(stars)
|
||||
else:
|
||||
# Check if the number is evenly divisible by 1000.
|
||||
if stars % 1000 == 0:
|
||||
return f"{stars // 1000}k"
|
||||
else:
|
||||
# Format to one decimal place.
|
||||
return f"{stars / 1000:.1f}k"
|
||||
|
||||
def extract_owner_repo(url):
|
||||
|
||||
# Extract URL
|
||||
parsed = urlparse(url)
|
||||
path_parts = parsed.path.strip("/").split("/")
|
||||
if len(path_parts) >= 2:
|
||||
return path_parts[0], path_parts[1]
|
||||
else:
|
||||
raise ValueError(f"URL {url} is not a valid GitHub repository URL.")
|
||||
|
||||
def update_star_count(application):
|
||||
repo_url = application.get("link", "")
|
||||
try:
|
||||
owner, repo = extract_owner_repo(repo_url)
|
||||
except ValueError as e:
|
||||
print(e)
|
||||
return
|
||||
|
||||
api_url = f"https://api.github.com/repos/{owner}/{repo}"
|
||||
response = requests.get(api_url, headers=HEADERS)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
stars = data.get("stargazers_count", 0)
|
||||
application["stars"] = format_stars(stars)
|
||||
print(f"Updated {owner}/{repo} with {application['stars']} stars.")
|
||||
else:
|
||||
print(f"Failed to fetch data for {owner}/{repo}: {response.status_code} {response.text}")
|
||||
|
||||
def main():
|
||||
# Load the JSON file
|
||||
with open(JSON_FILE, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
applications = data.get("applications", [])
|
||||
for app in applications:
|
||||
update_star_count(app)
|
||||
|
||||
# Save updated JSON back to file
|
||||
with open(JSON_FILE, "w", encoding="utf-8") as f:
|
||||
json.dump(data, f, indent=4)
|
||||
print("Updated JSON file.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -0,0 +1,69 @@
|
||||
import json
|
||||
import requests
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
GITHUB_TOKEN = os.getenv('GH_API_TOKEN')
|
||||
HEADERS = {
|
||||
'Authorization': f'token {GITHUB_TOKEN}',
|
||||
'Accept': 'application/vnd.github.v3+json'
|
||||
}
|
||||
|
||||
def get_repo_data(owner, repo):
|
||||
repo_url = f'https://api.github.com/repos/{owner}/{repo}'
|
||||
commits_url = f'{repo_url}/commits'
|
||||
|
||||
repo_response = requests.get(repo_url, headers=HEADERS)
|
||||
commit_response = requests.get(commits_url, headers=HEADERS)
|
||||
|
||||
if repo_response.status_code != 200:
|
||||
print(f"Failed to fetch data for {owner}/{repo}")
|
||||
return {}
|
||||
|
||||
repo_data = repo_response.json()
|
||||
commits_data = commit_response.json()
|
||||
|
||||
last_commit_date = ''
|
||||
if isinstance(commits_data, list) and len(commits_data) > 0:
|
||||
last_commit_date = commits_data[0]['commit']['committer']['date']
|
||||
last_commit_date = datetime.strptime(last_commit_date, "%Y-%m-%dT%H:%M:%SZ").strftime("%m/%d/%Y")
|
||||
|
||||
return {
|
||||
'description': repo_data.get('description', ''),
|
||||
'stars': repo_data.get('stargazers_count', 0),
|
||||
'language': repo_data.get('language', ''),
|
||||
'license': repo_data.get('license', {}).get('spdx_id', '') if repo_data.get('license') else '',
|
||||
'last_commit': last_commit_date
|
||||
}
|
||||
|
||||
def update_applications(filepath='applications.json'):
|
||||
with open(filepath, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
for app in data.get('applications', []):
|
||||
try:
|
||||
url = app['link']
|
||||
if "github.com" not in url:
|
||||
continue
|
||||
parts = url.split('/')
|
||||
owner, repo = parts[3], parts[4]
|
||||
print(f"Updating: {owner}/{repo}")
|
||||
|
||||
updated_info = get_repo_data(owner, repo)
|
||||
|
||||
app['description'] = updated_info.get('description', app['description'])
|
||||
app['stars'] = updated_info.get('stars', app['stars'])
|
||||
app['language'] = updated_info.get('language', app['language'])
|
||||
app['license'] = updated_info.get('license', app['license'])
|
||||
app['last_commit'] = updated_info.get('last_commit', app['last_commit'])
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error updating {app.get('name')}: {e}")
|
||||
|
||||
with open(filepath, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, indent=4)
|
||||
|
||||
print("Update complete!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
update_applications()
|
||||
|
||||
Reference in New Issue
Block a user