feat: impl docs (#4)

The entire public api is covered with documentation in two languages - Russian and English.

the library now supports the latest three versions of python - 3.12, 3.13 and 3.14

minor design changes: now, when a Boolean flag is entered, its value is an empty string, not None.

tests have been adapted to the supported versions of python, readmi has been redesigned in two languages, German is no longer available.
This commit is contained in:
kolo
2025-12-04 21:55:19 +03:00
committed by GitHub
parent a2ac6a608f
commit ce7e24b924
210 changed files with 13770 additions and 1183 deletions
+43 -240
View File
@@ -1,131 +1,80 @@
import unittest
from datetime import datetime, date
from datetime import date, datetime
from argenta.response.entity import Response, DataBridge, EMPTY_INPUT_FLAGS
from argenta.response.status import ResponseStatus
from argenta.data_bridge import DataBridge
from argenta.command.flag.models import InputFlag
from argenta.command.flag.flags.models import InputFlags
from argenta.command.flag import InputFlag
from argenta.response.entity import EMPTY_INPUT_FLAGS, Response
from argenta.response.status import ResponseStatus
class TestDataBridge(unittest.TestCase):
def setUp(self):
"""Clear data before each test"""
DataBridge.clear_data()
def tearDown(self):
"""Clear data after each test"""
DataBridge.clear_data()
"""Create a new DataBridge instance for each test"""
self.data_bridge = DataBridge()
def test_update_data_basic(self):
"""Test basic data update functionality"""
test_data = {"key1": "value1", "key2": "value2"}
DataBridge.update_data(test_data)
self.assertEqual(DataBridge.get_data(), test_data)
self.data_bridge.update(test_data)
self.assertEqual(self.data_bridge.get_all(), test_data)
def test_update_data_with_datetime(self):
"""Test updating data with datetime objects"""
test_datetime = datetime(2024, 1, 15, 10, 30, 45)
test_data = {"created_at": test_datetime, "name": "test"}
DataBridge.update_data(test_data)
result = DataBridge.get_data()
self.data_bridge.update(test_data)
result = self.data_bridge.get_all()
self.assertEqual(result["created_at"], test_datetime)
self.assertEqual(result["name"], "test")
def test_update_data_with_date(self):
"""Test updating data with date objects"""
test_date = date(2024, 1, 15)
test_data = {"birth_date": test_date, "active": True}
DataBridge.update_data(test_data)
result = DataBridge.get_data()
self.assertEqual(result["birth_date"], test_date)
self.assertEqual(result["active"], True)
def test_update_data_multiple_calls(self):
"""Test multiple update_data calls merge data"""
first_data = {"key1": "value1", "date1": date(2024, 1, 1)}
second_data = {"key2": "value2", "date2": datetime(2024, 2, 1, 12, 0)}
DataBridge.update_data(first_data)
DataBridge.update_data(second_data)
result = DataBridge.get_data()
self.assertEqual(len(result), 4)
self.assertEqual(result["key1"], "value1")
self.assertEqual(result["key2"], "value2")
self.assertEqual(result["date1"], date(2024, 1, 1))
self.assertEqual(result["date2"], datetime(2024, 2, 1, 12, 0))
def test_update_data_overwrites_existing_keys(self):
"""Test that update_data overwrites existing keys"""
initial_data = {"key": "old_value", "date": date(2024, 1, 1)}
updated_data = {"key": "new_value", "date": date(2024, 2, 1)}
DataBridge.update_data(initial_data)
DataBridge.update_data(updated_data)
result = DataBridge.get_data()
self.assertEqual(result["key"], "new_value")
self.assertEqual(result["date"], date(2024, 2, 1))
"""Test multiple update calls merge data"""
first_data = {"key1": "value1"}
second_data = {"key2": "value2"}
self.data_bridge.update(first_data)
self.data_bridge.update(second_data)
self.assertEqual(len(self.data_bridge.get_all()), 2)
def test_get_data_empty(self):
"""Test get_data returns empty dict when no data"""
result = DataBridge.get_data()
self.assertEqual(result, {})
"""Test get_all returns empty dict when no data"""
self.assertEqual(self.data_bridge.get_all(), {})
def test_clear_data(self):
"""Test clear_data removes all data"""
test_data = {"key": "value", "timestamp": datetime.now()}
DataBridge.update_data(test_data)
# Verify data exists
self.assertNotEqual(DataBridge.get_data(), {})
# Clear and verify
DataBridge.clear_data()
self.assertEqual(DataBridge.get_data(), {})
"""Test clear_all removes all data"""
self.data_bridge.update({"key": "value"})
self.assertNotEqual(self.data_bridge.get_all(), {})
self.data_bridge.clear_all()
self.assertEqual(self.data_bridge.get_all(), {})
def test_delete_from_data(self):
"""Test delete_from_data removes specific key"""
test_data = {
"key1": "value1",
"key2": "value2",
"created_at": datetime(2024, 1, 1, 10, 0)
}
DataBridge.update_data(test_data)
# Delete one key
DataBridge.delete_from_data("key1")
result = DataBridge.get_data()
self.assertEqual(len(result), 2)
"""Test delete_by_key removes specific key"""
test_data = {"key1": "value1", "key2": "value2"}
self.data_bridge.update(test_data)
self.data_bridge.delete_by_key("key1")
result = self.data_bridge.get_all()
self.assertNotIn("key1", result)
self.assertIn("key2", result)
self.assertIn("created_at", result)
def test_delete_from_data_nonexistent_key(self):
"""Test delete_from_data with nonexistent key raises KeyError"""
test_data = {"existing_key": "value"}
DataBridge.update_data(test_data)
"""Test delete_by_key with nonexistent key raises KeyError"""
with self.assertRaises(KeyError):
DataBridge.delete_from_data("nonexistent_key")
self.data_bridge.delete_by_key("nonexistent_key")
def test_get_by_key(self):
"""Test get_by_key retrieves correct value"""
test_data = {"key1": "value1", "key2": date(2024, 1, 1)}
self.data_bridge.update(test_data)
self.assertEqual(self.data_bridge.get_by_key("key1"), "value1")
self.assertEqual(self.data_bridge.get_by_key("key2"), date(2024, 1, 1))
self.assertIsNone(self.data_bridge.get_by_key("nonexistent"))
class TestResponse(unittest.TestCase):
def setUp(self):
"""Clear data before each test"""
DataBridge.clear_data()
def tearDown(self):
"""Clear data after each test"""
DataBridge.clear_data()
def test_response_initialization_basic(self):
"""Test basic Response initialization"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
self.assertEqual(response.status, ResponseStatus.ALL_FLAGS_VALID)
self.assertEqual(response.input_flags, EMPTY_INPUT_FLAGS)
@@ -133,151 +82,9 @@ class TestResponse(unittest.TestCase):
"""Test Response initialization with input flags"""
input_flags = InputFlags([InputFlag('test', input_value='value', status=None)])
response = Response(ResponseStatus.INVALID_VALUE_FLAGS, input_flags)
self.assertEqual(response.status, ResponseStatus.INVALID_VALUE_FLAGS)
self.assertEqual(response.input_flags, input_flags)
def test_response_inherits_databridge_functionality(self):
"""Test that Response inherits DataBridge methods"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
test_data = {"message": "hello", "timestamp": datetime.now()}
# Test update_data
response.update_data(test_data)
result = response.get_data()
self.assertEqual(result["message"], "hello")
self.assertIsInstance(result["timestamp"], datetime)
def test_response_data_passing_with_dates(self):
"""Test passing date and datetime objects through Response"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
current_time = datetime.now()
today = date.today()
date_data = {
"current_datetime": current_time,
"current_date": today,
"custom_datetime": datetime(2024, 3, 15, 14, 30, 0),
"custom_date": date(2023, 12, 25),
"metadata": {"created": current_time, "updated": today}
}
response.update_data(date_data)
retrieved_data = response.get_data()
# Verify datetime objects are preserved
self.assertEqual(retrieved_data["current_datetime"], current_time)
self.assertEqual(retrieved_data["current_date"], today)
self.assertEqual(retrieved_data["custom_datetime"], datetime(2024, 3, 15, 14, 30, 0))
self.assertEqual(retrieved_data["custom_date"], date(2023, 12, 25))
# Verify nested datetime objects
self.assertEqual(retrieved_data["metadata"]["created"], current_time)
self.assertEqual(retrieved_data["metadata"]["updated"], today)
def test_response_data_persistence_across_instances(self):
"""Test that data persists across different Response instances"""
# First response instance
response1 = Response(ResponseStatus.ALL_FLAGS_VALID)
test_datetime = datetime(2024, 1, 1, 12, 0, 0)
response1.update_data({"session_start": test_datetime})
# Second response instance
response2 = Response(ResponseStatus.UNDEFINED_FLAGS)
retrieved_data = response2.get_data()
# Data should persist
self.assertEqual(retrieved_data["session_start"], test_datetime)
def test_response_data_complex_date_scenarios(self):
"""Test complex scenarios with date/datetime handling"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
# Create complex data structure with various date formats
complex_data = {
"user": {
"name": "John Doe",
"birth_date": date(1990, 5, 15),
"last_login": datetime(2024, 1, 15, 10, 30, 45),
"preferences": {
"timezone": "UTC",
"date_format": "%Y-%m-%d",
"created_at": datetime(2023, 1, 1, 0, 0, 0)
}
},
"events": [
{"name": "login", "timestamp": datetime(2024, 1, 15, 10, 30, 45)},
{"name": "logout", "timestamp": datetime(2024, 1, 15, 18, 45, 30)},
],
"dates_list": [
date(2024, 1, 1),
date(2024, 1, 2),
date(2024, 1, 3)
]
}
response.update_data(complex_data)
retrieved_data = response.get_data()
# Verify all date/datetime objects are correctly preserved
self.assertEqual(retrieved_data["user"]["birth_date"], date(1990, 5, 15))
self.assertEqual(retrieved_data["user"]["last_login"], datetime(2024, 1, 15, 10, 30, 45))
self.assertEqual(retrieved_data["user"]["preferences"]["created_at"], datetime(2023, 1, 1, 0, 0, 0))
# Verify dates in lists
self.assertEqual(len(retrieved_data["events"]), 2)
self.assertEqual(retrieved_data["events"][0]["timestamp"], datetime(2024, 1, 15, 10, 30, 45))
self.assertEqual(retrieved_data["events"][1]["timestamp"], datetime(2024, 1, 15, 18, 45, 30))
# Verify date list
self.assertEqual(len(retrieved_data["dates_list"]), 3)
self.assertEqual(retrieved_data["dates_list"][0], date(2024, 1, 1))
self.assertEqual(retrieved_data["dates_list"][1], date(2024, 1, 2))
self.assertEqual(retrieved_data["dates_list"][2], date(2024, 1, 3))
def test_response_clear_data_functionality(self):
"""Test clearing data functionality through Response"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
# Add some data with dates
response.update_data({
"timestamp": datetime.now(),
"date": date.today(),
"message": "test"
})
# Verify data exists
self.assertNotEqual(response.get_data(), {})
# Clear data
response.clear_data()
# Verify data is cleared
self.assertEqual(response.get_data(), {})
def test_response_delete_specific_date_data(self):
"""Test deleting specific date-related data"""
response = Response(ResponseStatus.ALL_FLAGS_VALID)
# Add mixed data
test_data = {
"start_date": date(2024, 1, 1),
"end_date": date(2024, 12, 31),
"created_at": datetime.now(),
"name": "test_session"
}
response.update_data(test_data)
# Delete specific date field
response.delete_from_data("start_date")
result = response.get_data()
self.assertNotIn("start_date", result)
self.assertIn("end_date", result)
self.assertIn("created_at", result)
self.assertIn("name", result)
def test_response_status_types(self):
"""Test Response with different status types"""
statuses = [
@@ -286,14 +93,10 @@ class TestResponse(unittest.TestCase):
ResponseStatus.INVALID_VALUE_FLAGS,
ResponseStatus.UNDEFINED_AND_INVALID_FLAGS
]
for status in statuses:
response = Response(status)
response.update_data({"timestamp": datetime.now(), "status_test": True})
self.assertEqual(response.status, status)
self.assertIn("timestamp", response.get_data())
self.assertIn("status_test", response.get_data())
with self.subTest(status=status):
response = Response(status)
self.assertEqual(response.status, status)
if __name__ == '__main__':