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

Uploaded Source

Built Distributions

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

Uploaded CPython 3.12 Windows x86-64

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

Uploaded CPython 3.12 macOS 11.0+ ARM64

mountaineer-0.1.4-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.4-cp311-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.11 Windows x86-64

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

Uploaded CPython 3.11 macOS 11.0+ ARM64

mountaineer-0.1.4-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.4-cp310-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.10 Windows x86-64

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

Uploaded CPython 3.10 macOS 11.0+ ARM64

mountaineer-0.1.4-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.4-cp39-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.9 Windows x86-64

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

Uploaded CPython 3.9 macOS 11.0+ ARM64

mountaineer-0.1.4-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.4-cp38-none-win_amd64.whl (8.7 MB view details)

Uploaded CPython 3.8 Windows x86-64

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

Uploaded CPython 3.8 macOS 11.0+ ARM64

mountaineer-0.1.4-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.4.tar.gz.

File metadata

  • Download URL: mountaineer-0.1.4.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.4.tar.gz
Algorithm Hash digest
SHA256 54118b6c0be2688bbcb4d2750f38527123b8b06dcfbd8669f8c6d451b2e69523
MD5 8d2d0de32a3d87aee79eda4ab3650607
BLAKE2b-256 9e59c5ddaf0f45c5c8568ba4b62e328733679506ee700af8980898e561e3782d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp312-none-win_amd64.whl
Algorithm Hash digest
SHA256 65f958b6ef09c85c4ec6e79dd1019a625bbb439c1f20965e4854f70331b12735
MD5 ec4326c2e677822621ff0cdff69642bc
BLAKE2b-256 e8a4ed15b2b81e9ff37abfe7880d046b804c4b50872fbbb523dba32f744354f8

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 571df6e7b1c00e881863fe022e7a6a57438530dd7ecd9dffc8a5c6d16355d41c
MD5 532ffb1232a3ff14375e479464501142
BLAKE2b-256 38df21fe578142e169002c2d02e0476918bb4a23492bce26071b990f1a38caa2

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 4784654db37ccffba657fef2a67f2a8c1d363c51bcd70038f3980e8d98fcff32
MD5 a89285f8da72e864659c1d8fed4dd419
BLAKE2b-256 70fc3d36e27c33ee5cc1803a45dc8ad0583adc0ab4ae6cdcbbaddc6e5afb4fac

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4af7c62f5d61cf3e7118905796887587577da9e6edf4af97ef510f7b8d36c876
MD5 81fd0d43c26c72488f9030faadd3a248
BLAKE2b-256 a4b50a30319acbd2affb143783da85c349660692cc2578c78acf8ca4a688276f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1dd8f5e224d4b84b4bcc2e1e1737ccccdc845663cb09eb728f5ed48f8e6c9472
MD5 5bd74af33761159913a12355118ecd18
BLAKE2b-256 6115b8287d9b22d60b35324b9fa8dcd29a6c5eba70912ea5197eb1a6efd3e161

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp311-none-win_amd64.whl
Algorithm Hash digest
SHA256 92190e872c45ced00e50ac337aad3902ea347b215a43ff74cb514e4f96a6bf61
MD5 d0c3d8498ac19bbdff570701a8a218c8
BLAKE2b-256 c1370a6623a500e90b81d68b93c44b60a50a21815eaf93576efb1c5b52ffea2f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68e5b366485038542bd50529a2d162648a3fd49b8d1fca791c3aef09ed026ac0
MD5 5f3d747fa3d64635d4a85b2161240d34
BLAKE2b-256 97dbad21ea8d7327c56872b4105b887bb9d636fbce782948d22320e93d160224

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 17d480d88cbba815024b4e2d5643a59ea82ec2a0036c776476d67647f36cac3d
MD5 8c20302a34b701098e157ef44c1c311c
BLAKE2b-256 06b515df27d56016a5c185d4561e5309bd47c7d48b7edfb967d3dedf06657ebd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e7a16fbc2778ee02ebea888495810501194d28fa2d5bdd95ac5fff5e6353bc79
MD5 558abf597392ce8aa9964213dfd1f7f7
BLAKE2b-256 4c448f8ff26fffc9db9bdc7eba7b515248e5eedfa0e36e1ebb4d1aad62fbac90

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6b2b2f9b90dd581415da78d1570afd3949c873e26b4dbcb7d7d92d537ebcb44c
MD5 14dadb1517bf66abbea7df97546301bb
BLAKE2b-256 0f9b499029e85e9cb91dc0b38c1857346aeaa2f4589dd0964c386765bd9fc34a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp310-none-win_amd64.whl
Algorithm Hash digest
SHA256 dcd9b3fb6611dda81de859308704f73a7140b9e2849e58baa9dcd81b351315ab
MD5 b7cb7acfc44b129a914342174dd439ec
BLAKE2b-256 158b1089d3662ed9ca1f17f1b4a373b3b5a19fbe80a952317b336cb35a52437f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 081b23bd4bf579e66f87ae3b5dc2d56356b5f6f1655b22e0332ffc856f45282f
MD5 22cdcd23befe44eca6964ead2ad10bfb
BLAKE2b-256 4cceb7acd136e8807843075e9b60087b3454f45fc31067c5d37a637297b30050

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 ab9ca774a66e2988cc0f2a2c15c341015e2ec14f4c1b24d929116b84f18e999f
MD5 53c728a8bc6bc61b108144416460ab71
BLAKE2b-256 9426f02091e1d88d86b839941af8e9a2546c7a6b33301b677cea77933f30e741

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 073a731a609280018911dccaef2d25fe8f424aefbe353d46f20ccdea0e308d0f
MD5 c5e0c0706e05f0316ce8ae01b71e35cc
BLAKE2b-256 61ad42b35c818cba9f1817c9e9c37f5ae30b3b7062121170d30a41554014d355

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5a6d85bd54a3969417ac48d1a95bceb0482b42de859b26309de73d15dc8b3274
MD5 b9d2c253eef6edf39627a07a428d0aa8
BLAKE2b-256 209cc71bc83ea7929b43787898692d4c0bd21d0a8464137591c8a9ef340941bc

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp39-none-win_amd64.whl
Algorithm Hash digest
SHA256 eeb8b9ff5ba936b45031a51150505f5bb0c405e658f9d0ea488202e1cc85322e
MD5 ed550d6048b9142b61ea684a32b8d0aa
BLAKE2b-256 bd0b26e60fb70d80fca05cf4c02bbf973de15c69ba0ee1445e56801dd886829d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 732a99fa5191dc24153e11e5fe38000426c1469417eb305d139ee7fb06e4e0d2
MD5 55d0d38345309eed0c938d9cd16859aa
BLAKE2b-256 0dd588a23d299dca830415f953974cd69b4c66c76a3c7683280bd7b9a80708dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 f95f6f7fd7963d08286a67ec23ac906a260b08cadaf2330c6ba20f57ea00d11f
MD5 0696e62d684819e68382074a82bb5f80
BLAKE2b-256 277b923ef911b4f32f29394cae155868cbb7cdc20b68c7cda6c521bc7a6ea9c3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 755ae96e0355ce01db274168c946e111746fe48bfbdf0084d53cdbc3ccf9188c
MD5 22cad0b42d825f4d555a17b56a3cc620
BLAKE2b-256 2172ea92988ab98322bdcc5121654c7c9f783cff67c1f8ef12e9c8384a5726e4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 9390b3efed2d7e117e471925d0814391a5d103fa19244c6e8565eea6768174a9
MD5 2795c2d632ab1149cc43c5fe13756f28
BLAKE2b-256 7e3b2f0cb37f9b9a5e92974d64f93c85321beb3c46f37306c860c4d8e3fb15d3

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp38-none-win_amd64.whl
Algorithm Hash digest
SHA256 d15c79ee01f832fcc4c815a64e697edbeca90526528e9f375ee9721ba2b7a3fc
MD5 d5a268a8660a61383945b148b751c721
BLAKE2b-256 6865f3316cf295bf93c4e8ded97c7bb03f2e714dccd66315e41cba4346566e0c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 8ad8723ed7f95570c58173c9d5433e3bc01a49b4a9b4d189d1e1972d5f6a659e
MD5 15a879aaaf421ba4e4b3058c51cc1cc9
BLAKE2b-256 626bdcac697a9b96aa86f2eaa64f93544fb764f637bf30a53e32285ea133a43f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 3d2450ecbcc05aecfbafd7bf6a9cea28d0f0bb0333339b5fb4db85cc0a5d761f
MD5 87eaaf379a2e1a9e3e8103dea53b13a2
BLAKE2b-256 462e1ef496626d943a3793799ba1e84dbe715ceb5b15bd0fa1ff4e0f04e6b08c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 341e85a425f316d8555bb3fb2b2e11da64de55e01770c7069c41315ea349b8d4
MD5 fc387d5d47afe3585db11b607c2e84e6
BLAKE2b-256 a8080c4c3270644bd696a6bfd61bfb29bba0db0bab0d13dd3623513c1ec1741c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for mountaineer-0.1.4-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 246ba3757cce9328bbf47a77a15b372889eea96a5049888aa6f12966f70175dc
MD5 438ba806cc8f85ed09783424ceecafb2
BLAKE2b-256 0abec2d7edf065e4cebf3fdc05d4fb212cacc019acbfedb82a19d83200a25584

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