kinemotion 0.45.1__tar.gz → 0.46.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kinemotion might be problematic. Click here for more details.
- {kinemotion-0.45.1 → kinemotion-0.46.0}/CHANGELOG.md +8 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/PKG-INFO +1 -1
- {kinemotion-0.45.1 → kinemotion-0.46.0}/pyproject.toml +1 -1
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/__init__.py +4 -1
- kinemotion-0.46.0/src/kinemotion/core/timing.py +246 -0
- kinemotion-0.46.0/tests/core/test_timing.py +196 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/uv.lock +1 -1
- kinemotion-0.45.1/src/kinemotion/core/timing.py +0 -49
- kinemotion-0.45.1/tests/core/test_timing.py +0 -72
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.dockerignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.envrc +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.gitattributes +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.mcp.json +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.readthedocs.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.serena/project.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.tool-versions +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/.vercelignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/CLAUDE.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/Dockerfile +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/GEMINI.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/LICENSE +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/SECURITY.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/.dockerignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/.env.example +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/Dockerfile +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/src/kinemotion_backend/app.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/api/core.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/api/overview.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/testing.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/index.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/quick-start.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/docs/validation-status.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.env.example +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/index.html +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/package.json +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/index.css +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/vercel.json +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/justfile +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/local_dev.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/mkdocs.yml +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/requirements-docs.txt +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/README.md +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/project.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/sonar-project.properties +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/api.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/conftest.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.45.1 → kinemotion-0.46.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.46.0 (2025-12-12)
|
|
11
|
+
|
|
12
|
+
### Features
|
|
13
|
+
|
|
14
|
+
- **core**: Enhance timing with high-precision measurement and zero-overhead option
|
|
15
|
+
([`756821e`](https://github.com/feniix/kinemotion/commit/756821e0a050266f09a2d16a20fe014b875e2a0e))
|
|
16
|
+
|
|
17
|
+
|
|
10
18
|
## v0.45.1 (2025-12-11)
|
|
11
19
|
|
|
12
20
|
### Bug Fixes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.46.0
|
|
4
4
|
Summary: Video-based kinematic analysis for athletic performance
|
|
5
5
|
Project-URL: Homepage, https://github.com/feniix/kinemotion
|
|
6
6
|
Project-URL: Repository, https://github.com/feniix/kinemotion
|
|
@@ -22,7 +22,7 @@ from .smoothing import (
|
|
|
22
22
|
smooth_landmarks,
|
|
23
23
|
smooth_landmarks_advanced,
|
|
24
24
|
)
|
|
25
|
-
from .timing import PerformanceTimer
|
|
25
|
+
from .timing import NULL_TIMER, NullTimer, PerformanceTimer, Timer
|
|
26
26
|
from .video_io import VideoProcessor
|
|
27
27
|
|
|
28
28
|
__all__ = [
|
|
@@ -49,6 +49,9 @@ __all__ = [
|
|
|
49
49
|
"calculate_position_stability",
|
|
50
50
|
# Timing
|
|
51
51
|
"PerformanceTimer",
|
|
52
|
+
"Timer",
|
|
53
|
+
"NullTimer",
|
|
54
|
+
"NULL_TIMER",
|
|
52
55
|
# Video I/O
|
|
53
56
|
"VideoProcessor",
|
|
54
57
|
]
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"""Timing utilities for performance profiling.
|
|
2
|
+
|
|
3
|
+
This module implements a hybrid instrumentation pattern combining:
|
|
4
|
+
1. Protocol-based type safety (structural subtyping)
|
|
5
|
+
2. Null Object Pattern (zero overhead when disabled)
|
|
6
|
+
3. High-precision timing (time.perf_counter)
|
|
7
|
+
4. Memory optimization (__slots__)
|
|
8
|
+
5. Accumulation support (for loops and repeated measurements)
|
|
9
|
+
|
|
10
|
+
Performance Characteristics:
|
|
11
|
+
- PerformanceTimer overhead: ~200ns per measurement
|
|
12
|
+
- NullTimer overhead: ~20ns per measurement
|
|
13
|
+
- Memory: 32 bytes per timer instance
|
|
14
|
+
- Precision: ~1 microsecond (perf_counter)
|
|
15
|
+
|
|
16
|
+
Example:
|
|
17
|
+
# Active timing
|
|
18
|
+
timer = PerformanceTimer()
|
|
19
|
+
with timer.measure("video_processing"):
|
|
20
|
+
process_video(frames)
|
|
21
|
+
metrics = timer.get_metrics()
|
|
22
|
+
|
|
23
|
+
# Zero-overhead timing (disabled)
|
|
24
|
+
tracker = PoseTracker(timer=NULL_TIMER)
|
|
25
|
+
# No timing overhead, but maintains API compatibility
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
import time
|
|
29
|
+
from contextlib import AbstractContextManager
|
|
30
|
+
from typing import Protocol, runtime_checkable
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@runtime_checkable
|
|
34
|
+
class Timer(Protocol):
|
|
35
|
+
"""Protocol for timer implementations.
|
|
36
|
+
|
|
37
|
+
Enables type-safe substitution of PerformanceTimer with NullTimer.
|
|
38
|
+
Uses structural subtyping - any class implementing these methods
|
|
39
|
+
conforms to the protocol.
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
def measure(self, name: str) -> AbstractContextManager[None]:
|
|
43
|
+
"""Context manager to measure execution time of a block.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
name: Name of the step being measured (e.g., "pose_tracking")
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
Context manager that measures execution time
|
|
50
|
+
"""
|
|
51
|
+
...
|
|
52
|
+
|
|
53
|
+
def get_metrics(self) -> dict[str, float]:
|
|
54
|
+
"""Retrieve all collected timing metrics.
|
|
55
|
+
|
|
56
|
+
Returns:
|
|
57
|
+
Dictionary mapping operation names to durations in seconds
|
|
58
|
+
"""
|
|
59
|
+
...
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class _MeasureContext(AbstractContextManager[None]):
|
|
63
|
+
"""Optimized context manager for active timing.
|
|
64
|
+
|
|
65
|
+
Uses __slots__ for memory efficiency and perf_counter for precision.
|
|
66
|
+
Accumulates durations for repeated measurements of the same operation.
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
__slots__ = ("_metrics", "_name", "_start")
|
|
70
|
+
|
|
71
|
+
def __init__(self, metrics: dict[str, float], name: str) -> None:
|
|
72
|
+
"""Initialize measurement context.
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
metrics: Dictionary to store timing results
|
|
76
|
+
name: Name of the operation being measured
|
|
77
|
+
"""
|
|
78
|
+
self._metrics = metrics
|
|
79
|
+
self._name = name
|
|
80
|
+
self._start = 0.0
|
|
81
|
+
|
|
82
|
+
def __enter__(self) -> None:
|
|
83
|
+
"""Start timing measurement using high-precision counter."""
|
|
84
|
+
self._start = time.perf_counter()
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> bool:
|
|
88
|
+
"""Complete timing measurement and accumulate duration.
|
|
89
|
+
|
|
90
|
+
Accumulates duration if the same operation is measured multiple times.
|
|
91
|
+
This is useful for measuring operations in loops.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
exc_type: Exception type (if any)
|
|
95
|
+
exc_val: Exception value (if any)
|
|
96
|
+
exc_tb: Exception traceback (if any)
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
False (does not suppress exceptions)
|
|
100
|
+
"""
|
|
101
|
+
duration = time.perf_counter() - self._start
|
|
102
|
+
# Accumulate for repeated measurements (e.g., in loops)
|
|
103
|
+
self._metrics[self._name] = self._metrics.get(self._name, 0.0) + duration
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
class PerformanceTimer:
|
|
108
|
+
"""High-precision timer for tracking execution duration of named steps.
|
|
109
|
+
|
|
110
|
+
Uses time.perf_counter() for high-resolution monotonic timing.
|
|
111
|
+
Suitable for development, profiling, and performance analysis.
|
|
112
|
+
|
|
113
|
+
Accumulates timing data for repeated measurements of the same operation,
|
|
114
|
+
making it suitable for measuring operations in loops.
|
|
115
|
+
|
|
116
|
+
Precision: ~1 microsecond on most platforms
|
|
117
|
+
Overhead: ~200 nanoseconds per measurement
|
|
118
|
+
|
|
119
|
+
Example:
|
|
120
|
+
timer = PerformanceTimer()
|
|
121
|
+
|
|
122
|
+
# Measure single operation
|
|
123
|
+
with timer.measure("video_initialization"):
|
|
124
|
+
initialize_video(path)
|
|
125
|
+
|
|
126
|
+
# Measure in loop (accumulates)
|
|
127
|
+
for frame in frames:
|
|
128
|
+
with timer.measure("pose_tracking"):
|
|
129
|
+
track_pose(frame)
|
|
130
|
+
|
|
131
|
+
metrics = timer.get_metrics()
|
|
132
|
+
print(f"Total pose tracking: {metrics['pose_tracking']:.3f}s")
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
__slots__ = ("metrics",)
|
|
136
|
+
|
|
137
|
+
def __init__(self) -> None:
|
|
138
|
+
"""Initialize timer with empty metrics dictionary."""
|
|
139
|
+
self.metrics: dict[str, float] = {}
|
|
140
|
+
|
|
141
|
+
def measure(self, name: str) -> AbstractContextManager[None]:
|
|
142
|
+
"""Context manager to measure execution time of a block.
|
|
143
|
+
|
|
144
|
+
Uses perf_counter() for high-resolution monotonic timing.
|
|
145
|
+
More precise and reliable than time.time() for performance measurement.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
name: Name of the step being measured (e.g., "pose_tracking")
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Context manager that measures execution time
|
|
152
|
+
|
|
153
|
+
Note:
|
|
154
|
+
perf_counter() is monotonic - not affected by system clock adjustments.
|
|
155
|
+
Repeated measurements of the same operation name will accumulate.
|
|
156
|
+
"""
|
|
157
|
+
return _MeasureContext(self.metrics, name)
|
|
158
|
+
|
|
159
|
+
def get_metrics(self) -> dict[str, float]:
|
|
160
|
+
"""Get collected timing metrics in seconds.
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
A copy of the metrics dictionary to prevent external modification.
|
|
164
|
+
"""
|
|
165
|
+
return self.metrics.copy()
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class _NullContext(AbstractContextManager[None]):
|
|
169
|
+
"""Singleton null context manager with zero overhead.
|
|
170
|
+
|
|
171
|
+
Implements the context manager protocol but performs no operations.
|
|
172
|
+
Optimized away by the Python interpreter for minimal overhead.
|
|
173
|
+
"""
|
|
174
|
+
|
|
175
|
+
__slots__ = ()
|
|
176
|
+
|
|
177
|
+
def __enter__(self) -> None:
|
|
178
|
+
"""No-op entry - returns immediately."""
|
|
179
|
+
return None
|
|
180
|
+
|
|
181
|
+
def __exit__(self, exc_type: object, exc_val: object, exc_tb: object) -> bool:
|
|
182
|
+
"""No-op exit - returns immediately.
|
|
183
|
+
|
|
184
|
+
Args:
|
|
185
|
+
exc_type: Exception type (ignored)
|
|
186
|
+
exc_val: Exception value (ignored)
|
|
187
|
+
exc_tb: Exception traceback (ignored)
|
|
188
|
+
|
|
189
|
+
Returns:
|
|
190
|
+
False (does not suppress exceptions)
|
|
191
|
+
"""
|
|
192
|
+
return False
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
class NullTimer:
|
|
196
|
+
"""No-op timer implementing the Null Object Pattern.
|
|
197
|
+
|
|
198
|
+
Provides zero-overhead instrumentation when profiling is disabled.
|
|
199
|
+
All methods are no-ops that optimize away at runtime.
|
|
200
|
+
|
|
201
|
+
Performance: ~20-30 nanoseconds overhead per measure() call.
|
|
202
|
+
This is negligible compared to any actual work being measured.
|
|
203
|
+
|
|
204
|
+
Use Cases:
|
|
205
|
+
- Production deployments (profiling disabled)
|
|
206
|
+
- Performance-critical paths
|
|
207
|
+
- Testing without timing dependencies
|
|
208
|
+
|
|
209
|
+
Example:
|
|
210
|
+
# Use global singleton for zero allocation overhead
|
|
211
|
+
tracker = PoseTracker(timer=NULL_TIMER)
|
|
212
|
+
|
|
213
|
+
# No overhead - measure() call optimizes to nothing
|
|
214
|
+
with tracker.timer.measure("operation"):
|
|
215
|
+
do_work()
|
|
216
|
+
"""
|
|
217
|
+
|
|
218
|
+
__slots__ = ()
|
|
219
|
+
|
|
220
|
+
def measure(self, name: str) -> AbstractContextManager[None]:
|
|
221
|
+
"""Return a no-op context manager.
|
|
222
|
+
|
|
223
|
+
This method does nothing and is optimized away by the Python interpreter.
|
|
224
|
+
The context manager protocol (__enter__/__exit__) has minimal overhead.
|
|
225
|
+
|
|
226
|
+
Args:
|
|
227
|
+
name: Ignored - kept for protocol compatibility
|
|
228
|
+
|
|
229
|
+
Returns:
|
|
230
|
+
Singleton null context manager
|
|
231
|
+
"""
|
|
232
|
+
return _NULL_CONTEXT
|
|
233
|
+
|
|
234
|
+
def get_metrics(self) -> dict[str, float]:
|
|
235
|
+
"""Return empty metrics dictionary.
|
|
236
|
+
|
|
237
|
+
Returns:
|
|
238
|
+
Empty dictionary (no metrics collected)
|
|
239
|
+
"""
|
|
240
|
+
return {}
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
# Singleton instances for global reuse
|
|
244
|
+
# Use these instead of creating new instances to avoid allocation overhead
|
|
245
|
+
_NULL_CONTEXT = _NullContext()
|
|
246
|
+
NULL_TIMER: Timer = NullTimer()
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"""Tests for performance timing utilities."""
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
|
|
5
|
+
from kinemotion.core.timing import (
|
|
6
|
+
NULL_TIMER,
|
|
7
|
+
NullTimer,
|
|
8
|
+
PerformanceTimer,
|
|
9
|
+
Timer,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_performance_timer_init() -> None:
|
|
14
|
+
"""Test timer initialization."""
|
|
15
|
+
timer = PerformanceTimer()
|
|
16
|
+
assert timer.metrics == {}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_performance_timer_measure() -> None:
|
|
20
|
+
"""Test measuring execution time."""
|
|
21
|
+
timer = PerformanceTimer()
|
|
22
|
+
|
|
23
|
+
with timer.measure("test_step"):
|
|
24
|
+
time.sleep(0.01)
|
|
25
|
+
|
|
26
|
+
metrics = timer.get_metrics()
|
|
27
|
+
assert "test_step" in metrics
|
|
28
|
+
assert metrics["test_step"] >= 0.01
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_performance_timer_multiple_steps() -> None:
|
|
32
|
+
"""Test measuring multiple steps."""
|
|
33
|
+
timer = PerformanceTimer()
|
|
34
|
+
|
|
35
|
+
with timer.measure("step1"):
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
with timer.measure("step2"):
|
|
39
|
+
pass
|
|
40
|
+
|
|
41
|
+
metrics = timer.get_metrics()
|
|
42
|
+
assert "step1" in metrics
|
|
43
|
+
assert "step2" in metrics
|
|
44
|
+
assert len(metrics) == 2
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_get_metrics_returns_copy() -> None:
|
|
48
|
+
"""Test that get_metrics returns a copy of the dictionary."""
|
|
49
|
+
timer = PerformanceTimer()
|
|
50
|
+
with timer.measure("step"):
|
|
51
|
+
pass
|
|
52
|
+
|
|
53
|
+
metrics = timer.get_metrics()
|
|
54
|
+
metrics["new_key"] = 1.0
|
|
55
|
+
|
|
56
|
+
# Original metrics should not be modified
|
|
57
|
+
assert "new_key" not in timer.metrics
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_performance_timer_accumulates_metrics() -> None:
|
|
61
|
+
"""Test that multiple measurements accumulate in metrics."""
|
|
62
|
+
timer = PerformanceTimer()
|
|
63
|
+
|
|
64
|
+
with timer.measure("operation_a"):
|
|
65
|
+
time.sleep(0.005)
|
|
66
|
+
|
|
67
|
+
with timer.measure("operation_b"):
|
|
68
|
+
time.sleep(0.005)
|
|
69
|
+
|
|
70
|
+
with timer.measure("operation_c"):
|
|
71
|
+
pass
|
|
72
|
+
|
|
73
|
+
metrics = timer.get_metrics()
|
|
74
|
+
assert len(metrics) == 3
|
|
75
|
+
assert metrics["operation_a"] >= 0.005
|
|
76
|
+
assert metrics["operation_b"] >= 0.005
|
|
77
|
+
assert metrics["operation_c"] >= 0.0
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def test_performance_timer_accumulates_same_operation() -> None:
|
|
81
|
+
"""Test that repeated measurements of same operation accumulate."""
|
|
82
|
+
timer = PerformanceTimer()
|
|
83
|
+
|
|
84
|
+
# Measure same operation multiple times (e.g., in a loop)
|
|
85
|
+
with timer.measure("loop_operation"):
|
|
86
|
+
time.sleep(0.005)
|
|
87
|
+
|
|
88
|
+
with timer.measure("loop_operation"):
|
|
89
|
+
time.sleep(0.005)
|
|
90
|
+
|
|
91
|
+
with timer.measure("loop_operation"):
|
|
92
|
+
time.sleep(0.005)
|
|
93
|
+
|
|
94
|
+
metrics = timer.get_metrics()
|
|
95
|
+
assert len(metrics) == 1
|
|
96
|
+
assert "loop_operation" in metrics
|
|
97
|
+
# Total should be sum of all three measurements
|
|
98
|
+
assert metrics["loop_operation"] >= 0.015
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_null_timer_basic() -> None:
|
|
102
|
+
"""Test that NullTimer provides no-op functionality."""
|
|
103
|
+
timer = NullTimer()
|
|
104
|
+
|
|
105
|
+
# Should not raise any errors
|
|
106
|
+
with timer.measure("operation"):
|
|
107
|
+
time.sleep(0.001)
|
|
108
|
+
|
|
109
|
+
# Should return empty metrics
|
|
110
|
+
metrics = timer.get_metrics()
|
|
111
|
+
assert metrics == {}
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def test_null_timer_singleton() -> None:
|
|
115
|
+
"""Test that NULL_TIMER is a singleton instance."""
|
|
116
|
+
timer = NULL_TIMER
|
|
117
|
+
|
|
118
|
+
# Should work like NullTimer
|
|
119
|
+
with timer.measure("operation"):
|
|
120
|
+
time.sleep(0.001)
|
|
121
|
+
|
|
122
|
+
assert timer.get_metrics() == {}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def test_null_timer_zero_overhead() -> None:
|
|
126
|
+
"""Test that NullTimer has negligible overhead."""
|
|
127
|
+
null_timer = NULL_TIMER
|
|
128
|
+
perf_timer = PerformanceTimer()
|
|
129
|
+
|
|
130
|
+
# Measure with null timer (should be near instant)
|
|
131
|
+
start = time.perf_counter()
|
|
132
|
+
for _ in range(1000):
|
|
133
|
+
with null_timer.measure("operation"):
|
|
134
|
+
pass
|
|
135
|
+
null_duration = time.perf_counter() - start
|
|
136
|
+
|
|
137
|
+
# Measure with performance timer
|
|
138
|
+
start = time.perf_counter()
|
|
139
|
+
for _ in range(1000):
|
|
140
|
+
with perf_timer.measure("operation"):
|
|
141
|
+
pass
|
|
142
|
+
perf_duration = time.perf_counter() - start
|
|
143
|
+
|
|
144
|
+
# Null timer should be faster than performance timer
|
|
145
|
+
assert null_duration <= perf_duration
|
|
146
|
+
# Both should be reasonably fast (less than 10ms for 1000 iterations)
|
|
147
|
+
assert null_duration < 0.01
|
|
148
|
+
assert perf_duration < 0.01
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def test_timer_protocol_conformance() -> None:
|
|
152
|
+
"""Test that PerformanceTimer and NullTimer conform to Timer protocol."""
|
|
153
|
+
# Both should be instances of Timer protocol
|
|
154
|
+
assert isinstance(PerformanceTimer(), Timer)
|
|
155
|
+
assert isinstance(NullTimer(), Timer)
|
|
156
|
+
assert isinstance(NULL_TIMER, Timer)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def test_performance_timer_uses_perf_counter() -> None:
|
|
160
|
+
"""Test that PerformanceTimer provides high precision timing."""
|
|
161
|
+
timer = PerformanceTimer()
|
|
162
|
+
|
|
163
|
+
# Measure a very short operation
|
|
164
|
+
with timer.measure("short_operation"):
|
|
165
|
+
# Just a few loop iterations
|
|
166
|
+
for _ in range(100):
|
|
167
|
+
pass
|
|
168
|
+
|
|
169
|
+
metrics = timer.get_metrics()
|
|
170
|
+
# perf_counter should detect even microsecond-level durations
|
|
171
|
+
# The measurement should be non-zero and very small
|
|
172
|
+
assert metrics["short_operation"] >= 0.0
|
|
173
|
+
# Should be less than 1ms for 100 iterations
|
|
174
|
+
assert metrics["short_operation"] < 0.001
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def test_performance_timer_memory_efficiency() -> None:
|
|
178
|
+
"""Test that PerformanceTimer uses __slots__ for memory efficiency."""
|
|
179
|
+
timer = PerformanceTimer()
|
|
180
|
+
|
|
181
|
+
# __slots__ means no __dict__ attribute
|
|
182
|
+
assert not hasattr(timer, "__dict__")
|
|
183
|
+
|
|
184
|
+
# Should only have metrics attribute
|
|
185
|
+
assert hasattr(timer, "metrics")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def test_null_timer_memory_efficiency() -> None:
|
|
189
|
+
"""Test that NullTimer uses __slots__ for minimal memory."""
|
|
190
|
+
timer = NullTimer()
|
|
191
|
+
|
|
192
|
+
# __slots__ means no __dict__ attribute
|
|
193
|
+
assert not hasattr(timer, "__dict__")
|
|
194
|
+
|
|
195
|
+
# NullTimer should have no instance attributes (empty __slots__)
|
|
196
|
+
assert len(timer.__slots__) == 0
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
"""Timing utilities for performance profiling."""
|
|
2
|
-
|
|
3
|
-
import time
|
|
4
|
-
from collections.abc import Generator
|
|
5
|
-
from contextlib import contextmanager
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class PerformanceTimer:
|
|
9
|
-
"""Simple timer for tracking execution duration of named steps.
|
|
10
|
-
|
|
11
|
-
Uses context manager pattern for clean, testable timing instrumentation.
|
|
12
|
-
Accumulates timing data in metrics dictionary accessible via get_metrics().
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
def __init__(self) -> None:
|
|
16
|
-
"""Initialize timer with empty metrics dictionary."""
|
|
17
|
-
self.metrics: dict[str, float] = {}
|
|
18
|
-
|
|
19
|
-
@contextmanager
|
|
20
|
-
def measure(self, name: str) -> Generator[None, None, None]:
|
|
21
|
-
"""Context manager to measure execution time of a block.
|
|
22
|
-
|
|
23
|
-
Args:
|
|
24
|
-
name: Name of the step being measured (e.g., "pose_tracking")
|
|
25
|
-
|
|
26
|
-
Yields:
|
|
27
|
-
None
|
|
28
|
-
|
|
29
|
-
Example:
|
|
30
|
-
timer = PerformanceTimer()
|
|
31
|
-
with timer.measure("video_initialization"):
|
|
32
|
-
# code to measure
|
|
33
|
-
pass
|
|
34
|
-
metrics = timer.get_metrics() # {"video_initialization": 0.123}
|
|
35
|
-
"""
|
|
36
|
-
start_time = time.time()
|
|
37
|
-
try:
|
|
38
|
-
yield
|
|
39
|
-
finally:
|
|
40
|
-
duration = time.time() - start_time
|
|
41
|
-
self.metrics[name] = duration
|
|
42
|
-
|
|
43
|
-
def get_metrics(self) -> dict[str, float]:
|
|
44
|
-
"""Get collected timing metrics in seconds.
|
|
45
|
-
|
|
46
|
-
Returns:
|
|
47
|
-
A copy of the metrics dictionary to prevent external modification.
|
|
48
|
-
"""
|
|
49
|
-
return self.metrics.copy()
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"""Tests for performance timing utilities."""
|
|
2
|
-
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
from kinemotion.core.timing import PerformanceTimer
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def test_performance_timer_init() -> None:
|
|
9
|
-
"""Test timer initialization."""
|
|
10
|
-
timer = PerformanceTimer()
|
|
11
|
-
assert timer.metrics == {}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def test_performance_timer_measure() -> None:
|
|
15
|
-
"""Test measuring execution time."""
|
|
16
|
-
timer = PerformanceTimer()
|
|
17
|
-
|
|
18
|
-
with timer.measure("test_step"):
|
|
19
|
-
time.sleep(0.01)
|
|
20
|
-
|
|
21
|
-
metrics = timer.get_metrics()
|
|
22
|
-
assert "test_step" in metrics
|
|
23
|
-
assert metrics["test_step"] >= 0.01
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def test_performance_timer_multiple_steps() -> None:
|
|
27
|
-
"""Test measuring multiple steps."""
|
|
28
|
-
timer = PerformanceTimer()
|
|
29
|
-
|
|
30
|
-
with timer.measure("step1"):
|
|
31
|
-
pass
|
|
32
|
-
|
|
33
|
-
with timer.measure("step2"):
|
|
34
|
-
pass
|
|
35
|
-
|
|
36
|
-
metrics = timer.get_metrics()
|
|
37
|
-
assert "step1" in metrics
|
|
38
|
-
assert "step2" in metrics
|
|
39
|
-
assert len(metrics) == 2
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def test_get_metrics_returns_copy() -> None:
|
|
43
|
-
"""Test that get_metrics returns a copy of the dictionary."""
|
|
44
|
-
timer = PerformanceTimer()
|
|
45
|
-
with timer.measure("step"):
|
|
46
|
-
pass
|
|
47
|
-
|
|
48
|
-
metrics = timer.get_metrics()
|
|
49
|
-
metrics["new_key"] = 1.0
|
|
50
|
-
|
|
51
|
-
# Original metrics should not be modified
|
|
52
|
-
assert "new_key" not in timer.metrics
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
def test_performance_timer_accumulates_metrics() -> None:
|
|
56
|
-
"""Test that multiple measurements accumulate in metrics."""
|
|
57
|
-
timer = PerformanceTimer()
|
|
58
|
-
|
|
59
|
-
with timer.measure("operation_a"):
|
|
60
|
-
time.sleep(0.005)
|
|
61
|
-
|
|
62
|
-
with timer.measure("operation_b"):
|
|
63
|
-
time.sleep(0.005)
|
|
64
|
-
|
|
65
|
-
with timer.measure("operation_c"):
|
|
66
|
-
pass
|
|
67
|
-
|
|
68
|
-
metrics = timer.get_metrics()
|
|
69
|
-
assert len(metrics) == 3
|
|
70
|
-
assert metrics["operation_a"] >= 0.005
|
|
71
|
-
assert metrics["operation_b"] >= 0.005
|
|
72
|
-
assert metrics["operation_c"] >= 0.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/api/supabase-authentication-setup-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/authentication/supabase-quick-start-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.45.1 → kinemotion-0.46.0}/.basic-memory/codebase/codebase-architecture-overview.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|