Skip to content
This repository was archived by the owner on Dec 13, 2025. It is now read-only.
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@ dist/

*.egg-info/
__pycache__/

.tox/
.idea/
50 changes: 50 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
## Contributing to Sigmoid_Check

Welcome to the **Sigmoid_Check** repository! This guide outlines the process of contributing to our Python library, which automates homework verification. Please read and follow the steps carefully to ensure smooth collaboration.

### 1. Access Permission
This repository is private, and only those with the necessary permissions can access it. If you have access, you can create branches and make contributions.

### 2. Working on a Ticket

#### Step 1: Create a Branch
1. Navigate to the **GitHub Projects** section where tickets are listed.
2. Select the ticket you will be working on.
3. Use the **Create Branch** button available within the ticket to automatically generate a branch with the correct name.
4. Checkout the newly created branch locally using the following command:
```bash
git checkout <branch_name>
```

#### Step 2: Implement Changes
1. Make your changes locally on the checked-out branch.
2. Ensure your code follows PEP 8 standards and is properly tested.

### 3. Create a Pull Request (PR)
1. Once your changes are implemented and tested, push your branch to the repository:
```bash
git push origin <branch_name>
```
2. Navigate to GitHub and create a **Pull Request** (PR) from your branch.
3. Assign **Eduard Balamatiuc** (`eduard-balamatiuc`) as the reviewer.
4. If needed, add any additional reviewers requested by the team.

### 4. Review and Update
1. After submitting the PR, wait for the code review.
2. Implement any feedback or changes requested by the reviewers.
3. Once all changes are approved, the PR will be ready to merge.

### 5. Merging the PR
1. Once approved, merge the PR into the main branch.
2. After merging, deployment to PyPi will need to be handled manually until we automate the process.

### 6. PyPi Deployment
1. Contact **Eduard Balamatiuc** (`eduard-balamatiuc`) to handle version updates and PyPi deployment.
2. Ensure the version number is correctly updated to reflect the latest changes.

### 7. Updating the Documentation
If the deployment process is automated in the future, this documentation will be updated to reflect the changes. Please check back for any updates.

---

Thank you for contributing to **Sigmoid_Check**! We appreciate your effort in improving the project.
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[metadata]
description-file = README.md
description_file = README.md
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@
"Programming Language :: Python :: 3.10",
"Operating System :: OS Independent"
],
)
)
2 changes: 1 addition & 1 deletion sigmoid_check/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from . import python_odyssey
from . import python_odyssey
2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
from .lesson_13.lesson import Lesson13
from .lesson_14.lesson import Lesson14
from .lesson_15.lesson import Lesson15
from .lesson_16.lesson import Lesson16
from .lesson_16.lesson import Lesson16
2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_10/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson10
from .lesson import Lesson10
127 changes: 76 additions & 51 deletions sigmoid_check/python_odyssey/lesson_10/lesson.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_11/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson11
from .lesson import Lesson11
385 changes: 252 additions & 133 deletions sigmoid_check/python_odyssey/lesson_11/lesson.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_13/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson13
from .lesson import Lesson13
201 changes: 129 additions & 72 deletions sigmoid_check/python_odyssey/lesson_13/lesson.py

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_14/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson14
from .lesson import Lesson14
84 changes: 57 additions & 27 deletions sigmoid_check/python_odyssey/lesson_14/lesson.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,26 @@
class Task1:
"""1. Creează o clasă `Utilizator` care să conțină un atribut public `nume` și un atribut protejat `_nivel_acces` cu valoarea implicită "Default".
Clasa `Utilizator` trebuie să conțină metoda `afiseaza_nivel_acces` care să returneze string-ul "*nume-utilizator* are nivelul de acces *nivel-acces*.".
De asemenea, clasa `Utilizator` trebuie să conțină metoda `utilizeaza_sistem` care să returneze string-ul "*nume-utilizator* poate utiliza funcții de bază ale sistemului.".
"""1. Creează o clasă `Utilizator` care să conțină un atribut public `nume` și un atribut protejat `_nivel_acces`
cu valoarea implicită "Default".
Clasa `Utilizator` trebuie să conțină metoda `afiseaza_nivel_acces` care să returneze string-ul
"*nume-utilizator* are nivelul de acces *nivel-acces*.".
De asemenea, clasa `Utilizator` trebuie să conțină metoda `utilizeaza_sistem` care să returneze string-ul
"*nume-utilizator* poate utiliza funcții de bază ale sistemului.".

2. Creează o clasă `UtilizatorManager` care să moștenească clasa `Utilizator` și să aibă atributul protejat `_nivel_acces` cu valoarea "Manager".
Clasa `UtilizatorManager` trebuie să conțină metoda `modifica_setari` care să returneze string-ul "*nume-utilizator* poate modifica setările sistemului.".
De asemenea, clasa `UtilizatorManager` trebuie să conțină metoda `citeste_date_utilizator` care să returneze string-ul "*nume-utilizator* poate citi datele utilizatorilor.".
2. Creează o clasă `UtilizatorManager` care să moștenească clasa `Utilizator`
și să aibă atributul protejat `_nivel_acces` cu valoarea "Manager".
Clasa `UtilizatorManager` trebuie să conțină metoda `modifica_setari` care să returneze string-ul
"*nume-utilizator* poate modifica setările sistemului.".
De asemenea, clasa `UtilizatorManager` trebuie să conțină metoda `citeste_date_utilizator`
care să returneze string-ul "*nume-utilizator* poate citi datele utilizatorilor.".

3. Creează o clasă `UtilizatorAdmin` care să moștenească clasa `Utilizator` și să aibă atributul protejat `_nivel_acces` cu valoarea "Admin".
Clasa `UtilizatorAdmin` trebuie să conțină metoda `modifica_setari` care să returneze string-ul "*nume-utilizator* poate modifica setările sistemului.".
De asemenea, clasa `UtilizatorAdmin` trebuie să conțină metoda `modifica_date_utilizator` care să returneze string-ul "*nume-utilizator* poate modifica datele utilizatorilor.".
3. Creează o clasă `UtilizatorAdmin` care să moștenească clasa `Utilizator`
și să aibă atributul protejat `_nivel_acces` cu valoarea "Admin".
Clasa `UtilizatorAdmin` trebuie să conțină metoda `modifica_setari` care să returneze string-ul
"*nume-utilizator* poate modifica setările sistemului.".
De asemenea, clasa `UtilizatorAdmin` trebuie să conțină metoda `modifica_date_utilizator` care să returneze
string-ul "*nume-utilizator* poate modifica datele utilizatorilor.".
"""

def __init__(self, class_user, class_user_manager, class_user_admin):
self.class_user = class_user
self.class_user_manager = class_user_manager
Expand All @@ -37,18 +47,29 @@ def check_task(self):


class Task2:
"""1. Pentru această sarcină vom crea o copie a clasei `Utilizator` de mai sus, deoarece vom avea nevoie de aceeași structură pentru a adăuga utilizatorii în sistem.
Creează o clasă `user` care să conțină un atribut privat `_nume` și un atribut protejat `__nivel_acces` cu valoarea implicită "Default".
Acum avem nevoie de un getter și un setter pentru atributul `_nume` și `__nivel_acces` pentru a putea modifica aceste valori în afara clasei.

2. Creează o clasă `Sistem` care va conține un atribut privat `__utilizatori` inițializat cu un dicționar gol în care cheile vor fi id-ul și valorile utilizatorii.
Clasa `Sistem` trebuie să conțină metoda `adauga_utilizator` care va primi un obiect de tip `Utilizator` și va adăuga utilizatorul la dicționar împreună cu un nou id.
De asemenea, clasa `Sistem` trebuie să conțină metoda `afiseaza_utilizatori` care va returna o listă cu numele utilizatorilor existenți.
Clasa `Sistem` trebuie să conțină metoda `verifica_nivel_acces` care va primi numele unui utilizator și va returna nivelul de acces al utilizatorului respectiv.
Clasa `Sistem` trebuie să conțină și metoda `modifica_name_user` care va primi id-ul utilizatorului și noul nume al utilizatorului și va modifica numele utilizatorului respectiv.
Clasa `Sistem` trebuie să conțină și metoda `sterge_utilizator` care va primi id-ul utilizatorului și va șterge utilizatorul respectiv.
Clasa `Sistem` trebuie să conțină și metoda `modifica_nivel_acces` care va primi id-ul utilizatorului și noul nivel de acces al utilizatorului și va modifica nivelul de acces al utilizatorului respectiv.
"""1. Pentru această sarcină vom crea o copie a clasei `Utilizator` de mai sus, deoarece vom avea nevoie de aceeași
structură pentru a adăuga utilizatorii în sistem.
Creează o clasă `user` care să conțină un atribut privat `_nume` și un atribut protejat
`__nivel_acces` cu valoarea implicită "Default".
Acum avem nevoie de un getter și un setter pentru atributul `_nume` și `__nivel_acces` pentru a putea modifica
aceste valori în afara clasei.

2. Creează o clasă `Sistem` care va conține un atribut privat `__utilizatori` inițializat cu un dicționar gol
în care cheile vor fi id-ul și valorile utilizatorii.
Clasa `Sistem` trebuie să conțină metoda `adauga_utilizator` care va primi un obiect de tip `Utilizator`
și va adăuga utilizatorul la dicționar împreună cu un nou id.
De asemenea, clasa `Sistem` trebuie să conțină metoda `afiseaza_utilizatori` care va returna
o listă cu numele utilizatorilor existenți.
Clasa `Sistem` trebuie să conțină metoda `verifica_nivel_acces` care va primi numele unui utilizator
și va returna nivelul de acces al utilizatorului respectiv.
Clasa `Sistem` trebuie să conțină și metoda `modifica_name_user` care va primi id-ul utilizatorului
și noul nume al utilizatorului și va modifica numele utilizatorului respectiv.
Clasa `Sistem` trebuie să conțină și metoda `sterge_utilizator` care va primi id-ul utilizatorului
și va șterge utilizatorul respectiv.
Clasa `Sistem` trebuie să conțină și metoda `modifica_nivel_acces` care va primi id-ul utilizatorului
și noul nivel de acces al utilizatorului și va modifica nivelul de acces al utilizatorului respectiv.
"""

def __init__(self, class_user, class_sistem):
self.class_user = class_user
self.class_sistem = class_sistem
Expand All @@ -72,14 +93,21 @@ def check_task(self):


class Task3:
"""1. Creează o clasă `TechSolutionsApp` care va conține o valoare a clasei `versiune_applicatie` cu valoarea implicită "1.0".
Această clasă va avea nevoie de 3 metode, fiecare dintre acestea va fi utilizată pentru a simula interacțiunea cu sistemul nostru.
De asemenea clasa va primi ca argument la inițializare o valoare ce va reprezenta versiunea aplicatiei care va fi stocată în atributul `self.versiune_aplicatie`.
"""1. Creează o clasă `TechSolutionsApp` care va conține o valoare a clasei `versiune_applicatie`
cu valoarea implicită "1.0".
Această clasă va avea nevoie de 3 metode, fiecare dintre acestea va fi utilizată pentru a simula interacțiunea
cu sistemul nostru.
De asemenea clasa va primi ca argument la inițializare o valoare ce va reprezenta versiunea aplicatiei
care va fi stocată în atributul `self.versiune_aplicatie`.

Metoda `market_view` va fi o metodă statică care nu va avea acces la self sau cls și va returna string-ul "Vizualizare piață".
Metoda `delogat_view` va fi o metodă de clasă care va avea acces la cls și va returna string-ul "Versiunea aplicației este *versiune-aplicatie*" utilizând atributul clasei.
Metoda `account_view` va fi o metodă de instanță care va avea acces la self și va returna string-ul "Vizualizare aplicație user *versiune-aplicatie*" utilizând atributul instanței.
Metoda `market_view` va fi o metodă statică care nu va avea acces la self sau cls
și va returna string-ul "Vizualizare piață".
Metoda `delogat_view` va fi o metodă de clasă care va avea acces la cls și va returna string-ul
"Versiunea aplicației este *versiune-aplicatie*" utilizând atributul clasei.
Metoda `account_view` va fi o metodă de instanță care va avea acces la self și va returna string-ul
"Vizualizare aplicație user *versiune-aplicatie*" utilizând atributul instanței.
"""

def __init__(self, class_app):
self.class_app = class_app

Expand All @@ -93,8 +121,10 @@ def check_task(self):
except AssertionError:
return False


class Lesson14:
"""Test class for checking the implementation of tasks in lesson 13 of the Python Odyssey Bootcamp."""

def __init__(self):
self.status_tasks = {f"task_{i}": False for i in range(1, 4)}

Expand All @@ -107,7 +137,7 @@ def check_task(self, task_number, *args):
if self.status_tasks[f"task_{task_number}"]:
return f"Task {task_number}: Correct! Well done."
return f"Task {task_number}: Incorrect! Please try again."
except Exception as e:
except:
return f"Task {task_number}: Error!"

def get_completion_percentage(self):
Expand Down
2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_15/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson15
from .lesson import Lesson15
29 changes: 22 additions & 7 deletions sigmoid_check/python_odyssey/lesson_15/lesson.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
class Task1:
"""Primul pas în crearea algoritmului este implementarea unor containere de date care va permite stocarea și manipularea datelor într-un mod mai simplu
și eficient. Trebuie să creezi o clasă nouă `DataContainer`. Pentru a manipula datele vom folosi metodele speciale ale clasei.
"""Primul pas în crearea algoritmului este implementarea unor containere de date care va permite stocarea
și manipularea datelor într-un mod mai simplu
și eficient. Trebuie să creezi o clasă nouă `DataContainer`.
Pentru a manipula datele vom folosi metodele speciale ale clasei.

Clasa va primi ca parametru o listă de numere integer.
- __init__ initializează clasa cu lista de numere.
Expand All @@ -10,6 +12,7 @@ class Task1:
- __setitem__ va permite modificarea elementelor din listă folosind indexul (e.g., container[0] = 5).
- __add__ va permite combinarea a două instanțe de `DataContainer` într-o singură instanță.
"""

def __init__(self, class_data_container):
self.class_data_container = class_data_container

Expand All @@ -28,12 +31,15 @@ def check_task(self):
except:
return False


class Task2:
"""Acum avem nevoie de o modalitate de a calcula suma și produsul containerului de date. Pentru aceasta creează două clase noi care vor moșteni clasa `DataContainer`.
"""Acum avem nevoie de o modalitate de a calcula suma și produsul containerului de date. Pentru aceasta creează
două clase noi care vor moșteni clasa `DataContainer`.
- `SumaContainer` va calcula suma elementelor din listă.
- `ProdusContainer` va calcula produsul elementelor din listă.
Ambele clase vor avea metoda `calculate` care va returna suma sau produsul elementelor.
"""

def __init__(self, class_suma_container, class_produs_container, class_data_container):
self.class_suma_container = class_suma_container
self.class_produs_container = class_produs_container
Expand All @@ -49,13 +55,15 @@ def check_task(self):
except:
return False


class Task3:
"""Pentru ca instrumentul pe care îl folosim să fie complet vom mai avea nevoie de careva adiții.
Creează o clasă `DataAnalysis` care va primi ca input o listă de obiecte de tipul `DataContainer`.
- __init__ va inițializa clasa cu lista de obiecte.
- `add_container` va permite adăugarea unui nou container în listă.
- `__call__` va returna o listă cu valorile maxime ale fiecărui container.
"""

def __init__(self, class_data_analysis, class_data_container):
self.class_data_analysis = class_data_analysis
self.class_data_container = class_data_container
Expand All @@ -72,6 +80,7 @@ def check_task(self):
except:
return False


class Task4:
"""Pe lângă elementul de analiză a datelor, Microsoft a mai cerut și un element de statistică.
Creează o clasă `DataStatistics` care va primi ca input o listă de obiecte de tipul `DataContainer`.
Expand All @@ -82,6 +91,7 @@ class Task4:
- `min` va returna valoarea minimă din toate containerele.
- `sum` va returna suma elementelor din toate containerele.
"""

def __init__(self, class_data_statistics, class_data_container):
self.class_data_statistics = class_data_statistics
self.class_data_container = class_data_container
Expand All @@ -99,15 +109,18 @@ def check_task(self):
except:
return False


class Task5:
"""Creează o clasă `DataFilter` care va primi ca input o listă de obiecte de tipul `DataContainer`.
- __init__ va inițializa clasa cu lista de obiecte.
- `add_container` va permite adăugarea unui nou container în listă.
- `filter_zeros` va returna o listă cu toate elementele care sunt diferite de 0.
- `filter_negatives` va returna o listă cu toate elementele care sunt mai mari sau egale cu 0.
- `filter_positives` va returna o listă cu toate elementele care sunt mai mici sau egale cu 0.
- `filter_under_mean` va returna o listă cu toate elementele care sunt mai mari decât media aritmetică a tuturor elementelor calculate cu metoda `mean` din clasa `DataStatistics`.
- `filter_under_mean` va returna o listă cu toate elementele care sunt mai mari decât media aritmetică
a tuturor elementelor calculate cu metoda `mean` din clasa `DataStatistics`.
"""

def __init__(self, class_data_filter, class_data_statistics, class_data_container):
self.class_data_filter = class_data_filter
self.class_data_statistics = class_data_statistics
Expand All @@ -118,7 +131,6 @@ def check_task(self):
container1 = self.class_data_container([1, 2, 3, 0, -1, -2])
container2 = self.class_data_container([4, 5, 6, 0, -3, -4])
filter = self.class_data_filter([container1, container2])
stats = self.class_data_statistics([container1, container2])
assert sorted(filter.filter_zeros()) == sorted([1, 2, 3, -1, -2, 4, 5, 6, -3, -4])
assert sorted(filter.filter_negatives()) == sorted([-1, -2, -3, -4])
assert sorted(filter.filter_positives()) == sorted([1, 2, 3, 0, 4, 5, 6, 0])
Expand All @@ -127,8 +139,10 @@ def check_task(self):
except:
return False


class Lesson15:
"""Test class for checking the implementation of tasks in lesson 15 of the Python Odyssey Bootcamp."""

def __init__(self):
self.status_tasks = {f"task_{i}": False for i in range(1, 6)}

Expand All @@ -141,13 +155,14 @@ def check_task(self, task_number, *args):
if self.status_tasks[f"task_{task_number}"]:
return f"Task {task_number}: Correct! Well done."
return f"Task {task_number}: Incorrect! Please try again."
except Exception as e:
except:
return f"Task {task_number}: Error!"

def get_completion_percentage(self):
completed = sum([1 for task in self.status_tasks if self.status_tasks[task]])
return f"Your completion percentage is {completed * 100 / len(self.status_tasks)}%"


class DataContainer:
def __init__(self, data):
"""
Expand Down Expand Up @@ -186,4 +201,4 @@ def __add__(self, other):
if isinstance(other, DataContainer):
combined_data = self.data + other.data
return DataContainer(combined_data)
raise TypeError("Can only add another DataContainer instance.")
raise TypeError("Can only add another DataContainer instance.")
2 changes: 1 addition & 1 deletion sigmoid_check/python_odyssey/lesson_16/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .lesson import Lesson16
from .lesson import Lesson16
Loading