Saravanan666/pypi-org huggingface dataset:
Package: qtier
qtierCuter approach to Qt-for-python, with focus on type hints, JSON APIs and QML.Example Usage:The following example shows how qtier can be used to query a graphql service.models.pyfromqtier.itemsystemimportrole,define_roles@define_rolesclassWorm:name:str=role()family:str=role()size:int=role()@define_rolesclassApple:size:int=role()owner:str=role()color:str=role()# nested models are also supported!worms:Worm=role(default=None)qtier will create for youQAbstractListModelto be used in QML you only need to
define your models withdefine_roles.
qtier initializes the data with a dict, in this case coming from graphql service.main.pyimportglobimportosimportsysfrompathlibimportPathfromqtpy.QtQmlimportQQmlApplicationEnginefromqtpy.QtCoreimportQObject,SignalfromqtpyimportQtCore,QtGui,QtQml,QtQuickfromqtierimportslotfromqtier.gql.clientimportHandlerProto,GqlClientMessage,GqlWsTransportClientfromqtier.itemsystemimportGenericModelfromtests.test_sample_ui.modelsimportAppleclassEntryPoint(QObject):classAppleHandler(HandlerProto):message=GqlClientMessage.from_query("""query MyQuery {apples {colorownersizeworms {familynamesize}}}""")def__init__(self,app:'EntryPoint'):self.app=appdefon_data(self,message:dict)->None:self.app.apple_model.initialize_data(message['apples'])defon_error(self,message:dict)->None:print(message)defon_completed(self,message:dict)->None:print(message)def__init__(self,parent=None):super().__init__(parent)main_qml=Path(__file__).parent/'qml'/'main.qml'QtGui.QFontDatabase.addApplicationFont(str(main_qml.parent/'materialdesignicons-webfont.ttf'))self.qml_engine=QQmlApplicationEngine()self.gql_client=GqlWsTransportClient(url='ws://localhost:8080/graphql')self.apple_query_handler=self.AppleHandler(self)self.gql_client.query(self.apple_query_handler)self.apple_model:GenericModel[Apple]=Apple.Model()QtQml.qmlRegisterSingletonInstance(EntryPoint,"com.props",1,0,"EntryPoint",self)# type: ignore# for some reason the app won't initialize without this event processing here.QtCore.QEventLoop().processEvents(QtCore.QEventLoop.ProcessEventsFlag.AllEvents,1000)self.qml_engine.load(str(main_qml.resolve()))@QtCore.Property(QtCore.QObject,constant=True)defappleModel(self)->GenericModel[Apple]:returnself.apple_modeldefmain():app=QtGui.QGuiApplication(sys.argv)ep=EntryPoint()# noqa: F841, this collected by the gc otherwise.ret=app.exec()sys.exit(ret)if__name__=="__main__":main()
Package: qtile
A full-featured, hackable tiling window manager written and configured in PythonFeaturesSimple, small and extensible. It’s easy to write your own layouts,
widgets and commands.Configured in Python.Runs as an X11 WM or a Wayland compositor.Command shell that allows all aspects of Qtile to be managed and
inspected.Complete remote scriptability - write scripts to set up workspaces,
manipulate windows, update status bar widgets and more.Qtile’s remote scriptability makes it one of the most thoroughly
unit-tested window managers around.CommunityQtile is supported by a dedicated group of users. If you need any help, please
don’t hesitate to fire off an email to our mailing list or join us on IRC. You
can also ask questions on the discussions board.Mailing List:https://groups.google.com/group/qtile-devQ&A:https://github.com/qtile/qtile/discussions/categories/q-aIRC:irc://irc.oftc.net:6667/qtileDiscord:https://discord.gg/ehh233wCrC(Bridged with IRC)Example codeCheck out theqtile-examplesrepo which contains examples of users’ configurations,
scripts and other useful links.ContributingPlease report any suggestions, feature requests, bug reports, or annoyances to
the GitHubissue tracker. There are also a fewtips & tricks,
andguidelinesfor contributing in the documentation.Please also consider submitting useful scripts etc. to the qtile-examples repo
(see above).Maintainers@tych0GPG:3CCA B226 289D E016 0C61 BDB4 18D1 8F1B C464 DCA3@ramnesGPG:99CC A84E 2C8C 74F3 2E12  AD53 8C17 0207 0803 487A@m-colGPG:35D9 2E7C C735 7A81 173E  A1C9 74F9 FDD2 0984 FBEC@flacjacketGPG:58B5 F350 8339 BFE5 CA93  AC9F 439D 9701 E7EA C588@elParaguayoGPG:A6BA A1E1 7D26 64AD B97B  2C6F 58A9 AA7C 8672 7DF7@jwijenberghGPG:B1C8 1CF3 063B 5836 4946  3687 4827 061B D417 C233
Package: qtile-profiles
qtile-profilesIm using my laptop for work and private stuff and wanted to use some kind of profiles.InstallationYou can install the package using pippipinstallqtile-profilesUsagefromqtile_profilesimportProfile,ProfileManagerdefset_browser(browser:str):subprocess.run(f"xdg-mime default{browser}x-scheme-handler/http",shell=True,)subprocess.run(f"xdg-mime default{browser}x-scheme-handler/https",shell=True,)work=Profile(programs={# define some aliases for shorter commands later"firefox":"firefox","thunderbird":"flatpak run org.mozilla.Thunderbird",# see 6 lines down"teams":"chromium --app=https://teams.office.com",},init=[# spawn these program when calling initialize("web",["firefox"]),("chat",["mattermost-desktop","teams"]),("mail",["tunderbird"]),# here we can use thunderbird insead of calling flatpak("kp",["keepassxc"]),],on_load=lambdaqtile:set_browser("firefox.desktop")# callback, call when profile is selected)privat=Profile(programs={"firefox":"firefox -P privat","thunderbird":"thunderbird","discord":"discord",},init=[("web",["firefox"]),("chat",["signal-desktop","discord"]),("mail",["thunderbird"]),("kp",["keepassxc"]),],on_load=lambdaqtile:set_browser("firefox-privat.desktop"))profiles=ProfileManager([work,privat])keys.extend([Key([super],"p",lazy.function(profiles.next_profile)),Key([super],"f",lazy.function(profiles.spawn,"firefox")),Key([super],"i",lazy.function(profiles.current_profile.spawn_init)),])
Package: qtile-window-trashbin
qtile-window-trashbinQtile Extension to reopen closed windows. Never think "Oh shit" again when you close a window.InstallationYou can install the package using pippipinstallqtile-window-trashbinUsageThis module adds a "Thrashbin" class. Use it in your keybindings instead of kill. The pane will be killed after a given time.U could put the following in your ~/.config/qtile/config.pyfromtrashbinimportTrashbintrash_group=ScratchPad("killPane")#We use an invisible Group: A ScratchPad.groups.extend([trash_group])# Let's append it to to groups.trash=Trashbin(trash_group.name,delay=5)# Initialize the Trashbin. Use the newly created Group to store the windows. Kill a Window put to the trashbin afert 5 seconds.keys.extend([Key([mod],"q",lazy.function(trash.append_currend_window)),# move to trashKey([mod,"shift"],"q",lazy.window.kill()),# real kill. Sometimes you want to kill insteadly.Key([mod,"shift"],"e",lazy.function(trash.pop_to_current_group))# Restore the last window put to the trashbin.])Afterwards you can hitSuper + qand the current window be moved to the trash.
HitSuper + Shift + eto restore the last window, put to the trashbin.
Sometimes moving a window to the trash is not what you want.
For example when quiting an video player you may want to stop the playing immediately.
HitSuper + Shift + qto quit immediatley. Caution: This is not undoable.
Package: qtilities
# qtilitiesA collection of utility programs for PyQt5 development.## Installation### From PyPIpip install qtilities### From sourcegit clone https://github.com/pylipp/qtilitiescd qtilitiesmake install## Contents### `pqp` and `pqpc`> Python QML Previewer and Client`pqp` previews QML components and continuously updates while you're editing the source code.#### StartLaunch an empty previewer:> pqpLaunch the previewer displaying one or more components by providing the paths:> pqp TextFoo.qml bar/ComboBaz.qml#### Loading componentsLoad components by clicking the 'Load' button.Alternatively you can run the client:> pqpc HackWindow.qmlIt sends one or more component paths via UDP to port 31415. The previewer `pqp` listens to that port and loads the components.#### Pausing/resuming preview`pqp` continuously updates, regardless of changes in the source code or not. If you wish to test user interaction functionality of your component, you can pause the preview by clicking the 'Preview' button.### `qmltags`> Basic ctags generator for QML components`qmltags` generates 'class' ctags for custom QML components.Run without arguments to recursively parse the current directory and its subdirectories for QML files> qmltagsAlternatively, you can provide one or more paths to QML components:> qmltags HackWindow.qml screen/*.qmlThis assumes that your shell performs file name expansion.Note that `qmltags` overwrites a `tags` file in the current working directory if it exists.### `pyqmlscene`> Basic Python port of the `qmlscene` utilityRun with a QML file holding an arbitrary component as argument:> pyqmlscene MyComponent.qml
Package: qTimer
A small command line extendable timer that integrates with various project
management solutions.Installation and ConfigurationqTimer can be install via the
[Python Package Index](http://pypi.python.org/pypi/qTimer) or via
setup.py.  qTimer depends upon
[SQLAlchemy](http://pypi.python.org/pypi/SQLAlchemy) and
[Alembic](http://pypi.python.org/pypi/alembic) to run.You should take the time to configure qTimer before running it for the first
time.  Basic configuration is to copy the dist-packages/qtimer/default.ini to
$HOME/.qtimer and then change the url and token.  You can also configure things
such as how long will qTimer cache data from remote sources and how much will
it round time in both display and posting.  The[alembic]and[loggers]sections are for advanced users only, and the average user should probably
steer clear of those.Extending qTimerIf you’re interested in extending qTimer take a look at the plugins folder
and the commands folder.A command is a class which provides a sub-parser and business logic
for a given sub-command. See commands folder and command.py for detailsA plugin represents a way of retrieving data from a remote source.  Plugins
are required to have the magic method load_qtimer_plugin(url, token).  See
plugins/plugin.prototype.py for more details.
Package: qt-installer
yaqti (Yet Another QT Installer - ya-q-ti!)Overviewyaqtiis a basic unofficial CLI Qt installer; designed to keep things as stupid as possible. It lets you install different Qt5 and Qt6 versions with optional modules such as QtCharts, QtNetworkAuth ect all in a single command,# install yaqtipipinstallyaqti# install Qt!python-myaqtiinstall--oswindows--platformdesktop--version6.2.0--modulesqtchartsqtquick3d, optionally the--set-envcan be specified. This setsQt5_DIR/Qt6_DIRso CMake can find the installation.--install-depscan be specified, on Linux platforms to install Qt dependencies fromapt-get.
It can also be used as a github action,-   name: Install Qt
    uses: WillBrennan/yaqti
    with:
        version: '6.2.0'
        host: 'linux'
        target: 'desktop'
        modules: 'qtcharts qtwebengine'. By default, the github-action will set the enviroment variables for Qt and install Qt dependencies. For a real-world example visitdisk_usage, the project this was made for.OptionsversionThe version of Qt to install, for example6.2.0or5.15.2. It checks the version is valid.osThe operating system you'll be running onlinux,windows, ormac.platformThe platform you'll be building for,desktop,winrt,android, orios.modulesThe optional Qt modules to install such as,qtcharts,qtpurchasing,qtwebengine,qtnetworkauth,qtscript,debug_info.output-default: ./qtThe directory to install Qt in, it will put it in aversionsub directory. By default if you install--version=5.15.2it will install qt into./qt/5152.--set-envsDesigned for use in CI pipelines; this sets enviromental variables such asPATH,Qt5_DIR, andQt6_DIRso CMake can find Qt and you can use executables directly.--install-depsDesigned for use in CI pipelines. This installs dependencies required by Qt on Linux platforms. If this flag is provided on non-linux platforms it does nothing.Why Another Qt CLI Installer?I've had issues with other CLI installers in the past,They'll silently fail to download a module if you typeqchartsinstead ofqtchartsThis fetches module and addon configurations directly from the Qt Archive, new modules and versions will appear without the tool updating!It keeps module names the same between Qt5 and Qt6 despite Qt moving them around a bit.I like to keep things stupidly simple!How does it work?!Qt provides theQt Archive, this script simply works out what 7zip files to fetch and unpacks them to the specified installation directory. Then if you want, it sets the enviroment variable so CMake can find the install.
Package: qtinter
qtinter — Interop between asyncio and Qt for Pythonqtinteris a Python module that brings together asyncio and Qt
for Python, allowing you to use one from the other seamlessly.Read thefull documentationor check out the quickstart below.Installation$ pip install qtinterUsing asyncio from QtTo use asyncio-based libraries in Qt for Python, encloseapp.exec()inside context managerqtinter.using_asyncio_from_qt().Example (taken fromexamples/clock.py):"""Display LCD-style digital clock"""importasyncioimportdatetimeimportqtinter# <-- import modulefromPySide6importQtWidgetsclassClock(QtWidgets.QLCDNumber):def__init__(self,parent=None):super().__init__(parent)self.setDigitCount(8)defshowEvent(self,event):self._task=asyncio.create_task(self._tick())defhideEvent(self,event):self._task.cancel()asyncdef_tick(self):whileTrue:t=datetime.datetime.now()self.display(t.strftime("%H:%M:%S"))awaitasyncio.sleep(1.0-t.microsecond/1000000+0.05)if__name__=="__main__":app=QtWidgets.QApplication([])widget=Clock()widget.setWindowTitle("qtinter - Digital Clock example")widget.resize(300,50)withqtinter.using_asyncio_from_qt():# <-- enable asyncio in qt codewidget.show()app.exec()Using Qt from asyncioTo use Qt components from asyncio-based code, enclose the asyncio
entry-point inside context managerqtinter.using_qt_from_asyncio().Example (taken fromexamples/color.py):"""Display the RGB code of a color chosen by the user"""importasyncioimportqtinter# <-- import modulefromPySide6importQtWidgetsasyncdefchoose_color():dialog=QtWidgets.QColorDialog()dialog.show()future=asyncio.Future()dialog.finished.connect(future.set_result)result=awaitfutureifresult==QtWidgets.QDialog.DialogCode.Accepted:returndialog.selectedColor().name()else:returnNoneif__name__=="__main__":app=QtWidgets.QApplication([])withqtinter.using_qt_from_asyncio():# <-- enable qt in asyncio codecolor=asyncio.run(choose_color())ifcolorisnotNone:print(color)Using modal dialogsTo execute a modal dialog without blocking the asyncio event loop,
wrap the dialog entry-point inqtinter.modal()andawaiton it.Example (taken fromexamples/hit_100.py):importasyncioimportqtinterfromPySide6importQtWidgetsasyncdefmain():asyncdefcounter():nonlocalnwhileTrue:print(f"\r{n}",end='',flush=True)awaitasyncio.sleep(0.025)n+=1n=0counter_task=asyncio.create_task(counter())awaitqtinter.modal(QtWidgets.QMessageBox.information)(None,"Hit 100","Click OK when you think you hit 100.")counter_task.cancel()ifn==100:print("\nYou did it!")else:print("\nTry again!")if__name__=="__main__":app=QtWidgets.QApplication([])withqtinter.using_qt_from_asyncio():asyncio.run(main())Requirementsqtintersupports the following:Python version: 3.7 or higherQt binding: PyQt5, PyQt6, PySide2, PySide6Operating system: Linux, MacOS, WindowsLicenseBSD License.ContributingPlease raise an issue if you have any questions. Pull requests are more
than welcome!Creditsqtinteris derived fromqasyncbut rewritten from
scratch.  qasync is derived fromasyncqt, which is derived fromquamash.
Package: qtinteract
qtinteractA library for building fast interactive plots in Jupyter notebooks using Qt Widgets.Installationpip install qtinteractUsage%gui qt5    

from math import pi
from qtinteract import iplot

def f(x, a):
    return np.sin(a*x)

x = np.linspace(0, 2*pi, 101)

iplot(x, f, a=(1., 5.))
Package: qtip
QTIP provides Benchmarking as a Service for OPNFV community[![License](https://img.shields.io/github/license/opnfv/qtip.svg)](https://git.opnfv.org/qtip/tree/LICENSE)
[![Jenkins](https://img.shields.io/jenkins/s/https/build.opnfv.org/ci/view/qtip/job/qtip-verify-master.svg)](https://build.opnfv.org/ci/view/qtip/job/qtip-verify-master/)
[![Jenkins coverage](https://img.shields.io/jenkins/c/https/build.opnfv.org/ci/view/qtip/job/qtip-verify-master.svg)](https://build.opnfv.org/ci/view/qtip/job/qtip-verify-master/cobertura)
[![PyPI](https://img.shields.io/pypi/v/qtip.svg)](https://pypi.python.org/pypi/qtip)
[![Docker Pulls](https://img.shields.io/docker/pulls/opnfv/qtip.svg)](https://hub.docker.com/r/opnfv/qtip/)See [project wiki](https://wiki.opnfv.org/display/qtip) for more information.
Package: qt-jsonschema-form
qt-jsonschema-formA tool to generate Qt forms from JSON Schemas.FeaturesError messages from JSONSchema validation (see jsonschema).Widgets for file selection, colour picking, date-time selection (and more).Per-field widget customisation is provided by an additional ui-schema (inspired byhttps://github.com/mozilla-services/react-jsonschema-form).Unsupported validatorsCurrently this tool does not supportanyOforoneOfdirectives. The reason for this is simply that these validators have different semantics depending upon the context in which they are found. Primitive support could be added with meta-widgets for type schemas.Additionally, the$refkeyword is not supported. This will be fixed, but is waiting on some proposed upstream changes injsonschemaExampleimportsysfromjsonimportdumpsfromqtpyimportQtWidgetsfromqt_jsonschema_formimportWidgetBuilderif__name__=="__main__":app=QtWidgets.QApplication(sys.argv)builder=WidgetBuilder()schema={"type":"object","title":"Number fields and widgets","properties":{"schema_path":{"title":"Schema path","type":"string"},"integerRangeSteps":{"title":"Integer range (by 10)","type":"integer","minimum":55,"maximum":100,"multipleOf":10},"event":{"type":"string","format":"date"},"sky_colour":{"type":"string"},"names":{"type":"array","items":[{"type":"string","pattern":"[a-zA-Z\-'\s]+","enum":["Jack","Jill"]},{"type":"string","pattern":"[a-zA-Z\-'\s]+","enum":["Alice","Bob"]},],"additionalItems":{"type":"number"},}}}ui_schema={"schema_path":{"ui:widget":"filepath"},"sky_colour":{"ui:widget":"colour"}}form=builder.create_form(schema,ui_schema)form.widget.state={"schema_path":"some_file.py","integerRangeSteps":60,"sky_colour":"#8f5902","names":["Jack","Bob"]}form.show()form.widget.on_changed.connect(lambdad:print(dumps(d,indent=4)))app.exec_()NotesThis package usesQtPyas an abstraction layer for PyQt5/PySide2/PyQt6/PySide6. One of those libraries must also be installed in order to function.
Package: qt-json-setting
pyqt设置生成器一个可以根据json schema自动生成设置界面的工具功能:错误提示选项描述默认值提示拓展语法item_list:
你可以通过指定item_list来限定内容
例如:"optional":{"type":"string","title":"test2","item_list":["bule","green","yellow"]}效果:
Package: qtl
pyQTLpyQTL is a python module for analyzing and visualizing quantitative trait loci (QTL) data.InstallYou can install pyQTL using pip:pip3 install qtlor directly from this repository:$ git clone git@github.com:broadinstitute/pyqtl.git
$ cd pyqtl
# set up virtual environment and install
$ virtualenv venv
$ source venv/bin/activate
(venv)$ pip install -e .
Package: qt-log
QtLogCustom Python Log with colored message display for Maya/Houdini/NukePySide2/Python3 - Maya +2022, Houdini +19, Nuke +13Message Levelslog=get_stream_logger('my_log')log.info('test info')# whitelog.warning('test warning')# orangelog.error('test error')# redlog.critical('test critical')# purplelog.debug('test debug')# yellowlog.ok('test ok')# sky bluelog.file('test file')# super light bluelog.process('test process')# light bluelog.done('test done')# greenlog.hint('hint to the user')# yellowUsage# importsfromqtlog.stream_logimportget_stream_loggerfromqtlog.qt_ui_loggerimportQtUILogger# get loggerslog=get_stream_logger('MyToolLog')log_ext=get_stream_logger('ExternalLog')# create the log widgetself.loggers=QtUILogger(parent=self,layout_widget=self.ui.log_layout,loggers=[log,log_ext])# sent messages are displayed in color on the ui widget and mayalog.hint('Message')
Package: qtmacs
Qtmacs is an Emacs inspired macro framework for Qt. It consists of
task related applets and widget specific macros.Applets are basically plain windows that can house arbitrary
code and widgets. Within Qtmacs, they provide the functionailty to
eg. edit text, view a PDF file, or browse the web.Macros, on the other hand, govern the behaviour of individual widgets
in response to keyboard input. They are are applicable to any Qt based
widget.Both, applets and macros, are supplied via Python modules and can be
changed during runtime to customise the functionality and behaviour of
Qtmacs as required.SOURCE CODEThe source code is hosted on Github:https://github.com/qtmacsdev/qtmacsREQUIREMENTSPython 3.xPyQt4Older versions of PyQt4 may work as well but have not been tested.INSTALLATIONTo install Qtmacs on Windows, or use package managers on Linux based
distributions, please refer to theinstallation guide.To try out the source code directly use:gitclonehttps://github.com/qtmacsdev/qtmacs.gitcdqtmacs/bin./qtmacsDOCUMENTATIONThe full documentation, including screenshots, is available athttp://qtmacsdev.github.com/qtmacs/titlepage.htmlThere is also a discussion group athttps://groups.google.com/forum/?fromgroups#!forum/qtmacsLICENSEQtmacs is licensed under the terms of the GPL.
Package: qtme
Copyright (c) 2023 Jérémie DECOCK (www.jdhp.org)Web site:http://www.jdhp.org/software_en.html#qtmeOnline documentation:https://jdhp.gitlab.io/qtmeExamples:https://jdhp.gitlab.io/qtme/gallery/Notebooks:https://gitlab.com/jdhp/qt-multimedia-editor-notebooksSource code:https://gitlab.com/jdhp/qt-multimedia-editorIssue tracker:https://gitlab.com/jdhp/qt-multimedia-editor/issuesPytest code coverage:https://jdhp.gitlab.io/qtme/htmlcov/index.htmlQt Multimedia Editor on PyPI:https://pypi.org/project/qtmeQt Multimedia Editor on Anaconda Cloud:https://anaconda.org/jdhp/qtmeDescriptionMultimedia editor for PyQt/PySideNote:This project is still in beta stage, so the API is not finalized yet.DependenciesC.f. requirements.txtInstallationPosix (Linux, MacOSX, WSL, …)From the Qt Multimedia Editor source code:conda deactivate         # Only if you use Anaconda...
python3 -m venv env
source env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -r requirements.txt
python3 setup.py developWindowsFrom the Qt Multimedia Editor source code:conda deactivate         # Only if you use Anaconda...
python3 -m venv env
env\Scripts\activate.bat
python3 -m pip install --upgrade pip
python3 -m pip install -r requirements.txt
python3 setup.py developDocumentationOnline documentation:https://jdhp.gitlab.io/qtmeAPI documentation:https://jdhp.gitlab.io/qtme/api.htmlExample usageExamples:https://jdhp.gitlab.io/qtme/gallery/Build and run the Python Docker imageBuild the docker imageFrom the Qt Multimedia Editor source code:docker build -t qtme:latest .Run unit tests from the docker containerFrom the Qt Multimedia Editor source code:docker run qtme pytestRun an example from the docker containerFrom the Qt Multimedia Editor source code:docker run qtme python3 /app/examples/hello.pyBug reportsTo search for bugs or report them, please use the Qt Multimedia Editor Bug Tracker at:https://gitlab.com/jdhp/qt-multimedia-editor/issuesLicenseThis project is provided under the terms and conditions of theMIT License.
Package: qtmetabolabpy
Python package to process 1D and 2D NMR spectroscopic data for metabolomics and tracer based metabolism analysisDocumentation:https://ludwigc.github.io/metabolabpySource:https://github.com/ludwigc/MetaboLabPyBug reports:https://github.com/ludwigc/MetaboLabPy/issuesInstallationSee theInstallation pageof
theonline documentation.Command line$ metabolabpy --helpBugsPlease report any bugs that you findhere.
Or fork the repository onGitHuband create a pull request (PR). We welcome all contributions, and we
will help you to make the PR if you are new togit.Developers & ContributorsChristian Ludwig (C.Ludwig@bham.ac.uk) -University of Birmingham (UK)LicenseReleased under the GNU General Public License v3.0 (seeLICENSE file)