Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
25 changes: 25 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: CI

on:
push:
branches: [ main, feature/radaev ]
pull_request:

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install dependencies
run: pip install pytest

- name: Run tests
run: pytest
18 changes: 0 additions & 18 deletions .github/workflows/github-actions-demo.yml

This file was deleted.

22 changes: 22 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
name: Release

on:
push:
tags:
- 'v*.*.*'

jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Build project
run: echo "Собираем проект..."

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
name: Release ${{ github.ref_name }}
body: Автоматический релиз новой версии
18 changes: 0 additions & 18 deletions .github/workflows/test-pipeline.yml

This file was deleted.

15 changes: 15 additions & 0 deletions design_patterns/abstract_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from abc import ABC, abstractmethod

class Button(ABC):
@abstractmethod
def paint(self): pass

class WinButton(Button):
def paint(self): return "Windows button"

class GUIFactory(ABC):
@abstractmethod
def create_button(self): pass

class WinFactory(GUIFactory):
def create_button(self): return WinButton()
19 changes: 19 additions & 0 deletions design_patterns/builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class Car:
def __init__(self):
self.engine = None
self.seats = None

class CarBuilder:
def __init__(self):
self.car = Car()

def set_engine(self, engine):
self.car.engine = engine
return self

def set_seats(self, seats):
self.car.seats = seats
return self

def build(self):
return self.car
18 changes: 18 additions & 0 deletions design_patterns/factory_method.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from abc import ABC, abstractmethod

class Transport(ABC):
@abstractmethod
def deliver(self): pass

class Truck(Transport):
def deliver(self): return "Доставка грузовиком"

class Logistics(ABC):
@abstractmethod
def create_transport(self): pass

def plan(self):
return self.create_transport().deliver()

class RoadLogistics(Logistics):
def create_transport(self): return Truck()
6 changes: 6 additions & 0 deletions design_patterns/singleton.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Singleton:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
2 changes: 2 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def hello():
return "Hello, CI/CD!"
36 changes: 36 additions & 0 deletions patterns2/adapter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
cat > adapter.py << 'EOF'
class EuropeanSocket:
def voltage(self):
return 220

def plug(self):
return "Европейская вилка"

class AmericanSocket:
def voltage(self):
return 110

def plug_type(self):
return "Американская вилка"

class Adapter:
def __init__(self, socket):
self.socket = socket

def voltage(self):
return self.socket.voltage()

def plug(self):
if hasattr(self.socket, 'plug_type'):
return f"Адаптер для {self.socket.plug_type()}"
return self.socket.plug()

# Пример
if __name__ == "__main__":
eu_socket = EuropeanSocket()
print(f"Европа: {eu_socket.voltage()}V, {eu_socket.plug()}")

us_socket = AmericanSocket()
adapter = Adapter(us_socket)
print(f"США через адаптер: {adapter.voltage()}V, {adapter.plug()}")
EOF
39 changes: 39 additions & 0 deletions patterns2/bridge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
cat > bridge.py << 'EOF'
class Device:
def turn_on(self):
pass

def turn_off(self):
pass

class TV(Device):
def turn_on(self):
return "TV включен"

def turn_off(self):
return "TV выключен"

class Radio(Device):
def turn_on(self):
return "Radio включен"

def turn_off(self):
return "Radio выключен"

class Remote:
def __init__(self, device):
self.device = device

def toggle_power(self):
pass

class BasicRemote(Remote):
def toggle_power(self):
return self.device.turn_on()

# Пример
if __name__ == "__main__":
tv = TV()
remote = BasicRemote(tv)
print(remote.toggle_power())
EOF
41 changes: 41 additions & 0 deletions patterns2/chain.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
cat > chain_of_responsibility.py << 'EOF'
class Handler:
def __init__(self):
self.next = None

def set_next(self, handler):
self.next = handler
return handler

def handle(self, request):
if self.next:
return self.next.handle(request)
return None

class TechnicalSupport(Handler):
def handle(self, request):
if request == "�����������":
return "������������ ������ ��������"
return super().handle(request)

class BillingSupport(Handler):
def handle(self, request):
if request == "�������":
return "������� ������ ��������"
return super().handle(request)

class GeneralSupport(Handler):
def handle(self, request):
return "����� ��������� ������ ��������"

# ������
if __name__ == "__main__":
tech = TechnicalSupport()
billing = BillingSupport()
general = GeneralSupport()

tech.set_next(billing).set_next(general)

print(tech.handle("�����������"))
print(tech.handle("�������"))
EOF
32 changes: 32 additions & 0 deletions patterns2/iterator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cat > iterator.py << 'EOF'
class BookCollection:
def __init__(self):
self.books = []

def add_book(self, book):
self.books.append(book)

def __iter__(self):
return BookIterator(self.books)

class BookIterator:
def __init__(self, books):
self.books = books
self.index = 0

def __next__(self):
if self.index < len(self.books):
book = self.books[self.index]
self.index += 1
return book
raise StopIteration

# ������
if __name__ == "__main__":
library = BookCollection()
library.add_book("����� � ���")
library.add_book("������������ � ���������")

for book in library:
print(f"�����: {book}")
EOF
32 changes: 32 additions & 0 deletions patterns2/proxy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cat > proxy.py << 'EOF'
class Image:
def display(self):
pass

class RealImage(Image):
def __init__(self, filename):
self.filename = filename
self.load_from_disk()

def load_from_disk(self):
print(f"�������� {self.filename}")

def display(self):
print(f"����� {self.filename}")

class ProxyImage(Image):
def __init__(self, filename):
self.filename = filename
self.real_image = None

def display(self):
if not self.real_image:
self.real_image = RealImage(self.filename)
self.real_image.display()

# ������
if __name__ == "__main__":
image = ProxyImage("photo.jpg")
image.display() # ��������� � ����������
image.display() # ������ ���������� (��� ���������)
EOF
37 changes: 37 additions & 0 deletions patterns2/strategy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
cat > strategy.py << 'EOF'
class PaymentStrategy:
def pay(self, amount):
pass

class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
return f"Оплата {amount} руб. кредитной картой"

class PayPalPayment(PaymentStrategy):
def pay(self, amount):
return f"Оплата {amount} руб. через PayPal"

class ShoppingCart:
def __init__(self):
self.items = []
self.strategy = None

def set_payment_strategy(self, strategy):
self.strategy = strategy

def add_item(self, item):
self.items.append(item)

def checkout(self):
total = sum(self.items)
return self.strategy.pay(total)

# Пример
if __name__ == "__main__":
cart = ShoppingCart()
cart.add_item(100)
cart.add_item(200)

cart.set_payment_strategy(CreditCardPayment())
print(cart.checkout())
EOF
Binary file added radaev/README.md
Binary file not shown.
1 change: 1 addition & 0 deletions test_file.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Test for CI
4 changes: 4 additions & 0 deletions test_main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from main import hello

def test_hello():
assert hello() == "Hello, CI/CD!"