Skip to content
Open
Show file tree
Hide file tree
Changes from 112 commits
Commits
Show all changes
114 commits
Select commit Hold shift + click to select a range
18a1fa9
Improve code quality, documentation, and type safety
toddmath May 27, 2026
b0c7051
fix python ide config, remove unused imports
toddmath May 27, 2026
f213544
Added new class example
egges Apr 28, 2025
04b3ae2
Added function examples
egges Apr 29, 2025
807ce57
Added a few examples
egges Apr 25, 2025
e5c7151
Expanded map examples.
egges Apr 25, 2025
94ba8dd
Added first examples.
egges Apr 10, 2025
9c192b9
Added anti-pattern code examples.
egges Apr 17, 2025
21ef389
Added initial abstraction example
egges May 8, 2025
fcbb868
Updated examples.
egges May 8, 2025
7811372
Some cleanup.
egges May 8, 2025
ce84514
WiP on abstraction example
egges May 12, 2025
714fda4
Removed output images. Cleaned up examples and organized them around …
egges May 14, 2025
2d72111
Minor fixes.
egges May 26, 2025
beca4f6
Created SDK design examples.
egges May 27, 2025
e45363b
Minor update to sdk example
egges May 27, 2025
5cbec25
Worked on basic serverless example
egges May 14, 2025
1b78eef
Changed example to use 2nd gen cloud run functions. Cleanup.
egges May 20, 2025
7355d45
Fixed serverless Pulumi example.
egges May 23, 2025
1c55cf1
Added mcp example
egges May 15, 2025
61973a5
Added API example + MCP server that integrates with API
egges May 16, 2025
148eca5
Updated example.
egges May 20, 2025
81fd49f
Added dataclasses examples.
egges May 23, 2025
d090540
Added library examples.
egges Jun 24, 2025
6a4e0d8
Builder pattern example.
egges Jun 17, 2025
64225b3
Updated website. Made dataclass immutable. Added metadata to builder …
egges Jun 18, 2025
f9f4831
Added other library examples.
egges Jun 18, 2025
ffb8127
Fixed type issue in base API model.
egges Jun 25, 2025
63b2dcd
Added standard library code examples.
egges Jul 15, 2025
b89fd1e
Minor cleanup of code examples.
egges Jul 17, 2025
bac34ed
Added code example
egges Jul 15, 2025
bec49bf
Added weather example
egges Jul 8, 2025
5ba29f1
Added testing code examples.
egges Jul 11, 2025
f2ef78d
Updated testtips code example
egges Jul 22, 2025
1bae6e9
Added initial ai design pattern code examples.
egges Jul 28, 2025
1af31f6
Added pydantic ai dependency
egges Jul 28, 2025
f1eebdb
Updated code examples.
egges Aug 7, 2025
4d08d8d
Removed unneccesary environment variable setting.
egges Aug 12, 2025
7262f32
Added singleton code examples.
egges Aug 7, 2025
49ac780
Added pyproject file. Minor cleanup. Added thread-safe example.
egges Aug 12, 2025
a6d1c0d
Added code examples for SOLID video.
egges Jul 30, 2025
b32d88a
Added project code example.
egges Aug 12, 2025
910f9e6
Added Python 3.14 code examples.
egges Sep 11, 2025
f8b0868
Added uv workspaces example
egges Sep 16, 2025
ee335f0
Added registry code example.
egges Sep 3, 2025
8c0cc62
Added context object example.
egges Sep 9, 2025
7f0e3b0
Added DI examples.
egges Oct 8, 2025
bdecb71
Added intermediate version. Renamed files for clarity.
egges Oct 8, 2025
d1c8e31
Added initial code example.
egges Sep 30, 2025
4137a7f
Added get_all_events method
egges Sep 30, 2025
e0de2b7
Updated event example
egges Oct 8, 2025
d2314e6
Added pythonic code example
egges Oct 2, 2025
87279cb
Examples for learning Python fast
egges Oct 8, 2025
0ec8a7d
Added aiGrunn code example
egges Nov 13, 2025
9479108
Added code example.
egges Oct 30, 2025
1074989
Added ttl example
egges Nov 11, 2025
155c1d1
Added threaded example
egges Nov 11, 2025
7192b89
Rough code example.
egges Oct 29, 2025
dd121a5
More work on production code example
egges Oct 30, 2025
c79ad86
Worked on code example
egges Nov 5, 2025
86e5402
Minor improvements
egges Nov 5, 2025
f4fbe30
Fixed slowapi warning
egges Nov 5, 2025
2d75351
More work on code example.
egges Nov 6, 2025
107d314
More code example cleanup.
egges Nov 6, 2025
c02cf4e
Added retry example
egges Nov 10, 2025
adcd8c7
Added one more example
egges Nov 18, 2025
1094f22
Added code example
egges Nov 5, 2025
c2a9cd4
Added code example
egges Nov 27, 2025
78ac372
Minor tweak to simplify rule system.
egges Dec 10, 2025
76234c1
Updated rule factory type definition.
egges Dec 10, 2025
bdd0163
Minor fixes in rules example.
egges Dec 11, 2025
be8ab7e
Added code example.
egges Dec 3, 2025
8010cd9
Various fixes in code example. Added proper before version.
egges Dec 9, 2025
c560005
Added Python features code examples.
egges Dec 2, 2025
b1bb4ef
Fixed issue in contextvars example.
egges Dec 9, 2025
14baa39
Added code example.
egges Nov 27, 2025
62477c1
Worked on cqrs example.
egges Jan 12, 2026
e61f747
Updated code example
egges Jan 22, 2026
204f400
Added ports example.
egges Jan 20, 2026
d24d421
Updated ports & adapters example.
egges Jan 23, 2026
7ddb151
Example cleanup
egges Jan 28, 2026
de21d26
Minor improvements.
egges Jan 28, 2026
5c2c72f
Added code example
egges Jan 22, 2026
aeb546f
Improved Singleton example
egges Jan 23, 2026
242aa18
More example updates.
egges Jan 23, 2026
49599a9
Removed Optional type
egges Jan 23, 2026
2c99968
Improved auto registry example.
egges Jan 27, 2026
3168342
Added value object example.
egges Jan 23, 2026
f19e88e
Added property vs method code example
egges Jan 16, 2026
f1d800b
Added code example.
egges Feb 13, 2026
6ab78a8
Added pyproject file.
egges Feb 13, 2026
0d8e2bc
WiP on state example.
egges Feb 24, 2026
e1b3c82
Simplified state machine types.
egges Feb 26, 2026
a21d051
Added code examples.
egges Feb 13, 2026
664df04
Work in progress on code example.
egges Feb 12, 2026
41c6d9b
Reworked example. Added sample sales csv.
egges Feb 13, 2026
6794ec7
Cleaned up after version.
egges Feb 26, 2026
a2d97a9
Small code cleanup
egges Mar 5, 2026
102b4f6
Added type checking option to settings.
egges Mar 17, 2026
f2b9a40
Added DRY code examples.
egges Mar 18, 2026
0d637c0
Added custom data example
egges Mar 18, 2026
5ec4f35
Added baseline examples.
egges Mar 18, 2026
ec1d33e
Simplified main file
egges Mar 18, 2026
d61238a
Added policy examples.
egges Mar 18, 2026
fbfe9d1
Added code example.
egges Mar 17, 2026
93039e9
Initial god object code example
egges Apr 22, 2026
9558aab
Simplified code example.
egges Apr 23, 2026
84fe027
Added data generation script.
egges Apr 28, 2026
de68821
Added basic webhook examples.
egges Apr 28, 2026
9f8b617
Worked on webhook example.
egges Apr 30, 2026
7b1dc16
Added code example.
egges Apr 28, 2026
4c5cec1
Improve code quality, documentation, and type safety
toddmath May 27, 2026
ec5fc53
Merge branch 'main' into 2026-upstream-changes
toddmath May 27, 2026
1f2fa89
Delete Ruff linting and formatting workflow
toddmath May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 4 additions & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
// "python.envFile": "${workspaceFolder}/.env",,
// Test settings
"python.testing.pytestEnabled": true,
// "python.testing.unittestEnabled": false,
// "python.testing.unittestEnabled": false,
"python.testing.cwd": "${workspaceFolder}/tests",
"python.defaultInterpreterPath": "${workspaceFolder}/2025/typescript/lokalise/.venv/bin/python"
}
"python.defaultInterpreterPath": "${workspaceFolder}/2025/typescript/lokalise/.venv/bin/python",
"python.analysis.typeCheckingMode": "basic"
}
2 changes: 1 addition & 1 deletion 2022/async/after-1/iot/service.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import asyncio
# import asyncio
import random
import string
from typing import Protocol
Expand Down
2 changes: 1 addition & 1 deletion 2022/async/after-2/iot/service.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import asyncio
import random
import string
from typing import Any, Awaitable, Protocol
from typing import Protocol

from iot.message import Message, MessageType

Expand Down
16 changes: 16 additions & 0 deletions 2025/abstraction/abstraction_abc/filters/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from abc import ABC, abstractmethod
from typing import Any

from PIL import Image


class FilterBase(ABC):
@property
@abstractmethod
def name(self) -> str: ...

@abstractmethod
def apply(self, image: Image.Image) -> Image.Image: ...

@abstractmethod
def configure(self, config: dict[str, Any]) -> None: ...
24 changes: 24 additions & 0 deletions 2025/abstraction/abstraction_abc/filters/grayscale.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from typing import Any

from PIL import Image, ImageOps

from .base import FilterBase


class GrayscaleFilter(FilterBase):
def __init__(self) -> None:
self._intensity: float = 1.0

@property
def name(self) -> str:
return "Grayscale"

def apply(self, image: Image.Image) -> Image.Image:
print(f"Applying {self.name} filter with intensity {self._intensity}")
grayscale_image = ImageOps.grayscale(image).convert("RGB")
if self._intensity < 1.0:
return Image.blend(image, grayscale_image, self._intensity)
return grayscale_image

def configure(self, config: dict[str, Any]) -> None:
self._intensity = config.get("intensity", self._intensity)
22 changes: 22 additions & 0 deletions 2025/abstraction/abstraction_abc/filters/invert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from .base import FilterBase
from PIL import Image, ImageOps
from typing import Any

class InvertFilter(FilterBase):
def __init__(self) -> None:
self._enabled: bool = True

@property
def name(self) -> str:
return "Invert"

def apply(self, image: Image.Image) -> Image.Image:
if self._enabled:
print(f"Applying {self.name} filter")
return ImageOps.invert(image.convert("RGB"))
else:
print(f"{self.name} filter disabled, returning original image")
return image

def configure(self, config: dict[str, Any]) -> None:
self._enabled = config.get("enabled", self._enabled)
19 changes: 19 additions & 0 deletions 2025/abstraction/abstraction_abc/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
from filters.grayscale import GrayscaleFilter
from filters.invert import InvertFilter
from process_img import process_img


def main() -> None:
input_image: str = "../input.jpg"

grayscale = GrayscaleFilter()
grayscale.configure({"intensity": 0.8})
process_img(input_image, "output_abc_grayscale.jpg", grayscale)

invert = InvertFilter()
invert.configure({"enabled": True})
process_img(input_image, "output_abc_invert.jpg", invert)


if __name__ == "__main__":
main()
10 changes: 10 additions & 0 deletions 2025/abstraction/abstraction_abc/process_img.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from filters.base import FilterBase
from PIL import Image


def process_img(image_path: str, output_path: str, filter_obj: FilterBase) -> None:
print(f"\nUsing filter: {filter_obj.name}")
image = Image.open(image_path)
image = filter_obj.apply(image)
image.save(output_path)
print(f"Saved processed image to {output_path}")
9 changes: 9 additions & 0 deletions 2025/abstraction/abstraction_callable/filters/grayscale.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from PIL import Image, ImageOps


def apply_grayscale(image: Image.Image, intensity: float) -> Image.Image:
print(f"Applying grayscale filter with intensity {intensity}")
grayscale_image = ImageOps.grayscale(image).convert("RGB")
if intensity < 1.0:
return Image.blend(image, grayscale_image, intensity)
return grayscale_image
6 changes: 6 additions & 0 deletions 2025/abstraction/abstraction_callable/filters/invert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from PIL import Image, ImageOps


def apply_invert(image: Image.Image) -> Image.Image:
print("Applying invert filter")
return ImageOps.invert(image.convert("RGB"))
18 changes: 18 additions & 0 deletions 2025/abstraction/abstraction_callable/filters/sepia.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from PIL import Image


def apply_sepia(image: Image.Image) -> Image.Image:
print("Applying sepia filter")
sepia_image = image.convert("RGB")
width, height = sepia_image.size
pixels = sepia_image.load()

for y in range(height):
for x in range(width):
r, g, b = pixels[x, y]
tr = int(0.393 * r + 0.769 * g + 0.189 * b)
tg = int(0.349 * r + 0.686 * g + 0.168 * b)
tb = int(0.272 * r + 0.534 * g + 0.131 * b)
pixels[x, y] = (min(255, tr), min(255, tg), min(255, tb))

return sepia_image
40 changes: 40 additions & 0 deletions 2025/abstraction/abstraction_callable/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from functools import partial

from filters.grayscale import apply_grayscale
from filters.invert import apply_invert
from PIL import Image, ImageOps
from process_img import ImageFilterFn, process_img


def make_grayscale_filter(intensity: float = 1.0) -> ImageFilterFn:
def filter_func(image: Image.Image) -> Image.Image:
print(f"Applying grayscale filter with intensity {intensity}")
# Note: intensity isn't actually used by Pillow here, but it demonstrates config
return ImageOps.grayscale(image)

return filter_func


def make_invert_filter(enabled: bool = True) -> ImageFilterFn:
def filter_func(image: Image.Image) -> Image.Image:
if enabled:
print("Applying invert filter")
return ImageOps.invert(image.convert("RGB"))
else:
print("Invert filter disabled, returning original image")
return image

return filter_func


def main() -> None:
input_image: str = "../input.jpg"

grayscale_fn = partial(apply_grayscale, intensity=0.6)
process_img(input_image, "output_abc_grayscale.jpg", grayscale_fn)

process_img(input_image, "output_abc_invert.jpg", apply_invert)


if __name__ == "__main__":
main()
12 changes: 12 additions & 0 deletions 2025/abstraction/abstraction_callable/process_img.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import Callable

from PIL import Image

type ImageFilterFn = Callable[[Image], Image]


def process_img(image_path: str, output_path: str, filter_fn: ImageFilterFn) -> None:
image = Image.open(image_path)
image = filter_fn(image)
image.save(output_path)
print(f"Saved processed image to {output_path}")
22 changes: 22 additions & 0 deletions 2025/abstraction/abstraction_none/filters/grayscale.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from typing import Any

from PIL import Image, ImageOps


class GrayscaleFilter:
def __init__(self) -> None:
self._intensity: float = 1.0

@property
def name(self) -> str:
return "Grayscale"

def apply(self, image: Image.Image) -> Image.Image:
print(f"Applying {self.name} filter with intensity {self._intensity}")
grayscale_image = ImageOps.grayscale(image).convert("RGB")
if self._intensity < 1.0:
return Image.blend(image, grayscale_image, self._intensity)
return grayscale_image

def configure(self, config: dict[str, Any]) -> None:
self._intensity = config.get("intensity", self._intensity)
11 changes: 11 additions & 0 deletions 2025/abstraction/abstraction_none/filters/invert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from PIL import Image, ImageOps


class InvertFilter:
@property
def name(self) -> str:
return "Invert"

def do_invert(self, image: Image.Image) -> Image.Image:
print(f"Applying {self.name} filter")
return ImageOps.invert(image.convert("RGB"))
18 changes: 18 additions & 0 deletions 2025/abstraction/abstraction_none/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from filters.grayscale import GrayscaleFilter
from filters.invert import InvertFilter
from process_img import process_img


def main() -> None:
input_image: str = "../input.jpg"

grayscale = GrayscaleFilter()
grayscale.configure({"intensity": 0.8})
process_img(input_image, "output_abc_grayscale.jpg", grayscale)

invert = InvertFilter()
process_img(input_image, "output_abc_invert.jpg", invert)


if __name__ == "__main__":
main()
20 changes: 20 additions & 0 deletions 2025/abstraction/abstraction_none/process_img.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Any

from filters.grayscale import GrayscaleFilter
from filters.invert import InvertFilter
from PIL import Image


def process_img(image_path: str, output_path: str, filter_obj: Any) -> None:
print(f"\nUsing filter: {filter_obj.name}")
image = Image.open(image_path)
if isinstance(filter_obj, GrayscaleFilter):
filter_obj.configure({"intensity": 0.8})
image = filter_obj.apply(image)
elif isinstance(filter_obj, InvertFilter):
image = filter_obj.do_invert(image)
else:
print("Unknown filter type. Skipping configuration.")

image.save(output_path)
print(f"Saved processed image to {output_path}")
22 changes: 22 additions & 0 deletions 2025/abstraction/abstraction_protocol/filters/grayscale.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from typing import Any

from PIL import Image, ImageOps


class GrayscaleFilter:
def __init__(self) -> None:
self._intensity: float = 1.0

@property
def name(self) -> str:
return "Grayscale"

def apply(self, image: Image.Image) -> Image.Image:
print(f"Applying {self.name} filter with intensity {self._intensity}")
grayscale_image = ImageOps.grayscale(image).convert("RGB")
if self._intensity < 1.0:
return Image.blend(image, grayscale_image, self._intensity)
return grayscale_image

def configure(self, config: dict[str, Any]) -> None:
self._intensity = config.get("intensity", self._intensity)
23 changes: 23 additions & 0 deletions 2025/abstraction/abstraction_protocol/filters/invert.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from typing import Any

from PIL import Image, ImageOps


class InvertFilter:
def __init__(self) -> None:
self._enabled: bool = True

@property
def name(self) -> str:
return "Invert"

def apply(self, image: Image.Image) -> Image.Image:
if self._enabled:
print(f"Applying {self.name} filter")
return ImageOps.invert(image.convert("RGB"))
else:
print(f"{self.name} filter disabled, returning original image")
return image

def configure(self, config: dict[str, Any]) -> None:
self._enabled = config.get("enabled", self._enabled)
18 changes: 18 additions & 0 deletions 2025/abstraction/abstraction_protocol/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from filters.grayscale import GrayscaleFilter
from filters.invert import InvertFilter
from process_img import process_img


def main() -> None:
input_image: str = "../input.jpg"

grayscale = GrayscaleFilter()
grayscale.configure({"intensity": 0.8})
process_img(input_image, "output_abc_grayscale.jpg", grayscale)

invert = InvertFilter()
process_img(input_image, "output_abc_invert.jpg", invert)


if __name__ == "__main__":
main()
20 changes: 20 additions & 0 deletions 2025/abstraction/abstraction_protocol/process_img.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Any, Protocol

from PIL import Image


class FilterBase(Protocol):
@property
def name(self) -> str: ...

def apply(self, image: Image.Image) -> Image.Image: ...

def configure(self, config: dict[str, Any]) -> None: ...


def process_img(image_path: str, output_path: str, filter_obj: FilterBase) -> None:
print(f"\nUsing filter: {filter_obj.name}")
image = Image.open(image_path)
image = filter_obj.apply(image)
image.save(output_path)
print(f"Saved processed image to {output_path}")
Binary file added 2025/abstraction/input.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions 2025/abstraction/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[project]
name = "abstraction"
version = "0.1.0"
requires-python = ">=3.13"
dependencies = [
"pillow>=11.2.1",
]
Loading