diff --git a/my_pyworkshop/cars.py b/my_pyworkshop/cars.py new file mode 100644 index 0000000..30f7e7a --- /dev/null +++ b/my_pyworkshop/cars.py @@ -0,0 +1,27 @@ +# import importlib +# importlib.reload(cars) + +class Car: + runs = True + number_of_wheels = 4 + + def __init__(self, name): + print("new car!") + self.name = name + print(f"Does run? {self.runs}") + + def __str__(self): + return f"{self.name} is {self.runs}" + + def __repr__(self): + return f"Car('{self.name}')" + + def start(self): + if self.runs: + print(f"{self.name} car is started") + else: + print(f"{self.name} car is broken !") + + @classmethod + def get_number_of_wheels(cls): + return cls.number_of_wheels diff --git a/my_pyworkshop/class_example.py b/my_pyworkshop/class_example.py new file mode 100644 index 0000000..8a760b4 --- /dev/null +++ b/my_pyworkshop/class_example.py @@ -0,0 +1,26 @@ +class Vehicle: + def __init__(self, make, model, fuel="gas"): + self.make = make + self.model = model + self.fuel = fuel + + def __str__(self): + return f"{self.make} {self.model}. It runs on {self.fuel}" + + +class Car(Vehicle): + number_of_wheels = 4 + + +class Truck(Vehicle): + number_of_wheels = 6 + + def __init__(self, make, model, fuel="diesel"): + super().__init__(make, model, fuel) + + +daily = Vehicle("Subaru", "Crosstrek") + +print(daily) +# print("for Class", Vehicle.number_of_wheels) +# print("for Instance", daily.number_of_wheels) diff --git a/my_pyworkshop/day_one.py b/my_pyworkshop/day_one.py new file mode 100644 index 0000000..88e4a1c --- /dev/null +++ b/my_pyworkshop/day_one.py @@ -0,0 +1,59 @@ +import requests + + +def create_query(languages, min_stars=50000): + query = f"stars:>{min_stars} " + + for language in languages: + query += f"language:{language} " + return {"q": query, "sort": "stars", "order": "desc"} + + +def repos_with_most_stars(languages): + gh_api_repo_search_url = "http://api.github.com/search/repositories" + + # parameters = {"q": "stars:>5000"} + parameters = create_query(languages) + + print(parameters) + response = requests.get(gh_api_repo_search_url, params=parameters) + + status_code = response.status_code + if status_code != 200: + raise RuntimeError(f"Some went wrong. Status code was: {status_code}") + else: + print(response) + response_json = response.json() + + # print(dir(response_json)) + # print(response_json.keys()) + items = response_json.get('items', {}) + + print(f"Number of records = {len(items)}") + + # count = 0 + # for item in items: + # if count >= 2: + # break + # print(f"[{count}] : {item}\n") + # count += 1 + + return response_json.get('items', {}) + + +if __name__ == "__main__": + results = repos_with_most_stars(languages=['Python', 'Javascript', 'Ruby']) + + interested_keys = ['language', 'stargazers_count', 'name'] + + print(f"{results[0].keys()}") + for result in results: + # language = result['language'] + # stars = result[''] + # print(result.keys()) + line_parts = [] + for key in interested_keys: + line_parts.append(f"{key}: {result[key]}") + + if len(line_parts): + print(" ".join(line_parts)) diff --git a/my_pyworkshop/dog.py b/my_pyworkshop/dog.py new file mode 100644 index 0000000..367f7fc --- /dev/null +++ b/my_pyworkshop/dog.py @@ -0,0 +1,16 @@ +import requests + +api_url = "http://shibe.online/api/shibes?count=1" + +try: + param = {"count": 10} + response = requests.get(api_url, params=param) + + status_code = response.status_code + + print("status code: ", status_code) + response_json = response.json() + print("response_json = ", response_json) +except Exception as e: + print(e) + \ No newline at end of file diff --git a/my_pyworkshop/exceptions.py b/my_pyworkshop/exceptions.py new file mode 100644 index 0000000..1969282 --- /dev/null +++ b/my_pyworkshop/exceptions.py @@ -0,0 +1,19 @@ +class GitHubApiError(Exception): + def __init__(self, status_code): + if status_code == 403: + message = f"Rate limit reached. Please wait a minute." + super().__init__(message) + elif status_code != 200: + message = f"Something went wrong. HTTP status code = {status_code}" + super().__init__(message) + else: + pass + + +def check_github_api_status_code(status_code): + if status_code == 403 or status_code != 200: + raise GitHubApiError(status_code) + else: + print(f"HTTP status_code OK") + +# raise GitHubApiError(403) diff --git a/my_pyworkshop/hello.py b/my_pyworkshop/hello.py new file mode 100644 index 0000000..8a92b13 --- /dev/null +++ b/my_pyworkshop/hello.py @@ -0,0 +1,21 @@ +from flask import Flask, render_template + +app = Flask(__name__) + + +@app.route("/") +def hello_world(): + return render_template("index.html") + + +@app.route("/test") +def hello_test_world(): + arguments = app.argv + print(arguments) + return "Hello Test World!" + + +@app.route("/test/") +def hello_test_world_with_name(name): + return render_template("test.html", name=name) + # return f"Hello Test World! {name}" diff --git a/my_pyworkshop/my_lib_module_example.py b/my_pyworkshop/my_lib_module_example.py new file mode 100644 index 0000000..9c205c0 --- /dev/null +++ b/my_pyworkshop/my_lib_module_example.py @@ -0,0 +1,11 @@ +import my_math_functions +import os + +# print(f"{my_math_functions.add_numbers(3, 4)}") + +my_folder = os.getcwd() +print(f"Here are the files in: {my_folder}:") + +with os.scandir(my_folder) as folder: + for item in folder: + print(f" - {item.name}") diff --git a/my_pyworkshop/my_math_functions/__init__.py b/my_pyworkshop/my_math_functions/__init__.py new file mode 100644 index 0000000..8272f52 --- /dev/null +++ b/my_pyworkshop/my_math_functions/__init__.py @@ -0,0 +1,2 @@ +def add_numbers(x, y): + return x + y diff --git a/my_pyworkshop/my_maths.py b/my_pyworkshop/my_maths.py new file mode 100644 index 0000000..c9bf541 --- /dev/null +++ b/my_pyworkshop/my_maths.py @@ -0,0 +1,18 @@ +def multiply(x, y): + return x * y + + +def add(x, y): + return x + y + + +def subtract(x, y): + return x - y + + +def divide(x, y): + return x / y + + +def divisible_by(x, y): + return x % y == 0 diff --git a/my_pyworkshop/my_sys_example.py b/my_pyworkshop/my_sys_example.py new file mode 100644 index 0000000..3890b56 --- /dev/null +++ b/my_pyworkshop/my_sys_example.py @@ -0,0 +1,31 @@ +import sys +import unittest + +# arguments = sys.argv +arguments = sys.argv[1:] + +name = input("Hello, input something here:") + +print(f"We received these argumnts: {arguments}") + +print(f"We are currently running on {sys.platform} machine") + +print(f"You just input {name}") + +print(f"your input is {type(name)}") + + +def multiply(x, y): + return x * y + + +class TestMultiply(unittest.TestCase): + def test_multiply(self): + test_x = 5 + test_y = 10 + + self.assertEqual(multiply(test_x, test_y), 50) + + +if __name__ == "__main__": + unittest.main() diff --git a/my_pyworkshop/project.py b/my_pyworkshop/project.py new file mode 100644 index 0000000..57487f7 --- /dev/null +++ b/my_pyworkshop/project.py @@ -0,0 +1,14 @@ +import try_me_lib +import requests + +target_names = ['setosa', 'versicolor', 'virginica'] + +name = 'setosa' + +print("dunder name is", __name__) +try: + try_me_lib.try_mey_me('setosa', target_names) +except Exception as e: + print("An error occurred:", e) + +print("End of project.py") diff --git a/my_pyworkshop/templates/index.html b/my_pyworkshop/templates/index.html new file mode 100644 index 0000000..4024b78 --- /dev/null +++ b/my_pyworkshop/templates/index.html @@ -0,0 +1 @@ +This is a template! \ No newline at end of file diff --git a/my_pyworkshop/templates/test.html b/my_pyworkshop/templates/test.html new file mode 100644 index 0000000..2463c1b --- /dev/null +++ b/my_pyworkshop/templates/test.html @@ -0,0 +1,8 @@ + +This is only a test page +{% if name %} +

Hello {{name}}

+{% endif %} +

Hello Test user

+ + \ No newline at end of file diff --git a/my_pyworkshop/tests.py b/my_pyworkshop/tests.py new file mode 100644 index 0000000..6f277eb --- /dev/null +++ b/my_pyworkshop/tests.py @@ -0,0 +1,38 @@ +import unittest +import my_maths + + +class TestMyMaths(unittest.TestCase): + def test_multiply(self): + test_x = 5 + test_y = 10 + + self.assertEqual(my_maths.multiply(test_x, test_y), 50, "should be 50") + + def test_add(self): + test_x = 5 + test_y = 10 + + self.assertEqual(my_maths.add(test_x, test_y), 15, "should be 15") + + def test_divide(self): + test_x = 5 + test_y = 10 + + self.assertEqual(my_maths.divide(test_x, test_y), 0.5, "should be 0.5") + + def test_subtract(self): + test_x = 5 + test_y = 10 + + self.assertEqual(my_maths.subtract(test_x, test_y), -5, "should be -5") + + def test_divisible_by(self): + self.assertTrue(my_maths.divisible_by( + 4, 2), "4 is divisible_by 2") + self.assertFalse(my_maths.divisible_by( + 4, 3), "4 is not divisible_by 3") + + +if __name__ == "__main__": + unittest.main() diff --git a/my_pyworkshop/try_me_lib.py b/my_pyworkshop/try_me_lib.py new file mode 100644 index 0000000..33fcb30 --- /dev/null +++ b/my_pyworkshop/try_me_lib.py @@ -0,0 +1,18 @@ +target_names = ['setosa', 'versicolor', 'virginica'] + + +def try_me(name, target_names=None): + if target_names is None: + target_names = [] + for target_name in target_names: + print(f"checking {target_name} against {name}") + if target_name != name: + print(f"found yet {target_name}") + continue + else: + print(f"found yet {target_name}") + + +if (__name__ == "__main__"): + print("dunder name is", __name__) + try_me('setosa', target_names) diff --git a/my_pyworkshop/vehicle.py b/my_pyworkshop/vehicle.py new file mode 100644 index 0000000..303fe49 --- /dev/null +++ b/my_pyworkshop/vehicle.py @@ -0,0 +1,18 @@ +class Vehicle: + def __init__(self, make, model, fuel="gas"): + self.make = make + self.model = model + self.fuel = fuel + + def is_eco_friendly(self): + if self.fuel == "gas": + return False + else: + return True + + +class Car(Vehicle): + + def __init__(self, make, model, fuel="gas", num_wheels=4): + super().__init__(make, model, fuel) + self.num_wheels = num_wheels diff --git a/my_pyworkshop_2/DocumentManager.py b/my_pyworkshop_2/DocumentManager.py new file mode 100644 index 0000000..1cd3369 --- /dev/null +++ b/my_pyworkshop_2/DocumentManager.py @@ -0,0 +1,42 @@ +from pathlib import * + + +class DocumentManager(): + def create_markdown(self, filename, title, content): + try: + if Path(filename).is_file(): + raise FileExistsError(f"{filename} already exists") + with open(filename, "w") as file: + file.write(f"# {title} \n\n") + file.write(content) + except FileExistsError as e: + print(f"Error: {e}") + return + except Exception as e: + print(f"Something went wrong: {e}") + return + + def add_log_entry(self, filename, log_message): + try: + with open(filename, "a") as file: + file.write(log_message) + except Exception as e: + print(f"Something went wrong: {e}") + return + + def display_file(self, filename): + try: + with open(filename, "r") as file: + for line in file: + print(line.strip("\n")) + except FileNotFoundError as e: + print(f"File Not Found Error: {e}") + return + + +if __name__ == "__main__": + doc = DocumentManager() + doc.create_markdown("notes.md", "Project Status", + "Everything is working smoothly.") + doc.add_log_entry("notes.md", "User logged in at 12:00") + doc.display_file("notes.md") diff --git a/my_pyworkshop_2/TextEditor.py b/my_pyworkshop_2/TextEditor.py new file mode 100644 index 0000000..451253b --- /dev/null +++ b/my_pyworkshop_2/TextEditor.py @@ -0,0 +1,34 @@ +from collections import deque + + +class TextEditor(): + def __init__(self, maxlen=5): + self.content = '' + self.stack_maxlen = maxlen + self.undo_stack = deque(maxlen=self.stack_maxlen) + self.redo_stack = deque(maxlen=self.stack_maxlen) + + def write(self, text): + self.undo_stack.append(self.content) + self.redo_stack = deque(maxlen=self.stack_maxlen) + self.content = text + + def undo(self): + if self.undo_stack: + last_state = self.undo_stack.pop() + self.redo_stack.append(self.content) + self.content = last_state + else: + print("Nothing to undo.") + + def redo(self): + if self.redo_stack: + previous_state = self.redo_stack.pop() + self.undo_stack.append(self.content) + self.content = previous_state + else: + print("Nothing to redo.") + + +if __name__ == "__main__": + editor = TextEditor() diff --git a/my_pyworkshop_2/api_processor.py b/my_pyworkshop_2/api_processor.py new file mode 100644 index 0000000..e69de29 diff --git a/my_pyworkshop_2/asyncio_example.py b/my_pyworkshop_2/asyncio_example.py new file mode 100644 index 0000000..84dc19f --- /dev/null +++ b/my_pyworkshop_2/asyncio_example.py @@ -0,0 +1,36 @@ +import asyncio + + +async def download_file(file_id: str, delay: float) -> str: + print(f"[START] Downloading {file_id}...") + await asyncio.sleep(delay) + return f"Payload {file_id} complete" + + +async def orchestrator() -> list[str]: + async with asyncio.TaskGroup() as tg: + task_a = tg.create_task(download_file('File A', 1.5)) + task_b = tg.create_task(download_file('File B', 0.5)) + task_c = tg.create_task(download_file('File C', 1)) + + return [ + task_a.result(), + task_b.result(), + task_c.result() + ] + # return await asyncio.gather( + # download_file('File A', 1.5), + # download_file("File B", 0.5), + # download_file("File C", 1) + # ) + + +async def main(): + results = await orchestrator() + + for result in results: + print(result) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/my_pyworkshop_2/control_robot.py b/my_pyworkshop_2/control_robot.py new file mode 100644 index 0000000..f1d4afa --- /dev/null +++ b/my_pyworkshop_2/control_robot.py @@ -0,0 +1,53 @@ +import unittest + + +class TestClass(unittest.TestCase): + + def test_control_robot(self): + input = "HALT" + self.assertEqual(control_robot(input), "Emergency stop activated.") + + input = ["MOVE", "SOUTH"] + self.assertEqual(control_robot(input), "Moving South.") + + # Expected: "Turning Right by 45 degrees." + input = ["TURN", "RIGHT", 45] + self.assertEqual(control_robot(input), "Turning Right by 45 degrees.") + + # Expected: "Speed limit exceeded! Capped at 100." + input = ["SPEED", 150] + self.assertEqual(control_robot(input), + "Speed limit exceeded! Capped at 100.") + + input = ["SPEED", 45] # Expected: "Speed adjusted to 45." + self.assertEqual(control_robot(input), "Speed adjusted to 45.") + + input = ["something", "else"] # Expected: "Speed adjusted to 45." + self.assertEqual(control_robot(input), "Unknown command format") + + +def control_robot(input: str | list | tuple) -> str: + if type(input) == str: + normalize_input = [input.upper()] + else: + normalize_input = [element.upper() if isinstance( + element, str) else element for element in input] + + match normalize_input: + case ['HALT']: + return "Emergency stop activated." + case ["MOVE", direction]: + return f"Moving {direction.capitalize()}." + case ["TURN", "LEFT" | "RIGHT" as direction, int(angle) | float(angle)]: + return f"Turning {direction.capitalize()} by {angle} degrees." + case ["SPEED", int(speed_value) | float(speed_value)] if speed_value > 100: + return "Speed limit exceeded! Capped at 100." + case ["SPEED", int(speed_value) | float(speed_value)]: + return f"Speed adjusted to {speed_value}." + case _: + return "Unknown command format" + + +if __name__ == "__main__": + + unittest.main() diff --git a/my_pyworkshop_2/db_connection.py b/my_pyworkshop_2/db_connection.py new file mode 100644 index 0000000..dab71d2 --- /dev/null +++ b/my_pyworkshop_2/db_connection.py @@ -0,0 +1,20 @@ +import sys +from contextlib import contextmanager + + +class DatabaseConnection: + def close(self): + print("[DB] Connection closed cleanly.") + + +@contextmanager +def db_session(): + print("[DB] Initializing and opening socket...") + connection = DatabaseConnection() + try: + yield connection + except Exception as err: + print(f"[ERROR] Transaction rolled back due to: {err}") + finally: + print("[DB] Flushing buffer...") + connection.close() diff --git a/my_pyworkshop_2/directory_scanner.py b/my_pyworkshop_2/directory_scanner.py new file mode 100644 index 0000000..52cc9a9 --- /dev/null +++ b/my_pyworkshop_2/directory_scanner.py @@ -0,0 +1,32 @@ +import sys +from pathlib import Path +from collections import defaultdict + + +class DirectoryScanner: + def __init__(self, target_dir: str): + self.target_dir = Path(target_dir).resolve() + + def organize_and_map(self) -> dict[str, list[str]]: + if not self.target_dir.is_dir(): + raise NotADirectoryError( + f"Path is not a valid directory: {self.target_dir}") + + file_map = defaultdict(list) + print(f"[SCAN] Beginning scan of: {self.target_dir}") + + # 1. Iterate through the folder using lazy evaluation + for path_item in self.target_dir.iterdir(): + + # 2. Defensive Filter: Skip directories and hidden system files + if path_item.is_dir() or path_item.name.startswith('.'): + continue + + # 3. Dynamic grouping based on file extension + # Fallback to 'no_extension' if the file has none + file_type = path_item.suffix.lower().lstrip('.') or 'no_extension' + + # 4. Record the file's base name under its category + file_map[file_type].append(path_item.name) + + return dict(file_map) diff --git a/my_pyworkshop_2/execution_logger.py b/my_pyworkshop_2/execution_logger.py new file mode 100644 index 0000000..0b7f7f4 --- /dev/null +++ b/my_pyworkshop_2/execution_logger.py @@ -0,0 +1,26 @@ +import time +from functools import wraps + + +def execution_logger(func): + @wraps(func) + def wrapper(*args, **kwargs): + start_time = time.perf_counter() + try: + result = func(*args, **kwargs) + return result + finally: + end_time = time.perf_counter() + total_time = end_time - start_time + print(f"[LOG] {func.__name__} took {total_time:.4f}s to complete") + + return wrapper + + +if __name__ == "__main__": + + @execution_logger + def test_func(x): + print(x) + + test_func(10) diff --git a/my_pyworkshop_2/hi.py b/my_pyworkshop_2/hi.py new file mode 100644 index 0000000..a30d2f6 --- /dev/null +++ b/my_pyworkshop_2/hi.py @@ -0,0 +1,4 @@ +greetings = ["Hello", "Bonjour", "Hola"] + +for greeting in greetings: + print(f"{greeting}, World") diff --git a/my_pyworkshop_2/httpx_get_example.py b/my_pyworkshop_2/httpx_get_example.py new file mode 100644 index 0000000..7ad5204 --- /dev/null +++ b/my_pyworkshop_2/httpx_get_example.py @@ -0,0 +1,45 @@ +from random import randint +import asyncio +import httpx +import json + + +async def fetch_api_data(client: httpx.AsyncClient, job_id: int) -> dict: + try: + print(f"[START] Initiating web request for Job {job_id}") + response = await client.get("https://httpbin.org/get") + print(response) + if response.status_code != 200: + raise httpx.HTTPError(f"Unable to fetch data for Job {job_id}") + return {job_id: response.json()} + except httpx.HTTPError as err: + print(f"[ERROR] Job {job_id} dropped safely. Details: {err}") + return {job_id: {"status": "failed", "reason": err}} + except json.JSONDecodeError as err: + print(f"[ERROR] Job {job_id} failed to decode. Details: {err}") + return {job_id: {"status": "failed", "reason": err}} + + +async def orchestrator(job_ids: list[int]) -> list[dict]: + print(f"[ORCHESTRATOR] Processing batch for IDs: {job_ids}") + tasks = [] + async with httpx.AsyncClient() as client: + async with asyncio.TaskGroup() as tg: + for job_id in job_ids: + tasks.append(tg.create_task(fetch_api_data(client, job_id))) + + results = [task.result() for task in tasks] + return results + + +async def main(): + try: + job_ids = [randint(100, 200) for num in range(0, 3)] + results = await orchestrator(job_ids) + + print(results) + except Exception as e: + print(f"Error found: {e}") + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/my_pyworkshop_2/httpx_post_example.py b/my_pyworkshop_2/httpx_post_example.py new file mode 100644 index 0000000..78a5074 --- /dev/null +++ b/my_pyworkshop_2/httpx_post_example.py @@ -0,0 +1,67 @@ +import asyncio +import httpx +from random import randint +import json +from pathlib import Path + + +def get_payload(user_id: int) -> dict: + return {"user_id": user_id, "role": "member", "status": "verified"} + + +async def register_user(client: httpx.AsyncClient, user_id: int) -> dict: + try: + payload = get_payload(user_id) + print(f"[REGISTER_USER] payload = {payload}") + response = await client.post("https://httpbin.org/post", json=payload) + + print(f"[DEBUG] response.status_code = {response.status_code}") + if response.status_code != 200: + raise httpx.HTTPError('POST request failed') + + response_json = response.json() + # print(f"[DEBUG] response.json() = {json.dump(response_json)}") + json_data = response_json.get('json', {}) + # print(f"[DEBUG] json = {json.dump(json_data)}") + return {user_id: json_data} + + except httpx.HTTPError as e: + print(f"[ERROR] HTTP error found: {str(e)}") + return {} + except Exception as e: + print(f"[ERROR] Failed to get json: {str(e)}") + return {} + + +async def orchestrator(user_ids: list[int]) -> list[dict]: + tasks = [] + async with httpx.AsyncClient() as client: + async with asyncio.TaskGroup() as tg: + for user_id in user_ids: + tasks.append(tg.create_task(register_user(client, user_id))) + + results = [task.result() for task in tasks] + return results + + +async def main(user_ids: list[int]): + results = await orchestrator(user_ids) + + output_file = Path('registration_results.json') + + try: + with output_file.open("w") as file: + json.dump(results, file, indent=4) + print( + f"[SUCCESS] saved {len(results)} records to '{output_file.absolute()}'") + except Exception as e: + print(f"[ERROR] Failed to write file: {e}") + + return results + +if __name__ == "__main__": + user_ids = [randint(100, 200) for num in range(0, 5)] + print(user_ids) + results = asyncio.run(main(user_ids)) + + # [print(result) for result in results] diff --git a/my_pyworkshop_2/json_parser.py b/my_pyworkshop_2/json_parser.py new file mode 100644 index 0000000..5ff145e --- /dev/null +++ b/my_pyworkshop_2/json_parser.py @@ -0,0 +1,41 @@ +import json + + +def process_active_users(json_payload): + try: + loaded_json = json.loads(json_payload) + # active_users = [item["username"] + # for item in loaded_json if item['is_active']] + + # return active_users + + # 1. Filter out inactive dictionary objects first + active_dicts = [item for item in loaded_json if item['is_active']] + + # 2. Sort by score (descending) then username (ascending) + sorted_dicts = sorted( + active_dicts, + # key=lambda item: (-item['score'], (tuple(255 - ord(c) + # for c in item['username']))) + key=lambda item: (-item['score'], item['username']) + ) + + active_users = [item['username'] for item in sorted_dicts] + return active_users + + except json.decoder.JSONDecodeError as e: + print(f"Invalid Payload Error: {e}") + return [] + + +if __name__ == "__main__": + json_payload = """ + [ + {"username": "charlie", "score": 85, "is_active": true}, + {"username": "alice", "score": 95, "is_active": false}, + {"username": "bob", "score": 85, "is_active": true}, + {"username": "david", "score": 100, "is_active": true} + ] + """ + + print(process_active_users(json_payload)) diff --git a/my_pyworkshop_2/notes.md b/my_pyworkshop_2/notes.md new file mode 100644 index 0000000..fe26c86 --- /dev/null +++ b/my_pyworkshop_2/notes.md @@ -0,0 +1,3 @@ +# Project Status + +Everything is working smoothly.User logged in at 12:00 \ No newline at end of file diff --git a/my_pyworkshop_2/quiz.py b/my_pyworkshop_2/quiz.py new file mode 100644 index 0000000..2cd455d --- /dev/null +++ b/my_pyworkshop_2/quiz.py @@ -0,0 +1,6 @@ +nums = [0, 1, False, 2, '', 3] +filtered = list(filter(None, nums)) +print(filtered) + +filtered = list(filter(0, nums)) +print(filtered) diff --git a/my_pyworkshop_2/registration_results.json b/my_pyworkshop_2/registration_results.json new file mode 100644 index 0000000..d95d04d --- /dev/null +++ b/my_pyworkshop_2/registration_results.json @@ -0,0 +1,37 @@ +[ + { + "108": { + "role": "member", + "status": "verified", + "user_id": 108 + } + }, + { + "199": { + "role": "member", + "status": "verified", + "user_id": 199 + } + }, + { + "183": { + "role": "member", + "status": "verified", + "user_id": 183 + } + }, + { + "121": { + "role": "member", + "status": "verified", + "user_id": 121 + } + }, + { + "172": { + "role": "member", + "status": "verified", + "user_id": 172 + } + } +] \ No newline at end of file diff --git a/my_pyworkshop_2/safe_config_manager.py b/my_pyworkshop_2/safe_config_manager.py new file mode 100644 index 0000000..80cd984 --- /dev/null +++ b/my_pyworkshop_2/safe_config_manager.py @@ -0,0 +1,35 @@ +import os +import json +from pathlib import Path + + +class SafeConfigManager: + def __init__(self, filepath: str): + self.filepath = Path(filepath) + + def update_setting(self, key: str, value: str | int | bool): + # 1. Read existing config safely + config_data = {} + if self.filepath.is_file(): + with self.filepath.open("r") as file: + config_data = json.load(file) + + # 2. Modify the data in memory + config_data[key] = value + + # 3. Create a temporary "shadow" file name + temp_filepath = self.filepath.with_suffix(".tmp") + + try: + # 4. Write data to the temporary file first + with temp_filepath.open("w") as temp_file: + json.dump(config_data, temp_file, indent=4) + + # 5. Atomic Swap: Replace old file with the complete temp file + os.replace(temp_filepath, self.filepath) + print(f"[SUCCESS] Updated '{key}' to '{value}' safely.") + + except Exception as err: + print(f"[CRITICAL] Write failed. Restoring backup. Error: {err}") + if temp_filepath.is_file(): + temp_filepath.unlink() # Deletes the corrupted temp file diff --git a/my_pyworkshop_2/stock_ticker.py b/my_pyworkshop_2/stock_ticker.py new file mode 100644 index 0000000..cd8160e --- /dev/null +++ b/my_pyworkshop_2/stock_ticker.py @@ -0,0 +1,31 @@ +import asyncio + + +async def fetch_stock_price(ticker: str, delay: float) -> float: + print(f"[FETCH] Starting lookup for {ticker}...") + await asyncio.sleep(delay) + match ticker: + case 'AAPL': + return 185.50 + case 'TSLA': + return 170.20 + case _: + return 100.0 + + +async def orchestrator(tickers: list[str]) -> list[float]: + tasks = [] + async with asyncio.TaskGroup() as tg: + for ticker in tickers: + tasks.append(tg.create_task(fetch_stock_price(ticker, 0.8))) + + return [task.result() for task in tasks] + + +async def main(): + tickers = ['AAPL', 'TSLA', 'NVDA'] + results = await orchestrator(tickers) + print(results) + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/my_pyworkshop_2/test_script.py b/my_pyworkshop_2/test_script.py new file mode 100644 index 0000000..49aa998 --- /dev/null +++ b/my_pyworkshop_2/test_script.py @@ -0,0 +1,136 @@ + +from datetime import datetime +from math import ceil +from collections import defaultdict +import re +raw_data = [ + "user1,25.00,success", + "", # Should be ignored (empty) + "user2,99.99,failed", # Should be ignored (not success) + "corrupted_line_here", # Should be ignored (invalid format) + "user3,10.50,success" +] + + +def parse_transactions(raw_data): + results = [] + for data in raw_data: + splited_data = data.split(",") + if len(splited_data) != 3: + print(f"corrupted data found {data}") + continue + elif splited_data[2] != 'success': + print(f"failed data found {data}") + continue + else: + results.append( + {'user': splited_data[0], 'amount': float(splited_data[1])}) + + return results + + +def parse_transactions_compact(raw_data): + results = [ + dict(zip(['user', 'amount'], [parts[0], float(parts[1])])) for data in raw_data if len( + parts := data.split(",")) == 3 and parts[2] == 'success' + ] + + return results + + +print(parse_transactions(raw_data)) +print(parse_transactions_compact(raw_data)) + + +sample_text = "Apple, banana, apple. Pear, BANANA, apple!" + + +def unique_word_count(sentence): + counts = defaultdict(int) + for word in re.split(r'[,. ;!]+', sentence): + if word == '': + continue + counts[word.lower()] += 1 + + return dict(counts) + + +print(unique_word_count(sample_text)) + +primary = {"timeout": 30, "retries": None, "debug": True} +fallback = {"timeout": 60, "retries": 3, "port": 8080} + + +def merge_configs(primary, fallback): + combined = dict() + + combined = fallback.copy() + combined.update(primary) + + results = {} + for key, value in combined.items(): + if value is not None: + results[key] = value + + return results + + +def merge_configs_compact(primary, fallback): + combined = fallback.copy() + combined.update(primary) + + return {key: value for key, value in combined.items() if value is not None} + + +merged_configs = merge_configs(primary, fallback) +print(merged_configs) + +################################################### + + +class InputDateError(Exception): + def __init__(self, message): + super().__init__(message) + + +def calculate_billing_cycles(signup, cancellation=None): + try: + signup_date = datetime(*tuple(int(part) + for part in signup.split("-"))).date() + end_date = datetime.now().date() + + if cancellation: + end_date = datetime(*tuple(int(part) + for part in cancellation.split("-"))).date() + + if end_date < signup_date: + raise InputDateError( + "Invalid input. End date must be larger than Start date") + + print(f"signup_date({type(signup_date)}) = {signup_date}") + print(f"end_date({type(end_date)}) = {end_date}") + + dates_diff = (end_date - signup_date).days + + if dates_diff == 0: + dates_diff = 1 + + print(f"dates_diff = {dates_diff}") + + billing_cycles = ceil(dates_diff / 30) + + return billing_cycles + + except InputDateError as e: + print(f"Error occurs: {e}") + + return 0 + + +print(f"Billing cycles = {calculate_billing_cycles('2026-01-01')}") +print( + f"Billing cycles = {calculate_billing_cycles('2026-01-01', '2026-02-05')}") +print( + f"Billing cycles = {calculate_billing_cycles('2026-01-01', '2025-12-05')}") +print( + f"Billing cycles = {calculate_billing_cycles('2026-01-01', '2026-01-01')}") diff --git a/my_pyworkshop_2/try_me.py b/my_pyworkshop_2/try_me.py new file mode 100644 index 0000000..e0b8d87 --- /dev/null +++ b/my_pyworkshop_2/try_me.py @@ -0,0 +1,20 @@ +def match_command(command): + match command: + case ['move', direction]: + print(f"1) move {direction}") + case ['move', *others]: + print(f"2) move {others}") + case _: + print("unknown") + + +if __name__ == "__main__": + test_commands = [ + ['test', 'abc'], + ['move', 'up'], + ['move', 'down'], + ['move', 'a', 'b', 'c'] + ] + + for test_command in test_commands: + match_command(test_command) diff --git a/pyworkshop/2_intermediate_python/day2_final/app.py b/pyworkshop/2_intermediate_python/day2_final/app.py new file mode 100644 index 0000000..49c54b3 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/app.py @@ -0,0 +1,31 @@ +from flask import Flask, render_template, request +from repos.exceptions import GitHubApiError +from repos.api import repos_with_most_stars + +app = Flask(__name__) + +available_languages = ["Python", "JavaScript", "Ruby", "Java"] + + +@app.route("/", methods=['POST', 'GET']) +def index(): + if request.method == 'GET': + selected_languages = available_languages + elif request.method == 'POST': + selected_languages = request.form.getlist('languages') + + results = repos_with_most_stars(selected_languages) + + print(f"Number of results = {len(results)}") + # print(results) + + return render_template( + 'index.html', + selected_languages=selected_languages, + available_languages=available_languages, + results=results) + + +@app.errorhandler(GitHubApiError) +def handle_api_error(error): + return render_template('error.html', message=error) diff --git a/pyworkshop/2_intermediate_python/day2_final/repos/api.py b/pyworkshop/2_intermediate_python/day2_final/repos/api.py new file mode 100644 index 0000000..c5966e5 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/repos/api.py @@ -0,0 +1,48 @@ +from repos.exceptions import GitHubApiError +from repos.models import GitHubRepo +import requests +import unittest + +gh_api_repo_search_url = "http://api.github.com/search/repositories" + + +def repos_with_most_stars(languages): + query = create_query(languages) + print(query) + parameters = {"q": query} + response = requests.get(gh_api_repo_search_url, params=parameters) + + # print(response) + + if response.status_code != 200: + raise GitHubApiError(response.status_code) + + response_json = response.json() + print(response_json) + + # pass + + items = response_json['items'] + + print(f"Number of items = {len(items)}") + count = 0 + for item in items: + if count > 1: + break + print( + f"Name: {item['name']}, Language: {item['language']}, Stars: {item['stargazers_count']}") + count = count + 1 + + # print(items[0].keys()) + return [GitHubRepo(item['name'], item['language'], item['stargazers_count']) for item in items] + + +def create_query(languages, min_stars=50000): + query = f"stars:>{min_stars} " + query += " ".join([f"language:{language}" for language in languages]) + + return query + + +if "__name__" == "__main__": + unittest.main() diff --git a/pyworkshop/2_intermediate_python/day2_final/repos/exceptions.py b/pyworkshop/2_intermediate_python/day2_final/repos/exceptions.py new file mode 100644 index 0000000..510becf --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/repos/exceptions.py @@ -0,0 +1,8 @@ +class GitHubApiError(Exception): + def __init__(self, status_code): + if status_code == 403: + message = "rate limit exceeded. please wait a minute and try again." + else: + message = f"HTTP Status Code was: {status_code}." + + super().__init__("GH API Error occurred: " + message) diff --git a/pyworkshop/2_intermediate_python/day2_final/repos/models.py b/pyworkshop/2_intermediate_python/day2_final/repos/models.py new file mode 100644 index 0000000..55db8a9 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/repos/models.py @@ -0,0 +1,11 @@ +class GitHubRepo(): + def __init__(self, name, language, num_stars): + self.name = name + self.language = language + self.num_stars = num_stars + + def __str__(self): + return f"Name: {self.name}, Language: {self.language}, Stars: {self.num_stars}" + + def __repr__(self): + return f"GitHubRepo({self.name}, {self.language}, {self.num_stars})" diff --git a/pyworkshop/2_intermediate_python/day2_final/static/favicon.png b/pyworkshop/2_intermediate_python/day2_final/static/favicon.png new file mode 100644 index 0000000..42c4379 Binary files /dev/null and b/pyworkshop/2_intermediate_python/day2_final/static/favicon.png differ diff --git a/pyworkshop/2_intermediate_python/day2_final/static/style.css b/pyworkshop/2_intermediate_python/day2_final/static/style.css new file mode 100644 index 0000000..0a0b219 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/static/style.css @@ -0,0 +1,229 @@ +/* +CSS Styles for GitHub Repos by Stars exercise site. +Sorry for the bad css! I'm a "full-stack" developer. +*/ + +/* +Checkbox Style From: https://codepen.io/wilder_taype/pen/pNXwMW +*/ + +@import url(https://fonts.googleapis.com/css?family=Roboto:400,700); +*{font-family: 'Roboto', sans-serif;} + +.option-input { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + position: relative; + top: 13.33333px; + right: 0; + bottom: 0; + left: 0; + height: 40px; + width: 40px; + transition: all 0.15s ease-out 0s; + background: #cbd1d8; + border: none; + color: #fff; + cursor: pointer; + display: inline-block; + margin-right: 0.5rem; + outline: none; + position: relative; + z-index: 1000; +} +.option-input:hover { + background: #9faab7; +} +.option-input:checked { + background: #40e0d0; +} +.option-input:checked::before { + height: 40px; + width: 40px; + position: absolute; + content: '✔'; + display: inline-block; + font-size: 26.66667px; + text-align: center; + line-height: 40px; +} +.option-input:checked::after { + background: #40e0d0; + content: ''; + display: block; + position: relative; + z-index: 100; +} + +body { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: box; + background: #e8ebee; + color: #9faab7; + font-family: "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif; + text-align: center; +} +body div { + padding: 5rem; +} +body label { + display: block; + line-height: 40px; + text-align: left; +} + +/* +Button Style From: https://codepen.io/wilder_taype/pen/LeoQEb +*/ + +button { + display: block; + border-radius: 3px; + margin: 15px 5px; + color: #fff; + cursor: pointer; + box-shadow: 3px 7px 7px 4px rgba(237,80,83,.5), 1px 0 0 rgba(0,0,0,.15); + background: #ed5053; + padding: 20px; + flex-grow: 1; + width: 100px; + border: none; + font-size: 1.6rem; + line-height: 1.6; +} + +/* +Table Style From: https://codepen.io/gmb/pen/xVGYZw +*/ + +html { + font-size: 62.5%; +} + +body { + font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 1.6rem; + line-height: 1.6; + color: #20262e; + background-color: #28b1de; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.container { + max-width: 800px; +} + +h1 { + text-align: center; + font-size: 3rem; + color: rgba(255, 255, 255, .8); + text-transform: uppercase; + line-height: 1.375; + margin: 0 0 2.4rem 0; + letter-spacing: 1px +} + +h2 { + text-align: right; + font-size: 1.2rem; + text-transform: uppercase; + line-height: 1.375; + margin: 0; + letter-spacing: 1px +} + +table { + width: 100%; + min-width: 300px; + margin-bottom: 2.4rem; + background-color: #20262e; + color: #fff; + overflow: hidden; +} + +table tr:nth-child(even) { + background-color: rgb(46, 53, 62); +} + +table th, +table td:before { + color: #28b1de; +} + +table th { + display: none; +} + +table th, +table td { + margin: .5rem 2rem; + text-align: left; +} + +table td { + display: block; + font-size: 90%; +} + +table td:first-child { + padding-top: 1rem; +} + +table td:last-child { + padding-bottom: 1rem; +} + +table td:before { + content: attr(data-th) ':\00a0'; + font-weight: bold; + min-width: 8rem; + display: inline-block; +} + + +@media (min-width: 600px) { + table td:before { + display: none; + } + table th, + table td { + display: table-cell; + } + table th, + table td, + table td:first-child, + table td:last-child { + padding: 1.5rem 2rem; + } +} + +/* +Error Page Style From: https://codepen.io/akashrajendra/pen/JKKRvQ +*/ + +#error{ + font-family: 'Lato', sans-serif; + color: #888; + margin: 0; + display: table; + width: 100%; + height: 100vh; + text-align: center; +} + +.fof{ + display: table-cell; + vertical-align: middle; +} + +.fof h1{ + font-size: 50px; + display: inline-block; + padding-right: 12px; +} \ No newline at end of file diff --git a/pyworkshop/2_intermediate_python/day2_final/templates/error.html b/pyworkshop/2_intermediate_python/day2_final/templates/error.html new file mode 100644 index 0000000..0e0b73c --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/templates/error.html @@ -0,0 +1,13 @@ + + + + + +
+
+

{{message}}

+
+
+ + + \ No newline at end of file diff --git a/pyworkshop/2_intermediate_python/day2_final/templates/index.html b/pyworkshop/2_intermediate_python/day2_final/templates/index.html new file mode 100644 index 0000000..89c1844 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/templates/index.html @@ -0,0 +1,57 @@ + + + + + + + Learn Python: Popular GitHub Repos (by ⭐️) With Flask + + + + + + + +
+

Languages

+
+ {% for language in available_languages %} + + {% endfor %} + +
+
+ +
+

Popular GitHub Repos (by ⭐️)

+
+ + + {% if not results %} + No Results. + {% else %} + + + + + + {% endif %} + + {% for result in results %} + + + + + + {% endfor %} + +
NameLanguageNumber Stars
{{result.name}}{{result.language}}{{result.num_stars}}
+
+
+ + + \ No newline at end of file diff --git a/pyworkshop/2_intermediate_python/day2_final/test.py b/pyworkshop/2_intermediate_python/day2_final/test.py new file mode 100644 index 0000000..bc1ac93 --- /dev/null +++ b/pyworkshop/2_intermediate_python/day2_final/test.py @@ -0,0 +1,28 @@ +from repos.api import create_query +from repos.models import GitHubRepo +from repos.exceptions import GitHubApiError +import unittest + + +class TestGitHubApi(unittest.TestCase): + def test_create_query(self): + test_languages = ['Python', 'JavaScript', 'Java'] + test_min_stars = 10 + + expected_query = "stars:>10 language:Python language:JavaScript language:Java" + self.assertEqual(create_query( + test_languages, test_min_stars), expected_query) + + +class TestGitHubApiError(unittest.TestCase): + def test_exception_403(self): + test_status_code = 403 + exception = GitHubApiError(test_status_code) + self.assertTrue("rate limit" in str( + exception), "'rate limit' not found") + + def test_exception_500(self): + test_status_code = 500 + exception = GitHubApiError(test_status_code) + self.assertTrue(str(test_status_code) in str( + exception), f"'{test_status_code}' not found") diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/command-palette.png b/website/content/01-introduction/02-requirements/05-vs-code/images/command-palette.png index eeb469f..1826d3d 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/command-palette.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/command-palette.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/install-pylint.png b/website/content/01-introduction/02-requirements/05-vs-code/images/install-pylint.png index ad759f6..37da7ed 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/install-pylint.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/install-pylint.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.1.png b/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.1.png index df53ee0..fd15477 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.1.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.1.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.2.png b/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.2.png index 1a3dc65..7dbd8cf 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.2.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/interpreter.2.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/open-folder.png b/website/content/01-introduction/02-requirements/05-vs-code/images/open-folder.png index fcf065d..8b35829 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/open-folder.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/open-folder.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/popups copy.png b/website/content/01-introduction/02-requirements/05-vs-code/images/popups copy.png index 98c52db..71aa026 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/popups copy.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/popups copy.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/popups.png b/website/content/01-introduction/02-requirements/05-vs-code/images/popups.png index 75398ff..29de7be 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/popups.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/popups.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/repl-start.png b/website/content/01-introduction/02-requirements/05-vs-code/images/repl-start.png index 1b10fea..094a82d 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/repl-start.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/repl-start.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/repl.png b/website/content/01-introduction/02-requirements/05-vs-code/images/repl.png index 0c7e4ed..a3926c6 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/repl.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/repl.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/select-linter.png b/website/content/01-introduction/02-requirements/05-vs-code/images/select-linter.png index 0eb22ba..bf3c2eb 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/select-linter.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/select-linter.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/select-pylint.png b/website/content/01-introduction/02-requirements/05-vs-code/images/select-pylint.png index 486428e..8bec4a8 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/select-pylint.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/select-pylint.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/selected-interpreter.png b/website/content/01-introduction/02-requirements/05-vs-code/images/selected-interpreter.png index 04e7ba2..c3d97dd 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/selected-interpreter.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/selected-interpreter.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-icon.png b/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-icon.png index 002be7d..2b75a41 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-icon.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-icon.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-logo.png b/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-logo.png index 3245933..d0c0a83 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-logo.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/vs-code-logo.png differ diff --git a/website/content/01-introduction/02-requirements/05-vs-code/images/welcome-page.png b/website/content/01-introduction/02-requirements/05-vs-code/images/welcome-page.png index c0cb7b2..45640f8 100644 Binary files a/website/content/01-introduction/02-requirements/05-vs-code/images/welcome-page.png and b/website/content/01-introduction/02-requirements/05-vs-code/images/welcome-page.png differ diff --git a/website/content/01-introduction/images/arrows.png b/website/content/01-introduction/images/arrows.png index 19ec202..3feb782 100644 Binary files a/website/content/01-introduction/images/arrows.png and b/website/content/01-introduction/images/arrows.png differ diff --git a/website/content/01-introduction/images/clear_history.png b/website/content/01-introduction/images/clear_history.png index cec447f..ad60697 100644 Binary files a/website/content/01-introduction/images/clear_history.png and b/website/content/01-introduction/images/clear_history.png differ diff --git a/website/content/01-introduction/images/copy.png b/website/content/01-introduction/images/copy.png index 61cbd87..68a966e 100644 Binary files a/website/content/01-introduction/images/copy.png and b/website/content/01-introduction/images/copy.png differ diff --git a/website/content/01-introduction/images/edit-page.png b/website/content/01-introduction/images/edit-page.png index c2a7886..ea03c9a 100644 Binary files a/website/content/01-introduction/images/edit-page.png and b/website/content/01-introduction/images/edit-page.png differ diff --git a/website/content/01-introduction/images/expand-section.png b/website/content/01-introduction/images/expand-section.png index d497e4d..62d2ff1 100644 Binary files a/website/content/01-introduction/images/expand-section.png and b/website/content/01-introduction/images/expand-section.png differ diff --git a/website/content/01-introduction/images/header.png b/website/content/01-introduction/images/header.png index 402114a..566db66 100644 Binary files a/website/content/01-introduction/images/header.png and b/website/content/01-introduction/images/header.png differ diff --git a/website/content/01-introduction/images/search.png b/website/content/01-introduction/images/search.png index ce48024..1a61989 100644 Binary files a/website/content/01-introduction/images/search.png and b/website/content/01-introduction/images/search.png differ diff --git a/website/content/01-introduction/images/toc.png b/website/content/01-introduction/images/toc.png index 9b07833..2a1b10c 100644 Binary files a/website/content/01-introduction/images/toc.png and b/website/content/01-introduction/images/toc.png differ diff --git a/website/content/02-introduction-to-python/110-control-statements-looping/images/break-continue.png b/website/content/02-introduction-to-python/110-control-statements-looping/images/break-continue.png index 631b9cf..31ba36e 100644 Binary files a/website/content/02-introduction-to-python/110-control-statements-looping/images/break-continue.png and b/website/content/02-introduction-to-python/110-control-statements-looping/images/break-continue.png differ diff --git a/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down-select.png b/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down-select.png index 91d8f43..375916a 100644 Binary files a/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down-select.png and b/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down-select.png differ diff --git a/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down.png b/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down.png index c92a052..b9418b7 100644 Binary files a/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down.png and b/website/content/02-introduction-to-python/175-running-code/images/terminal-drop-down.png differ diff --git a/website/content/02-introduction-to-python/175-running-code/images/vs-code-run-file-command-palette.png b/website/content/02-introduction-to-python/175-running-code/images/vs-code-run-file-command-palette.png index 48ab7c2..d74814d 100644 Binary files a/website/content/02-introduction-to-python/175-running-code/images/vs-code-run-file-command-palette.png and b/website/content/02-introduction-to-python/175-running-code/images/vs-code-run-file-command-palette.png differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/200.jpeg b/website/content/02-introduction-to-python/190-APIs/images/200.jpeg index 504bd49..d3e1ff8 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/200.jpeg and b/website/content/02-introduction-to-python/190-APIs/images/200.jpeg differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/301.jpeg b/website/content/02-introduction-to-python/190-APIs/images/301.jpeg index ba7927d..e7f9d2f 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/301.jpeg and b/website/content/02-introduction-to-python/190-APIs/images/301.jpeg differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/404.jpeg b/website/content/02-introduction-to-python/190-APIs/images/404.jpeg index beab571..39a6470 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/404.jpeg and b/website/content/02-introduction-to-python/190-APIs/images/404.jpeg differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/500.jpeg b/website/content/02-introduction-to-python/190-APIs/images/500.jpeg index 266681f..c2412c5 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/500.jpeg and b/website/content/02-introduction-to-python/190-APIs/images/500.jpeg differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/Htcpcp_teapot.jpg b/website/content/02-introduction-to-python/190-APIs/images/Htcpcp_teapot.jpg index b6168b7..52b28a1 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/Htcpcp_teapot.jpg and b/website/content/02-introduction-to-python/190-APIs/images/Htcpcp_teapot.jpg differ diff --git a/website/content/02-introduction-to-python/190-APIs/images/request-response.jpeg b/website/content/02-introduction-to-python/190-APIs/images/request-response.jpeg index 9a1d293..baf7a91 100644 Binary files a/website/content/02-introduction-to-python/190-APIs/images/request-response.jpeg and b/website/content/02-introduction-to-python/190-APIs/images/request-response.jpeg differ diff --git a/website/content/03-intermediate-python/10-introduction/images/python.png b/website/content/03-intermediate-python/10-introduction/images/python.png index 23a4c6e..cf9f414 100644 Binary files a/website/content/03-intermediate-python/10-introduction/images/python.png and b/website/content/03-intermediate-python/10-introduction/images/python.png differ diff --git a/website/content/03-intermediate-python/80-web-frameworks/images/request-response.jpeg b/website/content/03-intermediate-python/80-web-frameworks/images/request-response.jpeg index 9a1d293..baf7a91 100644 Binary files a/website/content/03-intermediate-python/80-web-frameworks/images/request-response.jpeg and b/website/content/03-intermediate-python/80-web-frameworks/images/request-response.jpeg differ diff --git a/website/static/code/day_two_final_exercise/static/favicon.png b/website/static/code/day_two_final_exercise/static/favicon.png index 42c4379..dddccdb 100644 Binary files a/website/static/code/day_two_final_exercise/static/favicon.png and b/website/static/code/day_two_final_exercise/static/favicon.png differ diff --git a/website/static/images/favicon.png b/website/static/images/favicon.png index 459fa7a..2ce9067 100644 Binary files a/website/static/images/favicon.png and b/website/static/images/favicon.png differ diff --git a/website/static/images/fem.png b/website/static/images/fem.png index 7a23f47..de4b0dd 100644 Binary files a/website/static/images/fem.png and b/website/static/images/fem.png differ diff --git a/website/static/images/me.jpg b/website/static/images/me.jpg index dc3ce4f..310630b 100644 Binary files a/website/static/images/me.jpg and b/website/static/images/me.jpg differ diff --git a/website/static/images/snake-cropped.png b/website/static/images/snake-cropped.png index 0a75d65..de4ead0 100644 Binary files a/website/static/images/snake-cropped.png and b/website/static/images/snake-cropped.png differ diff --git a/website/static/images/snake-scaled.png b/website/static/images/snake-scaled.png index a9db22f..721d529 100644 Binary files a/website/static/images/snake-scaled.png and b/website/static/images/snake-scaled.png differ diff --git a/website/static/images/snake.png b/website/static/images/snake.png index 152854d..c2de6d0 100644 Binary files a/website/static/images/snake.png and b/website/static/images/snake.png differ diff --git a/website/static/images/twittercard.png b/website/static/images/twittercard.png index 94c0401..7ee0784 100644 Binary files a/website/static/images/twittercard.png and b/website/static/images/twittercard.png differ diff --git a/website/themes/nnja-theme-learn/images/screenshot.png b/website/themes/nnja-theme-learn/images/screenshot.png index 85966a2..e2de923 100644 Binary files a/website/themes/nnja-theme-learn/images/screenshot.png and b/website/themes/nnja-theme-learn/images/screenshot.png differ diff --git a/website/themes/nnja-theme-learn/images/tn.png b/website/themes/nnja-theme-learn/images/tn.png index c969306..32aa4c5 100644 Binary files a/website/themes/nnja-theme-learn/images/tn.png and b/website/themes/nnja-theme-learn/images/tn.png differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.eot b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.eot index 0a705d6..80ce0b0 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.eot and b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.svg b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.svg index b7f97c8..168f039 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.svg @@ -1,359 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:5524914016200b5deb3cc524ce665b479000cb5c8fc8bb61bd5052ab30a1e344 +size 63019 diff --git a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.ttf b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.ttf index 4b8a36d..2227904 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.ttf and b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.woff b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.woff index 6f39625..01bca42 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Inconsolata.woff and b/website/themes/nnja-theme-learn/static/fonts/Inconsolata.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot index 9984682..6bd7d86 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg index c412ea8..df70b41 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.svg @@ -1,1019 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:3e8b5689bbfd65a639d4e325012cf2c6bfe514801cb9db3aff4588953e78f795 +size 103303 diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf index 8cfb62d..c5bf50e 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff index d5c4290..f4f51c0 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 index eefb4a3..6dc27f2 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-Normal-webfont.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot index 2a26561..b80a864 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg index e642ab0..b9f30d6 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.svg @@ -1,918 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:c7617a91e47f3372b9af1c19c20a02927823af2e3eb4db18004592c6dedef8d3 +size 96245 diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf index 9ce9c7f..ceaedf0 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff index 381650c..25b795f 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 index 7e65954..e9b25c6 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 and b/website/themes/nnja-theme-learn/static/fonts/Novecentosanswide-UltraLight-webfont.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.eot b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.eot index 4052e4f..078784b 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.eot and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.svg b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.svg index 58ab4ba..4e88319 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.svg @@ -1,332 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:9ee6169292913f27786272a167a4e3ce0bfc1f9b707dd7c53a41762de892656f +size 55881 diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.ttf b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.ttf index 68019e1..f79eeb0 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.ttf and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff index a1bd9e4..8e99303 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff2 b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff2 index 20c68a7..11f1882 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff2 and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_200.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.eot b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.eot index ace7993..7d0fb82 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.eot and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.svg b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.svg index f29d0c8..9ccf8ef 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.svg @@ -1,331 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:ceca58569c3855ffceedf377d4718f9901e89ae13199767cb064f00a32bd6c2f +size 55829 diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.ttf b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.ttf index 35387c2..96f795f 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.ttf and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff index 8d789ea..0b359de 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff2 b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff2 index f6e216d..856bb38 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff2 and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_300.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.eot b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.eot index 9df6929..6df32ac 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.eot and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.eot differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.svg b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.svg index 4b030b7..ddaa84d 100644 --- a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.svg +++ b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.svg @@ -1,333 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:8cebea1ce5556b4602009ee9f604a6af11ad1a7dd3932a83fd8423f4f6f43e46 +size 55464 diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.ttf b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.ttf index 5b8cc53..689bd02 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.ttf and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.ttf differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff index df05851..1c99947 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff differ diff --git a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff2 b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff2 index b06c54d..dce1cac 100644 Binary files a/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff2 and b/website/themes/nnja-theme-learn/static/fonts/Work_Sans_500.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/images/clippy.svg b/website/themes/nnja-theme-learn/static/images/clippy.svg index 1c8abc2..8aec862 100644 --- a/website/themes/nnja-theme-learn/static/images/clippy.svg +++ b/website/themes/nnja-theme-learn/static/images/clippy.svg @@ -1 +1,3 @@ - +version https://git-lfs.github.com/spec/v1 +oid sha256:c7afc022b7926c3c2bb32819da3aaa28d35d50c6bcdf1461202b4a231038ab56 +size 510 diff --git a/website/themes/nnja-theme-learn/static/images/favicon.png b/website/themes/nnja-theme-learn/static/images/favicon.png index 0f3bda8..858586c 100644 Binary files a/website/themes/nnja-theme-learn/static/images/favicon.png and b/website/themes/nnja-theme-learn/static/images/favicon.png differ diff --git a/website/themes/nnja-theme-learn/static/images/gopher-404.jpg b/website/themes/nnja-theme-learn/static/images/gopher-404.jpg index df10648..f12ad8a 100644 Binary files a/website/themes/nnja-theme-learn/static/images/gopher-404.jpg and b/website/themes/nnja-theme-learn/static/images/gopher-404.jpg differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.eot b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.eot index 46aeb5f..11d2bc0 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.eot and b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.eot differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.svg b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.svg index 0469118..3d30a9a 100644 --- a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.svg +++ b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.svg @@ -1,1260 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:e2b365cd3cffb2fc29d3202ebbffd70168e59c0367b5088007673a6230a6fd11 +size 749737 diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.ttf b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.ttf index 0a30775..74f199a 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.ttf and b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.ttf differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff index bdab4ca..9fd2c6c 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff and b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff2 b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff2 index 0def871..8542f5e 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff2 and b/website/themes/nnja-theme-learn/static/webfonts/fa-brands-400.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.eot b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.eot index 836e082..3a56a66 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.eot and b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.eot differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.svg b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.svg index 81576d2..ed1d09f 100644 --- a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.svg +++ b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.svg @@ -1,471 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:7028d257f101edec1472e873fc3cc6335e843a1bac41179c2af5504163b9aad7 +size 139825 diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.ttf b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.ttf index b5414de..0b0bfa3 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.ttf and b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.ttf differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff index 56acb37..b4df84e 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff and b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff2 b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff2 index 4c5168f..3dce56d 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff2 and b/website/themes/nnja-theme-learn/static/webfonts/fa-regular-400.woff2 differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.eot b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.eot index 18c554f..31ac72a 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.eot and b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.eot differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.svg b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.svg index 7316c44..b66bc3a 100644 --- a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.svg +++ b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.svg @@ -1,2763 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:57a8aa7d3d3ac8029144397b726f92729010d83a6ccb031937d911a1a63e5fba +size 794054 diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.ttf b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.ttf index 53c8f36..29b0228 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.ttf and b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.ttf differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff index 4484e52..b368e94 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff and b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff differ diff --git a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff2 b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff2 index f0b9b0c..a163bc9 100644 Binary files a/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff2 and b/website/themes/nnja-theme-learn/static/webfonts/fa-solid-900.woff2 differ