Bedömning av ärenden¶
Django använder Trac för att hantera arbetet med kodbasen. Trac är en trädgård som sköts av gemenskapen med de buggar som folk har hittat och de funktioner som Django har beslutat att lägga till. Som i alla trädgårdar finns det ibland ogräs som ska rensas bort och ibland blommor och grönsaker som behöver plockas. Vi behöver din hjälp för att skilja det ena från det andra, och i slutändan gynnas vi alla tillsammans.
Precis som i alla trädgårdar kan vi sträva efter perfektion, men i verkligheten finns det inget sådant. Även i den mest orörda trädgård finns det fortfarande sniglar och insekter. I en gemensam trädgård finns det också hjälpsamma människor som - med de bästa avsikter - gödslar ogräset och förgiftar rosorna. Det är hela samhällets uppgift att sköta sig självt, hålla problemen på ett minimum och utbilda dem som kommer in i gemenskapen så att de kan bli värdefulla bidragande medlemmar.
På samma sätt, även om vi strävar efter att Trac ska vara en perfekt representation av Djangos framsteg, erkänner vi att detta inte kommer att hända. Genom att distribuera belastningen av Trac-underhåll till gemenskapen accepterar vi att det kommer att finnas misstag. Trac är ”mestadels korrekt”, och vi tar hänsyn till det faktum att det ibland kommer att vara fel. Det är helt okej. Vi är perfektionister med deadlines.
Vi förlitar oss på att gemenskapen fortsätter att delta, håller ärenden så korrekta som möjligt och tar upp frågor för diskussion på Django Forum när det finns förvirring eller oenighet.
Django är ett gemenskapsprojekt och alla bidrag hjälper till. Vi kan inte göra det här utan dig!
Arbetsflöde för triagering¶
Tyvärr innehåller inte alla rapporter i ärendehanteraren alla nödvändiga uppgifter. Ett antal ärenden har föreslagna lösningar, men de uppfyller inte nödvändigtvis alla krav för att följa riktlinjerna för bidrag.
Ett sätt att hjälpa till är att trimma ärenden som har skapats av andra användare.
Det mesta av arbetsflödet är baserat på konceptet med en ärendes triage stages. Varje steg beskriver var i sin livstid ett visst ärende befinner sig vid varje tidpunkt. Tillsammans med en handfull flaggor berättar detta attribut enkelt för oss vad och vem varje ärende väntar på.
Eftersom en bild säger mer än tusen ord börjar vi där:
Det finns fyra roller i detta diagram. Förvaltare (även kallade Fellows) deltar vanligen i samtliga, men vem som helst i Django-communityn kan delta i alla roller utom merger. Rollen merger tilldelas genom en omröstning i Steering Council.
Triagerare: vem som helst kan ta den här rollen genom att kontrollera att ett ärende beskriver ett verkligt problem och hålla ärendehanteraren organiserad.
Felrättare: vem som helst kan bidra genom att öppna en pull request och arbeta på en lösning för ett ärende.
Granskare: vem som helst kan granska pull requests och föreslå förbättringar.
Merger-ansvariga: personer med commit-åtkomst som fattar det slutliga beslutet att sammanfoga en ändring.
När vi säger vem som helst, menar vi dig!
Vårt Trac-system och GitHub-kodförråd är avsiktligt öppna för allmänheten. Vem som helst kan hjälpa till genom att arbeta med ärenden, triagera ärenden och granska ändringar. Django är ett communityprojekt och vi uppmuntrar triage och samarbete i communityn. Vi vill verkligen att du hjälper till!
Här är till exempel den typiska livscykeln för ett ärende:
Alice skapar ett ärende och öppnar en ofullständig pull request (tester saknas, implementeringen är felaktig).
Bob granskar pull requesten, markerar ärendet som ”Accepted”, sätter flaggorna ”needs tests” och ”patch needs improvement”, och lämnar en kommentar som förklarar hur Alice kan förbättra patchen. Detta placerar automatiskt ärendet i kön ”waiting on author” inom stadiet ”accepted”.
Alice uppdaterar pull requesten, lägger till tester (men rättar ännu inte implementeringen) och tar bort de två flaggorna. Ärendet flyttas till kön ”needs PR review”.
Charlie granskar pull requesten, sätter åter flaggan ”patch needs improvement” och lämnar en ny kommentar med förslag på ändringar i implementeringen. Ärendet flyttas tillbaka till kön ”waiting on author”.
Alice uppdaterar pull requesten igen, rättar denna gång implementeringen och tar bort flaggan ”patch needs improvement”. Ärendet flyttas åter till kön ”needs PR review”.
Daisy granskar pull request och markerar ärendet som ”Redo för incheckning”.
Jacob, en merger, granskar och sammanfogar pull requesten.
Vissa ärenden går snabbt genom dessa steg, medan andra kräver mer tid och diskussion. Varje bidrag hjälper Django att förbättras.
Triage-stadier¶
Nedan beskriver vi mer i detalj de olika steg som ett ärende kan gå igenom under sin livstid.
Ej Recenserade¶
Ärendet har inte granskats av någon som ansett sig kvalificerad att bedöma om det innehåller ett giltigt problem eller bör stängas av något skäl. Ogranskade ärenden visas i kön ”triage”.
Ogranskade ärenden kan få ytterligare förfining innan de accepteras. Om du inte både är författare till ärendet och tänker skicka in en patch ska ogranskade ärenden inte tas över.
Accepterad¶
Den absoluta innebörden av ”accepted” är att problemet som beskrivs i ärendet är giltigt och möjligt att agera på. Det delas upp i tre köer:
Behöver patch (Accepted + No Flags)
Ärendet är giltigt, men ingen har skickat in en patch för det ännu. Ofta innebär detta att du kan börja skriva en fix för den. Detta är i allmänhet mer sant för accepterade buggar än accepterade funktioner. Ett ärende för en bugg som har accepterats innebär att problemet har verifierats av minst en triager som en legitim bugg - och bör förmodligen åtgärdas om möjligt.
För nya funktioner bör accepterade ärenden endast existera efter att idén har gått igenom den lämpliga processen för att föreslå nya funktioner och fått godkännande av gemenskapen och Steering Council, eller accepterats i en DEP.
Behöver PR-granskning (Accepted + Has Patch)
Ärendet väntar på att folk ska granska den medföljande lösningen. Detta innebär att ladda ner patchen och prova den, verifiera att den innehåller tester och dokument, köra testsviten med den medföljande patchen och lämna feedback på ärendet.
Väntar på författaren (Accepted + Has Patch + Needs fixes)
Detta innebär att ärendet har granskats och att det har konstaterats att det behöver ytterligare arbete. ”Behöver testas” och ”Behöver dokumenteras” är självförklarande. ”Patch needs improvement” åtföljs i allmänhet av en kommentar i ärendet som förklarar vad som behövs för att förbättra koden.
Redo för incheckning¶
Ärendet granskades av någon annan medlem av gemenskapen än den person som levererade patchen och ansågs uppfylla alla krav för ett commit-ready bidrag. En fusion måste nu genomgå en sista granskning innan den kan skickas in.
Det finns många pull requests. Det kan ta ett tag för din patch att bli granskad. Se Bidra med kod FAQ för några idéer här.
En dag/kanske¶
Detta steg visas inte i diagrammet. Det används sparsamt för att hålla reda på långsiktiga förändringar.
Dessa ärenden är ovanliga och generellt sett mindre användbara eftersom de inte beskriver konkreta problem som kan åtgärdas.
Andra triageattribut¶
Ett antal flaggor, som visas som kryssrutor i Trac, kan ställas in på ett ärende:
Har lapp¶
Det innebär att ärendet har en associerad lösning. Dessa granskas för att säkerställa att de följer de dokumenterade riktlinjerna.
De följande tre fälten (Behöver dokumentation, Behöver tester, Patch behöver förbättras) gäller endast om en patch har levererats.
Behov av dokumentation¶
Den här flaggan används för ärenden med korrigeringar som behöver tillhörande dokumentation. Fullständig dokumentation av funktioner är en förutsättning för att vi ska kunna checka in dem i kodbasen.
Behov av tester¶
Detta flaggar för att patchen behöver associerade enhetstester. Återigen, detta är en obligatorisk del av ett giltigt bidrag.
Patch behöver förbättras¶
Den här flaggan betyder att även om ärendet har en lösning, är den inte riktigt redo för incheckning. Det kan betyda att patchen inte längre tillämpas korrekt, att det finns ett fel i implementeringen eller att koden inte uppfyller våra standarder.
Lätt att välja¶
Ärenden som skulle kräva små, enkla förändringar.
Typ¶
Ärenden bör kategoriseras efter typ mellan:
- Ny funktion
För att du tillför något nytt.
- Insekt
För när en befintlig sak är trasig eller inte beter sig som förväntat.
- Uppstädning/optimering
För när inget är trasigt men något kan göras renare, bättre, snabbare, starkare.
Komponent¶
Ärenden bör klassificeras i komponenter som indikerar vilket område av Django-kodbasen de tillhör. Detta gör att ärendena blir bättre organiserade och lättare att hitta.
Allvarlighetsgrad¶
Attributet severity används för att identifiera blockerare, det vill säga problem som bör åtgärdas innan nästa version av Django släpps. Vanligtvis är dessa problem buggar som orsakar regressioner från tidigare versioner eller potentiellt orsakar allvarliga dataförluster. Detta attribut används ganska sällan och de allra flesta ärenden har en allvarlighetsgrad på ”Normal”.
Version¶
Attributet version anger den tidigaste version där felet kunde återskapas. Under triage kan detta fält uppdateras, men det behöver inte uppdateras ytterligare när den versionen inte längre stöds. Fältet ska inte återställas till ”dev” för att visa att problemet fortfarande finns: anteckna i stället den testade commit-hashen i en kommentar.
UI/UX¶
Den här flaggan används för ärenden som rör frågor om användargränssnitt och användarupplevelser. Den här flaggan skulle till exempel vara lämplig för användarvänliga funktioner i formulär eller administratörsgränssnittet.
Cc¶
Du kan lägga till ditt användarnamn eller din e-postadress i det här fältet för att bli meddelad när nya bidrag görs till ärendet.
Nyckelord¶
Med det här fältet kan du märka ett ärende med flera nyckelord. Det kan t.ex. vara användbart för att gruppera flera ärenden på samma tema. Nyckelord kan antingen separeras med kommatecken eller mellanslag. Nyckelordssökning hittar nyckelordssträngen var som helst i nyckelorden. Om du t.ex. klickar på ett ärende med nyckelordet ”form” får du fram liknande ärenden som är märkta med nyckelord som innehåller strängar som ”formset”, ”modelformset” och ”ManagementForm”.
Stänga ärenden¶
När ett ärende har avslutat sin användbara livscykel är det dags att stänga det. Att stänga ett ärende är dock ett stort ansvar. Du måste vara säker på att problemet verkligen är löst, och du måste komma ihåg att den som rapporterat ärendet kanske inte är glad över att få sitt ärende stängt (om det inte är åtgärdat!). Om du inte är säker på om du ska stänga ett ärende, lämna en kommentar med dina tankar istället.
Om du stänger ett ärende bör du alltid kontrollera följande:
Försäkra dig om att problemet är löst.
Lämna en kommentar med en förklaring till beslutet att stänga ärendet.
Om det finns något sätt de kan förbättra ärendet för att öppna det igen, låt dem veta det.
Om ärendet är en dubblett ska du hänvisa till det ursprungliga ärendet. Korsreferera också det stängda ärendet genom att lämna en kommentar i det ursprungliga ärendet - detta gör det möjligt att få tillgång till mer relaterad information om den rapporterade buggen eller den begärda funktionen.
**Var artig Ingen gillar att få sitt ärende avslutat. Det kan vara frustrerande eller till och med avskräckande. Det bästa sättet att undvika att avskräcka människor från att bidra till Django är att vara artig och vänlig och att ge förslag på hur de kan förbättra detta ärende och andra ärenden i framtiden.
Ett ärende kan lösas på flera olika sätt:
- fixerad
Används när en patch har rullats in i Django och problemet är åtgärdat.
- ogiltig
Används om det visar sig att ärendet är felaktigt. Detta innebär att problemet i ärendet faktiskt är resultatet av ett användarfel, eller beskriver ett problem med något annat än Django, eller inte alls är en buggrapport eller funktionsbegäran (till exempel skickar vissa nya användare supportfrågor som ärenden).
- wontfix
Används när någon beslutar att begäran inte är lämplig för övervägande i Django. Ibland stängs ett ärende som ”wontfix” med en begäran om att rapportören ska starta en diskussion på Django Forum om de känner annorlunda än den motivering som ges av den person som stängde ärendet. Andra gånger föregås beslutet att stänga ett ärende av en diskussion. Använd alltid forumet för att få ett samförstånd innan du återöppnar ärenden som stängts som ”wontfix”.
- needsnewfeatureprocess
Används när ärendet motiverar en ny funktion, som behöver få synpunkter och stöd från communityn. Se processen för att föreslå nya funktioner.
- duplicera
Används när ett annat ärende täcker samma fråga. Genom att stänga dubbla ärenden håller vi all diskussion på ett ställe, vilket är till hjälp för alla.
- arbetar för
Används när ärendet inte innehåller tillräckligt med detaljer för att replikera den ursprungliga buggen.
- behöver information
Används när ärendet inte innehåller tillräckligt med information för att replikera det rapporterade problemet, men fortfarande kan vara giltigt. Ärendet bör öppnas på nytt när mer information har lämnats.
Om du anser att ärendet stängdes felaktigt – eftersom du fortfarande har problemet, det har dykt upp någon annanstans eller triagerarna har gjort ett misstag – kan du öppna ärendet igen och lämna mer information. Öppna däremot inte igen ärenden som har markerats som ”wontfix” eller ”needsnewfeatureprocess”. För ”wontfix”-ärenden ska du i stället ta upp problemet i Django Forum. För ”needsnewfeatureprocess”-ärenden föreslår du funktionen genom processen för nya funktioner.
Hur kan jag hjälpa till med utvecklingen?¶
Utvecklingsprocessen drivs främst av communitymedlemmar. Verkligen, VEM SOM HELST kan hjälpa till.
Om du vill engagera dig kan du börja med att skapa ett konto på Trac. Om du har ett konto men har glömt ditt lösenord kan du återställa det genom att använda sidan för återställning av lösenord.
Då kan du hjälpa till genom att:
Stänga ”Unreviewed”-ärenden som ”invalid”, ”worksforme”, ”duplicate”, ”wontfix” eller ”needsnewfeatureprocess”.
Stänga ”ogranskade” ärenden som ”behöver information” när beskrivningen är för knapphändig för att kunna åtgärdas.
Korrigering av flaggorna ”Behöver testas”, ”Behöver dokumenteras” eller ”Har patch” för ärenden där de är felaktigt inställda.
Ställ in flaggan ”Easy pickings” för ärenden som är små och relativt okomplicerade.
Ange typ av ärenden som fortfarande är okategoriserade.
Kontrollera att gamla ärenden fortfarande är giltiga. Om ett ärende inte har varit aktivt på länge är det möjligt att problemet har åtgärdats men att ärendet ännu inte har stängts.
Identifiera trender och teman i ärendena. Om det finns många felrapporter om en viss del av Django, kan det tyda på att vi bör överväga att refaktorisera den delen av koden. Om en trend håller på att växa fram bör du ta upp den till diskussion (med hänvisning till de relevanta ärendena) på Django Forum.
Kontrollera att de lösningar som andra har skickat in är korrekta. Om de är korrekta och även innehåller lämplig dokumentation och tester flyttar du dem till steget ”Redo för kontroll”. Om de inte är korrekta lämnar du en kommentar där du förklarar varför och sätter motsvarande flaggor (”Patch needs improvement”, ”Needs tests” etc.).
Observera
Sidan Reports innehåller länkar till många användbara Trac-frågor, inklusive flera som är användbara för att triagera ärenden och granska förslag som föreslås ovan.
Du hittar även mer information i Råd till nya bidragsgivare.
Vi ber dock alla allmänna gemenskapsmedlemmar som arbetar i ärendedatabasen att göra följande
Flytta inte fram dina egna ärenden till ”Accepted”. En annan communitymedlem bör granska rapporten och sätta detta steg efter att ha återskapat och bekräftat problemet.
Flytta inte fram dina egna ärenden till ”Ready for checkin”. Du får markera andra personers ärenden som du har granskat med ”Ready for checkin”, men du bör få minst en annan communitymedlem att granska en patch som du skickar in.
Reversera inte ett beslut utan att skicka ett meddelande till Django Forum för att hitta konsensus.
Om du är osäker på om du bör göra en ändring, gör inte ändringen utan lämna istället en kommentar med dina farhågor på ärendet eller skicka ett meddelande till Django Forum. Det är okej att vara osäker, men din input är fortfarande värdefull.
Bisektion av en regression¶
En regression är en bugg som finns i en nyare version av Django men inte i en äldre. En mycket användbar information är den commit som introducerade regressionen. Att veta vilken commit som orsakade förändringen i beteende hjälper till att identifiera om förändringen var avsiktlig eller om det var en oavsiktlig bieffekt. Så här kan du avgöra detta.
Börja med att skriva ett regressionstest för Djangos testsvit för den aktuella frågan. Vi låtsas till exempel att vi felsöker en regression i migreringar. När du har skrivit testet och bekräftat att det misslyckas på den senaste huvudgrenen, lägg det i en separat fil som du kan köra fristående. I vårt exempel låtsas vi att vi har skapat tests/migrations/test_regression.py, som kan köras med:
$ ./runtests.py migrations.test_regression
Därefter markerar vi den aktuella punkten i historien som ”dålig” eftersom testet misslyckas:
$ git bisect bad
You need to start by "git bisect start"
Do you want me to do it for you [Y/n]? y
Nu måste vi hitta en punkt i git-historiken innan regressionen infördes (dvs. en punkt där testet godkänns). Använd något som git checkout HEAD~100 för att kolla in en tidigare revision (100 commits tidigare, i det här fallet). Kontrollera om testet misslyckas. Om så är fallet markerar du den punkten som ”dålig” (git bisect bad), checkar sedan ut en tidigare revision och kontrollerar igen. När du hittar en revision där ditt test godkänns markerar du den som ”bra”:
$ git bisect good
Bisecting: X revisions left to test after this (roughly Y steps)
...
Nu är vi redo för den roliga delen: att använda git bisect run för att automatisera resten av processen:
$ git bisect run tests/runtests.py migrations.test_regression
Du bör se git bisect använda en binär sökning för att automatiskt kontrollera revisioner mellan de bra och dåliga begåvningarna tills den hittar den första ”dåliga” begåvningen där testet misslyckas.
Rapportera nu dina resultat på Trac-ärendet och inkludera regressionstestet som en bilaga. När någon skriver en fix för buggen kommer de redan att ha ditt test som utgångspunkt.
Granska patchar¶
Ett utmärkt sätt att lära känna Djangos kodbas är att hjälpa till att granska patchar. Det låter dig fokusera på en avgränsad del av Django ur ett visst perspektiv. Dessutom får Django oftast fler patchar än projektet hinner granska, vilket gör att granskningskön växer. Bidragsgivare kan hjälpa Django oerhört mycket genom att granska patchar.
Granskningskön definieras av ärenden i Trac som är i tillståndet ”Accepted”, har flaggan ”has patch” satt och saknar flaggorna ”patch needs improvement”, ”needs tests” och ”needs documentation”. Det finns också en uppsättning Pull Requests på GitHub med etiketten ”no ticket” som kan granskas.
Kodgranskningsprocess¶
Den allmänna processen för att granska en patch för Django är följande:
Välj en patch att granska. Den kan komma från granskningskön eller från Pull Requests på GitHub med etiketten ”no ticket”. Om du är ny, välj en specifik komponent att hålla dig till. Django är en stor kodbas, så det är bäst att bidra konsekvent med ett smalt fokus och utvidga det långsamt.
Hämta grenen. Se Hantering av pull requests, inklusive git-aliaset som gör det enklare att checka ut andra pull requests.
Kontrollera testerna. Om ärendet gäller ett fel bör det finnas ett regressionstest. Bekräfta att testet misslyckas om ändringen återställs. Kontrollera även att testerna täcker koden och logiken tillräckligt. Se Checklista för bidrag.
Testa i ditt eget Django-projekt. Se Installera utvecklingsversionen för hur. Utforska användargränssnittet och användarupplevelsen med ändringen. Känns det rätt? Kan du få det att gå sönder? Ett annat angreppssätt är att utgå från att allt är fel. Kan du visa för dig själv att varje del är korrekt?
Kontrollera dokumentationen. Är dokumentationen begriplig? Ger den läsaren den information som behövs just då? Är den välskriven? Är den konsekvent med dokumentationen före och efter den? Se Bygg dokumentationen lokalt.
Är du nöjd med patchen? Detta är ganska subjektivt, men det är okej. Fråga dig om angreppssättet verkar rimligt och om det finns ett bättre sätt att göra det på. Fråga också om ändringens omfattning är lämplig. Är namnen lämpliga? Att byta namn på saker är långsamt och utmanande i Django, så vi bör försöka få det rätt från början. Finns det frågor om bakåtkompatibilitet? Slutligen, finns det andra allmänna frågor, till exempel sådant som oroar dig eller som bör undersökas?
Granska din återkoppling. Innan du skickar in den, fundera på vad du vill dela. Det kräver mod att öppna en pull request, så vi bör vara omtänksamma och hänsynsfulla inför det steg författaren har tagit. Använd GitHubs förslagsfunktion om du har petiga eller små förslag. Om angreppssättet inte är som du väntade dig bör du fråga författaren varför innan du begär flera ändringar. Försök först förstå deras resonemang.
Skicka återkoppling på GitHub och uppdatera flaggorna ”patch needs improvement”, ”needs tests” och ”needs documentation” efter behov. Det flyttar ärendet till kön ”waiting for author”. Om du har gjort en specifik sorts kodgranskning, ange det i pull requesten.
Typer av kodgranskning¶
Alla kan eller bör inte ge samma sorts kodgranskning. En mångsidig uppsättning åsikter och erfarenheter hjälper Django att bli bättre. Om du gör en specifik granskning, ange det i pull requesten på GitHub. Nedan finns några typer av kodgranskning du kan utföra:
Tillgänglighetsgranskning. Följer den våra Tillgänglighetsstandarder?
Patchstil och granskning av bidragsprocessen.
Granskning av användbarhet och utvecklarupplevelse.
Använd ändringen och ge återkoppling utifrån den erfarenheten.
Är API:erna och dokumentationen tillgängliga och väl förklarade?
Sakkunniggranskning. Har du egen expertis som är relevant, till exempel databaser, HTTP eller säkerhet?
Benchmarking- och prestandagranskning. Det finns benchmarktester, men ibland kräver ändringar ytterligare tester.
Använd django-asv riktmärken för att kontrollera prestandan över tid.
Kör benchmarktester genom att ge pull requesten etiketten ”benchmark”.