Initial commit
This commit is contained in:
commit
e2f8ea7b67
|
@ -0,0 +1 @@
|
||||||
|
__pycache__
|
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2022
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,35 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
def init(): pass
|
||||||
|
def main():
|
||||||
|
mfp.setProgramName("me.fier.example") # Your domain/username and the name of your program
|
||||||
|
|
||||||
|
# Some example code to test the functionality
|
||||||
|
testpy = mfp.require("test")
|
||||||
|
testpy.st = "Hello world"
|
||||||
|
testpy.echo()
|
||||||
|
testpy["st"] = "Hello world 2"
|
||||||
|
testpy.echo()
|
||||||
|
testpy = mfp.require("test")
|
||||||
|
testpy.echo()
|
||||||
|
testpy = mfp.dofile(mfp.p(mfp.sd,"modmfp","test.py")) # Same file as used for mfp.require
|
||||||
|
testpy.echo()
|
||||||
|
|
||||||
|
def bootstrap(name,modName):
|
||||||
|
if name in globals(): return
|
||||||
|
import sys, os, importlib
|
||||||
|
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
||||||
|
s = os.path.realpath(sys.executable)
|
||||||
|
else:
|
||||||
|
s = os.path.realpath(__file__)
|
||||||
|
|
||||||
|
if not os.path.join(os.path.dirname(s),"modpy") in sys.path:
|
||||||
|
sys.path = [os.path.join(os.path.dirname(s),"modpy")] + sys.path
|
||||||
|
|
||||||
|
mod = importlib.import_module(modName); modl = mod.Bunch()
|
||||||
|
mod.init(mod,modl,s,name)
|
||||||
|
globals()[name] = mod; globals()[name + "l"] = modl
|
||||||
|
|
||||||
|
bootstrap("mfp","me.fier.python")
|
||||||
|
init()
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
|
@ -0,0 +1,4 @@
|
||||||
|
print("Running " +mfpl.s)
|
||||||
|
st = None
|
||||||
|
def echo():
|
||||||
|
print(st)
|
|
@ -0,0 +1,78 @@
|
||||||
|
import os
|
||||||
|
|
||||||
|
# BUNCH
|
||||||
|
try:
|
||||||
|
import munch
|
||||||
|
Bunch = munch.Munch
|
||||||
|
bunchify = munch.munchify
|
||||||
|
unbunchify = munch.unmunchify
|
||||||
|
except Exception:
|
||||||
|
import bunch
|
||||||
|
Bunch = munch.Bunch
|
||||||
|
bunchify = munch.bunchify
|
||||||
|
unbunchify = munch.unbunchify
|
||||||
|
|
||||||
|
# GLOBALS
|
||||||
|
g = Bunch()
|
||||||
|
|
||||||
|
# SCRIPTS
|
||||||
|
paths = []
|
||||||
|
loaded = Bunch()
|
||||||
|
|
||||||
|
def docode(st,name = "Unknown"):
|
||||||
|
code = compile(st,name,"exec")
|
||||||
|
glb = Bunch()
|
||||||
|
glb[distro] = me
|
||||||
|
glb[distro + "l"] = Bunch()
|
||||||
|
glb[distro + "l"].s = name
|
||||||
|
try:
|
||||||
|
glb[distro + "l"].sd = pUp(name)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
exec(code,glb)
|
||||||
|
return glb
|
||||||
|
|
||||||
|
def dofile(path):
|
||||||
|
return docode(open(path,encoding="utf-8").read(),path)
|
||||||
|
|
||||||
|
def require(name,*args,**kwargs):
|
||||||
|
if not name in loaded:
|
||||||
|
for path in paths:
|
||||||
|
path = path.replace("?",name)
|
||||||
|
if os.path.isfile(path):
|
||||||
|
loaded[name] = dofile(path,*args,**kwargs)
|
||||||
|
return loaded[name]
|
||||||
|
raise Exception("Library " +name+ " not found.")
|
||||||
|
return loaded[name]
|
||||||
|
|
||||||
|
# PROGRAM
|
||||||
|
programName = None
|
||||||
|
programNameSet = False
|
||||||
|
def setProgramName(name):
|
||||||
|
global programName,programNameSet
|
||||||
|
if programNameSet: return
|
||||||
|
programNameSet = True
|
||||||
|
programName = name
|
||||||
|
|
||||||
|
# INIT
|
||||||
|
inited = False
|
||||||
|
def init(mod,modl,sp,d):
|
||||||
|
global inited
|
||||||
|
if inited: return
|
||||||
|
global distro,me,p,pUp,programName,programNameSet,s,sd,distro
|
||||||
|
import sys
|
||||||
|
inited = True
|
||||||
|
distro = d
|
||||||
|
me = mod
|
||||||
|
|
||||||
|
p = os.path.join
|
||||||
|
pUp = os.path.dirname
|
||||||
|
s = sp
|
||||||
|
sd = pUp(sp)
|
||||||
|
modl.s = s
|
||||||
|
modl.sd = sd
|
||||||
|
programName = distro + "." + s.replace(modl.sd + os.path.sep,"",1).rsplit(".",1)[0]
|
||||||
|
programNameSet = False
|
||||||
|
|
||||||
|
paths.append(p(modl.sd,"mod" +distro, "?.py"))
|
||||||
|
paths.append(p(modl.sd,"mod" +distro, "?","main.py"))
|
|
@ -0,0 +1,28 @@
|
||||||
|
This is the script most of my future (2022.12.19+) Python projects will be based off of. Some of it is inspired by Lua.
|
||||||
|
|
||||||
|
Compatible with Python 3.4 and up. Lower may work.
|
||||||
|
|
||||||
|
The initialization works like this:
|
||||||
|
1. bootstrap(globName,modName) is ran -- It initializes the mfp module, which contains all extra functionality. It takes 2 arguments, the name the module will be in global, and the name of the module. Preferably, you do not edit this.
|
||||||
|
2. init() is ran -- This where you write you initialization code, if your script is usable as a module.
|
||||||
|
3. main() is ran, if your script is not an import -- This is where you put your program code, if it is one.
|
||||||
|
|
||||||
|
Provides the following mfpl.* (local to current script):
|
||||||
|
* s: The script's full path.
|
||||||
|
* sd: The script's full directory.
|
||||||
|
|
||||||
|
Provides the following mfp.* (global to all scripts):
|
||||||
|
* s: The main script's full path.
|
||||||
|
* sd: The main script's full directory.
|
||||||
|
* p(pathList): Combines a list into a path string.
|
||||||
|
* pUp(path): Goes up (..) in the path.
|
||||||
|
* setProgramName(name): Set the name of your main program, only works on first call. You should run it before running any other mfp modules.
|
||||||
|
* programName: The name of your program. DO NOT modify this variable directly, use mfp.setProgramName().
|
||||||
|
* require(name): Runs a module from mfp.paths, saves its global, and returns the script's global as a Bunch. If a module of the same name has already been required, it returns the already saved global.
|
||||||
|
* paths: The directories mfp should search for modules in with mfp.require(). ? in all paths is replaced with the name given to mfp.require().
|
||||||
|
* dofile(path): Runs a script from a raw path. It does not use mfp.paths. Returns the script's global as a Bunch.
|
||||||
|
* docode(text): Runs string as Python code. Returns the script's global as a Bunch.
|
||||||
|
* g: A Bunch where you can store variables accessible by all mfp modules and scripts.
|
||||||
|
* Bunch(): Creates a Bunch. Read about it here: https://github.com/Infinidat/munch
|
||||||
|
* bunchify(list): Converts a list into a Bunch.
|
||||||
|
* unbunchify(Bunch): Converts a Bunch into a regular list.
|
Loading…
Reference in New Issue