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 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"

    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

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

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

Uploaded Source

Built Distributions

mountaineer-0.2.0-cp312-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.12 Windows x86-64

mountaineer-0.2.0-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.2.0-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.2.0-cp312-cp312-macosx_11_0_arm64.whl (10.8 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

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

Uploaded CPython 3.12 macOS 10.12+ x86-64

mountaineer-0.2.0-cp311-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.11 Windows x86-64

mountaineer-0.2.0-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.2.0-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.2.0-cp311-cp311-macosx_11_0_arm64.whl (10.8 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

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

Uploaded CPython 3.11 macOS 10.12+ x86-64

mountaineer-0.2.0-cp310-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.10 Windows x86-64

mountaineer-0.2.0-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.2.0-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.2.0-cp310-cp310-macosx_11_0_arm64.whl (10.8 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

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

Uploaded CPython 3.10 macOS 10.12+ x86-64

mountaineer-0.2.0-cp39-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.9 Windows x86-64

mountaineer-0.2.0-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.2.0-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.2.0-cp39-cp39-macosx_11_0_arm64.whl (10.8 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

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

Uploaded CPython 3.9 macOS 10.12+ x86-64

mountaineer-0.2.0-cp38-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.8 Windows x86-64

mountaineer-0.2.0-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.2.0-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.2.0-cp38-cp38-macosx_11_0_arm64.whl (10.8 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mountaineer-0.2.0-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.2.0.tar.gz.

File metadata

  • Download URL: mountaineer-0.2.0.tar.gz
  • Upload date:
  • Size: 3.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.0.0 CPython/3.12.2

File hashes

Hashes for mountaineer-0.2.0.tar.gz
Algorithm Hash digest
SHA256 25e85e754f8df0104120d40d44dfaec1a85233bb31aeb72122a6cb68646a97a4
MD5 c9253347f15f094a04ad2994995a93ad
BLAKE2b-256 c6c40e335eacee7612c00a9b0d4f7d53153be68fb5c8436f2c2c89c77336021a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 072784ef33c8ae77d22dbc469aafdc64bffcf7c81c95befc13c825d09cdaf22e
MD5 0547e63396efdbfd8668cdffcb4d27c6
BLAKE2b-256 03b422ebec4af5e3d3ca298c7f0d451d685aea7266dd327787cddc51e5591e5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c66d13082bb977b39a61fc543d51954bcc0f3aa3f1a9ad21bf2cc35802aa2a70
MD5 4dcb5cac0616e296d0b3d13f10a6c21a
BLAKE2b-256 ddca8fc4bd2a49aeef23add56b5c66254d2c2178fd2fe4e281b6166421f22cb0

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 1f75abe0df6fbb7009ef852cfbfa8bab7f0a03f2bb256a7b32d2d57eda6d2a85
MD5 3ea7a4815d831b4ead83acd419e7579d
BLAKE2b-256 ad5ac979778897d2a29fcb1517f728cf048b77fd6215db8b05dab0327d767630

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 08527491d1b5f38c773ecc61d66d9dc68acaed732ead515adc10738e2c0b2b92
MD5 9ad108cdb80cb392d1de14292c787824
BLAKE2b-256 ec26f9aef458f719c0b6cc8a00b55c9a91e813bedcda389ac78a3cb077e6e125

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 8308ea6137d4a2951f85304d7dee8660c2a6f6d9516ca812204ed3132ded2862
MD5 19e610b7232b538905cc781621ab6371
BLAKE2b-256 df18f79fb0370b11dcfc5b4934d04eac22315fc0b1c0e5ee8f9c30fd935ca25e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 c3fc820e67b1bd81a39b7ad661bdabb2cfcb24e701aa3b6b6f882f2cb18a1b06
MD5 b946d35a1ed2ed434369883bbb03246a
BLAKE2b-256 ec943be29107a85be9693a5667395bb69ae901dc95d02168d0a0b879b0ea2bd5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3ae233c6f20d8170e28ab048e3cff84a1f3368968b59ee4c2eb2d7b8c574c4fb
MD5 9994c6b2a5223976f291d2ce3bd6bd85
BLAKE2b-256 1a3eedc081992a568a27a395abcebc64a935686166685b409141d466263deb77

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 73bdc8eba332f5ef82565efc1431d46aa4945e1b27df00103adc011c9f28fdbd
MD5 e0e1b5d76425519a5d8bb579edce7c72
BLAKE2b-256 5d6d1a38a568943492f7034d62e392012b95bde1f30e61911db9bd3bf701f815

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4656335a7687f4dfa63ce7bb9fc12064451a373bb92fcef9955abaa0490a57c0
MD5 a00ed5617fd9815f7f1076e7c23e61ae
BLAKE2b-256 30b4c1327d1fe76ed4dd0e439d8b55166246995b82e4d9b2715682b15d48370f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 afb2ad211378307d90facded1ab18d5214fc7d8056f1f955db3323405662d6d3
MD5 760ad1ecb2077f70b45e9ff342686c1f
BLAKE2b-256 1ff4785b51cd688f24dbc3be52c901a5bc02b661efa4c78ec3f05bb01d68f977

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 5c9ef6c21ee8319a4045b6c2b7fc13bb6d1d84a1317986134893fac9de0388cf
MD5 6d601b601c49d382113ba112d3ea95cd
BLAKE2b-256 feb8c5d1cb53db7d1d73899359325b8354bb4759b440ae4991e30db2f2253da8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ba95022b76eb7ed510701c5013566ba83160e8dd73eb4a1f3ba602fb37f4cb0f
MD5 de20a82f26fb30ebad98dec4eccea320
BLAKE2b-256 505a36edfa1aea585840bc8310b04c0f0f805d0db21b80bd508e83ff01b951c1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 c66b82c19daca33e31143ee7bd2f0b0458109af65e61e199639b6cf73b01bbd9
MD5 ff682d0f67bd374278676ce467294f2f
BLAKE2b-256 f349e012bb20d716a6af1bf25485d03b96749005a30cf224e2d8d1476128129c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9cc885fe6838a732b4c730a334f1fc1d234b2ea18e3339005cf17cb5e48f064d
MD5 5815a9191acbc293a624b06088d01218
BLAKE2b-256 ebd79b89dac2b028f5c77c4e4094d16123bd68046115854c6c0f39e2a10f6443

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 491ab0bdb8d39962d969639a26c731b06f7629d97f2963ca0d971b612a3ff725
MD5 80960828b7cb307da189587efcd2c40c
BLAKE2b-256 c30b65154f216fd0b89fca9ed91e95f6c751f97313af99a96a3fea1802ac2bee

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 62cad8b46899afa7e10ecad83d14d472a5b0f405696965b6af534f99c873a717
MD5 80ace64494f4986435de31b3b51c2c2f
BLAKE2b-256 5d64b1c6fb583b5518d8641c87d8b2a8078baca4b32b5d91eca3775a6dd83e8d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d5787b198a5601cee6cadf4f79afa55ad69b98ded9b28cec78b633a96b56fdd0
MD5 434b0ad796b7099a0762b206b406cffd
BLAKE2b-256 68142f8674eea8702c339890d432e4c551956c2325754985eb84be90b665a3ef

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 84e287f877814280fc7647112ae849b4f1f37f7c3f6d3d38c32fb888a9b70069
MD5 36285c953dde99318798b0f2256f6ca8
BLAKE2b-256 523a288163bf75a5857359b3e9e677e8a7c1f129de8f71fd4b40d01b7ff57cc3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ccd2d631a63a164518dceb76e881d838ebaa370c669e26095900be9d99b7de4
MD5 f2ec4702a078212a8000f2b2a81dc620
BLAKE2b-256 7ac3e184ef61361af1475c60ad5c386d510377232676190771b9a86b910540ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 aa027aaf8c539267f190dc2f0ac15d9f1e1dc9134df862110f957fff62707a6f
MD5 ba83764cb4354e1677c9217f750451ee
BLAKE2b-256 bc4478cd9dfb737b4472f2914d2c6905cf55ce80be79f41e2967a80137573ca3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 537ade8160da1158048a14fb395933d4e69ba59059ac0f1f7ed8d06cf7ce5086
MD5 1792b8e76a85824ff59a0090329b5c92
BLAKE2b-256 f7314b04c041396311fc446d09e919d5e2bbb3d849fa84ddfabf3cef8e5181f1

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1df3ea979c144b2b59ae39eaceb8fb7193308570f3c30588989a8b477cc4007b
MD5 fcaee43adb23b780cc58ffcc7c1c7aac
BLAKE2b-256 714ecba8d2bd0796c7151ca0900c4d0be4b19845fb0a5914028883aabfb065e6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2fbe41076735c589331d03053c97a35eadd7cf10736241454acdd9a4613f4340
MD5 40248d6a86bcc74533be5ff8619c6480
BLAKE2b-256 f28b43abff19d8383f15b26fdca43dc815e6a7529f85b20f89ae7167ffa84ecc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ad3b51b852859b4c00d0f37a789b09a401f1ddda65070f00bd74b66aa4ab27c4
MD5 51abd7e384b2ff67a9d0a929105a9c43
BLAKE2b-256 2adfae18f5eb0b3e0a8574d006dbed26d0dac3cfe121fa1c8d83964b7ab4f060

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.2.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 0c09562c8704c5217c8898b641eb651d7fb7f63d85da53c085b84fef44cb4537
MD5 5e57efc6f8729ba24ca2ae5ea03f42d0
BLAKE2b-256 2827a15804e9c502997359fefb496ca3cd0c5ad93f1a4b4022c89c9cabe03c7e

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