Skip to main content

No project description provided

Project description

Mountaineer Header

Move fast. Climb mountains. Don't break things.

Mountaineer 🏔️ is a framework to easily build webapps in Python and React. If you've used either of these languages before for development, we think you'll be right at home.

Main Features

Each framework has its own unique features and tradeoffs. Mountaineer focuses on developer productivity above all else, with production speed a close second.

  • 📝 Typehints up and down the stack: frontend, backend, and database
  • 🎙️ Trivially easy client<->server communication, data binding, and function calling
  • 🌎 Optimized server rendering for better accessibility and SEO
  • 🏹 Static analysis of web pages for strong validation: link validity, data access, etc.
  • 🤩 Skip the API or Node.js server just to serve frontend clients

We built Mountaineer out of a frustration that we were reinventing the webapp wheel time and time again. We love Python for backend development and the interactivity of React for frontend UX. But they don't work seamlessly together without a fair amount of glue. So: we built the glue. While we were at it, we embedded a V8 engine to provide server-side rendering, added conventions for application configuration, built native Typescript integrations, and more. Our vision is for you to import one slim dependency and you're off to the races.

We're eager for you to give Mountaineer a try, and equally devoted to making you successful if you like it. File an Issue if you see anything unexpected or if there's a steeper learning curve than you expect. There's much more to do - and we're excited to do it together.

~ Pierce

Getting Started

New Project

To get started as quickly as possible, we bundle a project generator that sets up a simple project after a quick Q&A. Make sure you have pipx installed.

$ pipx run create-mountaineer-app

? Project name [my-project]: my_webapp
? Author [Pierce Freeman <pierce@freeman.vc>] Default
? Use poetry for dependency management? [Yes] Yes
? Create stub MVC files? [Yes] Yes
? Use Tailwind CSS? [Yes] Yes
? Add editor configuration? [vscode] vscode

Mountaineer projects all follow a similar structure. After running this CLI you should see a new folder called my_webapp, with folders like the following:

my_webapp
  /controllers
    /home.py
  /models
    /mymodel.py
  /views
    /app
      /home
        /page.tsx
      /layout.tsx
    /package.json
    /tsconfig.json
  /app.py
  /cli.py
pyproject.toml
poetry.lock

Every service file is nested under the my_webapp root package. Views are defined in a disk-based hierarchy (views) where nested routes are in nested folders. This folder acts as your React project and is where you can define requirements and build parameters in package.json and tsconfig.json. Controllers are defined nearby in a flat folder (controllers) where each route is a separate file. Everything else is just standard Python code for you to modify as needed.

Development

If you're starting a new application from scratch, you'll typically want to create your new database tables. Make sure you have postgres running. We bundle a docker compose file for convenience with create-mountaineer-app.

docker compose up -d
poetry run createdb

Of course you can also use an existing database instance, simply configure it in the .env file in the project root.

Mountaineer relies on watching your project for changes and doing progressive compilation. We provide a few CLI commands to help with this.

While doing development work, you'll usually want to preview the frontend and automatically build dependent files. You can do this with:

$ poetry run runserver

INFO:     Started server process [93111]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:5006 (Press CTRL+C to quit)

Navigate to http://127.0.0.1:5006 to see your new webapp running.

Or, if you just want to watch the source tree for changes without hosting the server. Watching will allow your frontend to pick up API definitions from your backend controllers:

$ poetry run watch

Both of these CLI commands are specified in your project's cli.py file.

Walkthrough

Below we go through some of the unique aspects of Mountaineer. Let's create a simple Todo list where we can add new items.

For the purposes of this walkthrough we assume your project is generated with create-mountaineer-app and you've skipped MVC stub files. If not, you'll have to delete some of the pre-existing files.

Let's get started by creating the data models that will persist app state to the database. These definitions are effectively Pydantic schemas that will be bridged to the database via SQLModel.

# my_webapp/models/todo.py

from mountaineer.database import SQLModel, Field
from uuid import UUID, uuid4

class TodoItem(SQLModel, table=True):
    id: UUID = Field(default_factory=uuid4, primary_key=True)

    description: str
    completed: bool = False

Update the index file as well:

# my_webapp/models/__init__.py

from .todo import TodoItem # noqa: F401

Make sure you have a Postgres database running. We bundle a docker compose file for convenience with create-mountaineer-app. Launch it in the background and create the new database tables from these code definitions:

docker compose up -d
poetry run createdb
poetry run runserver

Great! At this point we have our database tables created and have a basic server running. We next move to creating a new controller, since this will define which data you can push and pull to your frontend.

# my_webapp/controllers/home.py

from mountaineer import sideeffect, ControllerBase, RenderBase
from mountaineer.database import DatabaseDependencies

from fastapi import Request, Depends
from mountaineer.database.session import AsyncSession
from sqlmodel import select

from my_webapp.models.todo import TodoItem

class HomeRender(RenderBase):
    client_ip: str
    todos: list[TodoItem]

class HomeController(ControllerBase):
    url = "/"
    view_path = "/app/home/page.tsx"

    async def render(
        self,
        request: Request,
        session: AsyncSession = Depends(DatabaseDependencies.get_db_session)
    ) -> HomeRender:
        todos = (await session.exec(select(TodoItem))).all()

        return HomeRender(
            client_ip=(
                request.client.host
                if request.client
                else "unknown"
            ),
            todos=todos
        )

The only three requirements of a controller are setting the:

  • URL
  • View path
  • Initial data payload

This render() function is a core building block of Mountaineer. All Controllers need to have one. It defines all the data that your frontend will need to resolve its view. This particular controller retrieves all Todo items from the database, alongside the user's current IP.

[!TIP] render() functions accepts all parameters that FastAPI endpoints do: paths, query parameters, and dependency injected functions. Right now we're just grabbing the Request object to get the client IP.

Note that the database session is provided via dependency injection, which plug-and-plays with FastAPI's Depends syntax. The standard library provides two main dependency providers:

  • mountaineer.CoreDependencies: helper functions for configurations and general dependency injection
  • mountaineer.database.DatabaseDependencies: helper functions for database lifecycle and management

Now that we've newly created this controller, we wire it up to the application. This registers it for display when you load the homepage.

# my_webapp/app.py
from mountaineer.app import AppController
from mountaineer.client_compiler.postcss import PostCSSBundler
from mountaineer.render import LinkAttribute, Metadata

from my_webapp.config import AppConfig
from my_webapp.controllers.home import HomeController

controller = AppController(
    config=AppConfig(),
    global_metadata=Metadata(
        links=[LinkAttribute(rel="stylesheet", href="/static/app_main.css")]
    ),
    custom_builders=[
        PostCSSBundler(),
    ],
)

controller.register(HomeController())

Let's move over to the frontend.

/* my_webapp/views/app/home/page.tsx */

import React from "react";
import { useServer, ServerState } from "./_server/useServer";

const CreateTodo = ({ serverState }: { serverState: ServerState }) => {
  return (
    <div className="flex gap-x-4">
      <input
        type="text"
        className="grow rounded border-2 border-gray-200 px-4 py-2"
      />
      <button className="rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700">
        Create
      </button>
    </div>
  );
};

const Home = () => {
  const serverState = useServer();

  return (
    <div className="mx-auto max-w-2xl space-y-8 p-8 text-2xl">
      <p>
        Hello {serverState.client_ip}, you have {serverState.todos.length} todo
        items.
      </p>
      <CreateTodo serverState={serverState} />
      {
        /* Todo items are exposed as typehinted Typescript interfaces */
        serverState.todos.map((todo) => (
          <div key={todo.id} className="rounded border-2 border-gray-200 p-4">
            <div>{todo.description}</div>
          </div>
        ))
      }
    </div>
  );
};

export default Home;

We define a simple view to show the data coming from the backend. To accomplish this conventionally, we'd need to wire up an API layer, a Node server, or format the page with Jinja templates.

Here instead we use our automatically generated useServer() hook. This hook payload will provide all the HomeRender fields as properties of serverState. And it's available instantly on page load without any roundtrip fetches. Also - if your IDE supports language servers (which most do these days), you should see the fields auto-suggesting for serverState as you type.

IDE Typehints

If you access this in your browser at localhost:5006/ we can see our welcome message, but we can't really do anything with the todos yet. Let's add some interactivity.

[!TIP] Try disabling Javascript in your browser. The page will still render as-is with all variables intact, thanks to our server-side rendering.

Server-side rendering

What good is todo list that doesn't get longer? We define a add_todo function that accepts a pydantic model NewTodoRequest, which defines the required parameters for a new todo item. We then cast this to a database object and add it to the postgres table.

# my_webapp/controllers/home.py

from pydantic import BaseModel

class NewTodoRequest(BaseModel):
    description: str

class HomeController(ControllerBase):
    ...

    @sideeffect
    async def add_todo(
        self,
        payload: NewTodoRequest,
        session: AsyncSession = Depends(DatabaseDependencies.get_db_session)
    ) -> None:
        new_todo =  TodoItem(description=payload.description)
        session.add(new_todo)
        await session.commit()

The important part here is the @sideeffect. Once you create a new Todo item, the previous state on the frontend is outdated. It will only show the todos before you created a new one. That's not what we want in an interactive app. This decorator indicates that we want the frontend to refresh its data, since after we update the todo list on the server the client state will be newly outdated.

Mountaineer detects the presence of this sideeffect function and analyzes its signature. It then exposes this to the frontend as a normal async function.

/* my_webapp/views/app/home/page.tsx */

import React, { useState } from "react";
import { useServer } from "./_server/useServer";

/* Replace the existing CreateTodo component definition you have */
const CreateTodo = ({ serverState }: { serverState: ServerState }) => {
  const [newTodo, setNewTodo] = useState("");

  return (
    <div className="flex gap-x-4">
      <input
        type="text"
        className="grow rounded border-2 border-gray-200 px-4 py-2"
        value={newTodo}
        onChange={(e) => setNewTodo(e.target.value)}
      />
      <button
        className="rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700"
        onClick={
          /* Here we call our sideeffect function */
          async () => {
            await serverState.add_todo({
              requestBody: {
                description: newTodo,
              },
            });
            setNewTodo("");
          }
        }
      >
        Create
      </button>
    </div>
  );
};

...

export default Home;

useServer() exposes our add_todo function so we can call our backend directly from our frontend. Also notice that we don't have to read or parse the output value of this function to render the new todo item to the list. Since the function is marked as a sideeffect, the frontend will automatically refresh its data after the function is called.

Go ahead and load it in your browser. If you open up your web tools, you can create a new Todo and see POST requests sending data to the backend and receiving the current server state. The actual data updates and merging happens internally by Mountaineer.

Getting Started Final TODO App

Getting Started Final TODO App

You can use these serverState variables anywhere you'd use dynamic React state variables (useEffect, useCallback, etc). But unlike React state, these variables are automatically updated when a relevant sideeffect is triggered.

And that's it. We've just built a fully interactive web application without having to worry about an explicit API. You specify the data model and actions on the server and the appropriate frontend hooks are generated and updated automatically. It gives you the power of server rendered html and the interactivity of a virtual DOM, without having to compromise on complicated data mutations to keep everything in sync.

Learn More

We have additional documentation that does more of a technical deep dive on different features of Mountaineer. Check out mountaineer.sh.

Project details


Download files

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

Source Distribution

mountaineer-0.8.0.dev1.tar.gz (1.9 MB view details)

Uploaded Source

Built Distributions

mountaineer-0.8.0.dev1-cp312-none-win_amd64.whl (17.3 MB view details)

Uploaded CPython 3.12 Windows x86-64

mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.7 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (20.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

mountaineer-0.8.0.dev1-cp312-cp312-macosx_11_0_arm64.whl (17.9 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

mountaineer-0.8.0.dev1-cp312-cp312-macosx_10_12_x86_64.whl (18.9 MB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

mountaineer-0.8.0.dev1-cp311-none-win_amd64.whl (17.3 MB view details)

Uploaded CPython 3.11 Windows x86-64

mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.7 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (20.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

mountaineer-0.8.0.dev1-cp311-cp311-macosx_11_0_arm64.whl (18.0 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

mountaineer-0.8.0.dev1-cp311-cp311-macosx_10_12_x86_64.whl (18.9 MB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

mountaineer-0.8.0.dev1-cp310-none-win_amd64.whl (17.3 MB view details)

Uploaded CPython 3.10 Windows x86-64

mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (20.7 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (20.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

mountaineer-0.8.0.dev1-cp310-cp310-macosx_11_0_arm64.whl (18.0 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mountaineer-0.8.0.dev1-cp310-cp310-macosx_10_12_x86_64.whl (18.9 MB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

File details

Details for the file mountaineer-0.8.0.dev1.tar.gz.

File metadata

  • Download URL: mountaineer-0.8.0.dev1.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for mountaineer-0.8.0.dev1.tar.gz
Algorithm Hash digest
SHA256 9babaa8fd8282bf7ae300c6b55c4e59b17f8a93bccc94ab5a34e7122c4a86969
MD5 ed777494fe96e6accfbf0ca90320edfb
BLAKE2b-256 72ac622e84c9d398d44c754a796383756cdef3cc7db734499d1b4592afa53d09

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1.tar.gz:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 25376541265bd11e942c334619f19067178ea7ad32d3a4933cc48f41b22ae134
MD5 b614120afd7bd4e8898db0b09a6d25cf
BLAKE2b-256 e403fc94eab3dbeb6b7aef757169c899bb880c6dca7b0c3c1d44a2eb8992ddf5

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp312-none-win_amd64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a9c57827bba5237b76602b41cc00eb5c10dbae921bf943e1da7af1eeb2fedccd
MD5 297bee97f384f2cbc96e67a62acef67b
BLAKE2b-256 d37001bbc57f75256372fa4f3d14c940b66dbedf94a86467767fa474bd626999

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bc339e87b453839ea9236a43000dcb33114878eea8bdd46f9c314fccccae35ba
MD5 4dba9b435c0658bcd84d7e5a76d2ebe1
BLAKE2b-256 decfa0d68a9e65728d9bb0226f59418c5e66edb4f135d9bc91c53d9e8502a657

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 71b09c67a8b20084b1ce21837196569cc5b9a04d64accaba145d5a1662823556
MD5 d7583e6800629de7b1d1fbc77701910c
BLAKE2b-256 207bb9c67aaf990ecd6791a38aeeadf8462b1e711720de7ad288f439d72043fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b9ae67ec2938c8bc397bda67fc1ff2d07629013322ac171ba5c1136ae1caeef3
MD5 4591fb4d770aacb71b410a80cc30fd56
BLAKE2b-256 db255998905220b485ec15bc79e870c23f1dc8b99d70909035d43188574e9f15

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp312-cp312-macosx_10_12_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 7f652d711b09ac1b607f91b624a2754ef0aeeaecfb3144104ee267c2d3c45510
MD5 0615294ef277e2ffafcf512df39a900e
BLAKE2b-256 33d9699448d3c81edbbd65270233bd54aa4b3bc2e57d83116a4fd612647f9a6c

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp311-none-win_amd64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1c93e3a432b2a09e7d3dc853d36415b9753145e1d91427c411dcb97bad93a290
MD5 b156cf1138144a428c2d0fa6340a6837
BLAKE2b-256 89ec001163bfcf8e3acfd499734154057597a51826b1e3f4f7881b6d9f33d4bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ae11aa3b69be3b9000ffb7e0424eeb5cf6ba68cda04ab1ea2c5a09b6521349d8
MD5 3c372be9a101fd6b16e440af2bdbab0b
BLAKE2b-256 5b26c8b250d07630b4c650cbdd5ab96e250ec9b6e1de96479173d1f3f804be31

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 621bfb1077579ee57758c95a21e2effc7e1a239e32e3fa715b58c5dc7a3b960b
MD5 a499621534c1888007cc67b65cd0da6a
BLAKE2b-256 3c0e3f8776287334f3909717d2f36318e53caf6704cb56becb2f5d6aeeb44990

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 770d48e81a1e2dcbcbcd69ec71301b44723ffd4516f253d2406e864e5ff386e2
MD5 b8035d843d0faf0eff03920cbc98cf5e
BLAKE2b-256 50a44a7ed19a31c83db3d9948eb26691dd31ece7b5856b9d1d03a4ae84da1281

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp311-cp311-macosx_10_12_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 bcf7c47f15dc86175cbd0e65aeadafee4568b2a661577b9e2f4e0ff297125a0c
MD5 2d560181836edf7845543585a9e16f6f
BLAKE2b-256 4e23cdfc2c1449c9c9e76e62c3686b6beb194d3b68b92ad5e844201ee3b45ea1

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp310-none-win_amd64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d45564b867871944ff7daea386af863cb8833d83c9d27fb5394a3d7dbcb930c
MD5 27326d5670ac5fc8e2c1ade29330644a
BLAKE2b-256 b35cb2d7e003b5eb5a676aa13c26c2c30ac29743512d6102d90eaf303a22dba1

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d2cc4369a4d647ad5c227a6e34d99d7c020a6fa09c4f7af7c1eb931850053f76
MD5 553cdf5a4a2c313ed9c643a64c23455f
BLAKE2b-256 67e5cacbd4fe1b3011aa5e3f4446cc2d7134971313ffc3ded427475a7c965868

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5654df1a649ebf640a92e3e17b330ef4145d60c7374697ea80144e687d85b109
MD5 fafbf807a379e4ab674ee422bd6941ea
BLAKE2b-256 f846103eb315dd71057e406775871c88201e163028d7f38b391abd0fc213aad6

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

File details

Details for the file mountaineer-0.8.0.dev1-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.8.0.dev1-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 057e5f13f554a9c4447b00f6b33bf8cda0b15856ef7d3bb08819b470a8d85785
MD5 cbd9e2a3e1ec81f29304a2355fd36d3c
BLAKE2b-256 4b5d2ec939076da7cf145938a042a25c96ee702720a4b06de1fc86f43797f63f

See more details on using hashes here.

Provenance

The following attestation bundles were made for mountaineer-0.8.0.dev1-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: test.yml on piercefreeman/mountaineer

Attestations:

Supported by

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