Skip to content
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
File renamed without changes.
File renamed without changes.
File renamed without changes.
69 changes: 68 additions & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,72 @@
# Welcome to the Mail Client Template
# Welcome to the OSS-TAPP

This project is a professional-grade template for a modern Python application, built using a component-based architecture with a clear separation between interface and implementation.

This documentation site provides an overview of the project's architecture, API contracts, and usage guidelines.

## Project Structure

The project is organized into several component libraries:

### Mail Client Libraries

- **[Mail Client API](api/mail_client_api.md)**: Abstract interface for mail operations
- **[Gmail Implementation](api/gmail_client_impl.md)**: Google Gmail API implementation
- **[Mail Service](libraries/mail_client_service.md)**: FastAPI service for mail operations
- **[Mail Service Client](libraries/mail_client_service_client.md)**: Auto-generated service client
- **[Mail Adapter](libraries/mail_client_adapter.md)**: Adapter for service-based mail operations

### Task Client Libraries

- **[Task Client API](libraries/task_client_api.md)**: Abstract interface for task operations
- **[Google Tasks Implementation](libraries/gtask_client_impl.md)**: Google Tasks API implementation
- **[Task Service](libraries/task_client_service.md)**: FastAPI service for task operations
- **[Task Service Client](libraries/task_client_service_client.md)**: Auto-generated service client
- **[Task Adapter](libraries/task_client_adapter.md)**: Adapter for service-based task operations

### Tickets Libraries

- **[Tickets API](libraries/tickets_api.md)**: Abstract interface for ticketing operations
- **[Tickets Implementation](libraries/tickets_client_impl.md)**: Google Tasks-based ticket implementation

## Quick Start

### Mail Client

```python
import gmail_client_impl
from mail_client_api import get_client

client = get_client(interactive=False)
messages = client.list_messages()
```

### Task Client

```python
import gtask_client_impl
from task_client_api import get_client

client = get_client(interactive=False)
tasklists = client.list_tasklists()
```

### Tickets

```python
import gtask_client_impl # noqa: F401
from tickets_client_impl import TicketsClient

client = TicketsClient(interactive=False)
ticket = client.create_ticket(title="Fix bug", description="Description")
```

## Documentation

Each library has comprehensive documentation accessible through the navigation menu. All libraries include:

- Overview and purpose
- API reference
- Usage examples
- Architecture details
- Testing guidelines
11 changes: 11 additions & 0 deletions docs/libraries/gtask_client_impl.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Google Tasks Client Implementation

`gtask_client_impl` provides a concrete `task_client_api.Client` backed by the Google Tasks API.

## Package Overview

::: gtask_client_impl

## Documentation

For detailed documentation, see the [package README](../../src/gtask_client_impl/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/mail_client_adapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Mail Client Adapter

`mail_client_adapter` wraps the auto-generated mail service client to implement the `mail_client_api.Client` protocol.

## Documentation

For detailed documentation, see the [package README](../../src/mail_client_adapter/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/mail_client_service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Mail Client Service

`mail_client_service` provides a FastAPI service for mail client operations.

## Documentation

For detailed documentation, see the [package README](../../src/mail_client_service/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/mail_client_service_client.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Mail Client Service Client

`mail_client_service_client` provides an auto-generated client for the mail client service.

## Documentation

For detailed documentation, see the [package README](../../src/mail_client_service_client/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/task_client_adapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Task Client Adapter

`task_client_adapter` wraps the auto-generated task service client to implement the `task_client_api.Client` protocol.

## Documentation

For detailed documentation, see the [package README](../../src/task_client_adapter/README.md).
11 changes: 11 additions & 0 deletions docs/libraries/task_client_api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Task Client API

`task_client_api` defines the abstract `Client` base class that every task client must implement.

## Package Overview

::: task_client_api

## Documentation

For detailed documentation, see the [package README](../../src/task_client_api/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/task_client_service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Task Client Service

`task_client_service` provides a FastAPI service for task client operations.

## Documentation

For detailed documentation, see the [package README](../../src/task_client_service/README.md).
7 changes: 7 additions & 0 deletions docs/libraries/task_client_service_client.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Task Client Service Client

`task_client_service_client` provides an auto-generated client for the task client service.

## Documentation

For detailed documentation, see the [package README](../../src/task_client_service_client/README.md).
11 changes: 11 additions & 0 deletions docs/libraries/tickets_api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Tickets API

`tickets_api` defines the abstract interfaces for ticketing operations.

## Package Overview

::: tickets_api

## Documentation

For detailed documentation, see the [package README](../../src/tickets_api/README.md).
11 changes: 11 additions & 0 deletions docs/libraries/tickets_client_impl.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Tickets Client Implementation

`tickets_client_impl` provides a concrete implementation of `tickets_api.TicketInterface` using Google Tasks.

## Package Overview

::: tickets_client_impl

## Documentation

For detailed documentation, see the [package README](../../src/tickets_client_impl/README.md).
46 changes: 34 additions & 12 deletions mkdocs.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
site_name: Mail Client Project
site_description: "A professional-grade template for a modern Python project."
site_name: OSS-TAPP
site_description: 'A professional-grade template for a modern Python project with mail and task client implementations.'

theme:
name: material
Expand All @@ -20,29 +20,51 @@ theme:

nav:
- 'Overview': 'index.md'
- 'Architecture': 'component.md'
- 'API Reference':
- 'Message Protocol': 'api/message.md'
- 'Mail Client API': 'api/mail_client_api.md'
- 'Gmail Client Implementation': 'api/gmail_client_impl.md'
- 'Gmail Message Implementation': 'api/gmail_message_impl.md'
- 'Design': 'DESIGN.md'
- 'Contributing': 'CONTRIBUTING.md'
- 'Mail Client':
- 'API Reference': 'api/mail_client_api.md'
- 'Gmail Implementation': 'api/gmail_client_impl.md'
- 'Service': 'libraries/mail_client_service.md'
- 'Service Client': 'libraries/mail_client_service_client.md'
- 'Adapter': 'libraries/mail_client_adapter.md'
- 'Task Client':
- 'API Reference': 'libraries/task_client_api.md'
- 'Google Tasks Implementation': 'libraries/gtask_client_impl.md'
- 'Service': 'libraries/task_client_service.md'
- 'Service Client': 'libraries/task_client_service_client.md'
- 'Adapter': 'libraries/task_client_adapter.md'
- 'Tickets':
- 'API Reference': 'libraries/tickets_api.md'
- 'Implementation': 'libraries/tickets_client_impl.md'
- 'Testing': 'testing.md'
- 'CI/CD Setup': 'circleci-setup.md'

markdown_extensions:
- pymdownx.highlight:
anchor_linenums: true
- pymdownx.superfences
- pymdownx.tabbed:
alternate_style: true

plugins:
- mkdocstrings:
handlers:
python:
options:
# This helps mkdocstrings find packages in the src directory
search_paths:
- src/message/src
search_paths:
- src/mail_client_api/src
- src/gmail_client_impl/src
- src/gmail_message_impl/src
- src/mail_client_service/src
- src/mail_client_adapter/src
- src/mail_client_service_client/src
- src/task_client_api/src
- src/gtask_client_impl/src
- src/task_client_service/src
- src/task_client_adapter/src
- src/task_client_service_client/src
- src/tickets_api/src
- src/tickets_client_impl/src
show_source: false
docstring_section_style: spacy
members_order: source
17 changes: 17 additions & 0 deletions oss-tapp/docs/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Welcome to MkDocs

For full documentation visit [mkdocs.org](https://www.mkdocs.org).

## Commands

* `mkdocs new [dir-name]` - Create a new project.
* `mkdocs serve` - Start the live-reloading docs server.
* `mkdocs build` - Build the documentation site.
* `mkdocs -h` - Print help message and exit.

## Project layout

mkdocs.yml # The configuration file.
docs/
index.md # The documentation homepage.
... # Other markdown pages, images and other files.
1 change: 1 addition & 0 deletions oss-tapp/mkdocs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
site_name: My Docs
5 changes: 5 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ readme = "README.md"
requires-python = ">=3.11"
dependencies = [
"google-auth-oauthlib>=1.2.2",
"mkdocs>=1.6.1",
"openapi-python-client>=0.27.1",
"python-dotenv>=1.0.0",
"types-requests>=2.32.4.20250913",
Expand Down Expand Up @@ -37,6 +38,8 @@ members = [
"src/task_client_service",
"src/task_client_adapter",
"src/task_client_service_client",
"src/tickets_api",
"src/tickets_client_impl",
]

[tool.ruff]
Expand Down Expand Up @@ -75,6 +78,8 @@ mypy_path = [
"src/task_client_service/src",
"src/task_client_service_client/src",
"src/task_client_adapter/src",
"src/tickets_api/src",
"src/tickets_client_impl/src",
]

ignore_missing_imports = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,42 @@

SCOPES = ["https://www.googleapis.com/auth/tasks"]
CREDENTIALS_PATH = "credentials.json"


def get_base_url() -> str:
"""Get the base URL for the service.

Detects the deployment environment and returns the appropriate base URL:
- On Render: Uses RENDER_EXTERNAL_URL environment variable
- Otherwise: Uses OAUTH_REDIRECT_URI or falls back to localhost
"""
# Check if explicitly set via environment variable
if os.environ.get("OAUTH_REDIRECT_URI"):
redirect_uri = os.environ.get("OAUTH_REDIRECT_URI", "")
# Extract base URL from redirect URI (remove /auth/callback if present)
if redirect_uri.endswith("/auth/callback"):
return redirect_uri[:-14] # Remove "/auth/callback"
return redirect_uri

# Check if running on Render
render_external_url = os.environ.get("RENDER_EXTERNAL_URL")
if render_external_url:
# RENDER_EXTERNAL_URL is the full public URL (e.g., https://your-service.onrender.com)
return render_external_url.rstrip("/")

# Default to localhost for local development
return "http://127.0.0.1:8001"


def get_redirect_uri() -> str:
"""Get the OAuth redirect URI for the current environment."""
base_url = get_base_url()
return f"{base_url}/auth/callback"


# Default to port 8001 to match the service port
REDIRECT_URI = os.environ.get("OAUTH_REDIRECT_URI", "http://127.0.0.1:8001/auth/callback")
REDIRECT_URI = get_redirect_uri()
logger.info("OAuth redirect URI configured: %s", REDIRECT_URI)


def get_credentials_path() -> Path:
Expand Down Expand Up @@ -156,6 +190,7 @@ async def login(request: Request) -> RedirectResponse:
)

try:
logger.info("Initiating OAuth flow with redirect URI: %s", REDIRECT_URI)
flow: Flow = Flow.from_client_secrets_file(
str(creds_path),
scopes=SCOPES,
Expand All @@ -170,6 +205,7 @@ async def login(request: Request) -> RedirectResponse:
authorization_url = str(authorization_url)
state = str(state)

logger.info("Redirecting to Google authorization URL")
request.session["oauth_state"] = state

except FileNotFoundError as e:
Expand Down
1 change: 1 addition & 0 deletions src/tickets_api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Tickets API
14 changes: 14 additions & 0 deletions src/tickets_api/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[project]
name = "tickets-api"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.11"
dependencies = []

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.ruff]
extend = "../../pyproject.toml"
Loading