Skip to main content

Python SDK for the CommonGrants protocol

Project description

CommonGrants Python SDK

A Python SDK for interacting with the CommonGrants protocol, providing a type-safe interface for managing grant opportunities.

Features

  • Type-Safe Models: Built with Pydantic v2 for robust data validation and serialization
  • Comprehensive Schema Support: Full implementation of the CommonGrants protocol schemas
  • Modern Python: Requires Python 3.11+ for optimal performance and type safety
  • Extensible: Easy to extend with custom fields and validation

Installation

# Using pip
pip install common-grants-sdk

# Using Poetry
poetry add common-grants-sdk

Quick Start

from datetime import datetime, date, UTC
from uuid import uuid4

from common_grants_sdk.schemas.pydantic import (
    Event,
    Money,
    OpportunityBase,
    OppFunding,
    OppStatus,
    OppStatusOptions,
    OppTimeline,
)

# Create a new opportunity
opportunity = OpportunityBase(
    id=uuid4(),
    title="Research Grant 2024",
    description="Funding for innovative research projects",
    status=OppStatus(
        value=OppStatusOptions.OPEN,
        description="This opportunity is currently accepting applications"
    ),
    created_at=datetime.now(UTC),
    last_modified_at=datetime.now(UTC),
    funding=OppFunding(
        total_amount_available=Money(amount="100000.00", currency="USD"),
        min_award_amount=Money(amount="10000.00", currency="USD"),
        max_award_amount=Money(amount="50000.00", currency="USD"),
        estimated_award_count=5
    ),
    key_dates=OppTimeline(
        app_opens=Event(
            name="Application Opens",
            date=date(2024, 1, 1),
            description="Applications open"
        ),
        app_deadline=Event(
            name="Application Deadline",
            date=date(2024, 3, 31),
            description="Applications close"
        )
    )
)

# Serialize to JSON
json_data = opportunity.dump_json()

# Deserialize from JSON
loaded_opportunity = OpportunityBase.from_json(json_data)

Core Components

Base Model

  • CommonGrantsBaseModel: Base class for all models, provides common serialization and validation methods
  • SystemMetadata: Tracks creation and modification timestamps for records

Opportunity Models

  • OpportunityBase: Core opportunity model
  • OppFunding: Funding details and constraints
  • OppStatus & OppStatusOptions: Opportunity status tracking
  • OppTimeline: Key dates and milestones

Field Types

  • Money: Represents monetary amounts with currency
  • DecimalString: Validated string representing a decimal number
  • Event: Union of event types
  • EventType: Enum for event type discrimination
  • SingleDateEvent: Event with a single date
  • DateRangeEvent: Event with a start and end date
  • OtherEvent: Event with a custom description or recurrence
  • CustomField: Flexible field type for custom data
  • CustomFieldType: Enum for custom field value types
  • ISODate: Alias for datetime.date (ISO 8601 date)
  • ISOTime: Alias for datetime.time (ISO 8601 time)
  • UTCDateTime: Alias for datetime.datetime (UTC timestamp)

Transformation Utilities

The SDK includes a utility for transforming data according to a mapping specification:

  • transform_from_mapping() supports extracting fields, switching on values, and reshaping data dictionaries

Example: Data Transformation

from common_grants_sdk.utils.transformation import transform_from_mapping

source_data = {
    "opportunity_id": 12345,
    "opportunity_title": "Research into ABC",
    "opportunity_status": "posted",
    "summary": {
        "award_ceiling": 100000,
        "award_floor": 10000,
        "forecasted_close_date": "2025-07-15",
        "forecasted_post_date": "2025-05-01",
    },
}

mapping = {
    "id": { "field": "opportunity_id" },
    "title": { "field": "opportunity_title" },
    "status": { 
        "switch": {
            "field": "opportunity_status",
            "case": {
                "posted": "open",
                "closed": "closed",
            },
            "default": "custom",
        }
    },
    "funding": {
        "minAwardAmount": {
            "amount": { "field": "summary.award_floor" },
            "currency": "USD",
        },
        "maxAwardAmount": {
            "amount": { "field": "summary.award_ceiling" },
            "currency": "USD",
        },
    },
    "keyDates": {
        "appOpens": { "field": "summary.forecasted_post_date" },
        "appDeadline": { "field": "summary.forecasted_close_date" },
    },
}

transformed_data = transform_from_mapping(source_data, mapping)

assert transformed_data == {
    "id": uuid4(),
    "title": "Research into ABC",
    "status": "open",
    "funding": {
        "minAwardAmount": { "amount": 10000, "currency": "USD" },
        "maxAwardAmount": { "amount": 100000, "currency": "USD" },
    },
    "keyDates": {
        "appOpens": "2025-05-01",
        "appDeadline": "2025-07-15",
    },
}

HTTP Client

The SDK includes a type-safe HTTP client for interacting with CommonGrants Protocol-compliant APIs. The client provides a Pythonic interface with automatic authentication, request/response parsing, and pagination support.

from common_grants_sdk.client import Client, Auth
from common_grants_sdk.client.config import Config

# Initialize client
config = Config(base_url="https://api.example.org")
client = Client(config=config, auth=Auth.api_key("YOUR_API_KEY"))

# Get a specific opportunity
opportunity = client.opportunity.get("<opportunity_id>")
print(opportunity.title)

# List opportunities
response = client.opportunity.list(page=1)
for opp in response.items:
    print(opp.id, opp.title)

For detailed documentation, examples, and configuration options, see the HTTP Client README.

License

See LICENSE

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

common_grants_sdk-0.4.1.tar.gz (25.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

common_grants_sdk-0.4.1-py3-none-any.whl (41.6 kB view details)

Uploaded Python 3

File details

Details for the file common_grants_sdk-0.4.1.tar.gz.

File metadata

  • Download URL: common_grants_sdk-0.4.1.tar.gz
  • Upload date:
  • Size: 25.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.11.14 Linux/6.11.0-1018-azure

File hashes

Hashes for common_grants_sdk-0.4.1.tar.gz
Algorithm Hash digest
SHA256 572b62473bf8cd0828c474a245495ef13f89f4d7a8853c3601f84108f9bc7cd4
MD5 797865060895353eb3ce9c200b179736
BLAKE2b-256 34d06ec5b316a5d5032ade7f3a7f8dd82c7b86006c6df2bfbf3f69f986b2d745

See more details on using hashes here.

File details

Details for the file common_grants_sdk-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: common_grants_sdk-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 41.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.11.14 Linux/6.11.0-1018-azure

File hashes

Hashes for common_grants_sdk-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c170a24358b78e6427add61c480047c964d7a0f7afb8bfae53a15d29f401db8c
MD5 7106c46a50b8633f7162f22b3734ebdf
BLAKE2b-256 10b73b0d3f6f8ab107f6b85532962bea746bce0da35f1d887b8a67ba3e632133

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page