Skip to content

Commit

Permalink
Merge pull request #28 from fscherf/fscherf/dev/master
Browse files Browse the repository at this point in the history
add support for external sites
  • Loading branch information
fscherf authored Apr 15, 2024
2 parents 3c0d449 + 0cd5bb1 commit fb4a552
Show file tree
Hide file tree
Showing 36 changed files with 1,507 additions and 384 deletions.
71 changes: 41 additions & 30 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
FROM mcr.microsoft.com/playwright:v1.38.1-jammy

ARG UID=1000 GID=1000

# install pyenv dependencies
RUN apt update && apt upgrade -y && \
# tzdata (required by pyenv dependencies) \
DEBIAN_FRONTEND=noninteractive TZ=Gmt/UTC apt install -y tzdata && \
# https://github.com/pyenv/pyenv/wiki#suggested-build-environment \
apt install -y git build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils \
tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev && \
# milan dependencies \
apt install -y socat

# setup pyenv
RUN git clone https://github.com/yyuu/pyenv.git .pyenv
ENV PYENV_ROOT $HOME/.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

RUN pyenv install 3.8:latest
RUN pyenv install 3.9:latest
RUN pyenv install 3.10:latest
RUN pyenv install 3.11:latest

RUN pyenv global `pyenv versions --bare`

# setup commandline tools
RUN pip3.8 install --upgrade pip tox
RUN pyenv rehash
FROM ubuntu:focal

ARG DEBIAN_FRONTEND=noninteractive
ARG PYTHON_VERSIONS="3.7 3.8 3.9 3.10 3.11 3.12"
ARG PYTHON_VERSION="3.11"

# setup /milan
RUN mkdir /milan

COPY ./milan /milan/milan
COPY ./bin /milan/bin
COPY ./pyproject.toml /milan/pyproject.toml

# Ubuntu dependencies
RUN apt update && \
apt-get install -y software-properties-common && \
add-apt-repository ppa:deadsnakes/ppa && \
apt update && \
for version in ${PYTHON_VERSIONS}; do \
apt install -y \
python${version} \
python${version}-dev \
python${version}-venv && \
python${version} -m ensurepip --upgrade \
; done

# python dependencies
RUN python${PYTHON_VERSION} -m pip install /milan[docker]

# setup playwright
ENV PLAYWRIGHT_BROWSERS_PATH=/ms-playwright

RUN python${PYTHON_VERSION} -m playwright install-deps
RUN python${PYTHON_VERSION} -m playwright install

RUN chmod -R 777 /ms-playwright

# setup user
RUN adduser milan

USER milan
50 changes: 31 additions & 19 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ PYTHON=python3.11
PYTHON_ENV=env
DOC_ROOT=doc

.PHONY: milan build clean fullclean \
test ci-test frontend2\
.PHONY: milan build clean fullclean shell \
dist _release \
test ci-test frontend2 \
playwright-install playwright-browser \
browser demos

Expand Down Expand Up @@ -35,14 +36,22 @@ shell: | $(PYTHON_ENV)
. $(PYTHON_ENV)/bin/activate && \
rlpython $(args)

# tests #######################################################################
test: | $(PYTHON_ENV)
# packaging ###################################################################
dist: | $(PYTHON_ENV)
. $(PYTHON_ENV)/bin/activate && \
tox $(args)
rm -rf dist *.egg-info && \
$(PYTHON) -m build

ci-test: | $(PYTHON_ENV)
_release: dist
. $(PYTHON_ENV)/bin/activate && \
MILAN_CI_TEST=1 tox -e py38,py39,py310,py311 $(args)
twine upload --config-file ~/.pypirc.fscherf dist/*

# tests #######################################################################
test:
docker compose run milan tox $(args)

ci-test:
docker compose run milan MILAN_CI_TEST=1 tox -e py38,py39,py310,py311 $(args)

frontend: | $(PYTHON_ENV)
. $(PYTHON_ENV)/bin/activate && \
Expand All @@ -58,20 +67,23 @@ playwright-browser: | $(PYTHON_ENV)
$(PYTHON) scripts/run-playwright.py

# milan #######################################################################
browser: | $(PYTHON_ENV)
. $(PYTHON_ENV)/bin/activate && \
$(PYTHON) scripts/run-browser.py $(args)

demos: | $(PYTHON_ENV)
. $(PYTHON_ENV)/bin/activate && \
rm $(DOC_ROOT)/*.gif && \
$(PYTHON) scripts/run-browser.py \
--browser=chromium \
rm -rf $(DOC_ROOT)/*.gif && \
milan \
run demos/forms.py::main \
--run-app="python demos/demo-app.py --port=8080" \
--await-app-port=8080 \
--headless \
--run-form-demo \
--capture=$(DOC_ROOT)/form-demo.gif && \
$(PYTHON) scripts/run-browser.py \
--browser=chromium \
milan \
run demos/multi-window.py::main \
--run-app="python demos/demo-app.py --port=8080" \
--await-app-port=8080 \
--headless \
--windows=2 \
--capture=$(DOC_ROOT)/multi-window-demo.gif && \
milan \
run demos/youtube.py::open_trending_movies \
--headless \
--run-multi-window-demo \
--capture=$(DOC_ROOT)/multi-window-demo.gif
--capture=$(DOC_ROOT)/youtube-demo.gif
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,11 @@ async with Chromium.start(headless=True) as browser:

## Demos

**Single Window**
**Single Window** ([demos/forms.py](demos/forms.py))
![form-demo.gif](doc/form-demo.gif)

**Multi Window**
**Multi Window** ([demos/multi-window.py](demos/multi-window.py))
![multi-window-demo.gif](doc/multi-window-demo.gif)

**YouTube** ([demos/youtube.py](demos/youtube.py))
![youtube-demo.gif](doc/youtube-demo.gif)
14 changes: 14 additions & 0 deletions bin/milan
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env python3

import sys

from milan.cli.cli import cli


if __name__ == '__main__':
exit_code = cli(
argv=sys.argv,
setup_logging=True,
)

sys.exit(exit_code)
File renamed without changes.
16 changes: 16 additions & 0 deletions demos/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
def main(browser, cli_args):

# navigate to view
browser.navigate('localhost:8080')
browser.await_element('h1')
browser.await_text('h1', 'Milan Demo Application')

# fill out form
browser.fill('#text-input', 'foo')
browser.select('#select', label='Option 17')
browser.check('#check-box', True)

# open popup
browser.click('#open')
browser.fill('#text-input-2', 'bar')
browser.click('#close')
11 changes: 11 additions & 0 deletions demos/multi-window.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
def main(browser, cli_args):

# open first popup
browser.navigate('localhost:8080', window=0)
browser.click('#open', window=0)
browser.fill('#text-input-2', 'foo', window=0)

# open second popup
browser.navigate('localhost:8080', window=1)
browser.click('#open', window=1)
browser.fill('#text-input-2', 'bar', window=1)
5 changes: 5 additions & 0 deletions demos/youtube.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
def open_trending_movies(browser, cli_args):
browser.navigate('youtube.com')
browser.click('#guide-button')
browser.click('[title=Trending]')
browser.click('[tab-title=Movies]')
Binary file added doc/youtube-demo.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 9 additions & 13 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,18 @@ version: "3"

services:
milan:
hostname: milan
user: 1000:1000

build:
context: ./
args:
- UID=${UID:-1000}
- GID=${GID:-1000}
context: .

shm_size: 1gb
user: milan
working_dir: /app

volumes:
- ./:/app
- /tmp/.X11-unix:/tmp/.X11-unix

ports:
- "127.0.0.1:8080:8080"
- "127.0.0.1:9222:9222"
- "127.0.0.1:9223:9223"
environment:
- DISPLAY=${DISPLAY}

working_dir: "/app"
command: "bash"
command: /bin/bash
27 changes: 27 additions & 0 deletions milan/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,34 @@
import logging

from milan.chromium import Chromium # NOQA
from milan.firefox import Firefox # NOQA
from milan.webkit import Webkit # NOQA
from milan.errors import * # NOQA

VERSION = (0, 0, 0)
VERSION_STRING = '.'.join(str(i) for i in VERSION)

BROWSER = {
'chromium': Chromium,
'chrome': Chromium,
'firefox': Firefox,
'webkit': Webkit,
'safari': Webkit,
}

logger = logging.getLogger('milan')


def get_browser_by_name(name):
logging.debug('searching for a browser by name "%s"', name)

_name = name.strip().lower()

if _name not in BROWSER:
raise RuntimeError(f'No browser with name "{name}" found')

browser = BROWSER[_name]

logging.debug('%s found', browser)

return browser
Loading

0 comments on commit fb4a552

Please sign in to comment.