Skip to main content

Data model definitions for Nomy wallet analysis data processing

Project description

Nomy Data Models

This repository contains the data model definitions for Nomy wallet analysis data processing. These models are shared across multiple services:

  • nomy-data-service
  • nomy-data-processor
  • nomy-data-ingestor

Overview

The Nomy Data Models repository serves as a single source of truth for all data structures used in the Nomy wallet analysis ecosystem. By centralizing these models, we ensure consistency across different services and reduce duplication of code.

Features

  • Cross-language support: Models can be used in both Python and Rust
  • Versioned releases: Proper versioning to manage dependencies
  • Consistent data structures: Ensures data integrity across the entire pipeline
  • Centralized schema management: Single source of truth for all data models
  • SQLAlchemy ORM models: Database-ready models with full ORM support
  • Automatic Rust code generation: Python SQLAlchemy models are automatically converted to Rust structs

Installation

Python

# Install from PyPI
pip install nomy-data-models

# Install from source
pip install -e .

Rust

Add to your Cargo.toml:

[dependencies]
nomy-data-models = { version = "0.1.0", git = "https://github.com/bcnmy/nomy-data-models" }

Usage

Python

from nomy_data_models.models import WalletState, ServiceState, RawTrade, EnrichedTrade, Position

# Use the models with SQLAlchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import Session

engine = create_engine("sqlite:///nomy.db")
with Session(engine) as session:
    wallet_state = WalletState(
        wallet_address="0x1234567890abcdef1234567890abcdef12345678",
        chain_id=1
    )
    session.add(wallet_state)
    session.commit()

Rust

use nomy_data_models::models::{WalletState, ServiceState, RawTrade, EnrichedTrade, Position};

// Use the model
let wallet_state = WalletState {
    wallet_address: "0x1234567890abcdef1234567890abcdef12345678".to_string(),
    chain_id: 1,
    // ... other fields
};

Development Setup

Pre-commit Hooks

This repository uses pre-commit hooks to ensure code quality and consistency. After cloning the repository, install the pre-commit hooks:

# Make the script executable
chmod +x ./scripts/install-hooks.sh

# Install the hooks
./scripts/install-hooks.sh

The pre-commit hooks will automatically:

  • Format code with Black
  • Sort imports with isort
  • Run Python tests
  • Generate and verify Rust models
  • Format Rust code with rustfmt
  • Run Rust linting with Clippy

Important: Always ensure the pre-commit hooks are installed and up-to-date. They are essential for maintaining code quality and preventing CI failures.

Development

Prerequisites

  • Python 3.8+
  • Rust 1.50+
  • Poetry (for Python dependency management)
  • Cargo (for Rust dependency management)

Setup

  1. Clone the repository
  2. Install Python dependencies: poetry install
  3. Build Rust package: cargo build
  4. Install git hooks: ./scripts/install-hooks.sh

Git Hooks

This repository includes git hooks to automate certain tasks:

  • pre-commit: Automatically generates Rust models from Python models and verifies they build correctly before each commit

To install the git hooks, run:

./scripts/install-hooks.sh

This ensures that all Rust models are kept in sync with their Python counterparts and that they build correctly.

Adding New Models

  1. Add the model definition to the appropriate Python file in nomy_data_models/models/
  2. Update the __init__.py files to export the new model
  3. Run the code generation script: python scripts/generate_rust.py
  4. Verify the generated Rust code in src/models/
  5. Add tests for both Python and Rust implementations

Testing

# Run Python tests
pytest tests/python

# Run Rust tests
cargo test

Contributing

Please follow these steps when contributing:

  1. Create a new branch for your feature
  2. Add or modify models as needed
  3. Ensure tests pass for both Python and Rust
  4. Submit a pull request

Python-to-Rust Conversion

This repository includes a utility for automatically converting Python SQLAlchemy models to Rust structs. This ensures that the data models are consistent across both languages.

How it works

  1. Python SQLAlchemy models are defined in the nomy_data_models/models directory
  2. The nomy_data_models/py_to_rust.py module provides functions for converting these models to Rust
  3. The scripts/generate_rust.py script can be used to generate Rust code from the command line

Usage

To generate Rust models from Python SQLAlchemy models:

python scripts/generate_rust.py [output_dir]

If output_dir is not specified, the default is src/models.

Testing

To test the conversion process:

python scripts/test_conversion.py

This will generate Rust code in the scripts/test_output/models directory and run various tests to ensure the conversion is working correctly.

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

nomy_data_models-0.2.4.tar.gz (14.7 kB view details)

Uploaded Source

Built Distribution

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

nomy_data_models-0.2.4-py3-none-any.whl (19.0 kB view details)

Uploaded Python 3

File details

Details for the file nomy_data_models-0.2.4.tar.gz.

File metadata

  • Download URL: nomy_data_models-0.2.4.tar.gz
  • Upload date:
  • Size: 14.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.10.16 Linux/6.8.0-1021-azure

File hashes

Hashes for nomy_data_models-0.2.4.tar.gz
Algorithm Hash digest
SHA256 5153adaaeeeea4d03781ed61bf2a75ef5ccc96eeaac2387ddf6dc9c38aa6c92d
MD5 578cbbad1ef93f6e8c2ff352b0739f11
BLAKE2b-256 80a49a5eb2c6285e86d1c5f68060507a605e2c0b3aa7b3a5bb4326fe5497f3c7

See more details on using hashes here.

File details

Details for the file nomy_data_models-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: nomy_data_models-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 19.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.10.16 Linux/6.8.0-1021-azure

File hashes

Hashes for nomy_data_models-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 910e4a78658240270cff03796e5a51d0e50c4e6c3bc87a1ac4b5c88bece6f23c
MD5 9b74a966885569603cafff6fb57cb9d1
BLAKE2b-256 e3d7790d0393127e4850e323e562c173a47cf72895308c9f3dac3fa28058ed1a

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