- Created extensible BaseQueryParadigm interface with standardized QueryResult format - Implemented QueryParadigmRegistry for paradigm discovery and management - Added 5 working paradigms: SQL, FTS, GraphQL, JSONPath, Natural Language - Documented 9 additional paradigms: QBE, Batch Manipulation, Visual Query Builder, REST API, NoSQL, UNIX Pipeline, XPath/XQuery, RAG, Data Transformation - Integrated full CLI interface: list, search, show, exec, categories commands - Added comprehensive test suite with 23 test cases covering all components - Auto-registration system enables easy addition of new paradigms - Organized paradigms by category (structural, textual, semantic, visual, procedural, network) and complexity (beginner, intermediate, advanced) 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
149 lines
4.6 KiB
Python
149 lines
4.6 KiB
Python
"""
|
|
REST API Paradigm - HTTP-based data access.
|
|
"""
|
|
|
|
import time
|
|
from typing import Dict, Any, List, Optional
|
|
|
|
from ..base import BaseQueryParadigm, QueryResult
|
|
|
|
|
|
class RESTAPIParadigm(BaseQueryParadigm):
|
|
"""REST API paradigm for HTTP-based data access."""
|
|
|
|
@property
|
|
def name(self) -> str:
|
|
return "REST API"
|
|
|
|
@property
|
|
def description(self) -> str:
|
|
return "HTTP-based data access using RESTful endpoints with standard HTTP methods and caching"
|
|
|
|
@property
|
|
def category(self) -> str:
|
|
return "network"
|
|
|
|
@property
|
|
def complexity(self) -> str:
|
|
return "intermediate"
|
|
|
|
def execute(self, query: str, config: Dict[str, Any] = None) -> QueryResult:
|
|
"""Execute REST API request (not yet implemented)."""
|
|
start_time = time.time()
|
|
|
|
# This is a documentation paradigm - not yet implemented
|
|
execution_time = (time.time() - start_time) * 1000
|
|
|
|
return QueryResult(
|
|
paradigm=self.name,
|
|
query=query,
|
|
execution_time_ms=execution_time,
|
|
result_count=0,
|
|
results=[],
|
|
metadata={
|
|
"status": "not_implemented",
|
|
"implementation_issue": "TBD - to be created",
|
|
"description": "REST API provides HTTP-based access to MarkiTect data with proper caching and pagination"
|
|
},
|
|
success=False,
|
|
error_message="REST API paradigm not yet implemented. This paradigm will provide HTTP endpoints for data access."
|
|
)
|
|
|
|
def get_examples(self) -> List[Dict[str, str]]:
|
|
"""Get example REST API requests."""
|
|
return [
|
|
{
|
|
"name": "List files",
|
|
"description": "GET request to list all markdown files",
|
|
"query": "GET /api/v1/files?type=markdown&limit=20"
|
|
},
|
|
{
|
|
"name": "Search files",
|
|
"description": "GET request with search parameters",
|
|
"query": "GET /api/v1/files/search?q=documentation&author=Alice&tags=tutorial"
|
|
},
|
|
{
|
|
"name": "Get file content",
|
|
"description": "GET specific file with content",
|
|
"query": "GET /api/v1/files/123?include=content,metadata,tags"
|
|
},
|
|
{
|
|
"name": "Update file tags",
|
|
"description": "PATCH request to update file tags",
|
|
"query": "PATCH /api/v1/files/123/tags {'tags': ['updated', 'documentation']}"
|
|
},
|
|
{
|
|
"name": "Bulk operations",
|
|
"description": "POST request for bulk file operations",
|
|
"query": "POST /api/v1/files/bulk {'action': 'add_tag', 'files': [1,2,3], 'tag': 'archived'}"
|
|
}
|
|
]
|
|
|
|
def validate_query(self, query: str) -> tuple[bool, Optional[str]]:
|
|
"""Validate REST API request format."""
|
|
if not query.strip():
|
|
return False, "REST API request cannot be empty"
|
|
|
|
parts = query.strip().split(' ', 1)
|
|
if len(parts) < 2:
|
|
return False, "REST API request must include HTTP method and URL"
|
|
|
|
method = parts[0].upper()
|
|
valid_methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']
|
|
|
|
if method not in valid_methods:
|
|
return False, f"HTTP method must be one of: {', '.join(valid_methods)}"
|
|
|
|
url = parts[1].split(' ')[0]
|
|
if not url.startswith('/api/'):
|
|
return False, "URL must start with /api/"
|
|
|
|
return True, None
|
|
|
|
def get_syntax_help(self) -> str:
|
|
"""Get syntax help for REST API requests."""
|
|
return """REST API Request Syntax:
|
|
|
|
Format: <METHOD> <URL> [JSON_BODY]
|
|
|
|
HTTP Methods:
|
|
- GET: Retrieve data
|
|
- POST: Create new resources
|
|
- PUT: Update entire resource
|
|
- PATCH: Partial update
|
|
- DELETE: Remove resource
|
|
|
|
Base URL: /api/v1
|
|
|
|
Endpoints:
|
|
- /api/v1/files - File operations
|
|
- /api/v1/files/search - Search files
|
|
- /api/v1/files/{id} - Specific file operations
|
|
- /api/v1/tags - Tag operations
|
|
- /api/v1/authors - Author operations
|
|
- /api/v1/stats - Statistics
|
|
|
|
Query Parameters:
|
|
- limit: Limit number of results (default: 20, max: 100)
|
|
- offset: Skip number of results (for pagination)
|
|
- include: Comma-separated fields to include
|
|
- sort: Sort field (prefix with - for descending)
|
|
- filter[field]: Filter by field value
|
|
|
|
Examples:
|
|
GET /api/v1/files?limit=10&sort=-created_at
|
|
GET /api/v1/files/search?q=tutorial&filter[author]=Alice
|
|
POST /api/v1/files {"path": "/new/file.md", "content": "# New File"}
|
|
PATCH /api/v1/files/123 {"tags": ["updated"]}
|
|
|
|
Response Format:
|
|
{
|
|
"data": [...],
|
|
"meta": {
|
|
"total": 100,
|
|
"limit": 20,
|
|
"offset": 0,
|
|
"has_more": true
|
|
}
|
|
}
|
|
""" |