Skip to content

Commit d8d9aec

Browse files
authored
Merge branch 'main' into lesson_03
2 parents 1267efe + 4bb35ec commit d8d9aec

21 files changed

+922
-20
lines changed
1.07 MB
Loading
2.87 MB
Loading
2.86 MB
Loading
3.62 MB
Loading

lesson_01/khaylasaunders/index.html

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Readme in HTML</title>
7+
<link rel="stylesheet" href="stylesheet.css">
8+
9+
10+
</head>
11+
<body class="markdown-body">
12+
<h1><strong>Howdy, I'm Khayla Saunders</strong>&nbsp;🤠👩🏾‍💻</h1>
13+
<h2>Welcome to my Git Crib!</h2>
14+
<p>Feel free to call me Khai! I love having sidebar chit-chats to make connections, laugh, and work hard. Integrity is essential to me. One of my favorite quotes is from the GOAT Lebron "I know we're out [of] the playoff race, but if I'm on the court, I'm going to play how I play, and I play to win. So, I <strong>never will cheat the game </strong>..."</p>
15+
<h3> A few not so essential, basics</h3>
16+
<ul>
17+
<li>I use she/her/hers pronouns</li>
18+
<li>3x Gen Philadelphian! GO BIRDS! (Still learning football...BUT I frequent West Point games to support my little BIG cousin!)</li>
19+
<li>I can get a little southern, I went to undergrad at THE BEST HBCU, Tuskegee University</li>
20+
<li> I earned my Master's in Historic Preservation from the University of Pennsylvania, where I enjoyed breaking traditional norms to save Black Philly Gems...check out my work with the <a href=(https://www.inquirer.com/arts/tanner-house-community-outreach-report-20240910.html)>Tanner House!</a></li>
21+
<li>I need my Mushroom Coffee Daily (Everyday Doze) 🍄 </li>
22+
23+
</ul>
24+
<h4>Work Routine</h4>
25+
<p>I am at my best in the mornings, and Ready to chat about work from 9 a.m. to 6 p.m.</p>
26+
<h4>Best Way to communicate </h4>
27+
<ul>
28+
<li><span>Email:</span> For non-urgent but more extended questions, it helps me process more efficiently and think through the problem better.</li>
29+
<li><span>Google Chat:</span> Best for casual or quick questions and/or conversations.</li>
30+
<li><span>In-person:</span> MY FAVORITE!</li>
31+
</ul>
32+
<blockquote><span>ALSO</span> Feel Free to tap me, even if I have headphones on (I prefer to work with something in the background).
33+
</blockquote>
34+
<h4>How do I like to give feedback? </h4>
35+
<p>I want to meet in person, but if it's easier, I can email you. I'm always taking notes that I can share.</p>
36+
<h4>How do I like to receive feedback? </h4>
37+
<p>In-person is best, but if you don't have any time, email/Google chat is best. </p>
38+
<h4>My Goal for this year </h4>
39+
<p>I want continuous growth in my faith, to become a software engineer, to go on one international trip, and to keep learning to remain a service person.</p>
40+
<h4>Birthday</h4>
41+
<p>March 25th ♈</p>
42+
<h4>Favorite Topics</h4>
43+
<ul class="favorites">
44+
<li> Family ❤️</li>
45+
<li>Art 🖌️</li>
46+
<li> Sephora 🩶</li>
47+
<li>NYT No Recipe-Recipe Cook Book🧑‍🍳</li>
48+
<li>Sports 🏈🏀 (LOYAL TO PHILLY!)</li>
49+
<li>Reality TV junckie 📺 🫣</li>
50+
<li>Reading & learning anything related to Black people 🖤</li>
51+
52+
53+
</ul>
54+
<h4 class="camera">Camera Roll</h4>
55+
<!-- Image placement and caption styling guidance provided by ChatGPT -->
56+
<div class="image-container">
57+
<P>Eagles Fans</P>
58+
<img src="images/EAGLES.jpeg" alt="Family Eagles Watch Day Photo" class="photo">
59+
<p>Family Football Game</p>
60+
<img src="images/TU.jpeg" alt="West Point Game Day Selfie" class="photo">
61+
<p>West Point Game</p>
62+
<img src="images/WP.jpeg" alt="Photo of Khayla (left)and Kody (right) at West Point Game" class="photo">
63+
<p>First Time at the Selma Jubilee</p>
64+
<img src="images/CPCRS.jpg" alt="99th Selma Jubilee Photo" class="photo">
65+
</div>
66+
67+
68+
69+
<footer>
70+
<p>© 2025 Khayla Saunders. All rights reserved.</p>
71+
</footer>
72+
</body>
73+
</html>
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
2+
3+
body{
4+
width: 95%;
5+
margin: 10px;
6+
padding: 10px;
7+
border: 1px solid rgb(214,214,214);
8+
border-radius: 8px;
9+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans",
10+
Helvetica, Arial, sans-serif, "Segoe UI Emoji", "Apple Color Emoji";
11+
}
12+
h1 {
13+
border-bottom: 1px solid rgb(214,214,214);
14+
width: 100%;
15+
padding-bottom: 10px;
16+
17+
}
18+
h2{
19+
padding-top: 14px;
20+
padding-bottom: 10px;
21+
border-bottom: 1px solid rgb(214,214,214);
22+
}
23+
h3{
24+
border-bottom: 1px solid rgb(214,214,214);
25+
padding-bottom: 10px;
26+
font-size: 24px;
27+
font-weight: 600;
28+
}
29+
30+
li{
31+
line-height: 1.4;
32+
}
33+
h4{
34+
font-size: 20px;
35+
font-weight: 550;
36+
37+
38+
}
39+
span {
40+
color: #000;
41+
font-weight: 550;
42+
43+
}
44+
blockquote{
45+
color: rgb(91, 90, 90);
46+
border-left: 3px solid rgb(202, 204, 220);
47+
padding-left: 13px;
48+
}
49+
blockquote span{
50+
color: rgb(105, 103, 103);
51+
}
52+
.favorites {
53+
font-size: 13px;
54+
line-height: 2.5;
55+
}
56+
.camera {
57+
margin: 12px 0 0;
58+
font-size: 16px;
59+
font-weight: 600;
60+
}
61+
.image-container {
62+
width: 90%;
63+
background-repeat: no-repeat;
64+
display: flex;
65+
flex-direction: column;
66+
}
67+
.image-container p {
68+
font-size: 13px;
69+
font-weight: 550;
70+
margin: 24px 0 16px;
71+
}
72+
/* Styling assistance provided by ChatGPT to ensure responsive images */
73+
74+
img{
75+
max-width: 100%;
76+
height: auto;
77+
display: block;
78+
79+
}
80+
81+

lesson_03/quiz/quiz.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,34 @@ quiz:
66
anotherone:
77
- $2y$10$8eHSzy3aCu4Ry3LzO9nWCeGpofSxsNVbnF.wCfn3ZADwQ6MEtN/KK
88
- $2y$10$dGB0CGv7.XQC5OqfyY6iXOiJsdVyxU3ve5YE0gt4m2I8P8H13lNXa
9+
ezraquiz:
10+
- $2y$10$fisFjMsmMwzlj3.PELyBNeupdruYROU00dwq296pg0VfHo05SSkta
11+
- $2y$10$.Z44VoTaxQSdPEx7RatO6OVCw1ff6ohS0kZnCrHEcFnElIgkfjP0u
12+
- $2y$10$nCm/E52FKO7DRo4XbpR2vu.HTyAzsDNNZr2dDfYJyblY1oLuGpnPO
13+
meikostephens:
14+
- $2y$10$AD1YHmrZZivus7DoM91UMuErNnpi63ueluFs7DcSQSrZbXwDycAOi
15+
- $2y$10$KvnxAYKh3A151RyOOFtOv.wfImRzZMgbBgKy3gyLd1uUSSjHaN.4u
16+
- $2y$10$qJDpo1X1kFXRD1M6Kpi8WeKg.a8dgzd8RawXX/3RuMqM82biBc6iK
17+
khaylasaunders:
18+
- $2y$10$GLR8QrgP55Rjj5Ljf/JgQuyemzq2HzMysMbk6W.m0OkBSJbVHBdxC
19+
- $2y$10$PnjXjW6fUxWSQyFZzy8gDunAxwzHjSHbILe3QW5TRimFeXIqs6tym
20+
- $2y$10$JbCDPrCLcwYFlOzPdXsQS.l4DYQgjaW3AeGqs4PDYRUbMDszhK.Gq
921
computerparts:
1022
- $2y$10$7TUXmYaJlWnRZTzYR..CsefgVcOZJMGt7ctxyAf.G3obBBFEAB342
1123
- $2y$10$0ghuTDegle177q8VjCgQ2OhManKjotYXrcDT3SLyUF8KvI152Wd0.
1224
- $2y$10$JXoeInFy4UzHhi2Lskxzeu7CQ9RprnJgBw9pjAlV.t6zQyJTyy8OK
25+
dylanlafferty:
26+
- $2y$10$acRuI5XyFjj4PLpl3d1xd.ZEG2MsPUpw0aFoP/CmEx14fEhdmxP1i
27+
- $2y$10$E9m5ekFKcrlyQkURGQNaaOPbu8sBn5fDRWEqUbGvuB8oLIhYLufn2
28+
- $2y$10$ppMDrfmIXbKcj/D6tuLL0uSAzyevGD8bm2PnqriSdKh81iBiRfUlS
1329
mercedesmathews:
1430
- $2y$10$hRwUbEYSqz761B.cG79T2uYsYPiEtKu.JgD3Aj7.Mofx27TtX5YHa
1531
- $2y$10$qE/gXxpq62FEGJOJd9MDA.vpDYLTNSsZbqZLpD/0368CKkcNBzW1y
1632
- $2y$10$yI/2BgOyqQfLdHM3ixPE5uLu89su/sHRJB2c5szDFIAYXDhRakS.C
33+
davidadenaike:
34+
- $2y$10$CCxBimjXsumkjTLWRWqibue0VeGel6Idfb/2q3y.mIuKHbkWVTsx6
35+
- $2y$10$/z0Ri9Fg7pOXUFYsOErj.Ol8Hxcy7zwqWezLTMWVtFv6tzvkCrJti
36+
- $2y$10$vQD1oc2OqiE1PkirdjQ/xu3sbrnJjwImPEwvCmP7Uk0Z1PDqQ0Mq.
1737
rmill:
1838
- $2y$10$FquR69q7W4E68TX/SNCB7u8Ri0DOFRDqsUPdGfuyIBjZJRVFkNI.6
1939
- $2y$10$FSWRA7hulVpyVxd8s67Nxuq/1cdmviW24qqoUbqihBf79cR.w9yly
@@ -22,3 +42,22 @@ quiz:
2242
- $2y$10$yAoLMl8ij6NqmOWbedu/bu0jBUwJn29cr/l2riI9I89tSXvk6RD.q
2343
- $2y$10$6wlesIJWKciE1ljq3CC0W.kOlNyNhkCdUxaLUWFFd/4GKn5FUT/2O
2444
- $2y$10$5iFZunbLe8IG3LBzoRYGluE2.7gSl/L4cXEbib08pX3tYmiDyS/7G
45+
46+
evanphilakhong:
47+
- $2y$10$3ERfjtWq6bYipHm0QGOuDe8oeXth3dnmfxT8g5P65sc8m4EivQNY.
48+
- $2y$10$cr3WSpMx9zljgMYCqz4uYOAMT2iOzDaRsnoQi6CfPu/761F.1EpwW
49+
- $2y$10$us8POdRzHVBFr1wNcuC7iuDg/YsQvr0GXe5JpFg8EIWzc6IMnIEUG
50+
jeremiahwing:
51+
- $2y$10$YLN9gvb8/fBf3ByHNIdb9.UZ8ilcuCdPgZN9QIYd2rwD23vzt2lvy
52+
- $2y$10$AEUmg5pH8c2VLZ871//G4eKjwx5cnKH5c2HGTNXdnAPF.3/ZmNap2
53+
- $2y$10$bcTYSI0R/3x0pPHcGPAjautopYx2MD8mJPqf2nXKMJeteoIwJQrQm
54+
- $2y$10$V8pMtwgtZe725nPssrr8kejs4Evh/Vi3ia8RulylOQ8x2YV4tJ4LO
55+
jasonwatson:
56+
- $2y$10$AZtPKyQ.6Bzb.jreO/u.2O3C7XfvYAVpjHzLkuhLVdsX74wc4vXwS
57+
- $2y$10$QbKtEXqpeItigRLAHsn8Qe/06ZpXhKEP1bGPJSFXymsoFw9.04NHy
58+
- $2y$10$tJLScW1OZpOLpVllM65EI.W1QjkSIIBtz.KG8z/s.07RNb7ZWC0um
59+
chanelhutt:
60+
- $2y$10$7/GS4n5j/5TXQc5zjDzlc.2xBKwRqrsksWzcl7VKRwa.fDxzdficS
61+
- $2y$10$9mfdal67CXoVG2phPKe1s.BpAT6HQeyQIiDtStfFazkPMW2AaW6Zu
62+
- $2y$10$LiCnvad23bwZWZbxXLhs3.r/YdwIX9eAFtjofaW1AH3Htnc9sEU1G
63+

lesson_03/quiz/src/lesson3.test.ts

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { beforeAll, describe, expect, it } from '@jest/globals';
33
import { Test, TestingModule } from '@nestjs/testing';
44
import {
55
AnswerChoice,
6+
MultipleChoiceQuizQuestion,
67
QuizConfig,
78
QuizQuestion,
89
} from 'codedifferently-instructional';
@@ -76,29 +77,60 @@ describe('Lesson3Test', () => {
7677

7778
const maybeIt = process.env.PROVIDER_NAME ? it : it.skip;
7879

80+
maybeIt(
81+
'checks multiple choice answers are configured correctly',
82+
async () => {
83+
const { providerName, questions } = getQuestionsFromCurrentProvider();
84+
for (const question of questions) {
85+
if (!(question instanceof MultipleChoiceQuizQuestion)) {
86+
continue;
87+
}
88+
89+
// Assert that multiple choice questions have at least one correct answer.
90+
const choices = question.getAnswerChoices();
91+
const areAnswersValid = await Promise.all(
92+
[...choices].map(async (choice) => {
93+
return quizConfig.checkAnswer(
94+
providerName,
95+
question.getQuestionNumber(),
96+
choice,
97+
);
98+
}),
99+
);
100+
101+
expect(areAnswersValid.some((isCorrect) => isCorrect)).toBe(true);
102+
}
103+
},
104+
);
105+
79106
maybeIt('checks for correct answers', async () => {
80-
const targetProviderName =
81-
process.env.PROVIDER_NAME?.toLowerCase().trim() || '';
107+
const { providerName, questions } = getQuestionsFromCurrentProvider();
108+
for (const question of questions) {
109+
const actualAnswer = question.getAnswer();
110+
softExpect(actualAnswer).not.toBe(AnswerChoice.UNANSWERED);
111+
softExpect(
112+
await quizConfig.checkAnswer(
113+
providerName,
114+
question.getQuestionNumber(),
115+
actualAnswer,
116+
),
117+
).toBe(true);
118+
}
119+
});
120+
121+
function getQuestionsFromCurrentProvider(): {
122+
providerName: string;
123+
questions: QuizQuestion[];
124+
} {
125+
const targetProviderName = process.env.PROVIDER_NAME?.trim() || '';
82126

83127
if (!quizQuestionsByProvider.has(targetProviderName)) {
84128
throw new Error(`Unknown provider name: ${targetProviderName}`);
85129
}
86130

87-
for (const [providerName, questions] of quizQuestionsByProvider) {
88-
if (providerName !== process.env.PROVIDER_NAME?.toLowerCase().trim()) {
89-
continue;
90-
}
91-
for (const question of questions) {
92-
const actualAnswer = question.getAnswer();
93-
softExpect(actualAnswer).not.toBe(AnswerChoice.UNANSWERED);
94-
softExpect(
95-
await quizConfig.checkAnswer(
96-
providerName,
97-
question.getQuestionNumber(),
98-
actualAnswer,
99-
),
100-
).toBe(true);
101-
}
102-
}
103-
});
131+
return {
132+
providerName: targetProviderName,
133+
questions: quizQuestionsByProvider.get(targetProviderName) || [],
134+
};
135+
}
104136
});
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import {
2+
AnswerChoice,
3+
MultipleChoiceQuizQuestion,
4+
QuizQuestion,
5+
QuizQuestionProvider,
6+
} from 'codedifferently-instructional';
7+
8+
export class ChanelHuttQuiz implements QuizQuestionProvider {
9+
getProviderName(): string {
10+
return 'chanelhutt';
11+
}
12+
13+
makeQuizQuestions(): QuizQuestion[] {
14+
return [
15+
ChanelHuttQuiz.makeQuestion0(),
16+
ChanelHuttQuiz.makeQuestion1(),
17+
ChanelHuttQuiz.makeQuestion2(),
18+
];
19+
}
20+
21+
private static makeQuestion0(): QuizQuestion {
22+
return new MultipleChoiceQuizQuestion(
23+
0,
24+
'Which one is not a purpose for git commit?',
25+
new Map<AnswerChoice, string>([
26+
[AnswerChoice.A, 'To save changes to your local repository'],
27+
[
28+
AnswerChoice.B,
29+
'To provide a clear, descriptive message for the changes made',
30+
],
31+
[AnswerChoice.C, 'To clear the terminal and re-type the command'],
32+
[AnswerChoice.D, 'Keeps track of changes made to your code'],
33+
]),
34+
AnswerChoice.UNANSWERED,
35+
); // Replace `UNANSWERED` with the correct answer.
36+
}
37+
38+
private static makeQuestion1(): QuizQuestion {
39+
return new MultipleChoiceQuizQuestion(
40+
1,
41+
'Which answer best fits the command git push?',
42+
new Map<AnswerChoice, string>([
43+
[AnswerChoice.A, 'To move the code to the trash'],
44+
[
45+
AnswerChoice.B,
46+
'To transfer files from the local repository to remote repository hosting services',
47+
],
48+
[AnswerChoice.C, 'To add comments to the code'],
49+
[AnswerChoice.D, 'To merge several branches into one branch'],
50+
]),
51+
AnswerChoice.UNANSWERED,
52+
); // Replace `UNANSWERED` with the correct answer.
53+
}
54+
55+
private static makeQuestion2(): QuizQuestion {
56+
return new MultipleChoiceQuizQuestion(
57+
2,
58+
'Which command is used to update the yourlocal repository with changes from your remote repository?',
59+
new Map<AnswerChoice, string>([
60+
[AnswerChoice.A, 'git fetch upstream'],
61+
[AnswerChoice.B, 'git pull'],
62+
[AnswerChoice.C, 'git commit'],
63+
[AnswerChoice.D, 'git checkout main'],
64+
]),
65+
AnswerChoice.UNANSWERED,
66+
); // Replace `UNANSWERED` with the correct answer.
67+
}
68+
}

0 commit comments

Comments
 (0)