Initial commit

This commit is contained in:
Fierelier 2022-12-19 08:01:04 +01:00
commit e2f8ea7b67
6 changed files with 165 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__

19
LICENSE Normal file
View File

@ -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.

35
example.py Normal file
View File

@ -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()

4
modmfp/test.py Normal file
View File

@ -0,0 +1,4 @@
print("Running " +mfpl.s)
st = None
def echo():
print(st)

View File

@ -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"))

28
readme.txt Normal file
View File

@ -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.