From cb44cab4f8751feb96d8fa7717c35734706df809 Mon Sep 17 00:00:00 2001 From: Nyeogmi Date: Mon, 26 Feb 2024 12:42:07 -0800 Subject: [PATCH] Add font loader --- MODULE.bazel | 30 +- MODULE.bazel.lock | 1603 +++++++++++++++++++++++++++++---- device/device.h | 6 +- game/game.c | 6 +- pytools/.gitignore | 1 + pytools/BUILD | 10 + pytools/font.py | 53 ++ pytools/requirements.txt | 1 + sys/BUILD | 21 +- sys/fonts/sys_font_normal.png | Bin 0 -> 4288 bytes sys/fonts/sys_font_small.h | 8 + sys/fonts/sys_font_small.png | Bin 0 -> 34069 bytes sys/sys.h | 1 + sys/sys_data.h | 1 + sys/sys_graphics.c | 26 + sys/sys_graphics.h | 7 +- 16 files changed, 1584 insertions(+), 190 deletions(-) create mode 100644 pytools/.gitignore create mode 100644 pytools/BUILD create mode 100644 pytools/font.py create mode 100644 pytools/requirements.txt create mode 100644 sys/fonts/sys_font_normal.png create mode 100644 sys/fonts/sys_font_small.h create mode 100644 sys/fonts/sys_font_small.png diff --git a/MODULE.bazel b/MODULE.bazel index 00bb183..df31f94 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -1,6 +1,24 @@ -############################################################################### -# Bazel now uses Bzlmod by default to manage external dependencies. -# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. -# -# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 -############################################################################### +""" +CrocParty: a tiny platformer. +""" +module( + name="crocparty", + version="0.0", +) + +bazel_dep(name="rules_python", version="0.31.0") + +# Set up Python +python = use_extension("@rules_python//python/extensions:python.bzl", "python") +python.toolchain( + python_version = "3.10", + is_default = True, +) + +pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip") +pip.parse( + hub_name = "pytools_deps", + python_version = "3.10", + requirements_lock = "//pytools:requirements.txt", +) +use_repo(pip, "pytools_deps") \ No newline at end of file diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 95bd134..5266287 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1,6 +1,6 @@ { "lockFileVersion": 3, - "moduleFileHash": "26410c1d586b610379d5f0071d4dd5919188e0ec421ce4608d07c972ac622678", + "moduleFileHash": "f69bdb13b0df2f6d309d415437228ebef31fa559567a65ecfe60de77e328ae1d", "flags": { "cmdRegistries": [ "https://bcr.bazel.build/" @@ -17,18 +17,192 @@ }, "moduleDepGraph": { "": { - "name": "", - "version": "", + "name": "crocparty", + "version": "0.0", "key": "", - "repoName": "", + "repoName": "crocparty", "executionPlatformsToRegister": [], "toolchainsToRegister": [], - "extensionUsages": [], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_python//python/extensions:python.bzl", + "extensionName": "python", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 12, + "column": 23 + }, + "imports": {}, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "python_version": "3.10", + "is_default": true + }, + "devDependency": false, + "location": { + "file": "@@//:MODULE.bazel", + "line": 13, + "column": 17 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_python//python/extensions:pip.bzl", + "extensionName": "pip", + "usingModule": "", + "location": { + "file": "@@//:MODULE.bazel", + "line": 18, + "column": 20 + }, + "imports": { + "pytools_deps": "pytools_deps" + }, + "devImports": [], + "tags": [ + { + "tagName": "parse", + "attributeValues": { + "hub_name": "pytools_deps", + "python_version": "3.10", + "requirements_lock": "//pytools:requirements.txt" + }, + "devDependency": false, + "location": { + "file": "@@//:MODULE.bazel", + "line": 19, + "column": 10 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], "deps": { + "rules_python": "rules_python@0.31.0", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" } }, + "rules_python@0.31.0": { + "name": "rules_python", + "version": "0.31.0", + "key": "rules_python@0.31.0", + "repoName": "rules_python", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "@pythons_hub//:all" + ], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_python//python/private/bzlmod:internal_deps.bzl", + "extensionName": "internal_deps", + "usingModule": "rules_python@0.31.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", + "line": 15, + "column": 30 + }, + "imports": { + "rules_python_internal": "rules_python_internal", + "pypi__build": "pypi__build", + "pypi__click": "pypi__click", + "pypi__colorama": "pypi__colorama", + "pypi__importlib_metadata": "pypi__importlib_metadata", + "pypi__installer": "pypi__installer", + "pypi__more_itertools": "pypi__more_itertools", + "pypi__packaging": "pypi__packaging", + "pypi__pep517": "pypi__pep517", + "pypi__pip": "pypi__pip", + "pypi__pip_tools": "pypi__pip_tools", + "pypi__pyproject_hooks": "pypi__pyproject_hooks", + "pypi__setuptools": "pypi__setuptools", + "pypi__tomli": "pypi__tomli", + "pypi__wheel": "pypi__wheel", + "pypi__zipp": "pypi__zipp" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": {}, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", + "line": 16, + "column": 22 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": "@rules_python//python/extensions:python.bzl", + "extensionName": "python", + "usingModule": "rules_python@0.31.0", + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", + "line": 41, + "column": 23 + }, + "imports": { + "pythons_hub": "pythons_hub" + }, + "devImports": [], + "tags": [ + { + "tagName": "toolchain", + "attributeValues": { + "is_default": true, + "python_version": "3.11" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel", + "line": 47, + "column": 17 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_features": "bazel_features@1.1.1", + "bazel_skylib": "bazel_skylib@1.3.0", + "platforms": "platforms@0.0.7", + "rules_proto": "rules_proto@5.3.0-21.7", + "com_google_protobuf": "protobuf@21.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0", + "urls": [ + "https://github.com/bazelbuild/rules_python/releases/download/0.31.0/rules_python-0.31.0.tar.gz" + ], + "integrity": "sha256-xovcT77CXeW1STuIGc/Id8TqKZwNyxXCRMWgAgjN4xE=", + "strip_prefix": "rules_python-0.31.0", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_python/0.31.0/patches/module_dot_bazel_version.patch": "sha256-j2KF6j66J2fRAGtc56Zj7Hp1dTGqOWPAR3+IODr0oLQ=" + }, + "remote_patch_strip": 1 + } + } + }, "bazel_tools@_": { "name": "bazel_tools", "version": "", @@ -154,10 +328,10 @@ "rules_cc": "rules_cc@0.0.9", "rules_java": "rules_java@7.1.0", "rules_license": "rules_license@0.0.7", - "rules_proto": "rules_proto@4.0.0", - "rules_python": "rules_python@0.4.0", + "rules_proto": "rules_proto@5.3.0-21.7", + "rules_python": "rules_python@0.31.0", "platforms": "platforms@0.0.7", - "com_google_protobuf": "protobuf@3.19.6", + "com_google_protobuf": "protobuf@21.7", "zlib": "zlib@1.3", "build_bazel_apple_support": "apple_support@1.5.0", "local_config_platform": "local_config_platform@_" @@ -176,6 +350,228 @@ "bazel_tools": "bazel_tools@_" } }, + "bazel_features@1.1.1": { + "name": "bazel_features", + "version": "1.1.1", + "key": "bazel_features@1.1.1", + "repoName": "bazel_features", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@bazel_features//private:extensions.bzl", + "extensionName": "version_extension", + "usingModule": "bazel_features@1.1.1", + "location": { + "file": "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel", + "line": 6, + "column": 24 + }, + "imports": { + "bazel_features_globals": "bazel_features_globals", + "bazel_features_version": "bazel_features_version" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_features~1.1.1", + "urls": [ + "https://github.com/bazel-contrib/bazel_features/releases/download/v1.1.1/bazel_features-v1.1.1.tar.gz" + ], + "integrity": "sha256-YsJuQn5cvHUQJERpJ2IuOYqdzfMsZDJSOIFXCdEcEag=", + "strip_prefix": "bazel_features-1.1.1", + "remote_patches": { + "https://bcr.bazel.build/modules/bazel_features/1.1.1/patches/module_dot_bazel_version.patch": "sha256-+56MAEsc7bYN/Pzhn252ZQUxiRzZg9bynXj1qpsmCYs=" + }, + "remote_patch_strip": 1 + } + } + }, + "bazel_skylib@1.3.0": { + "name": "bazel_skylib", + "version": "1.3.0", + "key": "bazel_skylib@1.3.0", + "repoName": "bazel_skylib", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [ + "//toolchains/unittest:cmd_toolchain", + "//toolchains/unittest:bash_toolchain" + ], + "extensionUsages": [], + "deps": { + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "bazel_skylib~1.3.0", + "urls": [ + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz" + ], + "integrity": "sha256-dNVE2W9KW7Yw1GXKi7z+Ix41lOWq5X4e2/F6brPKJQY=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "platforms@0.0.7": { + "name": "platforms", + "version": "0.0.7", + "key": "platforms@0.0.7", + "repoName": "platforms", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "rules_license": "rules_license@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "platforms", + "urls": [ + "https://github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz" + ], + "integrity": "sha256-OlYcmee9vpFzqmU/1Xn+hJ8djWc5V4CrR3Cx84FDHVE=", + "strip_prefix": "", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "rules_proto@5.3.0-21.7": { + "name": "rules_proto", + "version": "5.3.0-21.7", + "key": "rules_proto@5.3.0-21.7", + "repoName": "rules_proto", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "com_google_protobuf": "protobuf@21.7", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_proto~5.3.0-21.7", + "urls": [ + "https://github.com/bazelbuild/rules_proto/archive/refs/tags/5.3.0-21.7.tar.gz" + ], + "integrity": "sha256-3D+yBqLLNEG0heseQjFlsjEjWh6psDG0Qzz3vB+kYN0=", + "strip_prefix": "rules_proto-5.3.0-21.7", + "remote_patches": {}, + "remote_patch_strip": 0 + } + } + }, + "protobuf@21.7": { + "name": "protobuf", + "version": "21.7", + "key": "protobuf@21.7", + "repoName": "protobuf", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_jvm_external//:extensions.bzl", + "extensionName": "maven", + "usingModule": "protobuf@21.7", + "location": { + "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", + "line": 22, + "column": 22 + }, + "imports": { + "maven": "maven" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": { + "name": "maven", + "artifacts": [ + "com.google.code.findbugs:jsr305:3.0.2", + "com.google.code.gson:gson:2.8.9", + "com.google.errorprone:error_prone_annotations:2.3.2", + "com.google.j2objc:j2objc-annotations:1.3", + "com.google.guava:guava:31.1-jre", + "com.google.guava:guava-testlib:31.1-jre", + "com.google.truth:truth:1.1.2", + "junit:junit:4.13.2", + "org.mockito:mockito-core:4.3.1" + ] + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel", + "line": 24, + "column": 14 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_python": "rules_python@0.31.0", + "rules_cc": "rules_cc@0.0.9", + "rules_proto": "rules_proto@5.3.0-21.7", + "rules_java": "rules_java@7.1.0", + "rules_pkg": "rules_pkg@0.7.0", + "com_google_abseil": "abseil-cpp@20211102.0", + "zlib": "zlib@1.3", + "upb": "upb@0.0.0-20220923-a547704", + "rules_jvm_external": "rules_jvm_external@4.4.2", + "com_google_googletest": "googletest@1.11.0", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "protobuf~21.7", + "urls": [ + "https://github.com/protocolbuffers/protobuf/releases/download/v21.7/protobuf-all-21.7.zip" + ], + "integrity": "sha256-VJOiH17T/FAuZv7GuUScBqVRztYwAvpIkDxA36jeeko=", + "strip_prefix": "protobuf-21.7", + "remote_patches": { + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel.patch": "sha256-q3V2+eq0v2XF0z8z+V+QF4cynD6JvHI1y3kI/+rzl5s=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_module_dot_bazel_for_examples.patch": "sha256-O7YP6s3lo/1opUiO0jqXYORNHdZ/2q3hjz1QGy8QdIU=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/relative_repo_names.patch": "sha256-RK9RjW8T5UJNG7flIrnFiNE9vKwWB+8uWWtJqXYT0w4=", + "https://bcr.bazel.build/modules/protobuf/21.7/patches/add_missing_files.patch": "sha256-Hyne4DG2u5bXcWHNxNMirA2QFAe/2Cl8oMm1XJdkQIY=" + }, + "remote_patch_strip": 1 + } + } + }, "rules_cc@0.0.9": { "name": "rules_cc", "version": "0.0.9", @@ -307,7 +703,7 @@ "platforms": "platforms@0.0.7", "rules_cc": "rules_cc@0.0.9", "bazel_skylib": "bazel_skylib@1.3.0", - "rules_proto": "rules_proto@4.0.0", + "rules_proto": "rules_proto@5.3.0-21.7", "rules_license": "rules_license@0.0.7", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -354,158 +750,6 @@ } } }, - "rules_proto@4.0.0": { - "name": "rules_proto", - "version": "4.0.0", - "key": "rules_proto@4.0.0", - "repoName": "rules_proto", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", - "rules_cc": "rules_cc@0.0.9", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_proto~4.0.0", - "urls": [ - "https://github.com/bazelbuild/rules_proto/archive/refs/tags/4.0.0.zip" - ], - "integrity": "sha256-Lr5z6xyuRA19pNtRYMGjKaynwQpck4H/lwYyVjyhoq4=", - "strip_prefix": "rules_proto-4.0.0", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_proto/4.0.0/patches/module_dot_bazel.patch": "sha256-MclJO7tIAM2ElDAmscNId9pKTpOuDGHgVlW/9VBOIp0=" - }, - "remote_patch_strip": 0 - } - } - }, - "rules_python@0.4.0": { - "name": "rules_python", - "version": "0.4.0", - "key": "rules_python@0.4.0", - "repoName": "rules_python", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "@bazel_tools//tools/python:autodetecting_toolchain" - ], - "extensionUsages": [ - { - "extensionBzlFile": "@rules_python//bzlmod:extensions.bzl", - "extensionName": "pip_install", - "usingModule": "rules_python@0.4.0", - "location": { - "file": "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel", - "line": 7, - "column": 28 - }, - "imports": { - "pypi__click": "pypi__click", - "pypi__pip": "pypi__pip", - "pypi__pip_tools": "pypi__pip_tools", - "pypi__pkginfo": "pypi__pkginfo", - "pypi__setuptools": "pypi__setuptools", - "pypi__wheel": "pypi__wheel" - }, - "devImports": [], - "tags": [], - "hasDevUseExtension": false, - "hasNonDevUseExtension": true - } - ], - "deps": { - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "rules_python~0.4.0", - "urls": [ - "https://github.com/bazelbuild/rules_python/releases/download/0.4.0/rules_python-0.4.0.tar.gz" - ], - "integrity": "sha256-lUqom0kb5KCDMEosuDgBnIuMNyCnq7nEy4GseiQjDOo=", - "strip_prefix": "", - "remote_patches": { - "https://bcr.bazel.build/modules/rules_python/0.4.0/patches/propagate_pip_install_dependencies.patch": "sha256-v7S/dem/mixg63MF4KoRGDA4KEol9ab/tIVp+6Xq0D0=", - "https://bcr.bazel.build/modules/rules_python/0.4.0/patches/module_dot_bazel.patch": "sha256-kG4VIfWxQazzTuh50mvsx6pmyoRVA4lfH5rkto/Oq+Y=" - }, - "remote_patch_strip": 1 - } - } - }, - "platforms@0.0.7": { - "name": "platforms", - "version": "0.0.7", - "key": "platforms@0.0.7", - "repoName": "platforms", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "rules_license": "rules_license@0.0.7", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "platforms", - "urls": [ - "https://github.com/bazelbuild/platforms/releases/download/0.0.7/platforms-0.0.7.tar.gz" - ], - "integrity": "sha256-OlYcmee9vpFzqmU/1Xn+hJ8djWc5V4CrR3Cx84FDHVE=", - "strip_prefix": "", - "remote_patches": {}, - "remote_patch_strip": 0 - } - } - }, - "protobuf@3.19.6": { - "name": "protobuf", - "version": "3.19.6", - "key": "protobuf@3.19.6", - "repoName": "protobuf", - "executionPlatformsToRegister": [], - "toolchainsToRegister": [], - "extensionUsages": [], - "deps": { - "bazel_skylib": "bazel_skylib@1.3.0", - "zlib": "zlib@1.3", - "rules_python": "rules_python@0.4.0", - "rules_cc": "rules_cc@0.0.9", - "rules_proto": "rules_proto@4.0.0", - "rules_java": "rules_java@7.1.0", - "bazel_tools": "bazel_tools@_", - "local_config_platform": "local_config_platform@_" - }, - "repoSpec": { - "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", - "ruleClassName": "http_archive", - "attributes": { - "name": "protobuf~3.19.6", - "urls": [ - "https://github.com/protocolbuffers/protobuf/archive/refs/tags/v3.19.6.zip" - ], - "integrity": "sha256-OH4sVZuyx8G8N5jE5s/wFTgaebJ1hpavy/johzC0c4k=", - "strip_prefix": "protobuf-3.19.6", - "remote_patches": { - "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/relative_repo_names.patch": "sha256-w/5gw/zGv8NFId+669hcdw1Uus2lxgYpulATHIwIByI=", - "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/remove_dependency_on_rules_jvm_external.patch": "sha256-THUTnVgEBmjA0W7fKzIyZOVG58DnW9HQTkr4D2zKUUc=", - "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/add_module_dot_bazel_for_examples.patch": "sha256-s/b1gi3baK3LsXefI2rQilhmkb2R5jVJdnT6zEcdfHY=", - "https://bcr.bazel.build/modules/protobuf/3.19.6/patches/module_dot_bazel.patch": "sha256-S0DEni8zgx7rHscW3z/rCEubQnYec0XhNet640cw0h4=" - }, - "remote_patch_strip": 1 - } - } - }, "zlib@1.3": { "name": "zlib", "version": "1.3", @@ -588,18 +832,48 @@ } } }, - "bazel_skylib@1.3.0": { - "name": "bazel_skylib", - "version": "1.3.0", - "key": "bazel_skylib@1.3.0", - "repoName": "bazel_skylib", + "rules_pkg@0.7.0": { + "name": "rules_pkg", + "version": "0.7.0", + "key": "rules_pkg@0.7.0", + "repoName": "rules_pkg", "executionPlatformsToRegister": [], - "toolchainsToRegister": [ - "//toolchains/unittest:cmd_toolchain", - "//toolchains/unittest:bash_toolchain" - ], + "toolchainsToRegister": [], "extensionUsages": [], "deps": { + "rules_python": "rules_python@0.31.0", + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_license": "rules_license@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_pkg~0.7.0", + "urls": [ + "https://github.com/bazelbuild/rules_pkg/releases/download/0.7.0/rules_pkg-0.7.0.tar.gz" + ], + "integrity": "sha256-iimOgydi7aGDBZfWT+fbWBeKqEzVkm121bdE1lWJQcI=", + "strip_prefix": "", + "remote_patches": { + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/patches/module_dot_bazel.patch": "sha256-4OaEPZwYF6iC71ZTDg6MJ7LLqX7ZA0/kK4mT+4xKqiE=" + }, + "remote_patch_strip": 0 + } + } + }, + "abseil-cpp@20211102.0": { + "name": "abseil-cpp", + "version": "20211102.0", + "key": "abseil-cpp@20211102.0", + "repoName": "abseil-cpp", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "rules_cc": "rules_cc@0.0.9", "platforms": "platforms@0.0.7", "bazel_tools": "bazel_tools@_", "local_config_platform": "local_config_platform@_" @@ -608,16 +882,200 @@ "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", "ruleClassName": "http_archive", "attributes": { - "name": "bazel_skylib~1.3.0", + "name": "abseil-cpp~20211102.0", "urls": [ - "https://github.com/bazelbuild/bazel-skylib/releases/download/1.3.0/bazel-skylib-1.3.0.tar.gz" + "https://github.com/abseil/abseil-cpp/archive/refs/tags/20211102.0.tar.gz" ], - "integrity": "sha256-dNVE2W9KW7Yw1GXKi7z+Ix41lOWq5X4e2/F6brPKJQY=", - "strip_prefix": "", + "integrity": "sha256-3PcbnLqNwMqZQMSzFqDHlr6Pq0KwcLtrfKtitI8OZsQ=", + "strip_prefix": "abseil-cpp-20211102.0", + "remote_patches": { + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/patches/module_dot_bazel.patch": "sha256-4izqopgGCey4jVZzl/w3M2GVPNohjh2B5TmbThZNvPY=" + }, + "remote_patch_strip": 0 + } + } + }, + "upb@0.0.0-20220923-a547704": { + "name": "upb", + "version": "0.0.0-20220923-a547704", + "key": "upb@0.0.0-20220923-a547704", + "repoName": "upb", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_proto": "rules_proto@5.3.0-21.7", + "com_google_protobuf": "protobuf@21.7", + "com_google_absl": "abseil-cpp@20211102.0", + "platforms": "platforms@0.0.7", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "upb~0.0.0-20220923-a547704", + "urls": [ + "https://github.com/protocolbuffers/upb/archive/a5477045acaa34586420942098f5fecd3570f577.tar.gz" + ], + "integrity": "sha256-z39x6v+QskwaKLSWRan/A6mmwecTQpHOcJActj5zZLU=", + "strip_prefix": "upb-a5477045acaa34586420942098f5fecd3570f577", + "remote_patches": { + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/patches/module_dot_bazel.patch": "sha256-wH4mNS6ZYy+8uC0HoAft/c7SDsq2Kxf+J8dUakXhaB0=" + }, + "remote_patch_strip": 0 + } + } + }, + "rules_jvm_external@4.4.2": { + "name": "rules_jvm_external", + "version": "4.4.2", + "key": "rules_jvm_external@4.4.2", + "repoName": "rules_jvm_external", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [ + { + "extensionBzlFile": "@rules_jvm_external//:non-module-deps.bzl", + "extensionName": "non_module_deps", + "usingModule": "rules_jvm_external@4.4.2", + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 9, + "column": 32 + }, + "imports": { + "io_bazel_rules_kotlin": "io_bazel_rules_kotlin" + }, + "devImports": [], + "tags": [], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + }, + { + "extensionBzlFile": ":extensions.bzl", + "extensionName": "maven", + "usingModule": "rules_jvm_external@4.4.2", + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 16, + "column": 22 + }, + "imports": { + "rules_jvm_external_deps": "rules_jvm_external_deps" + }, + "devImports": [], + "tags": [ + { + "tagName": "install", + "attributeValues": { + "name": "rules_jvm_external_deps", + "artifacts": [ + "com.google.cloud:google-cloud-core:1.93.10", + "com.google.cloud:google-cloud-storage:1.113.4", + "com.google.code.gson:gson:2.9.0", + "org.apache.maven:maven-artifact:3.8.6", + "software.amazon.awssdk:s3:2.17.183" + ], + "lock_file": "@rules_jvm_external//:rules_jvm_external_deps_install.json" + }, + "devDependency": false, + "location": { + "file": "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel", + "line": 18, + "column": 14 + } + } + ], + "hasDevUseExtension": false, + "hasNonDevUseExtension": true + } + ], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "io_bazel_stardoc": "stardoc@0.5.1", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_jvm_external~4.4.2", + "urls": [ + "https://github.com/bazelbuild/rules_jvm_external/archive/refs/tags/4.4.2.zip" + ], + "integrity": "sha256-c1YC9QgT6y6pPKP15DsZWb2AshO4NqB6YqKddXZwt3s=", + "strip_prefix": "rules_jvm_external-4.4.2", "remote_patches": {}, "remote_patch_strip": 0 } } + }, + "googletest@1.11.0": { + "name": "googletest", + "version": "1.11.0", + "key": "googletest@1.11.0", + "repoName": "googletest", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "com_google_absl": "abseil-cpp@20211102.0", + "platforms": "platforms@0.0.7", + "rules_cc": "rules_cc@0.0.9", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "googletest~1.11.0", + "urls": [ + "https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz" + ], + "integrity": "sha256-tIcL8SH/d5W6INILzdhie44Ijy0dqymaAxwQNO3ck9U=", + "strip_prefix": "googletest-release-1.11.0", + "remote_patches": { + "https://bcr.bazel.build/modules/googletest/1.11.0/patches/module_dot_bazel.patch": "sha256-HuahEdI/n8KCI071sN3CEziX+7qP/Ec77IWayYunLP0=" + }, + "remote_patch_strip": 0 + } + } + }, + "stardoc@0.5.1": { + "name": "stardoc", + "version": "0.5.1", + "key": "stardoc@0.5.1", + "repoName": "stardoc", + "executionPlatformsToRegister": [], + "toolchainsToRegister": [], + "extensionUsages": [], + "deps": { + "bazel_skylib": "bazel_skylib@1.3.0", + "rules_java": "rules_java@7.1.0", + "bazel_tools": "bazel_tools@_", + "local_config_platform": "local_config_platform@_" + }, + "repoSpec": { + "bzlFile": "@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "stardoc~0.5.1", + "urls": [ + "https://github.com/bazelbuild/stardoc/releases/download/0.5.1/stardoc-0.5.1.tar.gz" + ], + "integrity": "sha256-qoFNrgrEALurLoiB+ZFcb0fElmS/CHxAmhX5BDjSwj4=", + "strip_prefix": "", + "remote_patches": { + "https://bcr.bazel.build/modules/stardoc/0.5.1/patches/module_dot_bazel.patch": "sha256-UAULCuTpJE7SG0YrR9XLjMfxMRmbP+za3uW9ONZ5rjI=" + }, + "remote_patch_strip": 0 + } + } } }, "moduleExtensions": { @@ -651,6 +1109,35 @@ ] } }, + "@@bazel_features~1.1.1//private:extensions.bzl%version_extension": { + "general": { + "bzlTransitiveDigest": "xm7Skm1Las5saxzFWt2hbS+e68BWi+MXyt6+lKIhjPA=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "bazel_features_version": { + "bzlFile": "@@bazel_features~1.1.1//private:version_repo.bzl", + "ruleClassName": "version_repo", + "attributes": { + "name": "bazel_features~1.1.1~version_extension~bazel_features_version" + } + }, + "bazel_features_globals": { + "bzlFile": "@@bazel_features~1.1.1//private:globals_repo.bzl", + "ruleClassName": "globals_repo", + "attributes": { + "name": "bazel_features~1.1.1~version_extension~bazel_features_globals", + "globals": { + "RunEnvironmentInfo": "5.3.0", + "DefaultInfo": "0.0.1", + "__TestingOnly_NeverAvailable": "1000000000.0.0" + } + } + } + }, + "recordedRepoMappingEntries": [] + } + }, "@@bazel_tools//tools/cpp:cc_configure.bzl%cc_configure_extension": { "general": { "bzlTransitiveDigest": "mcsWHq3xORJexV5/4eCvNOLxFOQKV6eli3fkr+tEaqE=", @@ -1249,6 +1736,774 @@ ] ] } + }, + "@@rules_python~0.31.0//python/extensions:pip.bzl%pip": { + "os:windows,arch:amd64": { + "bzlTransitiveDigest": "EY+DGyyJhrqMHBCiplU6kCYiNtiUXl3Olt6+vF4JnfE=", + "accumulatedFileDigests": { + "@@//pytools:requirements.txt": "ecb2c096486b1bb4dbe407a48fb3375ba496b6ea658c0cd7fc34571f381cd504" + }, + "envVariables": {}, + "generatedRepoSpecs": { + "pytools_deps_310_pillow": { + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "whl_library", + "attributes": { + "name": "rules_python~0.31.0~pip~pytools_deps_310_pillow", + "requirement": "pillow==10.2.0", + "repo": "pytools_deps_310", + "repo_prefix": "pytools_deps_310_", + "whl_patches": {}, + "experimental_target_platforms": [], + "python_interpreter": "", + "python_interpreter_target": "@@rules_python~0.31.0~python~python_3_10_host//:python", + "quiet": true, + "timeout": 600, + "isolated": true, + "extra_pip_args": [], + "download_only": false, + "pip_data_exclude": [], + "enable_implicit_namespace_pkgs": false, + "environment": {}, + "envsubst": [], + "group_name": "", + "group_deps": [] + } + }, + "pytools_deps_310__groups": { + "bzlFile": "@@rules_python~0.31.0//python/pip_install:pip_repository.bzl", + "ruleClassName": "group_library", + "attributes": { + "name": "rules_python~0.31.0~pip~pytools_deps_310__groups", + "repo_prefix": "pytools_deps_310_", + "groups": {} + } + }, + "pytools_deps": { + "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pip_repository.bzl", + "ruleClassName": "pip_repository", + "attributes": { + "name": "rules_python~0.31.0~pip~pytools_deps", + "repo_name": "pytools_deps", + "whl_map": { + "pillow": [ + "3.10" + ] + }, + "default_version": "3.10" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "bazel_features~1.1.1", + "bazel_features_globals", + "bazel_features~1.1.1~version_extension~bazel_features_globals" + ], + [ + "bazel_features~1.1.1", + "bazel_features_version", + "bazel_features~1.1.1~version_extension~bazel_features_version" + ], + [ + "rules_python~0.31.0", + "bazel_features", + "bazel_features~1.1.1" + ], + [ + "rules_python~0.31.0", + "bazel_skylib", + "bazel_skylib~1.3.0" + ], + [ + "rules_python~0.31.0", + "bazel_tools", + "bazel_tools" + ], + [ + "rules_python~0.31.0", + "pypi__build", + "rules_python~0.31.0~internal_deps~pypi__build" + ], + [ + "rules_python~0.31.0", + "pypi__click", + "rules_python~0.31.0~internal_deps~pypi__click" + ], + [ + "rules_python~0.31.0", + "pypi__colorama", + "rules_python~0.31.0~internal_deps~pypi__colorama" + ], + [ + "rules_python~0.31.0", + "pypi__importlib_metadata", + "rules_python~0.31.0~internal_deps~pypi__importlib_metadata" + ], + [ + "rules_python~0.31.0", + "pypi__installer", + "rules_python~0.31.0~internal_deps~pypi__installer" + ], + [ + "rules_python~0.31.0", + "pypi__more_itertools", + "rules_python~0.31.0~internal_deps~pypi__more_itertools" + ], + [ + "rules_python~0.31.0", + "pypi__packaging", + "rules_python~0.31.0~internal_deps~pypi__packaging" + ], + [ + "rules_python~0.31.0", + "pypi__pep517", + "rules_python~0.31.0~internal_deps~pypi__pep517" + ], + [ + "rules_python~0.31.0", + "pypi__pip", + "rules_python~0.31.0~internal_deps~pypi__pip" + ], + [ + "rules_python~0.31.0", + "pypi__pip_tools", + "rules_python~0.31.0~internal_deps~pypi__pip_tools" + ], + [ + "rules_python~0.31.0", + "pypi__pyproject_hooks", + "rules_python~0.31.0~internal_deps~pypi__pyproject_hooks" + ], + [ + "rules_python~0.31.0", + "pypi__setuptools", + "rules_python~0.31.0~internal_deps~pypi__setuptools" + ], + [ + "rules_python~0.31.0", + "pypi__tomli", + "rules_python~0.31.0~internal_deps~pypi__tomli" + ], + [ + "rules_python~0.31.0", + "pypi__wheel", + "rules_python~0.31.0~internal_deps~pypi__wheel" + ], + [ + "rules_python~0.31.0", + "pypi__zipp", + "rules_python~0.31.0~internal_deps~pypi__zipp" + ], + [ + "rules_python~0.31.0", + "pythons_hub", + "rules_python~0.31.0~python~pythons_hub" + ], + [ + "rules_python~0.31.0~python~pythons_hub", + "python_3_10_host", + "rules_python~0.31.0~python~python_3_10_host" + ], + [ + "rules_python~0.31.0~python~pythons_hub", + "python_3_10_x86_64-pc-windows-msvc", + "rules_python~0.31.0~python~python_3_10_x86_64-pc-windows-msvc" + ], + [ + "rules_python~0.31.0~python~pythons_hub", + "python_3_11_host", + "rules_python~0.31.0~python~python_3_11_host" + ], + [ + "rules_python~0.31.0~python~pythons_hub", + "python_3_11_x86_64-pc-windows-msvc", + "rules_python~0.31.0~python~python_3_11_x86_64-pc-windows-msvc" + ] + ] + } + }, + "@@rules_python~0.31.0//python/extensions:python.bzl%python": { + "general": { + "bzlTransitiveDigest": "nfcQ92K2B0JOoUwqlGTKoGF7+XoHjDW/y8t8LMG8TE4=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "python_3_11_s390x-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_s390x-unknown-linux-gnu", + "sha256": "49520e3ff494708020f306e30b0964f079170be83e956be4504f850557378a22", + "patches": [], + "platform": "s390x-unknown-linux-gnu", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-s390x-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_host": { + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", + "ruleClassName": "host_toolchain", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_host", + "python_version": "3.11.7", + "user_repository_name": "python_3_11", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_10_aarch64-apple-darwin": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_aarch64-apple-darwin", + "sha256": "fd027b1dedf1ea034cdaa272e91771bdf75ddef4c8653b05d224a0645aa2ca3c", + "patches": [], + "platform": "aarch64-apple-darwin", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-aarch64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-aarch64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10_x86_64-apple-darwin": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_x86_64-apple-darwin", + "sha256": "be0b19b6af1f7d8c667e5abef5505ad06cf72e5a11bb5844970c395a7e5b1275", + "patches": [], + "platform": "x86_64-apple-darwin", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-x86_64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-x86_64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_aarch64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_aarch64-unknown-linux-gnu", + "sha256": "b102eaf865eb715aa98a8a2ef19037b6cc3ae7dfd4a632802650f29de635aa13", + "patches": [], + "platform": "aarch64-unknown-linux-gnu", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_aarch64-apple-darwin": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_aarch64-apple-darwin", + "sha256": "b042c966920cf8465385ca3522986b12d745151a72c060991088977ca36d3883", + "patches": [], + "platform": "aarch64-apple-darwin", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-aarch64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10_ppc64le-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_ppc64le-unknown-linux-gnu", + "sha256": "f3f9c43eec1a0c3f72845d0b705da17a336d3906b7df212d2640b8f47e8ff375", + "patches": [], + "platform": "ppc64le-unknown-linux-gnu", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-ppc64le-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10_x86_64-pc-windows-msvc": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_x86_64-pc-windows-msvc", + "sha256": "b8d930ce0d04bda83037ad3653d7450f8907c88e24bb8255a29b8dab8930d6f1", + "patches": [], + "platform": "x86_64-pc-windows-msvc", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-x86_64-pc-windows-msvc-shared-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "pythons_hub": { + "bzlFile": "@@rules_python~0.31.0//python/private/bzlmod:pythons_hub.bzl", + "ruleClassName": "hub_repo", + "attributes": { + "name": "rules_python~0.31.0~python~pythons_hub", + "default_python_version": "3.10", + "toolchain_prefixes": [ + "_0000_python_3_11_", + "_0001_python_3_10_" + ], + "toolchain_python_versions": [ + "3.11", + "3.10" + ], + "toolchain_set_python_version_constraints": [ + "True", + "False" + ], + "toolchain_user_repository_names": [ + "python_3_11", + "python_3_10" + ] + } + }, + "python_3_11_x86_64-pc-windows-msvc": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_x86_64-pc-windows-msvc", + "sha256": "67077e6fa918e4f4fd60ba169820b00be7c390c497bf9bc9cab2c255ea8e6f3e", + "patches": [], + "platform": "x86_64-pc-windows-msvc", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-pc-windows-msvc-shared-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10_aarch64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_aarch64-unknown-linux-gnu", + "sha256": "8675915ff454ed2f1597e27794bc7df44f5933c26b94aa06af510fe91b58bb97", + "patches": [], + "platform": "aarch64-unknown-linux-gnu", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-aarch64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11": { + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", + "ruleClassName": "toolchain_aliases", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11", + "python_version": "3.11.7", + "user_repository_name": "python_3_11", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_10_s390x-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_s390x-unknown-linux-gnu", + "sha256": "859f6cfe9aedb6e8858892fdc124037e83ab05f28d42a7acd314c6a16d6bd66c", + "patches": [], + "platform": "s390x-unknown-linux-gnu", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-s390x-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-s390x-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10": { + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", + "ruleClassName": "toolchain_aliases", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10", + "python_version": "3.10.13", + "user_repository_name": "python_3_10", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_11_ppc64le-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_ppc64le-unknown-linux-gnu", + "sha256": "b44e1b74afe75c7b19143413632c4386708ae229117f8f950c2094e9681d34c7", + "patches": [], + "platform": "ppc64le-unknown-linux-gnu", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-ppc64le-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_11_x86_64-apple-darwin": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_x86_64-apple-darwin", + "sha256": "a0e615eef1fafdc742da0008425a9030b7ea68a4ae4e73ac557ef27b112836d4", + "patches": [], + "platform": "x86_64-apple-darwin", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-apple-darwin-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_versions": { + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", + "ruleClassName": "multi_toolchain_aliases", + "attributes": { + "name": "rules_python~0.31.0~python~python_versions", + "python_versions": { + "3.10": "python_3_10", + "3.11": "python_3_11" + } + } + }, + "python_3_10_x86_64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_x86_64-unknown-linux-gnu", + "sha256": "5d0429c67c992da19ba3eb58b3acd0b35ec5e915b8cae9a4aa8ca565c423847a", + "patches": [], + "platform": "x86_64-unknown-linux-gnu", + "python_version": "3.10.13", + "release_filename": "20231002/cpython-3.10.13+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20231002/cpython-3.10.13+20231002-x86_64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + }, + "python_3_10_host": { + "bzlFile": "@@rules_python~0.31.0//python/private:toolchains_repo.bzl", + "ruleClassName": "host_toolchain", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_10_host", + "python_version": "3.10.13", + "user_repository_name": "python_3_10", + "platforms": [ + "aarch64-apple-darwin", + "aarch64-unknown-linux-gnu", + "ppc64le-unknown-linux-gnu", + "s390x-unknown-linux-gnu", + "x86_64-apple-darwin", + "x86_64-pc-windows-msvc", + "x86_64-unknown-linux-gnu" + ] + } + }, + "python_3_11_x86_64-unknown-linux-gnu": { + "bzlFile": "@@rules_python~0.31.0//python:repositories.bzl", + "ruleClassName": "python_repository", + "attributes": { + "name": "rules_python~0.31.0~python~python_3_11_x86_64-unknown-linux-gnu", + "sha256": "4a51ce60007a6facf64e5495f4cf322e311ba9f39a8cd3f3e4c026eae488e140", + "patches": [], + "platform": "x86_64-unknown-linux-gnu", + "python_version": "3.11.7", + "release_filename": "20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz", + "urls": [ + "https://github.com/indygreg/python-build-standalone/releases/download/20240107/cpython-3.11.7+20240107-x86_64-unknown-linux-gnu-install_only.tar.gz" + ], + "distutils_content": "", + "strip_prefix": "python", + "coverage_tool": "", + "ignore_root_user_error": false + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_python~0.31.0", + "bazel_skylib", + "bazel_skylib~1.3.0" + ], + [ + "rules_python~0.31.0", + "bazel_tools", + "bazel_tools" + ] + ] + } + }, + "@@rules_python~0.31.0//python/private/bzlmod:internal_deps.bzl%internal_deps": { + "general": { + "bzlTransitiveDigest": "YM6cXp9AuQVARYWBY5VPn25r/wLyW6Lq09HCAiVNngE=", + "accumulatedFileDigests": {}, + "envVariables": {}, + "generatedRepoSpecs": { + "pypi__wheel": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__wheel", + "url": "https://files.pythonhosted.org/packages/b8/8b/31273bf66016be6ad22bb7345c37ff350276cfd46e389a0c2ac5da9d9073/wheel-0.41.2-py3-none-any.whl", + "sha256": "75909db2664838d015e3d9139004ee16711748a52c8f336b52882266540215d8", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__click": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__click", + "url": "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", + "sha256": "ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__importlib_metadata": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__importlib_metadata", + "url": "https://files.pythonhosted.org/packages/cc/37/db7ba97e676af155f5fcb1a35466f446eadc9104e25b83366e8088c9c926/importlib_metadata-6.8.0-py3-none-any.whl", + "sha256": "3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pyproject_hooks": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__pyproject_hooks", + "url": "https://files.pythonhosted.org/packages/d5/ea/9ae603de7fbb3df820b23a70f6aff92bf8c7770043254ad8d2dc9d6bcba4/pyproject_hooks-1.0.0-py3-none-any.whl", + "sha256": "283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pep517": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__pep517", + "url": "https://files.pythonhosted.org/packages/ee/2f/ef63e64e9429111e73d3d6cbee80591672d16f2725e648ebc52096f3d323/pep517-0.13.0-py3-none-any.whl", + "sha256": "4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__packaging": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__packaging", + "url": "https://files.pythonhosted.org/packages/ab/c3/57f0601a2d4fe15de7a553c00adbc901425661bf048f2a22dfc500caf121/packaging-23.1-py3-none-any.whl", + "sha256": "994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__pip_tools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__pip_tools", + "url": "https://files.pythonhosted.org/packages/e8/df/47e6267c6b5cdae867adbdd84b437393e6202ce4322de0a5e0b92960e1d6/pip_tools-7.3.0-py3-none-any.whl", + "sha256": "8717693288720a8c6ebd07149c93ab0be1fced0b5191df9e9decd3263e20d85e", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__setuptools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__setuptools", + "url": "https://files.pythonhosted.org/packages/4f/ab/0bcfebdfc3bfa8554b2b2c97a555569c4c1ebc74ea288741ea8326c51906/setuptools-68.1.2-py3-none-any.whl", + "sha256": "3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__zipp": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__zipp", + "url": "https://files.pythonhosted.org/packages/8c/08/d3006317aefe25ea79d3b76c9650afabaf6d63d1c8443b236e7405447503/zipp-3.16.2-py3-none-any.whl", + "sha256": "679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__colorama": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__colorama", + "url": "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", + "sha256": "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__build": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__build", + "url": "https://files.pythonhosted.org/packages/58/91/17b00d5fac63d3dca605f1b8269ba3c65e98059e1fd99d00283e42a454f0/build-0.10.0-py3-none-any.whl", + "sha256": "af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "rules_python_internal": { + "bzlFile": "@@rules_python~0.31.0//python/private:internal_config_repo.bzl", + "ruleClassName": "internal_config_repo", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~rules_python_internal" + } + }, + "pypi__pip": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__pip", + "url": "https://files.pythonhosted.org/packages/50/c2/e06851e8cc28dcad7c155f4753da8833ac06a5c704c109313b8d5a62968a/pip-23.2.1-py3-none-any.whl", + "sha256": "7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__installer": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__installer", + "url": "https://files.pythonhosted.org/packages/e5/ca/1172b6638d52f2d6caa2dd262ec4c811ba59eee96d54a7701930726bce18/installer-0.7.0-py3-none-any.whl", + "sha256": "05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__more_itertools": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__more_itertools", + "url": "https://files.pythonhosted.org/packages/5a/cb/6dce742ea14e47d6f565589e859ad225f2a5de576d7696e0623b784e226b/more_itertools-10.1.0-py3-none-any.whl", + "sha256": "64e0735fcfdc6f3464ea133afe8ea4483b1c5fe3a3d69852e6503b43a0b222e6", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + }, + "pypi__tomli": { + "bzlFile": "@@bazel_tools//tools/build_defs/repo:http.bzl", + "ruleClassName": "http_archive", + "attributes": { + "name": "rules_python~0.31.0~internal_deps~pypi__tomli", + "url": "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", + "sha256": "939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "type": "zip", + "build_file_content": "package(default_visibility = [\"//visibility:public\"])\n\nload(\"@rules_python//python:defs.bzl\", \"py_library\")\n\npy_library(\n name = \"lib\",\n srcs = glob([\"**/*.py\"]),\n data = glob([\"**/*\"], exclude=[\n # These entries include those put into user-installed dependencies by\n # data_exclude in /python/pip_install/tools/bazel.py\n # to avoid non-determinism following pip install's behavior.\n \"**/*.py\",\n \"**/*.pyc\",\n \"**/*.pyc.*\", # During pyc creation, temp files named *.pyc.NNN are created\n \"**/* *\",\n \"**/*.dist-info/RECORD\",\n \"BUILD\",\n \"WORKSPACE\",\n ]),\n # This makes this directory a top-level in the python import\n # search path for anything that depends on this.\n imports = [\".\"],\n)\n" + } + } + }, + "recordedRepoMappingEntries": [ + [ + "rules_python~0.31.0", + "bazel_tools", + "bazel_tools" + ] + ] + } } } } diff --git a/device/device.h b/device/device.h index c6a9389..df5f6fb 100644 --- a/device/device.h +++ b/device/device.h @@ -4,9 +4,9 @@ #include #include -// 240 x 135 is also cool -#define DEVICE_W 128 -#define DEVICE_H 128 +// 256 x 144 is also cool +#define DEVICE_W 256 +#define DEVICE_H 144 typedef enum { DEVICE_BUTTON_L=0, diff --git a/game/game.c b/game/game.c index 51059f1..f4930c1 100644 --- a/game/game.c +++ b/game/game.c @@ -49,10 +49,10 @@ void game_update() { ellipse_x0 += ellipse_dx0; if (ellipse_x0 < 0 || ellipse_x0 > DEVICE_W * 4) { ellipse_dx0 *= -1; } ellipse_y0 += ellipse_dy0; - if (ellipse_y0 < 0 || ellipse_y0 > DEVICE_W * 4) { ellipse_dy0 *= -1; } + if (ellipse_y0 < 0 || ellipse_y0 > DEVICE_H * 4) { ellipse_dy0 *= -1; } ellipse_x1 += ellipse_dx1; - if (ellipse_x1 < 0 || ellipse_x1 > DEVICE_H * 4) { ellipse_dx1 *= -1; } + if (ellipse_x1 < 0 || ellipse_x1 > DEVICE_W * 4) { ellipse_dx1 *= -1; } ellipse_y1 += ellipse_dy1; if (ellipse_y1 < 0 || ellipse_y1 > DEVICE_H * 4) { ellipse_dy1 *= -1; } } @@ -89,4 +89,6 @@ void game_draw() { sys_circ_draw_ext(x0, y0, 6, 248, false); sys_circ_draw_ext(x0, y0, 8, 244, false); sys_line_draw(x0, y0, x1, y1, 254); + + sys_print("Hello, blood\nsources!", x1, y1, 224); } diff --git a/pytools/.gitignore b/pytools/.gitignore new file mode 100644 index 0000000..eba74f4 --- /dev/null +++ b/pytools/.gitignore @@ -0,0 +1 @@ +venv/ \ No newline at end of file diff --git a/pytools/BUILD b/pytools/BUILD new file mode 100644 index 0000000..be2c7b9 --- /dev/null +++ b/pytools/BUILD @@ -0,0 +1,10 @@ +load("@pytools_deps//:requirements.bzl", "requirement") + +py_binary( + name = "font", + srcs = ["font.py"], + deps = [ + requirement("pillow"), + ], + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/pytools/font.py b/pytools/font.py new file mode 100644 index 0000000..b0f0b1f --- /dev/null +++ b/pytools/font.py @@ -0,0 +1,53 @@ +from typing import Tuple +from PIL import Image +import sys + + +def main(font_name, n_glyphs, fname_png, fname_c): + glyphs = load_glyphs(fname_png) + assert(len(glyphs) == n_glyphs), f"must be exactly {n_glyphs} glyphs" + + with open(fname_c, "wt") as output: + output.writelines([ + "// generated code! be nice!\n", + "#include \"sys/sys.h\";\n", + f"sys_glyph {font_name}[{n_glyphs}] = {{{', '.join(str(g) for g in glyphs)}}};\n" + ]) + + +def load_glyphs(fname_png: str): + with Image.open(fname_png) as im: + width = im.width + height = im.height + + assert width % 8 == 0, "width must be a multiple of 8" + assert height % 8 == 0, "height must be a multiple of 8" + + data = list(im.convert("RGBA").getdata()) + monochrome = [pixel_to_monochrome(p) for p in data] + + glyphs = [] + for gy in range(0, height, 8): + for gx in range(0, width, 8): + glyph = 0 + for py in range(0, 8): + for px in range(0, 8): + x = gx + px + y = gy + py + if monochrome[y * width + x]: + glyph |= 1 << (py * 8 + px) + glyphs.append(glyph) + + return glyphs + + +def pixel_to_monochrome(rgba: Tuple[int, int, int, int]): + if rgba[3] < 128: return False + if (rgba[0] + rgba[1] + rgba[2])/3 < 128: return False + return True + + +if __name__ == "__main__": + assert len(sys.argv) == 5, \ + "there must be four args (font name, n glyphs, src png, out c)" + main(sys.argv[1], int(sys.argv[2]), sys.argv[3], sys.argv[4]) diff --git a/pytools/requirements.txt b/pytools/requirements.txt new file mode 100644 index 0000000..50e2380 --- /dev/null +++ b/pytools/requirements.txt @@ -0,0 +1 @@ +pillow==10.2.0 \ No newline at end of file diff --git a/sys/BUILD b/sys/BUILD index 32e66ed..95b702b 100644 --- a/sys/BUILD +++ b/sys/BUILD @@ -1,7 +1,22 @@ +load("@bazel_skylib//rules:run_binary.bzl", "run_binary") + cc_library( name = "sys", - srcs = glob(["*.c"]), - hdrs = glob(["*.h"]), + srcs = glob(["*.c"]) + [":fonts/sys_font_small.c"], + hdrs = glob(["*.h"]) + [":fonts/sys_font_small.h"], visibility = ["//visibility:public"], - deps = ["//device:device"] + deps = ["//device:device"], +) + +run_binary( + name = "sys_font_small", + args = [ + "sys_font_small", + "256", + "$(location :fonts/sys_font_small.png)", + "$(location :fonts/sys_font_small.c)" + ], + srcs = [":fonts/sys_font_small.png"], + outs = [":fonts/sys_font_small.c"], + tool = "//pytools:font", ) \ No newline at end of file diff --git a/sys/fonts/sys_font_normal.png b/sys/fonts/sys_font_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..79933e44beefdf983961dc9f14d3b6be0bd1c5d0 GIT binary patch literal 4288 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 iU^*~C5ClQI5&r|^3MnLf*PX%u0000 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