Skip to content

Commit

Permalink
Merge pull request #67 from rtCamp/develop
Browse files Browse the repository at this point in the history
Bump v0.9.0 🎉
  • Loading branch information
Xieyt authored Dec 4, 2023
2 parents f9ac2fc + 192f1ad commit ab0492b
Show file tree
Hide file tree
Showing 14 changed files with 216 additions and 238 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@
.idea
*.log
tmp/*
tests/*
**/__pycache__/**
readme.org
2 changes: 1 addition & 1 deletion Docker/build.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
TAG='v0.8.3'
TAG='v0.9.0'
ARCH=$(uname -m)

# arm64
Expand Down
16 changes: 6 additions & 10 deletions Docker/frappe/bench-wrapper.sh
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
#!/bin/bash
# before_command() {
# supervisorctl -c /opt/user/supervisord.conf stop bench-dev
# }
after_command() {
supervisorctl -c /opt/user/supervisord.conf restart bench-dev
supervisorctl -c /opt/user/supervisord.conf restart bench-dev
}
wrapper() {
#before_command
"$@"
after_command
}
wrapper /opt/.pyenv/shims/bench "$@"
if [[ "$@" =~ ^restart[[:space:]]* ]]; then
after_command
else
/opt/.pyenv/shims/bench "$@"
fi
3 changes: 3 additions & 0 deletions frappe_manager/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from pathlib import Path

CLI_DIR = Path.home() / 'frappe'
3 changes: 0 additions & 3 deletions frappe_manager/docker_wrapper/DockerCompose.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
from subprocess import Popen, run, TimeoutExpired, CalledProcessError
from pathlib import Path
import subprocess
from typing import Union, Literal
from rich import print

import shlex
from frappe_manager.docker_wrapper.utils import (
stream_stdout_and_stderr,
parameters_to_options,
run_command_with_exit_code,
)
Expand Down
15 changes: 9 additions & 6 deletions frappe_manager/docker_wrapper/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,19 @@
from subprocess import PIPE, Popen, run
from threading import Thread
from typing import Any, Dict, Iterable, List, Optional, Tuple, Union, overload

from frappe_manager.logger import log
from rich import control

from frappe_manager.docker_wrapper.DockerException import DockerException

logger = log.get_logger()

def reader(pipe, pipe_name, queue):
try:
with pipe:
for line in iter(pipe.readline, b""):
# queue.put((pipe_name, line))
queue.put((pipe_name, str(line.decode().strip('\n')).encode()))
queue_line = line.decode().strip('\n')
logger.debug(queue_line)
queue.put((pipe_name, str(queue_line).encode()))
finally:
queue.put(None)

Expand All @@ -32,15 +33,15 @@ def stream_stdout_and_stderr(
full_cmd: list,
env: Dict[str, str] = None,
) -> Iterable[Tuple[str, bytes]]:

logger.debug('- -'*10)
logger.debug(f"DOCKER COMMAND: {' '.join(full_cmd)}")
if env is None:
subprocess_env = None
else:
subprocess_env = dict(os.environ)
subprocess_env.update(env)

full_cmd = list(map(str, full_cmd))
#print(full_cmd)
process = Popen(full_cmd, stdout=PIPE, stderr=PIPE, env=subprocess_env)
q = Queue()
full_stderr = b"" # for the error message
Expand All @@ -60,6 +61,8 @@ def stream_stdout_and_stderr(

exit_code = process.wait()

logger.debug(f"RETURN CODE: {exit_code}")
logger.debug('- -'*10)
if exit_code != 0:
raise DockerException(full_cmd, exit_code, stderr=full_stderr)

Expand Down
1 change: 1 addition & 0 deletions frappe_manager/logger/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import log
46 changes: 46 additions & 0 deletions frappe_manager/logger/log.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import logging
import logging.handlers
import os
from frappe_manager import CLI_DIR
import shutil
import gzip
from typing import Dict, Optional, Union


def namer(name):
return name + ".gz"

def rotator(source, dest):
with open(source, 'rb') as f_in:
with gzip.open(dest, 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
os.remove(source)

loggers: Dict[str, logging.Logger] = {}
log_directory = CLI_DIR / 'logs'

def get_logger(log_dir=log_directory, log_file_name='fm') -> logging.Logger:
""" Creates a Log File and returns Logger object """
# Build Log File Full Path
logPath = log_dir / f"{log_file_name}.log"

# if the directory doesn't exits then create it
log_dir.mkdir(parents=True, exist_ok=True)

# Create logger object and set the format for logging and other attributes
if loggers.get(log_file_name):
logger: Optional[logging.Logger] = loggers.get(log_file_name)
else:
logger: Optional[logging.Logger] = logging.getLogger(log_file_name)
logger.setLevel(logging.DEBUG)

# configured to roatate after 10 mb
handler = logging.handlers.RotatingFileHandler(logPath,'a+',maxBytes=10485760, backupCount=3)
handler.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)s: %(message)s'))
handler.rotator = rotator
logger.addHandler(handler)

# save logger to dict loggers
loggers[log_file_name] = logger

return logger
113 changes: 93 additions & 20 deletions frappe_manager/main.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,54 @@
import typer
import importlib
import os
import requests
import sys
import shutil
import atexit
from typing import Annotated, List, Optional, Set
from pathlib import Path
from frappe_manager.site_manager.manager import SiteManager
from frappe_manager.site_manager.Richprint import richprint
import os
import requests
from frappe_manager import CLI_DIR
from frappe_manager.logger import log

app = typer.Typer(no_args_is_help=True,rich_markup_mode='rich')

# TODO configure this using config
#sites_dir = Path().home() / __name__.split(".")[0]

sites_dir = Path.home() / 'frappe'
sites = SiteManager(sites_dir)

def exit_cleanup():
"""
This function is used to perform cleanup at the exit.
"""
richprint.stop()

def cli_entrypoint():
# logging
logger = log.get_logger()
logger.info('')
logger.info(f"{':'*20}FM Invoked{':'*20}")
logger.info('')

# logging command provided by user
logger.info(f"RUNNING COMMAND: {' '.join(sys.argv[1:])}")
logger.info('-'*20)
try:
app()
except Exception as e:
logger.exception(f"Exception: : {e}")
raise e
finally:
atexit.register(exit_cleanup)

# this will be initiated later in the app_callback
sites: Optional[SiteManager] = None

def version_callback(version: Optional[bool] = None):
if version:
fm_version = importlib.metadata.version('frappe_manager')
richprint.print(fm_version,emoji_code='')
raise typer.Exit()


@app.callback()
def app_callback(
ctx: typer.Context,
Expand All @@ -34,7 +60,51 @@ def app_callback(
"""
FrappeManager for creating frappe development envrionments.
"""
richprint.start(f"Working")

# Checks for cli directory
if not CLI_DIR.exists():
# creating the sites dir
# TODO check if it's writeable and readable -> by writing a file to it and catching exception
CLI_DIR.mkdir(parents=True, exist_ok=True)
richprint.print(f"fm directory doesn't exists! Created at -> {str(CLI_DIR)}")
else:
if not CLI_DIR.is_dir():
richprint.exit("Sites directory is not a directory! Aborting!")

# migration for directory change from CLI_DIR to CLI_DIR/sites
# TODO remove when not required, introduced in 0.8.4
sitesdir = CLI_DIR / 'sites'
if not sitesdir.exists():
richprint.change_head("Site directory migration")
move_directory_list = []
for site_dir in CLI_DIR.iterdir():
if site_dir.is_dir():
docker_compose_path = site_dir / "docker-compose.yml"
if docker_compose_path.exists():
move_directory_list.append(site_dir)

# stop all the sites
sitesdir.mkdir(parents=True, exist_ok=True)
sites_mananger = SiteManager(CLI_DIR)
sites_mananger.stop_sites()
# move all the directories
for site in move_directory_list:
site_name = site.parts[-1]
new_path = sitesdir / site_name
try:
shutil.move(site,new_path)
richprint.print(f"Directory migrated: {site_name}")
except:
logger.debug(f'Site Directory migration failed: {site}')
richprint.warning(f"Unable to site directory migration for {site}\nPlease manually move it to {new_path}")
richprint.print("Site directory migration: Done")

global sites
sites = SiteManager(sitesdir)

sites.set_typer_context(ctx)

if verbose:
sites.set_verbose()

Expand All @@ -52,18 +122,21 @@ def app_callback(

def check_frappe_app_exists(appname: str, branchname: str | None = None):
# check appname
app_url = f"https://github.com/frappe/{appname}"
app = requests.get(app_url).status_code

if branchname:
branch_url = f"https://github.com/frappe/{appname}/tree/{branchname}"
# check branch
branch = requests.get(branch_url).status_code
return {
"app": True if app == 200 else False,
"branch": True if branch == 200 else False,
}
return {"app": True if app == 200 else False}
try:
app_url = f"https://github.com/frappe/{appname}"
app = requests.get(app_url).status_code

if branchname:
branch_url = f"https://github.com/frappe/{appname}/tree/{branchname}"
# check branch
branch = requests.get(branch_url).status_code
return {
"app": True if app == 200 else False,
"branch": True if branch == 200 else False,
}
return {"app": True if app == 200 else False}
except Exception:
richprint.exit("Not able to connect to github.com.")


def apps_validation(value: List[str] | None):
Expand Down Expand Up @@ -143,7 +216,7 @@ def create(
$ [blue]fm create example --frappe-branch version-15-beta --apps erpnext:version-15-beta --apps hrms:version-15-beta[/blue]
"""

sites.init(sitename, createdir=True)
sites.init(sitename)

uid: int = os.getuid()
gid: int = os.getgid()
Expand Down
Loading

0 comments on commit ab0492b

Please sign in to comment.