Maven_super_30_LeseTolkeKode_3 - itnett/FTD02H-N GitHub Wiki

Selvfølgelig! Jeg vil gå gjennom koden på GitHub-repositoriet du refererte til, og kommentere den linje for linje for å hjelpe deg med å lese og tolke den.

Koden: calculate_github_grade.py

import requests  # Importerer requests-biblioteket som brukes til å gjøre HTTP-forespørsler
import math  # Importerer math-biblioteket som gir tilgang til matematiske funksjoner
from bs4 import BeautifulSoup  # Importerer BeautifulSoup for å analysere HTML-innhold

def get_grade(url):
    """
    Henter GitHub-aktiviteten og beregner en "karakter" basert på bidrag fra brukeren.

    Parameter:
    url (str): URL til GitHub-brukerens bidragsside.

    Returnerer:
    str: Brukerens GitHub-karakter basert på beregningslogikken.
    """
    # Sender en GET-forespørsel til GitHub-brukerens bidragsside
    r = requests.get(url)

    # Bruker BeautifulSoup til å analysere HTML-innholdet i GitHub-siden
    soup = BeautifulSoup(r.content, 'html.parser')

    # Finner alle elementer med taggen 'rect' som representerer bidrag i GitHub-heatmap
    rects = soup.find_all('rect')

    total_contributions = 0  # Initialiserer antall totale bidrag

    # Itererer gjennom alle 'rect' elementene
    for rect in rects:
        # Henter attributtet 'data-count' som angir antall bidrag på en spesifikk dag
        count = int(rect['data-count'])
        total_contributions += count  # Legger til antall bidrag i den totale summen

    # Beregner en score basert på totale bidrag
    score = math.log(total_contributions + 1)  # Legger til 1 for å unngå log(0)

    # Bestemmer karakter basert på scoren
    if score > 6:
        grade = 'A'
    elif score > 4:
        grade = 'B'
    elif score > 2:
        grade = 'C'
    elif score > 1:
        grade = 'D'
    else:
        grade = 'F'

    return grade  # Returnerer den beregnede karakteren

if __name__ == "__main__":
    url = input("Enter the GitHub contribution URL: ")  # Ber brukeren om å skrive inn GitHub URL
    grade = get_grade(url)  # Kaller get_grade-funksjonen for å beregne karakteren
    print(f"GitHub Grade: {grade}")  # Skriver ut den beregnede karakteren

Detaljert Gjennomgang og Kommentarer

  1. Imports:

    • import requests: Brukes til å sende HTTP-forespørsler. Her brukes det til å hente innholdet fra GitHub-siden.
    • import math: Inneholder matematiske funksjoner, som logaritmefunksjonen brukt senere i koden.
    • from bs4 import BeautifulSoup: Importerer BeautifulSoup, som er et bibliotek for å trekke ut data fra HTML og XML-filer. Her brukes det til å analysere HTML-innholdet på GitHub-siden.
  2. Funksjon get_grade(url):

    • Denne funksjonen tar en URL som peker til en GitHub-brukers bidragsside og returnerer en "karakter" basert på antall bidrag (commits, pull requests, osv.).

    • requests.get(url): Sender en GET-forespørsel til GitHub-siden for å hente HTML-innholdet.

    • BeautifulSoup(r.content, 'html.parser'): Analyserer HTML-innholdet på siden med BeautifulSoup for å gjøre det lettere å navigere i dokumentet.

    • soup.find_all('rect'): Finner alle elementer i HTML-dokumentet med taggen <rect>. Disse representerer bidragene på GitHub-profilens "contribution graph" (varmekart).

    • total_contributions = 0: Initialiserer en variabel som skal holde totalen av bidragene.

    • Løkken for rect in rects::

      • Itererer gjennom hvert rect-element.
      • rect['data-count']: Henter verdien av data-count-attributtet, som inneholder antall bidrag for en gitt dag.
      • total_contributions += count: Legger til dette antallet til totalen.
    • score = math.log(total_contributions + 1): Beregner en score basert på totalen. Logaritmefunksjonen gir en skalerbar måte å beregne score på. +1 er lagt til for å unngå at vi tar log(0), som er udefinert.

    • if score > 6: grade = 'A' ...: Baserer karakteren på den beregnede scoren. Høyere score gir bedre karakterer, med 'A' som høyeste og 'F' som laveste.

  3. Hoveddelen av programmet:

    • if __name__ == "__main__":: Sjekker om skriptet kjører som hovedprogram.
    • url = input("Enter the GitHub contribution URL: "): Tar brukerens input som GitHub-URL.
    • grade = get_grade(url): Kaller get_grade-funksjonen med den angitte URL-en for å beregne karakteren.
    • print(f"GitHub Grade: {grade}"): Skriver ut resultatet til brukeren.

Sammendrag

Dette skriptet er en enkel Python-applikasjon som beregner en "karakter" basert på antall bidrag en bruker har gjort på GitHub i løpet av det siste året. Den gjør dette ved å hente og analysere HTML-innholdet på en brukers bidragsside, trekke ut relevant data, og bruke en matematisk formel for å tildele en karakter.

Viktige konsepter som dekkes i dette skriptet:

  • Webskraping: Bruke BeautifulSoup for å trekke ut data fra HTML.
  • HTTP-forespørsler: Bruke requests for å hente nettsideinnhold.
  • Matematisk beregning: Bruke logaritmefunksjonen for å beregne en verdi basert på en akkumulasjon.
  • Kontrollstrukturer: Bruke if-elif-else for å bestemme hvilken karakter som skal tildeles.

Dette skriptet kan være en nyttig øvelse i å forstå hvordan data kan samles inn fra nettet, behandles, og presenteres på en enkel måte.

https://raw.githubusercontent.com/Madhav-MKNC/noob-scripts/main/calculate_github_grade.py

La oss gå gjennom dette skriptet, linje for linje, for å forstå hva det gjør og hvordan det fungerer. Jeg vil kommentere koden detaljert for å gjøre den enklere å lese og tolke.

Koden: calculate_github_grade.py

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
  • Shebang (#!/usr/bin/env python3): Dette er en shebang-linje som forteller systemet at skriptet skal kjøres med Python 3.
  • Koding-deklarasjon (# -*- coding:utf-8 -*-): Spesifiserer at koden bruker UTF-8-koding, som er en standard for å håndtere tekst med forskjellige tegnsett.
"""
Calculate the grade on GitHub according to the GitHub-readme-stats.
https://github-readme-stats.vercel.app/api?username=GITHUB_USERNAME&count_private=false&show_icons=true&theme=chartreuse-dark&PAT_1
eg: https://github-readme-stats.vercel.app/api?username=madhav-mknc&count_private=false&show_icons=true&theme=chartreuse-dark&PAT_1
algorithm: https://github.com/anuraghazra/github-readme-stats/blob/master/src/calculateRank.js
"""
  • Docstring: Gir en oversikt over hva skriptet gjør. Det forklarer at skriptet beregner en "karakter" på GitHub basert på brukerens bidrag, som inkluderer commits, pull requests (PRs), issues, stjerner, og følgere. Det gir også referanser til GitHub API og algoritmen som inspirasjon for beregningen.
def exponential_cdf(x):
    return 1-(2**(-x))
  • exponential_cdf(x): Denne funksjonen beregner den kumulative fordelingsfunksjonen (CDF) til en eksponensiell fordeling. Den tar en verdi x som input og returnerer en verdi mellom 0 og 1. Denne funksjonen er nyttig for å beregne sannsynligheter og vektinger som kan brukes til å skalere inputdata i beregningsalgoritmen.
def log_normal_cdf(x):
    return x/(1+x)
  • log_normal_cdf(x): Denne funksjonen beregner CDF for en log-normal fordeling. Den gir også en verdi mellom 0 og 1 som vekter inputdata. Det er en annen metode for å skalere data, men med en annen vektingsprofil enn exponential_cdf.
def calculateRank(all_commits, commits, prs, issues, stars, followers):
  • calculateRank-funksjonen: Dette er hovedfunksjonen som beregner brukerens GitHub-rangering (eller "karakter") basert på flere bidragsmålinger.
    COMMITS_MEDIAN = 1000 if all_commits else 250
    COMMITS_WEIGHT = 2
  • Median og vekting for commits: COMMITS_MEDIAN er satt til 1000 hvis all_commits er sant (dvs. alle commits tas med i beregningen). Ellers settes den til 250. COMMITS_WEIGHT er vekten som gis til commits i den endelige beregningen.
    PRS_MEDIAN = 50
    PRS_WEIGHT = 3

    ISSUES_MEDIAN = 25
    ISSUES_WEIGHT = 1

    STARS_MEDIAN = 50
    STARS_WEIGHT = 4
    
    FOLLOWERS_MEDIAN = 10
    FOLLOWERS_WEIGHT = 1
  • Median og vekting for PRs, issues, stjerner og følgere: Hver kategori har en medianverdi som brukes til å skalere inputdata, og en vekt som bestemmer hvor mye hver kategori bidrar til den totale rangeringen.
    TOTAL_WEIGHT = COMMITS_WEIGHT + PRS_WEIGHT + ISSUES_WEIGHT + STARS_WEIGHT + FOLLOWERS_WEIGHT
  • TOTAL_WEIGHT: Summen av alle vektene. Dette brukes til å normalisere den endelige rangeringen slik at den ligger mellom 0 og 1.
    THRESHOLDS = [1, 12.5, 25, 37.5, 50, 62.5, 75, 87.5, 100]
    LEVELS = ["S", "A+", "A", "A-", "B+", "B", "B-", "C+", "C"]
  • Terskler og nivåer: THRESHOLDS er en liste over prosentile terskler som definerer hvor rangeringen ligger på skalaen. LEVELS er en liste over karakterer som tilsvarer disse tersklene, fra "S" (høyeste) til "C" (laveste).
    rank = 1 - (COMMITS_WEIGHT * exponential_cdf(commits/COMMITS_MEDIAN)
                + PRS_WEIGHT * exponential_cdf(prs/PRS_MEDIAN)
                + ISSUES_WEIGHT * exponential_cdf(issues/ISSUES_MEDIAN)
                + STARS_WEIGHT * log_normal_cdf(stars/STARS_MEDIAN)
                + FOLLOWERS_WEIGHT * log_normal_cdf(followers/FOLLOWERS_MEDIAN)) / TOTAL_WEIGHT
  • Rangering (rank): Beregner rangeringen ved å kombinere alle de vektede bidragene. Hver bidragstype (commits, PRs, issues, stjerner, følgere) blir skalert ved hjelp av enten exponential_cdf eller log_normal_cdf, multiplisert med sin respektive vekt, og så summert. Den endelige rangeringen er 1 minus denne summen delt på TOTAL_WEIGHT.
    level = LEVELS[THRESHOLDS.index(next(t for t in THRESHOLDS if rank * 100 <= t))]
    return f"\nlevel: {level}\npercentile: {100-rank*100}\n"
  • Bestemme nivå og returnere resultat: level bestemmes ved å finne den første terskelen i THRESHOLDS som rangeringen faller under. Dette nivået returneres sammen med prosentilen (100 minus rangeringen, uttrykt i prosent).
if __name__ == "__main__":
    while True:
        try:
            print("Enter: commits prs issues stars followers")
            inp = list(map(int, input("Enter: ").split())) 
            grade = calculateRank(True, *inp)
            print("\n[*] Your Github Grade stats:", grade)
        except KeyboardInterrupt:
            break 
        except Exception:
            pass
  • Hovedkjøringsblokken: Hvis skriptet kjøres som hovedprogram (ikke importert som en modul), starter det en løkke hvor brukeren blir bedt om å skrive inn fem tall: antall commits, PRs, issues, stjerner og følgere. Disse tallene sendes til calculateRank-funksjonen, som returnerer og skriver ut brukerens GitHub-rangering.
  • Feilhåndtering: Løkken kan avbrytes med Ctrl+C (som genererer et KeyboardInterrupt). Andre unntak blir fanget, men bare ignorert (pass).

Sammendrag

Dette skriptet beregner en brukers GitHub-karakter ved å ta inn flere input-målinger som commits, PRs, issues, stjerner og følgere. Den bruker statistiske fordelingsfunksjoner til å vekting av disse målingene, og bestemmer en endelig karakter basert på hvor brukeren står i forhold til definerte terskler. Resultatet er en enkel, men interessant måte å visualisere en GitHub-brukers aktivitet på.

⚠️ **GitHub.com Fallback** ⚠️