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

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

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.views import get_view_path
from my_webapp.config import AppConfig
from my_webapp.controllers.home import HomeController

controller = AppController(
    view_root=get_view_path(""),
    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)
    ):
        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("");
            setShowNew(false);
          }
        }
      >
        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.1.3.tar.gz (3.0 MB view details)

Uploaded Source

Built Distributions

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

Uploaded CPython 3.12 Windows x86-64

mountaineer-0.1.3-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.3-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.3-cp312-cp312-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.12 macOS 11.0+ ARM64

mountaineer-0.1.3-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.3-cp311-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.11 Windows x86-64

mountaineer-0.1.3-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.3-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.3-cp311-cp311-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.11 macOS 11.0+ ARM64

mountaineer-0.1.3-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.3-cp310-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.10 Windows x86-64

mountaineer-0.1.3-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.3-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.3-cp310-cp310-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.10 macOS 11.0+ ARM64

mountaineer-0.1.3-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.3-cp39-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.9 Windows x86-64

mountaineer-0.1.3-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.3-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.3-cp39-cp39-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.9 macOS 11.0+ ARM64

mountaineer-0.1.3-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.3-cp38-none-win_amd64.whl (8.6 MB view details)

Uploaded CPython 3.8 Windows x86-64

mountaineer-0.1.3-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.3-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.3-cp38-cp38-macosx_11_0_arm64.whl (10.7 MB view details)

Uploaded CPython 3.8 macOS 11.0+ ARM64

mountaineer-0.1.3-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.3.tar.gz.

File metadata

  • Download URL: mountaineer-0.1.3.tar.gz
  • Upload date:
  • Size: 3.0 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.3.tar.gz
Algorithm Hash digest
SHA256 037e2829bf033ae7b69b0ea83263c47c3adf68b49dae04ea373086116064255e
MD5 e1b5f592d0fc292a14ab77a91580c09c
BLAKE2b-256 512a8e40f762e576afeea5811ab6d7971b168eb7a8cdb2031fc61e5bd62a94ec

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 b4681bd9c84e893d34c1d939ad9c38b165432122e6c6fb566d7ec1d484e533db
MD5 1034aee8b8cac5492b0caf454c4eb8b4
BLAKE2b-256 49850a1b82c98cf5658d2dc989ebf138f055096d2bc3847d363fa7ff3ab6841c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9485f0307aac3747ca185b2c3736bc424a89fa14ca8d7a7fb27ae936add25674
MD5 dd18bc7813f872964c4f454d684ec68d
BLAKE2b-256 bdec6502b83e192af6ffee9ab2f4cfe7ffac1e24d80edfc7fea292f822f39135

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 46b6c4c8cc6087a46477e0018fe10a693de8e0bdc9def5881d74dc0b4e085564
MD5 faa3ed6a2a15f3da50625141fae0b3d0
BLAKE2b-256 e4732e875d5ec43790de9b7d37a5c8a2a49f66c73ee8e0bf77aa7e3e5fdc7797

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c88293c7a6fd479b97a5ef0af6183c12b1c6f3d315adfb9819d1f0f5aeed9229
MD5 8169222af1e843ebe7cbf18b58a4a03e
BLAKE2b-256 7e21a0a47b2088ca8e2a49e0527dc50e7473ae93cce8e86696a931c63eb84973

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 141339b0c9a6e0b62ebd2ec71b7d7d01a92329e0d4a01689c6013510f274b580
MD5 d59e77fcba84f72a1d9ffddf2cb235ac
BLAKE2b-256 6d46302f5fd12d8f698506769cf54038e58e77c2a1633cc52387578ee7ca8b76

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 0e3b7fe08fc3ffd157a0642abe0ba71db538104c5fabba74d8aa8ae5daec42c0
MD5 ace4c414caf55101a097510892532d47
BLAKE2b-256 9936a1dd9af477997c806ac2ee906bd029429837032a608771e328c2e8a9a64b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 af5e6996533ad61f2c1974c703b82e19ea3f0f65148baafb7de2db5d6f7b5936
MD5 893b6469da0b4a598260338fd098cf93
BLAKE2b-256 d675fa03e1d7d26aa1b84762703f63617143a6b34e86f13e6c327ad3dde15f48

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 a87c287b45f19f51ddb3656b575847d4e35d055df4be25904ad22c57f3e305c3
MD5 b84b2d0f6a4d220601c201c47951c678
BLAKE2b-256 79ec410e213f15fe7d225c90289a9116e926ad41e9ad1dc64013a88d5a4d9b5a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a3ed4cce8affda7c0cb4bd824ee62b85cb2c80313afe017e135ea791729c06b9
MD5 42d2b5b7d998516694e05fbb83dca51b
BLAKE2b-256 66afc4a7217ac6c207a220db38d250769214f56fe69efaacdd27054c71490963

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 fd5ea92f5bf85ea121e69601765fa274762b0a81eec8e8df3318818dd0a10b8b
MD5 4d5135b52ab042469479d7521ee56b33
BLAKE2b-256 871c6d8008a54ff9f5a46e2563707a98700f4b24e947e8ae4e18c6050360b23b

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 5ff85106a3deec9e776207d5e27d0ab6504ea65b57b608ebb0ac99863910e972
MD5 73209b314608de4e88828cd3da184845
BLAKE2b-256 03f33ea3ea767e56462483f492dac5596d8f63d2957b79fba728a412b04bd6b8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 98861da32b23c44170f1c16c9f39115c96455f09617fd87ea0631894a0273394
MD5 2d3061ce579c29d0fc20f6c7f0591858
BLAKE2b-256 2a1671c58d39cebf7ec70bafbb1c8f6b2908a5c28578de29d51d2c2617183473

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4fc10d43f30e8a8ed80633c85b5ed77652d794d9bab35765ce75cb47efc452d1
MD5 be68e1cc089017f92ba385a0b8abed26
BLAKE2b-256 76a3654efed7c39bd8cd5f3cf8c111c5c997b39c94ff648cd70c7101ffd1524a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c411db40b0735c8db20c2ae57b9483a86a9d24ce12f56e9023ba00e97ca86727
MD5 d30da63c79731e9e146422c946975a74
BLAKE2b-256 ee84f5e72618a5dc36b0bed0ca4050ad2eedbe6af370154e9aa11da3d137507a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6360f78b2d2078c608ce46f0709ae64d222c6ef75dfb9725cbe0463d232d1c2a
MD5 00bfba634ded1a5ff239b6071d2ccae6
BLAKE2b-256 dadd5dffc537f28ab74b228cf762b6b59cd05ac678a442568a61580fa15327bb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 537a445c42190473cf33ed28e17fe66c4fc470533858d99b560c3db56740d8a2
MD5 243e581f964d92231e97a2ae483d5e55
BLAKE2b-256 b45665fa63d0db11a31d739d9ad9cdff15a6262fbb4d0d63783b47a120448527

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ebf9694cae5a3489e0b02dfca7eaa778bf1f104586e5fc84bdc8593744995b81
MD5 356cf19c738d68bbb493dcdfff0407e6
BLAKE2b-256 6dd22183cc2e36eb2e32813d571d8ee75a507965c238c395aa89470ec0bcb71a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0fe73338d702dbb7d9e3dd0aa1dae576a496fe1a2b32dbd7b320e4b8217e0d66
MD5 c1c3b03fc9b1978585d310c7702a0739
BLAKE2b-256 f776b73fb8907680a2243eda67c96d02c270d10a89b36f4b4965e844a6a5d9f5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 51dee7fde1da8a7fba067e52aef0dedbaf7bfb23b4d959ab96a56e533c526941
MD5 855a57224888b1136d5c087eae7283d3
BLAKE2b-256 c3b689539f6123ee27407fba19f8029b604d088aa5e0c13a8c13ad32f764ef08

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 94e2698838eabaa11d4b8c333dc6bc50d946acd03b3e26910060d7c504526fee
MD5 1b2fe876d969456bb86a330097fea365
BLAKE2b-256 b743fe8d53a401e4623b780a88a90f09d6b9561fe2907f0ddbe01045ec707e27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 9126c556d7c08cf42b50a2ebffdd86eabf3ef812c1ec19a7d585f72d1990bd03
MD5 88f7c56bce3d33eca5d18e0154ae8d51
BLAKE2b-256 1c4e20379f55f034727f88013285fddaf77ef9a33454002151b0f9a45f83c7fc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 abce69adcd74f2c1bd66d5f0af7f720099e4f675bb1d7721f6fb5bf83d2a0a02
MD5 368988758f78b05fdc65528f5867ce36
BLAKE2b-256 927f2362c7b4eb4cc7e66994fc74cb686ee24723db2992f8efd0d0bea71b95ab

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 63308698a7f9078b8eec83d664ef4d37e8b35b1fa548f5d9759e862ee194d5fa
MD5 e202823a302d041a743a802a2d7f5831
BLAKE2b-256 5555a2b2279fc119773f211053c083764ec3a40dbb7a62853340a5a73a323ac5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e4a662aff70772e9897819ca8401ac787614f71f354a2e39bd71cef2f65399ce
MD5 3f297f87df017daf356bda17c139ffcb
BLAKE2b-256 4ba58e01bb1a4dbec418d1b236eb84fdab728064257c1deb05c4a978ac7d9ce2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.3-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 46af6327e2be10e28347141bb800513a0c9f497a873d813cf849b9a02df328aa
MD5 ae3b964ae1f7f92fc162bba2448fb19a
BLAKE2b-256 046b23849d4b88631afb52d6eae54861db6bdfe2767ca226b339b03336156633

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