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. Especially while we're in the early days, I'm happy to hop on a text thread or call to help debug. Let me know.

~ 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
? Use poetry for dependency management? [Yes] Yes
? Author [Pierce Freeman <pierce@freeman.vc>] Default
? Use Tailwind CSS? [Yes] Yes

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

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

Or, if you just want to watch the source tree for changes without hosting the server:

$ 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.

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.

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:

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.

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

from fastapi import Request, Depends
from sqlalchemy.ext.asyncio 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"

    def __init__(self):
        super().__init__()

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

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

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

Let's move over to the frontend.

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

const CreateTodo = ({ serverState }: { serverState: ServerState }) => {
  return (
    <div className="flex gap-x-4">
      <button
        className="rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700"
      >New TODO</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 function that accepts a pydantic model, which defines the new object. We then cast this to a database object and add it to the postgres table.

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)
    ):
        new_todo =  TodoItem(description=payload.description)
        session.add(new_todo)
        await session.commit()

The important part here is the @sideeffect. 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.

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

const CreateTodo = ({ serverState }: { serverState: ServerState }) => {
  const [showNew, setShowNew] = useState(false);
  const [newTodo, setNewTodo] = useState("");

  return (
    <div className="flex gap-x-4">
      <button
        className="rounded bg-blue-500 px-4 py-2 font-bold text-white hover:bg-blue-700"
        onClick={() => setShowNew(true)}
      >
        New TODO
      </button>
      {showNew && (
        <>
          <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("");
                setShowNew(false);
              }
            }
          >
            Create
          </button>
        </>
      )}
    </div>
  );
};

...

export default Home;

We add some boilerplate functionality to our component to:

  • Expand a text input when the "New TODO" button is clicked
  • Allow the user to enter in a new todo description
  • Create that todo when the "Create" button is clicked

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. We order these roughly in the order that we anticipate you'll need them.

  • Client Actions: Details on @sideeffect, @passthrough, and masking @sideeffect fields for partial re-rendering.
  • View Definition: How to define the view and use the serverState hook. Covers page.tsx and layout.tsx conventions to easily nest your site designs.
  • Page Metadata: How to set the title, description, and other metadata for your pages.
  • Link Generation: Generate links to other pages within your webapp, with typehinting and automatic URL generation.
  • Error Handling: Conventions for handling client-side errors while fetching data in your webapp.
  • PostCSS: PostCSS build plugin for TailwindCSS support and other CSS processing.
  • Core Library: Details on how to do local development on the core library.

Future Directions

  • Offload more of the server logic to Rust
  • AST parsing of the tsx files to determine which parts of the serverState they're actually using and mask accordingly
  • Plugins for simple authentication, daemons, billing, etc.

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.1.2.tar.gz (3.1 MB view details)

Uploaded Source

Built Distributions

mountaineer-0.1.2-cp312-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.12 Windows x86-64

mountaineer-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

mountaineer-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.8 MB view details)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

mountaineer-0.1.2-cp312-cp312-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

mountaineer-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.12 macOS 10.12+ x86-64

mountaineer-0.1.2-cp311-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.11 Windows x86-64

mountaineer-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

mountaineer-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.8 MB view details)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

mountaineer-0.1.2-cp311-cp311-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

mountaineer-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.11 macOS 10.12+ x86-64

mountaineer-0.1.2-cp310-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.10 Windows x86-64

mountaineer-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

mountaineer-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.8 MB view details)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

mountaineer-0.1.2-cp310-cp310-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mountaineer-0.1.2-cp310-cp310-macosx_10_12_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.10 macOS 10.12+ x86-64

mountaineer-0.1.2-cp39-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.9 Windows x86-64

mountaineer-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ x86-64

mountaineer-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.8 MB view details)

Uploaded CPython 3.9 manylinux: glibc 2.17+ ARM64

mountaineer-0.1.2-cp39-cp39-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

mountaineer-0.1.2-cp39-cp39-macosx_10_12_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.9 macOS 10.12+ x86-64

mountaineer-0.1.2-cp38-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.8 Windows x86-64

mountaineer-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (15.3 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ x86-64

mountaineer-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (14.8 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.17+ ARM64

mountaineer-0.1.2-cp38-cp38-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mountaineer-0.1.2-cp38-cp38-macosx_10_12_x86_64.whl (11.4 MB view details)

Uploaded CPython 3.8 macOS 10.12+ x86-64

File details

Details for the file mountaineer-0.1.2.tar.gz.

File metadata

  • Download URL: mountaineer-0.1.2.tar.gz
  • Upload date:
  • Size: 3.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.8

File hashes

Hashes for mountaineer-0.1.2.tar.gz
Algorithm Hash digest
SHA256 1bd6e3cb02d10f895965ede15b45435702026854f5dc4dc94278d50e4642d9e7
MD5 0c671ca4c45f5c58f5e12ff4064cbff9
BLAKE2b-256 8572b116189f9ece8bffe643f4acfd40f36aba44072907efa3959417e114fe08

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp312-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 c26298c1b7bd4071818f9fbe7a730cbd1f429425fed71a54264769ff5fb3b57c
MD5 31bc71b760ce2079686156ca11eb1736
BLAKE2b-256 887fa0fb4798498b6ab225e03f602799a280ac98c25aa62fa17b8f5aa91bbbd8

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1bbb8604222f27fa4249acdec9a38ec66ad2085f12644c86f56974f7161b1ff9
MD5 2178b527b923209dbd4684d1e0deb9bd
BLAKE2b-256 9affdce1fd1f34c7b9e98290c6b201ddeb806a64e614242de60fd9ab21717528

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1463b8d8a1b33958ef3e133951f519134d5aeaaac454902b3f8949d727900ac4
MD5 63eb742cfb93f5cda060c3ef3c81a883
BLAKE2b-256 030ef0cae7fabcf3310f6b692033b8ae341c0f08f522ff9ca88c57a938511fa5

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6be1facabf606dc68e0386ee957d243479c12c4589b198af2ae2b154c9712570
MD5 da80a2f91b9471b868c356a5e6cef3ea
BLAKE2b-256 ef0e10ec90a6bac325264af021dcd94780de3d19330353873e41da38c5df4ffe

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 40a5ff0e442dfcbee61ea51139b77ad3789c43f84ea14535f0760c28e03b2aa6
MD5 ac4cc4d8883a0f69a370fc1202f72581
BLAKE2b-256 688df016dc61f1ef5baa329c1abb311a7ef702203fd38b116eda88584c4a5b10

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp311-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 89fd246edc0fce6e67e23c264f0f1f2d678635c83d83781e45fda2f15fea3647
MD5 a6e33037d782f8e354f5e767e3e8b3e0
BLAKE2b-256 3c71fce6dea4fc3d54d358208439a072f09018956a11aea7262cc3ec1cc718fd

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4e8f0aea409908ac2d48cf526bee5eca519a4b50f320e59f12f80b1616828973
MD5 c7491881625b4b88bee61341489091d9
BLAKE2b-256 7af4f75a5346ff1e65ab358d9754f6c9a10fe2314a9973ad3d621eca747392a4

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 d23909d99dc176066efc2ef3fe9ad3b3211873f0b0f287531c67c4af7b672a4b
MD5 d407d0ee5cdb867a4141f72de8d74207
BLAKE2b-256 f9c1ed8acc69a3b52c85ddf5aee2368e86eb72552a10f95a7f770001f6d08471

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fe1092a2feb761c1bec6b3fd6bbe31d12b023eebcedbd6a650a748ee95da4d2a
MD5 8184ba7751c67dab218dc916f1a55829
BLAKE2b-256 54e9d3124feb101ef7fc1474e5acdb8465a7a7fc0e47ca5337eeac424bedfc9d

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 a47a7654b6832f00bf2e1ad3bbb55ca4fb9e8e4915482ef58ebb3b4ff906fe2a
MD5 7475e22640b49de8333104cbc9475cde
BLAKE2b-256 1444f099accf8360fc23370fc7ffb9c1f62a5c89ec610cd24809d6831825f3b2

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp310-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 c4a680a6047468aef6f23e10241cc3883266cf59778c633fd5480e8a53379d12
MD5 ade1929bee801a039e9d1e8eb529aa72
BLAKE2b-256 04d3b67bad9b5c18d0f1baf630600c9c437dc6df8d7ef89c383e6933616803d6

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9117a85f9d943a47f8b81c06cbe82b20040e5bc6985526e72cd83aa1cd9dfe79
MD5 13678b62cd5b6f3b1cced1727e273f21
BLAKE2b-256 1a486266e18f85f2edf8274419d1e712bd8e769366d332289eeba0e96357c7d2

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 325f0940c3276c57b2d45aaa56bea1c31a35b02848bb895c8351b81299c638f9
MD5 99735068c8e9d098562bca5ab35da13f
BLAKE2b-256 3a51b01691dea3f8dfa0391aa899e1e3baff6f835a3b09e15e71d19182d3f530

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 efb1f4b085565fcfa11a49b798881f15a9241f2aac6bd2606f49b165e433992d
MD5 5b868750e16057c93c472a4072ec11f3
BLAKE2b-256 d42a936fac95d4fd5002d7c3d75835a7228c07b52dc0f25130cfe1288c0a5454

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 623c802e14d4acff4943d919b5b6d6984fa58eeddef85e5d0bffc51cc4294aba
MD5 e151b5625cbd39b016c58d72f7b45033
BLAKE2b-256 8d3ec2df4667be3334cf8bdb03ee2f6a82c94bc54fd7a041a37021ebfeb39e62

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp39-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 426fdc426d43a5276e6ce6bd2c283980511a6a80ce6f68b59087f46d5ab82d05
MD5 42ef07cb8d4273d99aba7bf49c49c8b0
BLAKE2b-256 b413c35c2e520350033eb0be038cc470dd476d10ad4a322c274cbfe8c28d181c

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 666be521f4ea1ffed7474a52f545004ae71871c763d584374a83e8e69de83a72
MD5 5443fb1f68a726fc43d654d420eeb8be
BLAKE2b-256 758406f71a53196d67a28cd902286a2e649d8f4024202d94c7fc6ce6f0baef8b

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 988e3adfcf998c2307b788b2791dfb44411ed675b17cccc0829654087171fa35
MD5 fdfc4e4629bcfd1e15e54773600b8f9e
BLAKE2b-256 d495d0a2ff479312f37fdd88cbb51bc6b690c8ce816d0fe2055c53064b941fb1

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 551e912ee5762fcaf6b15ca08c84ec241965edf361820daebdc32c1f294f8fc3
MD5 67f1e9fda9bec4ff28094f4d4326820d
BLAKE2b-256 71a8915a38c432d673039267610940399b97b310b2771bfa466c8439107598fb

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp39-cp39-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 c6e81359f238a5050db05c8f796e0090dc89b31947c860164bd07f270efc1624
MD5 476f5003e8c25013ab48e14e6426eca7
BLAKE2b-256 06a3b4ba97163b95b55b9f7ff22b05dc13a354960665d8dcc4734a13bd93dbac

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp38-none-win_amd64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 bc538e635c0a029c5d99516d6ed938c7bf1dae67c218f6411d061f734f520dc4
MD5 856135bd4793a60f951fa14028a1f3cb
BLAKE2b-256 09ec6228db135c14babfb35b17fdc99726f6035e5fe7a933d669905a73cf60ae

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c8244cad3c6a3470d087a02e68f6f062c4520c539e31cadfbca4b2761b68c0f6
MD5 f1fb2867cf177010442914e8fcb71890
BLAKE2b-256 359e798e246ff151ca871dd76da8bed1b824bdd187a04eaaf22d197abbbca89f

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 361362fc9eebcedc3a27f9b7ca4b9890db560cb01d60a70b373afea29fea82d0
MD5 282550737ab4bbbf1025b7ce24de6600
BLAKE2b-256 e01b6c87ed515b37a32a11aa17e6e4357c08b8e83e22276c6f8a5c300d9dd442

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5cbbbdab57eaa8d9cc9a6a56328f53adb9001d9a539663b65e64a5f6d8b5627e
MD5 4a0c88e68e518b93492439d846230334
BLAKE2b-256 acd4eaa559ed99f30fdd1cd1ddd6e727984d3d01dd14730e8f67d676bf672823

See more details on using hashes here.

File details

Details for the file mountaineer-0.1.2-cp38-cp38-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for mountaineer-0.1.2-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6aa7645499d6e1b87eda8410f05e458a056f9ca177c3e125b731bd11302fcd2c
MD5 f8499e12308c72bdf4c179434a664151
BLAKE2b-256 b543ed5046700812a50be875a5e3059adb0bd09703895a605ffbc87627c0edc1

See more details on using hashes here.

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