Spaces:
Sleeping
Sleeping
Commit
·
6c9722e
1
Parent(s):
916745d
update viper
Browse files- .gitignore +21 -0
- app.py +28 -5
- channels/channel.py +38 -0
- entities/entity.py +36 -0
- interactors/interactor.py +40 -0
- presenters/presenter.py +13 -0
- routers/router.py +14 -0
- views/view.py +20 -0
.gitignore
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Ignore node modules
|
2 |
+
node_modules/
|
3 |
+
|
4 |
+
# Ignore log files
|
5 |
+
logs
|
6 |
+
*.log
|
7 |
+
npm-debug.log*
|
8 |
+
|
9 |
+
# Ignore Next.js build output
|
10 |
+
.next
|
11 |
+
|
12 |
+
# Ignore yarn error log
|
13 |
+
yarn-error.log
|
14 |
+
|
15 |
+
# Ignore IDE settings
|
16 |
+
.vscode/
|
17 |
+
|
18 |
+
# Ignore operating system files
|
19 |
+
.DS_Store
|
20 |
+
Thumbs.db
|
21 |
+
ehthumbs.db
|
app.py
CHANGED
@@ -1,7 +1,30 @@
|
|
1 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
|
3 |
-
def
|
4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
from channels.channel import Channel
|
3 |
+
from entities.entity import Entity
|
4 |
+
from interactors.interactor import Interactor
|
5 |
+
from presenters.presenter import Presenter
|
6 |
+
from routers.router import Router
|
7 |
+
from views.view import View
|
8 |
|
9 |
+
def initialize_app():
|
10 |
+
# Tạo các thành phần
|
11 |
+
channel = Channel()
|
12 |
+
entity = Entity()
|
13 |
+
interactor = Interactor(channel, entity)
|
14 |
+
presenter = Presenter(channel)
|
15 |
+
router = Router(channel)
|
16 |
+
view = View(channel)
|
17 |
|
18 |
+
# Xử lý các sự kiện từ người dùng
|
19 |
+
presenter.handle('render')
|
20 |
+
presenter.handle('create', 'sampleKey', 'sampleValue')
|
21 |
+
presenter.handle('read', 'sampleKey')
|
22 |
+
presenter.handle('update', 'sampleKey', 'updatedValue')
|
23 |
+
presenter.handle('delete', 'sampleKey')
|
24 |
+
|
25 |
+
# Điều hướng
|
26 |
+
router.navigate('Home')
|
27 |
+
|
28 |
+
if __name__ == "__main__":
|
29 |
+
logging.basicConfig(level=logging.INFO)
|
30 |
+
initialize_app()
|
channels/channel.py
ADDED
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
|
3 |
+
class Event:
|
4 |
+
def __init__(self):
|
5 |
+
self.listeners = {}
|
6 |
+
|
7 |
+
def on(self, event: str, listener: callable):
|
8 |
+
if event not in self.listeners:
|
9 |
+
self.listeners[event] = []
|
10 |
+
self.listeners[event].append(listener)
|
11 |
+
logging.info(f"Registered listener for event: {event}")
|
12 |
+
|
13 |
+
def off(self, event: str, listener: callable):
|
14 |
+
if event in self.listeners:
|
15 |
+
self.listeners[event] = [l for l in self.listeners[event] if l != listener]
|
16 |
+
logging.info(f"Unregistered listener for event: {event}")
|
17 |
+
|
18 |
+
def emit(self, event: str, *args, **kwargs):
|
19 |
+
if event in self.listeners:
|
20 |
+
for listener in self.listeners[event]:
|
21 |
+
try:
|
22 |
+
listener(*args, **kwargs)
|
23 |
+
logging.info(f"Emitted event: {event}")
|
24 |
+
except Exception as e:
|
25 |
+
logging.error(f"Error emitting event {event}: {e}")
|
26 |
+
|
27 |
+
class Channel:
|
28 |
+
def __init__(self):
|
29 |
+
self.event = Event()
|
30 |
+
|
31 |
+
def on(self, event: str, listener: callable):
|
32 |
+
self.event.on(event, listener)
|
33 |
+
|
34 |
+
def off(self, event: str, listener: callable):
|
35 |
+
self.event.off(event, listener)
|
36 |
+
|
37 |
+
def emit(self, event: str, *args, **kwargs):
|
38 |
+
self.event.emit(event, *args, **kwargs)
|
entities/entity.py
ADDED
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from dataclasses import dataclass
|
2 |
+
import logging
|
3 |
+
|
4 |
+
@dataclass
|
5 |
+
class Entity:
|
6 |
+
data: dict = {}
|
7 |
+
|
8 |
+
def create(self, key: str, value: any):
|
9 |
+
if not isinstance(key, str) or value is None:
|
10 |
+
logging.error('Invalid key or value')
|
11 |
+
return
|
12 |
+
self.data[key] = value
|
13 |
+
logging.info(f"Create: {key} = {value}")
|
14 |
+
|
15 |
+
def read(self, key: str):
|
16 |
+
if not isinstance(key, str):
|
17 |
+
logging.error('Invalid key')
|
18 |
+
return
|
19 |
+
value = self.data.get(key)
|
20 |
+
logging.info(f"Read: {key} = {value}")
|
21 |
+
return value
|
22 |
+
|
23 |
+
def update(self, key: str, value: any):
|
24 |
+
if not isinstance(key, str) or value is None:
|
25 |
+
logging.error('Invalid key or value')
|
26 |
+
return
|
27 |
+
self.data[key] = value
|
28 |
+
logging.info(f"Update: {key} = {value}")
|
29 |
+
|
30 |
+
def delete(self, key: str):
|
31 |
+
if not isinstance(key, str):
|
32 |
+
logging.error('Invalid key')
|
33 |
+
return
|
34 |
+
if key in self.data:
|
35 |
+
del self.data[key]
|
36 |
+
logging.info(f"Delete: {key}")
|
interactors/interactor.py
ADDED
@@ -0,0 +1,40 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
from channels.channel import Channel
|
3 |
+
from entities.entity import Entity
|
4 |
+
|
5 |
+
class Interactor:
|
6 |
+
def __init__(self, channel: Channel, entity: Entity):
|
7 |
+
self.channel = channel
|
8 |
+
self.entity = entity
|
9 |
+
self.channel.on('create', self.create)
|
10 |
+
self.channel.on('read', self.read)
|
11 |
+
self.channel.on('update', self.update)
|
12 |
+
self.channel.on('delete', self.delete)
|
13 |
+
|
14 |
+
def create(self, key: str, value: any):
|
15 |
+
try:
|
16 |
+
self.entity.create(key, value)
|
17 |
+
logging.info(f"Create event emitted: {key} = {value}")
|
18 |
+
except Exception as e:
|
19 |
+
logging.error(f"Error emitting create event: {e}")
|
20 |
+
|
21 |
+
def read(self, key: str):
|
22 |
+
try:
|
23 |
+
self.entity.read(key)
|
24 |
+
logging.info(f"Read event emitted: {key}")
|
25 |
+
except Exception as e:
|
26 |
+
logging.error(f"Error emitting read event: {e}")
|
27 |
+
|
28 |
+
def update(self, key: str, value: any):
|
29 |
+
try:
|
30 |
+
self.entity.update(key, value)
|
31 |
+
logging.info(f"Update event emitted: {key} = {value}")
|
32 |
+
except Exception as e:
|
33 |
+
logging.error(f"Error emitting update event: {e}")
|
34 |
+
|
35 |
+
def delete(self, key: str):
|
36 |
+
try:
|
37 |
+
self.entity.delete(key)
|
38 |
+
logging.info(f"Delete event emitted: {key}")
|
39 |
+
except Exception as e:
|
40 |
+
logging.error(f"Error emitting delete event: {e}")
|
presenters/presenter.py
ADDED
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
from channels.channel import Channel
|
3 |
+
|
4 |
+
class Presenter:
|
5 |
+
def __init__(self, channel: Channel):
|
6 |
+
self.channel = channel
|
7 |
+
|
8 |
+
def handle(self, event: str, *args, **kwargs):
|
9 |
+
try:
|
10 |
+
self.channel.emit(event, *args, **kwargs)
|
11 |
+
logging.info(f"Event handled: {event}")
|
12 |
+
except Exception as e:
|
13 |
+
logging.error(f"Error handling event {event}: {e}")
|
routers/router.py
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import logging
|
2 |
+
from channels.channel import Channel
|
3 |
+
|
4 |
+
class Router:
|
5 |
+
def __init__(self, channel: Channel):
|
6 |
+
self.channel = channel
|
7 |
+
self.channel.on('navigate', self.navigate)
|
8 |
+
|
9 |
+
def navigate(self, screen: str):
|
10 |
+
try:
|
11 |
+
logging.info(f"Navigate to {screen}")
|
12 |
+
self.channel.emit('navigate', screen)
|
13 |
+
except Exception as e:
|
14 |
+
logging.error(f"Error navigating to {screen}: {e}")
|
views/view.py
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
from channels.channel import Channel
|
3 |
+
|
4 |
+
class View:
|
5 |
+
def __init__(self, channel: Channel):
|
6 |
+
self.channel = channel
|
7 |
+
self.channel.on('render', self.render)
|
8 |
+
self.channel.on('update', self.update)
|
9 |
+
|
10 |
+
def render(self):
|
11 |
+
with gr.Blocks() as demo:
|
12 |
+
gr.Markdown("## Welcome to VIPER Architecture")
|
13 |
+
gr.Markdown("This is a sample view rendering.")
|
14 |
+
demo.launch()
|
15 |
+
|
16 |
+
def update(self, content: str):
|
17 |
+
with gr.Blocks() as demo:
|
18 |
+
gr.Markdown("## Welcome to VIPER Architecture")
|
19 |
+
gr.Markdown(content)
|
20 |
+
demo.launch()
|