Quellcode durchsuchen

Merge pull request #11305 from gavindsouza/allow-me-to-execute-anything

feat: Allow me to execute anything console would allow
version-14
mergify[bot] vor 4 Jahren
committed by GitHub
Ursprung
Commit
e75df971fc
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden GPG-Schlüssel-ID: 4AEE18F83AFDEB23
2 geänderte Dateien mit 51 neuen und 1 gelöschten Zeilen
  1. +5
    -1
      frappe/commands/utils.py
  2. +46
    -0
      frappe/tests/test_commands.py

+ 5
- 1
frappe/commands/utils.py Datei anzeigen

@@ -133,6 +133,7 @@ def reset_perms(context):
def execute(context, method, args=None, kwargs=None, profile=False):
"Execute a function"
for site in context.sites:
ret = ""
try:
frappe.init(site=site)
frappe.connect()
@@ -154,7 +155,10 @@ def execute(context, method, args=None, kwargs=None, profile=False):
pr = cProfile.Profile()
pr.enable()

ret = frappe.get_attr(method)(*args, **kwargs)
try:
ret = frappe.get_attr(method)(*args, **kwargs)
except Exception:
ret = frappe.safe_eval(method + "(*args, **kwargs)", eval_globals=globals(), eval_locals=locals())

if profile:
pr.disable()


+ 46
- 0
frappe/tests/test_commands.py Datei anzeigen

@@ -0,0 +1,46 @@
# Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors

# imports - standard imports
import shlex
import subprocess
import unittest

# imports - module imports
import frappe


def clean(value):
if isinstance(value, (bytes, str)):
value = value.decode().strip()
return value


class BaseTestCommands:
def execute(self, command):
command = command.format(**{"site": frappe.local.site})
command = shlex.split(command)
self._proc = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
self.stdout = clean(self._proc.stdout)
self.stderr = clean(self._proc.stderr)
self.returncode = clean(self._proc.returncode)


class TestCommands(BaseTestCommands, unittest.TestCase):
def test_execute(self):
# test 1: execute a command expecting a numeric output
self.execute("bench --site {site} execute frappe.db.get_database_size")
self.assertEquals(self.returncode, 0)
self.assertIsInstance(float(self.stdout), float)

# test 2: execute a command expecting an errored output as local won't exist
self.execute("bench --site {site} execute frappe.local.site")
self.assertEquals(self.returncode, 1)
self.assertIsNotNone(self.stderr)

# test 3: execute a command with kwargs
# Note:
# terminal command has been escaped to avoid .format string replacement
# The returned value has quotes which have been trimmed for the test
self.execute("""bench --site {site} execute frappe.bold --kwargs '{{"text": "DocType"}}'""")
self.assertEquals(self.returncode, 0)
self.assertEquals(self.stdout[1:-1], frappe.bold(text='DocType'))

Laden…
Abbrechen
Speichern