Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Hookman

Documentation Status

This documentation covers HookMan usage & API.

For information about HookMan, read the section above. For public changelog and how the project is maintained, please check the GitHub page

What is HookMan?

HookMan is a python package that provides a plugin management system to applications, specially those who are written (in totally or partially) in C++.

It enables external contributors to implement plugins which act as extensions written in C/C++ that interact with the application through well-defined hooks.

This system was largely inspired by pluggy, the plugin system which powers pytest, tox, and devpi, but with the intent to be called from a C++ application rather than from Python.

It was conceived to facilitate the application development, allowing hooks to be exposed in a clear way and allowing plugins to be developed without access to classes or data from the application.

With HookMan your application can have access to the hooks implemented on plugins as simple as the example below.

# Initializing a classhm=HookMan(specs=acme_specs, plugin_dirs=['path1','path2'])
hook_caller=hm.get_hook_caller()
# Getting access to the hook implementationfriction_factor=hook_caller.friction_factor()
env_temperature=hook_caller.env_temperature()
# Checking if the hook was implementedassertfriction_factorisnotNoneassertenv_temperatureisNone# Executing the hook, wherever it is implemented either in plugin A or B.ff_result=friction_factor(1, 2.5)
env_tmp_result=env_temperature(35.5, 45.5)

How does it work?

In order to use HookMan in your application, it is necessary to inform which Hooks are available to be implemented through a configuration object.

With this configuration defined, users can create plugins that implement available Hooks extending the behavior of your application.

All plugins informed to your application will be validated by HookMan (to check which hooks are implemented), and an object holding a reference to the Hooks will be passed to the application.

The HookMan project uses the library pybind11 to interact between Python and C/C++, allowing a straightforward usage for who is calling the function (either in Python or in C++).

Defining some terminologies:

  • Application ⇨ The program that offers the extensions.
  • Hook ⇨ An extension of the Application.
  • Plugin ⇨ The program that implements the Hooks.
  • User ⇨ The person who installed the application.

Read the docs to learn more!

Credits

Thanks for pluggy, which is a similar project (plugin system) and source for many ideas.

This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template.

About

A plugin management system in python to applications (in totally or partially) written in C++.

Topics

Resources

Contributing

Stars

30 stars

Watchers

13 watching

Forks

Releases

Packages

Used by

Contributors

Languages