Copy docker run --rm zchencow/innozverse-python:latest python3 -c "
import sys, types, importlib, importlib.util
from typing import Any, Callable
# Step 3: Dynamic module loading with importlib
print('=== Dynamic Plugin Loading ===')
# Simulate plugin files in memory
plugins = {
'analytics_plugin': '''
NAME = \"analytics\"
VERSION = \"1.2.0\"
def on_order_created(order: dict) -> dict:
return {\"event\": \"order.created\", \"product\": order[\"product\"], \"revenue\": order[\"total\"]}
def on_order_refunded(order: dict) -> dict:
return {\"event\": \"order.refunded\", \"product\": order[\"product\"]}
''',
'notification_plugin': '''
NAME = \"notifications\"
VERSION = \"0.8.1\"
def on_order_created(order: dict) -> dict:
return {\"email_sent_to\": order.get(\"email\", \"?\"), \"subject\": f\"Order #{order[\"id\"]} confirmed\"}
def on_stock_low(product_id: int, stock: int) -> dict:
return {\"alert\": f\"Product #{product_id} low: {stock} units\"}
''',
}
# Load plugins from code strings (simulates loading .py files from a plugins/ dir)
loaded = {}
for mod_name, code in plugins.items():
spec = importlib.util.spec_from_loader(mod_name, loader=None)
mod = types.ModuleType(mod_name)
exec(compile(code, f'<{mod_name}>', 'exec'), mod.__dict__)
sys.modules[mod_name] = mod
loaded[mod.NAME] = mod
print(f' Loaded: {mod.NAME} v{mod.VERSION}')
# Dispatch events to all plugins that handle them
def dispatch(event: str, **payload) -> list:
handler_name = f'on_{event.replace(\".\", \"_\")}'
results = []
for name, mod in loaded.items():
handler = getattr(mod, handler_name, None)
if handler:
result = handler(**payload)
results.append({'plugin': name, 'result': result})
return results
print()
print('=== Event Dispatch ===')
order = {'id': 42, 'product': 'Surface Pro', 'total': 1728.0, 'email': '[email protected] '}
results = dispatch('order.created', order=order)
for r in results:
print(f' [{r[\"plugin\"]}]: {r[\"result\"]}')
results2 = dispatch('stock.low', product_id=1, stock=3)
for r in results2:
print(f' [{r[\"plugin\"]}]: {r[\"result\"]}')
# Step 4: Dependency Injection container
print()
print('=== Dependency Injection ===')
class Container:
def __init__(self):
self._factories: dict[type, Callable] = {}
self._singletons: dict[type, Any] = {}
self._singleton_types: set[type] = set()
def register(self, interface: type, factory: Callable, singleton: bool = False):
self._factories[interface] = factory
if singleton: self._singleton_types.add(interface)
def resolve(self, interface: type) -> Any:
if interface in self._singletons:
return self._singletons[interface]
factory = self._factories.get(interface)
if factory is None:
raise KeyError(f'No binding for {interface.__name__}')
instance = factory(self)
if interface in self._singleton_types:
self._singletons[interface] = instance
return instance
def inject(self, fn: Callable) -> Callable:
import inspect
hints = {k: v for k, v in fn.__annotations__.items() if k != 'return'}
def wrapper(*args, **kw):
for param, typ in hints.items():
if param not in kw:
try: kw[param] = self.resolve(typ)
except KeyError: pass
return fn(*args, **kw)
return wrapper
# Interfaces (abstract)
class DBConnection: pass
class Cache: pass
class Logger: pass
class SQLiteDB(DBConnection):
def __init__(self): print(' [DI] SQLiteDB connected')
def query(self, sql): return [{'row': 1}, {'row': 2}]
class InMemoryCache(Cache):
def __init__(self): self._store = {}; print(' [DI] Cache created')
def get(self, k): return self._store.get(k)
def set(self, k, v): self._store[k] = v
class ConsoleLogger(Logger):
def log(self, msg): print(f' [LOG] {msg}')
container = Container()
container.register(DBConnection, lambda c: SQLiteDB(), singleton=True)
container.register(Cache, lambda c: InMemoryCache(), singleton=True)
container.register(Logger, lambda c: ConsoleLogger(), singleton=False)
@container.inject
def get_products(db: DBConnection, cache: Cache, logger: Logger) -> list:
cached = cache.get('products')
if cached:
logger.log('Cache hit for products')
return cached
logger.log('Cache miss — querying DB')
products = db.query('SELECT * FROM products')
cache.set('products', products)
return products
print('First call (cache miss):')
r1 = get_products()
print(f' Got {len(r1)} products')
print('Second call (cache hit):')
r2 = get_products()
print(f' Got {len(r2)} products (same DB instance: {container.resolve(DBConnection) is container.resolve(DBConnection)})')
# Step 5: Versioned plugin system
print()
print('=== Versioned Plugin System ===')
from packaging.version import Version as V # may not be available
import re
def parse_version(s: str) -> tuple:
return tuple(int(x) for x in re.match(r'(\d+)\.(\d+)\.(\d+)', s).groups())
class VersionedRegistry:
def __init__(self):
self._plugins: dict[str, list[dict]] = {}
def register(self, name: str, version: str, factory: Callable, min_api: str = '1.0.0'):
self._plugins.setdefault(name, []).append({
'version': version, 'factory': factory, 'min_api': min_api
})
def get(self, name: str, api_version: str = '1.0.0') -> Any:
versions = self._plugins.get(name, [])
compatible = [v for v in versions if parse_version(v['min_api']) <= parse_version(api_version)]
if not compatible: raise ValueError(f'No compatible {name!r} for API {api_version}')
best = max(compatible, key=lambda v: parse_version(v['version']))
return best['factory']()
reg = VersionedRegistry()
reg.register('storage', '1.0.0', lambda: 'SQLite v1', min_api='1.0.0')
reg.register('storage', '2.0.0', lambda: 'SQLite v2', min_api='1.5.0')
reg.register('storage', '3.0.0', lambda: 'Postgres v1', min_api='2.0.0')
print(f'API 1.0.0: {reg.get(\"storage\", \"1.0.0\")}')
print(f'API 1.7.0: {reg.get(\"storage\", \"1.7.0\")}')
print(f'API 2.0.0: {reg.get(\"storage\", \"2.0.0\")}')
# Step 6: Capstone — full plugin system
print()
print('=== Capstone: Plugin Platform ===')
class PluginPlatform:
def __init__(self, api_version: str = '1.0.0'):
self.api_version = api_version
self._plugins: dict[str, Any] = {}
self._hooks: dict[str, list] = {}
self._middleware: list[Callable] = []
def install(self, plugin_class: type) -> None:
meta = getattr(plugin_class, '_meta', {})
name = meta.get('name', plugin_class.__name__)
self._plugins[name] = plugin_class(self)
print(f' Installed: {name} v{meta.get(\"version\", \"?\")}'
f' [{meta.get(\"description\", \"\")}]')
for event, handler_name in meta.get('hooks', {}).items():
handler = getattr(self._plugins[name], handler_name, None)
if handler: self._hooks.setdefault(event, []).append(handler)
def emit(self, event: str, **payload) -> list:
return [h(**payload) for h in self._hooks.get(event, [])]
def middleware(self, fn: Callable) -> Callable:
self._middleware.append(fn)
return fn
class OrderPlugin:
_meta = {'name':'orders','version':'2.1.0','description':'Order management',
'hooks':{'order.created':'on_create','order.refunded':'on_refund'}}
def __init__(self, platform): self.platform = platform; self.orders = []
def on_create(self, **kw):
self.orders.append(kw); return f'Order #{kw[\"id\"]} recorded'
def on_refund(self, **kw): return f'Order #{kw[\"id\"]} refunded'
class AnalyticsPlugin:
_meta = {'name':'analytics','version':'1.0.0','description':'Revenue analytics',
'hooks':{'order.created':'track'}}
def __init__(self, platform): self.revenue = 0.0
def track(self, **kw):
self.revenue += kw.get('total', 0)
return f'Revenue now: \${self.revenue:.2f}'
platform = PluginPlatform(api_version='2.0.0')
platform.install(OrderPlugin)
platform.install(AnalyticsPlugin)
print()
results = platform.emit('order.created', id=1, product='Surface Pro', total=1728.0)
for r in results: print(f' {r}')
results = platform.emit('order.created', id=2, product='Surface Pen', total=249.95)
for r in results: print(f' {r}')
results = platform.emit('order.refunded', id=1)
for r in results: print(f' {r}')
orders_plugin = platform._plugins['orders']
print(f'Total orders tracked: {len(orders_plugin.orders)}')
"