Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
398 commits
Select commit Hold shift + click to select a range
1af2089
Merge pull request #312 from gyermolenko/remove_runner_script
faif Nov 7, 2019
366e3c4
Fix simple typo: insided -> inside
timgates42 Nov 10, 2019
669818d
Use random.seed for deterministic doctest outputs
gyermolenko Nov 8, 2019
7bc5aec
Merge pull request #315 from gyermolenko/deterministic_blackboard
faif Nov 12, 2019
1f0f522
Merge pull request #314 from timgates42/bugfix/typo_inside
faif Nov 12, 2019
72c888f
Doctest for specification
gyermolenko Nov 13, 2019
224d5a5
Doctest for state
gyermolenko Nov 13, 2019
025f7cd
Doctest for publish_subscribe
gyermolenko Nov 13, 2019
6c40635
Doctest for borg
gyermolenko Nov 13, 2019
d9cea61
Tests from test_outputs are covered in corresponding scripts doctests
gyermolenko Nov 13, 2019
bfe7af3
Merge pull request #316 from gyermolenko/add_more_doctests__
faif Nov 14, 2019
93df74d
Add doctest for graph_search
gyermolenko Nov 15, 2019
e498b66
Add doctest for prototype
gyermolenko Nov 15, 2019
2d4a555
Add doctest for builder
gyermolenko Nov 15, 2019
b62a0a8
Add doctest for bridge
gyermolenko Nov 15, 2019
f097a2d
Merge pull request #317 from gyermolenko/more_doctests_v5
faif Nov 16, 2019
7d58afa
Fix prototype.py typo
janetat Dec 12, 2019
1859623
Merge pull request #318 from janetat/patch-1
faif Dec 14, 2019
6fa00c5
Tests for state patt. can be run in random order
gyermolenko Jan 8, 2020
358953d
Remove tests for Command
gyermolenko Jan 8, 2020
7cb8279
Tests for observer patt. can run in random order
gyermolenko Jan 8, 2020
c0374ff
All tests can run in random order
gyermolenko Jan 8, 2020
937a4ed
Merge pull request #319 from gyermolenko/test_order_randomization
faif Jan 11, 2020
2fdbac5
Added alternative implementation for Iterator pattern using the Itera…
sevetseh28 Feb 11, 2020
184b1a4
Merge pull request #320 from sevetseh28/iterator-protocol-alt-impl
faif Feb 12, 2020
7681bbd
enhance yop document
hojatm-huma Mar 9, 2020
b2df6c0
changed line len to 80 char
hojatm-huma Mar 10, 2020
0faf800
changed example and TL;DR part to have more clarification
hojatm-huma Mar 10, 2020
7e6254c
change TL;DR to mention proxy can add logic
hojatm-huma Mar 10, 2020
8dbfbd6
add changes to example to contain client real-subject usage
hojatm-huma Mar 10, 2020
0f16335
changed output to doctest
hojatm-huma Mar 10, 2020
393d783
Merge pull request #321 from h4ppysmile/patch-1
faif Mar 10, 2020
119ad75
Update commad pattern
hojatm-huma Mar 12, 2020
fed1e21
changed the example to implement undo feature
hojatm-huma Mar 14, 2020
382cec1
a little type error
hojatm-huma Mar 14, 2020
969a067
changing deleted files storage path
hojatm-huma Mar 15, 2020
ef4e73c
fixed does typo
hojatm-huma Mar 15, 2020
43bbf78
un-delete changed to restore
hojatm-huma Mar 15, 2020
f09e3a7
removed really deleting or renaming files
hojatm-huma Mar 15, 2020
ef7684b
remove apostopher from execute
hojatm-huma Mar 17, 2020
6ff56ea
remove apostrophe from execute
hojatm-huma Mar 17, 2020
697deba
Merge pull request #322 from h4ppysmile/patch-1
faif Mar 17, 2020
8894264
Added type hints to delegation pattern
rednafi Jun 18, 2020
ce2c40f
Merge pull request #326 from rednafi/master
faif Jun 18, 2020
af3be65
Added type hints to proxy pattern
rednafi Jun 18, 2020
6da77a1
Merge pull request #327 from rednafi/master
faif Jun 19, 2020
6479d33
Added type hints to dependency injection pattern
rednafi Jun 20, 2020
11449e6
Merge pull request #328 from rednafi/master
faif Jun 20, 2020
997f283
Added type hints to factory pattern
rednafi Jun 21, 2020
a822f7f
Fixed trailing comma on factory pattern
rednafi Jun 21, 2020
588f39a
Merge pull request #329 from rednafi/master
faif Jun 21, 2020
b2a3d55
Added type hints to 3-tier structural pattern
rednafi Jun 22, 2020
848013a
Removed hints for __get__ function
rednafi Jun 23, 2020
a79d012
Merge pull request #330 from rednafi/master
faif Jun 25, 2020
cb5b5fb
ABC based interface in mvc pattern
rednafi Jun 26, 2020
a2ad441
Merge pull request #331 from rednafi/master
faif Jun 27, 2020
44ce0a5
Type checked adapter pattern
rednafi Jun 27, 2020
f38a8d2
Merge pull request #332 from rednafi/master
faif Jun 28, 2020
19ef916
substitute tests with doctest in composite.py
Jul 2, 2020
983e1a2
Merge pull request #334 from alanwuha/master
faif Jul 2, 2020
4ef66a8
Merge pull request #1 from faif/master
Jul 3, 2020
8ff7ae4
Add doctest for pool
Jul 3, 2020
76b6c24
Add doctest for 3-tier
Jul 3, 2020
01fc932
Add doctest for decorator
Jul 3, 2020
d730dd0
Add doctest for front_controller
Jul 3, 2020
a77c79c
Add doctest for mvc
Jul 3, 2020
4be7de7
Merge pull request #335 from alanwuha/master
faif Jul 3, 2020
985822a
Added type hints to composite pattern
rednafi Jul 4, 2020
2d89d5c
Added type hints to composite pattern
rednafi Jul 4, 2020
c1ce8b8
Fixed missing hints
rednafi Jul 4, 2020
6ada489
Merge pull request #2 from faif/master
Jul 4, 2020
6a29d64
fixed blank lines and whitespace warnings raised by tox
Jul 4, 2020
2076cbc
Merge pull request #336 from rednafi/master
faif Jul 4, 2020
2a4428a
Merge pull request #337 from alanwuha/master
faif Jul 4, 2020
beac52d
Update borg pattern to reflect discussion in issue#3
modasserbillah Jul 4, 2020
1176d60
Added typehint to catalog pattern
rednafi Jul 5, 2020
19ca1a9
Merge branch 'master' of github.com:rednafi/python-patterns
rednafi Jul 5, 2020
4ba0c3f
Added typehint to catalog pattern
rednafi Jul 5, 2020
af85c4b
Added typehint to catalog pattern
rednafi Jul 5, 2020
fffc37f
Merge pull request #338 from modasserbillah/update-borg
faif Jul 5, 2020
9ee9b44
Merge pull request #339 from rednafi/master
faif Jul 5, 2020
71e0d55
Add doctest for abstract_factory.py
Jul 6, 2020
6f1cfec
Merge pull request #3 from faif/master
Jul 6, 2020
50ed535
Merge branch 'master' of github.com:alanwuha/python-patterns
Jul 6, 2020
30a9eaf
Merge pull request #340 from alanwuha/master
faif Jul 6, 2020
055edfa
Type checked chain of responsibility pattern
rednafi Jul 15, 2020
68e62a9
Type checked chain of responsibility pattern
rednafi Jul 15, 2020
3514739
Merge pull request #342 from rednafi/master
faif Jul 15, 2020
2e021bf
Added type hint to command pattern
rednafi Jul 19, 2020
51e83c5
Added dependency free makefile for mformatting
rednafi Jul 19, 2020
cdefb80
Merge pull request #343 from rednafi/master
faif Jul 20, 2020
f49d4e9
Added type hints to mediator pattern
rednafi Jul 21, 2020
d7219ff
Merge pull request #344 from rednafi/master
faif Jul 21, 2020
b4a65f8
Added type hints to observer pattern
rednafi Jul 23, 2020
27115a8
Updated signal links
rednafi Jul 23, 2020
daa2219
Handle unnamed exception with contextlib.suppress
rednafi Jul 23, 2020
fb35b1e
Merge pull request #345 from rednafi/master
faif Jul 23, 2020
2ed51f8
Rewrite tests for the Proxy class
imankulov Aug 12, 2020
3ac2188
Fix borg tests
imankulov Aug 12, 2020
2f0ebe0
Ignore Flake8 rule W503
imankulov Aug 12, 2020
242dd65
Remove unused imports
imankulov Aug 12, 2020
b1da067
Remove unnecessary f-string modifier
imankulov Aug 12, 2020
7447a4f
Merge pull request #348 from imankulov/fix_tests
faif Aug 12, 2020
5ed7713
Update tox.ini to use py37,py38 instead of ci37,ci38
imankulov Aug 12, 2020
eeb9711
Merge pull request #349 from imankulov/fix_tox
faif Aug 12, 2020
62e6fd5
Implemented breadth first search for shortest path in a graph
LCVcode Aug 16, 2020
86e56e0
Merge pull request #350 from LCVcode/master
faif Aug 17, 2020
0829e8c
Used correct function names in recursive calls and fixed the doctest
Sep 23, 2020
65651fd
Merge pull request #351 from techntools/correct-graph-search
faif Sep 24, 2020
27e9de2
Added base case and return the path as soon as end node is visited
Sep 26, 2020
f6adf63
Merge pull request #352 from techntools/correct-graph-search
faif Sep 26, 2020
335fd5b
Fix typo discovered by codespell
cclauss Dec 31, 2020
d8c0fd6
cant —> Cannot
cclauss Dec 31, 2020
f5d0a43
Travis CI: Test on Python 3.9
cclauss Dec 31, 2020
aa794c8
tox.ini: py39
cclauss Dec 31, 2020
62c72ca
GitHub Action to lint Python code
cclauss Dec 31, 2020
b936fcb
tox.ini: py38,py39
cclauss Dec 31, 2020
f343b5a
skip_missing_interpreters
cclauss Dec 31, 2020
5ef9a81
Update lint_python.yml
cclauss Dec 31, 2020
ab62f57
flake8 . --exclude=./.*
cclauss Dec 31, 2020
355b512
Merge pull request #361 from cclauss/patch-1
faif Jan 1, 2021
c1bcad2
Merge pull request #362 from cclauss/patch-2
faif Jan 1, 2021
602581a
Merge branch 'master' into patch-3
cclauss Jan 1, 2021
6bb4e6d
Merge pull request #363 from cclauss/patch-3
faif Jan 1, 2021
54c21bd
Make codespell and isort mandatory tests
cclauss Jan 2, 2021
3f94a9e
Make pytest . a mandatory test
cclauss Jan 2, 2021
b5468d9
Merge pull request #364 from cclauss/patch-3
faif Jan 2, 2021
a133a6a
pyupgrade --py36-plus **/*.py
cclauss Jan 2, 2021
c6d82e1
pyupgrade --py36-plus **/*.py
cclauss Jan 2, 2021
c4ef0b7
Merge pull request #365 from cclauss/blacken
faif Jan 2, 2021
20f06fd
Fix Typo
ooduor Jan 20, 2021
28e8b5f
Merge pull request #368 from ooduor/patch-1
faif Jan 20, 2021
f72b1ba
Update abstract_factory more elaborate
yhay81 Jan 24, 2021
74eb634
Update test of abstract factory
yhay81 Jan 24, 2021
a12ad8e
Update prototype
yhay81 Jan 24, 2021
b548b45
house keeping update
yhay81 Jan 24, 2021
9a8be5c
Update prototype.py
yhay81 Jan 24, 2021
666ef63
Update prototype.py
yhay81 Jan 24, 2021
7c3f71f
Update prototype.py
yhay81 Jan 24, 2021
2bdfe2a
Merge pull request #370 from yhay81/abstract_factory
faif Jan 25, 2021
c6becec
Merge pull request #371 from yhay81/prototype
faif Jan 25, 2021
4fcbf1b
Merge pull request #372 from yhay81/house_keeping
faif Jan 25, 2021
7f71d37
Added type hints and pytest tests
TolstochenkoDaniil May 27, 2021
b8849c1
resolve review
TolstochenkoDaniil May 28, 2021
c0677d7
Formatted with black
TolstochenkoDaniil May 31, 2021
5f47b07
Merge pull request #374 from TolstochenkoDaniil/strategy_pattern
faif May 31, 2021
b78348e
Closes #377: No return value expeced :bug:
g-paras Jul 6, 2021
24c6cc8
Merge pull request #378 from g-paras/stubs
faif Jul 6, 2021
2364304
:snake: Reformatted with black Closes #375
g-paras Jul 7, 2021
e639308
Merge pull request #379 from g-paras/Issue#375
faif Jul 7, 2021
ade29d6
Added type hints to chaining method pattern
2ykwang Dec 6, 2021
d752949
Added type hints to iterator pattern
2ykwang Dec 6, 2021
0ef9e80
Change string literals to class name. [PEP-0563]
2ykwang Dec 6, 2021
d3d00e5
Solve linter error
2ykwang Dec 7, 2021
2a469f4
Merge pull request #381 from 2ykwang/master
faif Dec 7, 2021
2940bc2
Replaces dead link with web archive copy.
emorozov Dec 13, 2021
0bc59cc
Added docstrings to several undocumented functions.
fluencydoc Dec 23, 2021
a528233
Fixed corrupted and unnecessary example docstrings
fluencydoc Dec 23, 2021
caf059d
Fixed corrupted docstrings
fluencydoc Dec 23, 2021
402a1d3
Fixed more docstring corruption
fluencydoc Dec 23, 2021
4e870fd
Fixed linter errors
fluencydoc Dec 23, 2021
33b0199
Merge branch 'trelent-documentation' of https://github.com/fluencydoc…
fluencydoc Dec 23, 2021
75d3ec0
Fixed linter errors
mjanos5 Feb 7, 2022
fdb8e78
Use URL shortener to fix archive link
mjanos5 Feb 8, 2022
84fa121
Merge pull request #387 from mjanos5/emorozov
faif Feb 8, 2022
1f2bb45
Merge pull request #386 from mjanos5/trelent-documentation
faif Feb 8, 2022
193ee4c
feat(typing): fix all problems by mypy
yhay81 Feb 17, 2022
79d1275
Merge pull request #388 from yhay81/feature/mypy-type-hints
faif Feb 19, 2022
0a15bbe
Replaced spammy link with a direct one
faif May 31, 2022
5c5b971
Close #258
faif Jun 2, 2022
93b5937
Cleanup README
faif Jun 2, 2022
778e3c5
Update .gitignore
abhinav1912 Jun 26, 2022
6f6cfbe
fix: created PetShop instance
abhinav1912 Jun 26, 2022
8541f98
Merge pull request #392 from abhinav1912/update_gitignore
faif Jun 26, 2022
aa357ee
docs: fix simple typo, assigining -> assigning
timgates42 Jul 2, 2022
02dd56a
Merge pull request #394 from timgates42/bugfix_typo_assigning
faif Jul 4, 2022
230166e
Merge pull request #393 from abhinav1912/fix/issue_376
faif Jul 4, 2022
0f5d2ca
Upgrade GitHub Actions
cclauss Jul 18, 2022
129cb3c
tox.ini: Add py310
cclauss Jul 18, 2022
3a02da2
Add Python 3.10
cclauss Jul 18, 2022
7c140eb
add type hints
abe-101 Jul 19, 2022
ca8706a
add type hints
abe-101 Jul 19, 2022
7ac7708
Merge pull request #395 from cclauss/patch-3
faif Jul 19, 2022
be59b53
Merge pull request #396 from abe-101/add-type-hints
faif Jul 19, 2022
9d4170d
issue 373: add more type hints
alexkahan Jul 27, 2022
f89c748
fix blackboard linter issue
alexkahan Aug 7, 2022
36f4fac
fix experts
alexkahan Aug 7, 2022
cc54961
Merge pull request #397 from alexkahan/issue-373-add-type-hints
faif Aug 8, 2022
ad6fd4b
Add Protocol to factory pattern
Jan 20, 2023
4e62fd0
Update chaining_method.py
Jan 21, 2023
93bfb7f
Merge pull request #403 from mfurquimdev/402-add-protocol-to-factory-…
faif Jan 27, 2023
d4b7f97
Merge pull request #404 from asaffifee/patch-1
faif Jan 27, 2023
76a5d21
simplify patterns/behavioral/memento, changing Transactional from des…
May 24, 2023
53ba9bc
add build and dist folders to .gitignore
grimley517 May 8, 2024
11113ea
linter updates - changes to comply with black
grimley517 May 8, 2024
af6fc3e
Additional linting error in patterns/behavioral/strategy.py added spa…
grimley517 May 12, 2024
e0b0061
extract complexity from docstring line
grimley517 May 12, 2024
87a1777
linter reformats quote marks in strategy pattern
grimley517 May 12, 2024
ffb45ca
put lint into a single shell command
grimley517 May 12, 2024
b6ceef4
Removed Random Petshop tests from abstract_factory.py as per #418
grimley517 May 16, 2024
e05b35f
linted abstract_factory.py
grimley517 May 16, 2024
9581e5a
updated readme to describe purpose of lint.sh file
grimley517 May 16, 2024
81e78fe
Merge pull request #417 from grimley517/#415-linter-preventing-prs
faif May 18, 2024
1a94d1f
Update README.md
azarboon Jun 11, 2024
f401747
Merge pull request #419 from azarboon/patch-1
faif Jun 19, 2024
cffe6cd
Update README.md
faif Sep 5, 2024
fa56fde
Update README.md
faif Sep 5, 2024
328b2d4
Merge pull request #408 from LeiYangGH/master
faif Sep 5, 2024
a400094
Added routing
Apr 23, 2025
8f0a91c
Cleaned up lint.sh
Apr 23, 2025
821a4dc
Merge pull request #432 from cdorsman/mvc-routing
faif Apr 25, 2025
ac1b2b4
Merge pull request #434 from cdorsman/lint-sh-cleanup
faif Apr 25, 2025
9016858
Update README.md
faif Apr 25, 2025
ce06e8b
Highlight the need for a wrapper in delegate
danwald Apr 26, 2025
75c27bf
Merge pull request #436 from danwald/update-delegation
faif May 2, 2025
ab82cbe
Removed old Python versions
cdorsman May 3, 2025
3b58565
Added typing
cdorsman May 3, 2025
24f8dcd
Fixed bug
cdorsman May 3, 2025
93b4e16
Removed bugs and added more types
cdorsman May 3, 2025
ccc17b4
Fixed bug on check if controller is defined
cdorsman May 3, 2025
65fcf56
removed object definition from routes
cdorsman May 3, 2025
6af5a82
I fixed a bug
cdorsman May 3, 2025
f6bc58d
Ädded comments and lost types
cdorsman May 3, 2025
58bd201
Defined "random_animal" with random animal from list.
cdorsman May 3, 2025
a50bb54
- Moved AbstractExpert
cdorsman May 4, 2025
9ad7206
Removed object type from init
cdorsman May 4, 2025
e834385
Retry
cdorsman May 4, 2025
8c0b293
Retry2
cdorsman May 4, 2025
092fdd3
fix doctest
cdorsman May 4, 2025
049d555
Retry3
cdorsman May 4, 2025
79a41c7
Retry4
cdorsman May 4, 2025
871fd8a
Added type to random_animal
cdorsman May 4, 2025
7f4e266
Pet to type[Pet]
cdorsman May 4, 2025
84b4b7b
woof
cdorsman May 4, 2025
7db462e
t to T
cdorsman May 4, 2025
07a5f33
Merge pull request #443 from cdorsman/abstract-factory-fixes
faif May 7, 2025
ecc5e17
Remove old py versions (#440)
cdorsman May 7, 2025
879ac01
Mvc add typing (#441)
cdorsman May 7, 2025
bee048e
11 project format (#446)
grimley517 Jul 19, 2025
3c0725a
Servant pattern (#413)
lmiguelvargasf Jul 19, 2025
ef74d59
fix(docs): correct typos in top comment of catalog.py (#451)
partth-code Sep 5, 2025
25c7356
fix: :bug: Fix potential warning in factory.py (#455)
Sorrow-Scarlet Oct 17, 2025
d842d10
Fix typo in top comment of catalog.py (#453)
Demagalawrence Oct 17, 2025
931ed9f
Add type hints and standardized docstrings to observer.py (#454)
Sai-Sravya-Thumati Oct 17, 2025
a72dead
Cleanup pluggable-libs & fix CI file output (#433, #447) (#448)
PraveenMudalgeri Oct 17, 2025
d1e262f
Remove pluggable-libs submodule and cleanup (#433) (#447)
PraveenMudalgeri Oct 17, 2025
11132fc
Translate several doctest tests to pytest (#414)
germin8 Oct 17, 2025
90016f4
Add type hint to remaining pattern modules (#410)
debakarr Oct 17, 2025
5110def
docs: add missing Servant pattern to README behavioral patterns table…
xingarr Nov 7, 2025
cd7f927
Add anti patterns sectiAdd “Anti-Patterns” section to README with exp…
ABHIRANJAN-KUMAR1 Nov 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .codespellignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
__pycache__
*.pyc
.idea
*.egg-info/
.tox/
env/
venv/
.env
.venv
.vscode/
.python-version
.coverage
build/
dist/
288 changes: 288 additions & 0 deletions .github/workflows/lint_pr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,288 @@
name: lint_pull_request
on: [pull_request, push]
jobs:
check_changes:
runs-on: ubuntu-24.04
outputs:
has_python_changes: ${{ steps.changed-files.outputs.has_python_changes }}
files: ${{ steps.changed-files.outputs.files }}
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # To get all history for git diff commands

- name: Get changed Python files
id: changed-files
run: |
if [ "${{ github.event_name }}" == "pull_request" ]; then
# For PRs, compare against base branch
CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT origin/${{ github.base_ref }} HEAD | grep '\.py$' | grep -v "^setup\.py$" || echo "")
# Check if setup.py specifically changed
SETUP_PY_CHANGED=$(git diff --name-only --diff-filter=ACMRT origin/${{ github.base_ref }} HEAD | grep "^setup\.py$" || echo "")
if [ ! -z "$SETUP_PY_CHANGED" ]; then
CHANGED_FILES="$CHANGED_FILES $SETUP_PY_CHANGED"
fi
else
# For pushes, use the before/after SHAs
CHANGED_FILES=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.before }} ${{ github.event.after }} | grep '\.py$' | grep -v "^setup\.py$" || echo "")
# Check if setup.py specifically changed
SETUP_PY_CHANGED=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.before }} ${{ github.event.after }} | grep "^setup\.py$" || echo "")
if [ ! -z "$SETUP_PY_CHANGED" ]; then
CHANGED_FILES="$CHANGED_FILES $SETUP_PY_CHANGED"
fi
fi

# Check if any Python files were changed and set the output accordingly
if [ -z "$CHANGED_FILES" ]; then
echo "No Python files changed"
echo "has_python_changes=false" >> $GITHUB_OUTPUT
echo "files=" >> $GITHUB_OUTPUT
else
echo "Changed Python files: $CHANGED_FILES"
echo "has_python_changes=true" >> $GITHUB_OUTPUT
# Use proper delimiter formatting for GitHub Actions
FILES_SINGLE_LINE=$(echo "$CHANGED_FILES" | tr '\n' ' ' | sed 's/[[:space:]]\+/ /g' | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
echo "files=$FILES_SINGLE_LINE" >> $GITHUB_OUTPUT
fi

- name: PR information
if: ${{ github.event_name == 'pull_request' }}
run: |
if [[ "${{ steps.changed-files.outputs.has_python_changes }}" == "true" ]]; then
echo "This PR contains Python changes that will be linted."
else
echo "This PR contains no Python changes, but still requires manual approval."
fi

lint:
needs: check_changes
if: ${{ needs.check_changes.outputs.has_python_changes == 'true' }}
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
tool: [flake8, format, mypy, pytest, pyupgrade, tox]
steps:
# Additional check to ensure we have Python files before proceeding
- name: Verify Python changes
run: |
if [[ "${{ needs.check_changes.outputs.has_python_changes }}" != "true" ]]; then
echo "No Python files were changed. Skipping linting."
exit 0
fi

- uses: actions/checkout@v3
with:
fetch-depth: 0

- uses: actions/setup-python@v4
with:
python-version: 3.12

- uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-dev.txt') }}
restore-keys: |
${{ runner.os }}-pip-

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-dev.txt

# Flake8 linting
- name: Lint with flake8
if: ${{ matrix.tool == 'flake8' }}
id: flake8
run: |
echo "Linting files: ${{ needs.check_changes.outputs.files }}"
flake8 ${{ needs.check_changes.outputs.files }} --count --show-source --statistics

# Format checking with isort and black
- name: Format check
if: ${{ matrix.tool == 'format' }}
id: format
run: |
echo "Checking format with isort for: ${{ needs.check_changes.outputs.files }}"
isort --profile black --check ${{ needs.check_changes.outputs.files }}
echo "Checking format with black for: ${{ needs.check_changes.outputs.files }}"
black --check ${{ needs.check_changes.outputs.files }}

# Type checking with mypy
- name: Type check with mypy
if: ${{ matrix.tool == 'mypy' }}
id: mypy
run: |
echo "Type checking: ${{ needs.check_changes.outputs.files }}"
mypy --ignore-missing-imports ${{ needs.check_changes.outputs.files }}

# Run tests with pytest
- name: Run tests with pytest
if: ${{ matrix.tool == 'pytest' }}
id: pytest
run: |
echo "Running pytest discovery..."
python -m pytest --collect-only -v

# First run any test files that correspond to changed files
echo "Running tests for changed files..."
changed_files="${{ needs.check_changes.outputs.files }}"

# Extract module paths from changed files
modules=()
for file in $changed_files; do
# Convert file path to module path (remove .py and replace / with .)
if [[ $file == patterns/* ]]; then
module_path=${file%.py}
module_path=${module_path//\//.}
modules+=("$module_path")
fi
done

# Run tests for each module
for module in "${modules[@]}"; do
echo "Testing module: $module"
python -m pytest -xvs tests/ -k "$module" || true
done

# Then run doctests on the changed files
echo "Running doctests for changed files..."
for file in $changed_files; do
if [[ $file == *.py ]]; then
echo "Running doctest for $file"
python -m pytest --doctest-modules -v $file || true
fi
done

# Check Python version compatibility
- name: Check Python version compatibility
if: ${{ matrix.tool == 'pyupgrade' }}
id: pyupgrade
run: pyupgrade --py312-plus ${{ needs.check_changes.outputs.files }}

# Run tox
- name: Run tox
if: ${{ matrix.tool == 'tox' }}
id: tox
run: |
echo "Running tox integration for changed files..."
changed_files="${{ needs.check_changes.outputs.files }}"

# Create a temporary tox configuration that extends the original one
echo "[tox]" > tox_pr.ini
echo "envlist = py312" >> tox_pr.ini
echo "skip_missing_interpreters = true" >> tox_pr.ini

echo "[testenv]" >> tox_pr.ini
echo "setenv =" >> tox_pr.ini
echo " COVERAGE_FILE = .coverage.{envname}" >> tox_pr.ini
echo "deps =" >> tox_pr.ini
echo " -r requirements-dev.txt" >> tox_pr.ini
echo "allowlist_externals =" >> tox_pr.ini
echo " pytest" >> tox_pr.ini
echo " coverage" >> tox_pr.ini
echo " python" >> tox_pr.ini
echo "commands =" >> tox_pr.ini

# Check if we have any implementation files that changed
pattern_files=0
test_files=0

for file in $changed_files; do
if [[ $file == patterns/* ]]; then
pattern_files=1
elif [[ $file == tests/* ]]; then
test_files=1
fi
done

# Only run targeted tests, no baseline
echo " # Run specific tests for changed files" >> tox_pr.ini

has_tests=false

# Add coverage-focused test commands
for file in $changed_files; do
if [[ $file == *.py ]]; then
# Run coverage tests for implementation files
if [[ $file == patterns/* ]]; then
module_name=$(basename $file .py)

# Get the pattern type (behavioral, structural, etc.)
if [[ $file == patterns/behavioral/* ]]; then
pattern_dir="behavioral"
elif [[ $file == patterns/creational/* ]]; then
pattern_dir="creational"
elif [[ $file == patterns/structural/* ]]; then
pattern_dir="structural"
elif [[ $file == patterns/fundamental/* ]]; then
pattern_dir="fundamental"
elif [[ $file == patterns/other/* ]]; then
pattern_dir="other"
else
pattern_dir=""
fi

echo " # Testing $file" >> tox_pr.ini

# Check if specific test exists
if [ -n "$pattern_dir" ]; then
test_path="tests/${pattern_dir}/test_${module_name}.py"
echo " if [ -f \"${test_path}\" ]; then echo \"Test file ${test_path} exists: true\" && coverage run -m pytest -xvs --cov=patterns --cov-append ${test_path}; else echo \"Test file ${test_path} exists: false\"; fi" >> tox_pr.ini

# Also try to find any test that might include this module
echo " coverage run -m pytest -xvs --cov=patterns --cov-append tests/${pattern_dir}/ -k \"${module_name}\" --no-header" >> tox_pr.ini
fi

# Run doctests for the file
echo " coverage run -m pytest --doctest-modules -v --cov=patterns --cov-append $file" >> tox_pr.ini

has_tests=true
fi

# Run test files directly if modified
if [[ $file == tests/* ]]; then
echo " coverage run -m pytest -xvs --cov=patterns --cov-append $file" >> tox_pr.ini
has_tests=true
fi
fi
done

# If we didn't find any specific tests to run, mention it
if [ "$has_tests" = false ]; then
echo " python -c \"print('No specific tests found for changed files. Consider adding tests.')\"" >> tox_pr.ini
# Add a minimal test to avoid failure, but ensure it generates coverage data
echo " coverage run -m pytest -xvs --cov=patterns --cov-append -k \"not integration\" --no-header" >> tox_pr.ini
fi

# Add coverage report command
echo " coverage combine" >> tox_pr.ini
echo " coverage report -m" >> tox_pr.ini

# Run tox with the custom configuration
echo "Running tox with custom PR configuration..."
echo "======================== TOX CONFIG ========================"
cat tox_pr.ini
echo "==========================================================="
tox -c tox_pr.ini

summary:
needs: [check_changes, lint]
# Run summary in all cases, regardless of whether lint job ran
if: ${{ always() }}
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v3

- name: Summarize results
run: |
echo "## Pull Request Lint Results" >> $GITHUB_STEP_SUMMARY
if [[ "${{ needs.check_changes.outputs.has_python_changes }}" == "true" ]]; then
echo "Linting has completed for all Python files changed in this PR." >> $GITHUB_STEP_SUMMARY
echo "See individual job logs for detailed results." >> $GITHUB_STEP_SUMMARY
else
echo "No Python files were changed in this PR. Linting was skipped." >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "⚠️ **Note:** This PR still requires manual approval regardless of linting results." >> $GITHUB_STEP_SUMMARY
36 changes: 36 additions & 0 deletions .github/workflows/lint_python.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
name: lint_python
on: [pull_request, push]
jobs:
lint_python:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.12
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install .[dev]
- name: Lint with flake8
run: flake8 ./patterns --count --show-source --statistics
continue-on-error: true
- name: Format check with isort and black
run: |
isort --profile black --check ./patterns
black --check ./patterns
continue-on-error: true
- name: Type check with mypy
run: mypy --ignore-missing-imports ./patterns || true
continue-on-error: true
- name: Run tests with pytest
run: |
pytest ./patterns
pytest --doctest-modules ./patterns || true
continue-on-error: true
- name: Check Python version compatibility
run: shopt -s globstar && pyupgrade --py312-plus ./patterns/**/*.py
continue-on-error: true
- name: Run tox
run: tox
continue-on-error: true
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
__pycache__
*.pyc
.idea
*.egg-info/
.tox/
env/
venv/
.env
.venv
.vscode/
.python-version
.coverage
.project
.pydevproject
/.pytest_cache/
build/
dist/
Loading