diff --git a/custom_theme/main.html b/custom_theme/main.html index bffbb07..4c73cdc 100644 --- a/custom_theme/main.html +++ b/custom_theme/main.html @@ -8,4 +8,15 @@ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-PG938LS'); + + + {% endblock %} diff --git a/custom_theme/partials/header.html.tpl b/custom_theme/partials/header.html.tpl index fa6afdc..5ede20a 100644 --- a/custom_theme/partials/header.html.tpl +++ b/custom_theme/partials/header.html.tpl @@ -25,11 +25,6 @@ var currVersion = '{{ config.curr_docs_version }}'
-
@@ -90,14 +85,11 @@ {% endif %} - {% if "material/search" in config.plugins %} - {% set search = config.plugins["material/search"] | attr("config") %} - {% if search.enabled %} - - {% include "partials/search.html" %} - {% endif %} + {% if "search" in config["plugins"] %} + + {% include "partials/search.html" %} {% endif %} {% if config.repo_url %}
@@ -116,6 +108,23 @@ .md-typeset span{display:none;} } /* Button used to open the chat form - fixed at the bottom of the page */ + .open-button { + background-color: var(--md-typeset-a-color); + border: none; + border-radius: 10px; + bottom: 23px; + box-sizing: border-box; + color: var(--md-default-bg-color); + cursor: pointer; + font-size: 13px; + opacity: 0.8; + padding: 10px 10px; + position: fixed; + right: 28px; + width: 160px; + z-index: 3; + } + diff --git a/docs/getting-started/installing.md b/docs/getting-started/installing.md index fab23e4..340b961 100644 --- a/docs/getting-started/installing.md +++ b/docs/getting-started/installing.md @@ -315,11 +315,11 @@ This command should display the installed version of PyKX. | Mac ARM | kdb+ 4.0 | libq.dylib | 2025.02.18 | | Mac x86 | kdb+ 4.0 | libq.dylib | 2025.02.18 | | Windows | kdb+ 4.0 | q.dll/q.lib | 2025.02.18 | -| Linux ARM | kdb+ 4.1 | libq.so | 2026.07.06 | -| Linux x86 | kdb+ 4.1 | libq.so | 2026.07.06 | -| Mac ARM | kdb+ 4.1 | libq.dylib | 2026.07.06 | -| Mac x86 | kdb+ 4.1 | libq.dylib | 2026.07.06 | -| Windows | kdb+ 4.1 | q.dll/q.lib | 2026.07.06 | +| Linux ARM | kdb+ 4.1 | libq.so | 2026.05.01 | +| Linux x86 | kdb+ 4.1 | libq.so | 2026.05.01 | +| Mac ARM | kdb+ 4.1 | libq.dylib | 2026.05.01 | +| Mac x86 | kdb+ 4.1 | libq.dylib | 2026.05.01 | +| Windows | kdb+ 4.1 | q.dll/q.lib | 2026.05.01 | | Linux ARM | Unlicensed | libe.so | 2023.11.22 | | Linux x86 | Unlicensed | libe.so | 2023.11.22 | | Mac ARM | Unlicensed | libe.so | 2023.11.22 | diff --git a/docs/release-notes/changelog.md b/docs/release-notes/changelog.md index bfdbb11..e150174 100644 --- a/docs/release-notes/changelog.md +++ b/docs/release-notes/changelog.md @@ -6,16 +6,6 @@ This changelog tracks all PyKX releases and their associated additions, fixes, a For changes to PyKX within a q environment, refer to the [PyKX under q changelog](./underq-changelog.md). -## PyKX 3.2.1 - -**Release Date** - -2026-XX-XX - -**Fixes and Improvments** - -- Updated 4.1 qlibs to 2026.07.06 for all platforms. - ## PyKX 3.2.0 **Release Date** diff --git a/docs/scripts/collapse-code.js b/docs/scripts/collapse-code.js deleted file mode 100644 index 92db1e7..0000000 --- a/docs/scripts/collapse-code.js +++ /dev/null @@ -1,65 +0,0 @@ -document$.subscribe(function () { - const THRESHOLD = 25; - const COLLAPSE_LINES = 10; - - document.querySelectorAll("pre code").forEach(function (code) { - const pre = code.parentElement; - - if (pre.closest(".code-compare, .code-compare-three")) return; - - const lines = code.textContent.split("\n").filter(function (l, i, arr) { - return !(i === arr.length - 1 && l === ""); - }); - if (lines.length < THRESHOLD) return; - - const wrapper = document.createElement("div"); - wrapper.className = "code-collapse"; - pre.parentNode.insertBefore(wrapper, pre); - wrapper.appendChild(pre); - - const lineHeight = parseFloat(getComputedStyle(code).lineHeight); - const collapsedHeight = lineHeight * COLLAPSE_LINES; - pre.style.maxHeight = collapsedHeight + "px"; - pre.style.overflow = "hidden"; - - const toggle = document.createElement("button"); - toggle.className = "code-collapse-toggle code-collapse-toggle--bottom"; - toggle.setAttribute("aria-expanded", "false"); - toggle.textContent = "▼ Show all " + lines.length + " lines"; - wrapper.appendChild(toggle); - - function expand() { - pre.style.maxHeight = "none"; - pre.style.overflow = ""; - toggle.setAttribute("aria-expanded", "true"); - toggle.textContent = "▲ Show fewer lines"; - wrapper.classList.add("code-collapse--expanded"); - } - - function collapse() { - pre.style.maxHeight = collapsedHeight + "px"; - pre.style.overflow = "hidden"; - toggle.setAttribute("aria-expanded", "false"); - toggle.textContent = "▼ Show all " + lines.length + " lines"; - wrapper.classList.remove("code-collapse--expanded"); - } - - toggle.addEventListener("click", function () { - pre.style.overflow === "hidden" ? expand() : collapse(); - }); - - // Auto-expand if search.highlight injects a inside a collapsed block. - // MutationObserver catches marks added after collapse runs (search nav is async). - if (pre.querySelector("mark")) { - expand(); - } else { - var observer = new MutationObserver(function () { - if (pre.querySelector("mark")) { - expand(); - observer.disconnect(); - } - }); - observer.observe(pre, { childList: true, subtree: true }); - } - }); -}); diff --git a/docs/scripts/init_kapa_widget.js b/docs/scripts/init_kapa_widget.js deleted file mode 100644 index 6b62d52..0000000 --- a/docs/scripts/init_kapa_widget.js +++ /dev/null @@ -1,52 +0,0 @@ -document.addEventListener("DOMContentLoaded", function () { - var script = document.createElement("script"); - script.src = "https://widget.kapa.ai/kapa-widget.bundle.js"; - script.setAttribute("data-website-id", "90e95ec3-2524-43ab-93da-3e94fdd01d59"); - script.setAttribute("data-project-name", "KX"); - script.setAttribute("data-modal-title", "Ask AI"); - script.setAttribute("data-project-color", "#FFC300"); - //script.setAttribute("data-project-color-dark", "#00B0F0"); - //script.setAttribute("data-color-scheme-selector", "[data-md-color-scheme='slate']"); - script.setAttribute("data-color-scheme", "light"); - script.setAttribute("data-surface-color", "#ffffff"); - script.setAttribute("data-surface-elevated-color", "#f8f9fa"); - script.setAttribute("data-surface-hover-color", "#f1f3f5"); - script.setAttribute("data-text-color", "#111111"); - script.setAttribute("data-text-muted-color", "#666666"); - script.setAttribute("data-border-color", "#dee2e6"); - script.setAttribute("data-anchor-color", "#2563eb"); - //script.setAttribute("data-surface-color-dark", "#17171a"); - //script.setAttribute("data-surface-elevated-color-dark", "#25252a"); - //script.setAttribute("data-surface-hover-color-dark", "#32323a"); - //script.setAttribute("data-text-color-dark", "#e4e4e7"); - //script.setAttribute("data-text-muted-color-dark", "#a1a1aa"); - //script.setAttribute("data-border-color-dark", "#3f3f45"); - //script.setAttribute("data-anchor-color-dark", "#60a5fa"); - script.setAttribute("data-modal-header-background-color", "#ffffff"); - script.setAttribute("data-modal-header-color", "#1a1a1a"); - //script.setAttribute("data-modal-header-background-color-dark", "#1a1a1a"); - //script.setAttribute("data-modal-header-color-dark", "#ffffff"); - script.setAttribute("data-project-logo", "https://images.seeklogo.com/logo-png/45/2/kx-logo-png_seeklogo-454185.png"); - script.setAttribute('data-modal-override-open-id', 'ask-ai-input'); - script.setAttribute('data-modal-override-open-class', 'search-input'); - script.setAttribute('data-modal-open-by-default', 'false'); - //script.setAttribute('data-user-analytics-fingerprint-enabled', 'true'); - script.setAttribute("data-modal-z-index", "10001"); - script.setAttribute("data-modal-size", "800px"); - script.setAttribute("data-scale-factor", "0.8"); - script.setAttribute("data-modal-title-font-size", "18px"); - script.setAttribute("data-button-text-color", "#060000"); - script.setAttribute("data-modal-disclaimer", "This is an experimental custom LLM for answering technical questions about KX products. Answers are based **only** on KX documentation and support sources, but may not be fully accurate so please use your best judgement. Don't forget to rate the answers and give feedback!"); - script.setAttribute("data-modal-example-questions", "How do I get started with PyKX?,What's new in PyKX?,How do I get started with KDB-X?,How do I learn q?"); - script.setAttribute("data-mcp-enabled", "true"); - script.setAttribute("data-mcp-server-url", "https://kx.mcp.kapa.ai"); - script.setAttribute("data-search-mode-enabled", "true"); - //script.setAttribute("data-consent-required", "true"); - //script.setAttribute("data-user-analytics-cookie-enabled", "true"); - //script.setAttribute("data-consent-screen-title", "Help us improve our AI assistant"); - //script.setAttribute("data-consent-screen-disclaimer", "By clicking 'Allow tracking', you consent to anonymous user tracking which helps us improve our service. We don't collect any personally identifiable information."); - //script.setAttribute("data-consent-screen-accept-button-text", "Allow tracking"); - //script.setAttribute("data-consent-screen-reject-button-text", "No, thanks"); - script.async = true; - document.head.appendChild(script); -}); \ No newline at end of file diff --git a/docs/scripts/search-highlight-clear.js b/docs/scripts/search-highlight-clear.js deleted file mode 100644 index 90a29f4..0000000 --- a/docs/scripts/search-highlight-clear.js +++ /dev/null @@ -1,19 +0,0 @@ -// Clear search.highlight marks on first click after they appear. -// Marks are injected asynchronously after navigation, so a MutationObserver -// watches for them rather than polling with a fixed timeout. -document$.subscribe(function () { - var content = document.querySelector(".md-content") || document.body; - - var observer = new MutationObserver(function () { - if (!content.querySelector("mark")) return; - observer.disconnect(); - document.addEventListener("click", function clearMarks() { - content.querySelectorAll("mark").forEach(function (mark) { - mark.replaceWith(document.createTextNode(mark.textContent)); - }); - document.removeEventListener("click", clearMarks); - }); - }); - - observer.observe(content, { childList: true, subtree: true }); -}); diff --git a/docs/stylesheets/2026-edited.css b/docs/stylesheets/2026-edited.css index 83386ba..cf82b53 100644 --- a/docs/stylesheets/2026-edited.css +++ b/docs/stylesheets/2026-edited.css @@ -361,74 +361,4 @@ .md-tabs__link { user-select: none; -} - -/* Collapsible code blocks */ -.code-collapse { - position: relative; -} - -.code-collapse::after { - content: ""; - position: absolute; - bottom: 0; - left: 0; - right: 0; - height: 6em; - background: linear-gradient(to bottom, transparent 0%, var(--md-code-bg-color) 80%); - pointer-events: none; -} - -[data-md-color-scheme="slate"] .code-collapse::after { - background: linear-gradient(to bottom, transparent, var(--kx-blue-grey)); -} - -.code-collapse--expanded::after { - display: none; -} - -.code-collapse-toggle--bottom { - position: absolute; - bottom: 2em; - left: 50%; - transform: translateX(-50%); - margin-bottom: 0; - z-index: 1; - background: var(--md-code-bg-color); -} - -[data-md-color-scheme="slate"] .code-collapse-toggle--bottom { - background: var(--kx-blue-grey); -} - -[data-md-color-scheme="kx-light"] .code-collapse-toggle--bottom { - background: var(--md-code-bg-color); -} - -.code-collapse-toggle { - display: inline-block; - margin-bottom: 0.4em; - cursor: pointer; - color: var(--kx-blue); - background: none; - border: 1px solid var(--kx-blue); - border-radius: 0.2em; - font-weight: 500; - font-size: 0.8em; - padding: 0.2em 0.6em; -} - -.code-collapse-toggle:hover { - background: var(--kx-blue); - color: white; -} - -[data-md-color-scheme="slate"] .code-collapse-toggle { - color: var(--kx-yellow); - border-color: var(--kx-yellow); -} - -[data-md-color-scheme="slate"] .code-collapse-toggle:hover { - background: var(--kx-yellow); - color: var(--kx-black); } \ No newline at end of file diff --git a/docs/stylesheets/prism-edited.css b/docs/stylesheets/prism-edited.css index 66a0be5..2eb16d2 100644 --- a/docs/stylesheets/prism-edited.css +++ b/docs/stylesheets/prism-edited.css @@ -55,12 +55,12 @@ pre[class*="language-"] { pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { - background: var(--md-typeset-mark-color); + background: #073642; /* base02 */ } pre[class*="language-"]::selection, pre[class*="language-"] ::selection, code[class*="language-"]::selection, code[class*="language-"] ::selection { - background: var(--md-typeset-mark-color); + background: #073642; /* base02 */ } /* Code blocks */ @@ -120,6 +120,7 @@ pre[class*="language-"] { .token.entity { color: #657b83; /* base00 */ + background: #eee8d5; /* base2 */ } .token.atrule, diff --git a/mkdocs.yml b/mkdocs.yml index f6f1e74..15c1577 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,14 +41,9 @@ extra_javascript: - 'https://code.jquery.com/jquery-3.6.0.min.js' - 'https://use.fontawesome.com/3dbf29ed12.js' - scripts/strip-q-prompt-copy.js - - scripts/init_kapa_widget.js - - scripts/collapse-code.js - - scripts/search-highlight-clear.js - # absolute URL so the shared, symlinked versions.js loads on every page. - # The old "." relative hack is double-escaped to "&period;" by - # newer mkdocs-material, which 404s and breaks the version dropdown. - - https://code.kx.com/pykx/scripts/versions.js - # Uncomment only for local test + # this relative path is needed to source from code.kx.com!!! + - "../../pykx/scripts/versions.js" + # Uncomment only for local test # - 'scripts/versions.js' @@ -87,8 +82,7 @@ markdown_extensions: format: !!python/name:pymdownx.superfences.fence_code_format - pymdownx.tilde - toc: - permalink: true - permalink_title: "" + permalink: false title: On this page plugins: @@ -133,12 +127,11 @@ plugins: - search - exclude-search: exclude: - - user-guide/advanced/Pandas_API* - - examples/interface-overview* - - examples/jupyter-integration* - - examples/db-management* - - "examples/streaming/Evolving System*" - - examples/charting* + - user-guide/advanced/Pandas_API.ipynb + - examples/interface-overview.ipynb + - examples/jupyter-integration.ipynb + - examples/db-management.ipynb + - examples/streaming/Evolving System.ipynb - spellcheck: known_words: spelling.txt ignore_code: true # Ignore words in tags @@ -222,10 +215,6 @@ theme: - content.code.annotate - content.action.edit - content.code.copy - - search.highlight - - navigation.tracking - - navigation.top - - toc.follow palette: - media: "(prefers-color-scheme: light)" scheme: kx-light diff --git a/src/pykx/lib/4-1-libs/q.k b/src/pykx/lib/4-1-libs/q.k index c37ff6f..9826538 100644 --- a/src/pykx/lib/4-1-libs/q.k +++ b/src/pykx/lib/4-1-libs/q.k @@ -68,7 +68,7 @@ show:{1 .Q.s x;};csv:"," / ";" also \z 1 for "D"$"dd/mm/yyyy" parse:{$["\\"=*x;(system;1_x);-5!x]};eval:-6!;reval:-24! \d .Q /def[`a`b`c!(0;0#0;`)]`b`c!(("23";"24");,"qwe") -k:4.1;K:0Nd;host:-12!;addr:-13!;gc:-20!;ts:{-34!(x;y)};gz:-35!;ipc:{-40!(x;y)};w:{`used`heap`peak`wmax`mmap`mphy`syms`symw!(."\\w"),."\\w 0"} / used: dpft en par chk ind fs fu fc +k:4.1;K:0Nd;host:-12!;addr:-13!;gc:-20!;ts:{-34!(x;y)};gz:-35!;w:{`used`heap`peak`wmax`mmap`mphy`syms`symw!(."\\w"),."\\w 0"} / used: dpft en par chk ind fs fu fc res:`abs`acos`asin`atan`avg`bin`binr`cor`cos`cov`delete`dev`div`do`enlist`exec`exit`exp`getenv`hopen`if`in`insert`last`like`log`max`min`prd`select`setenv`sin`sqrt`ss`sum`tan`update`var`wavg`while`within`wsum`xexp`from`by addmonths:{("d"$m+y)+x-"d"$m:"m"$x} f:{$[^y;"";y<0;"-",f[x;-y];y<1;1_f[x;10+y];9e15>j:"j"$y*prd x#10f;(x_j),".",(x:-x)#j:$j;$y]} diff --git a/src/pykx/q.so/libs/4-1/l64/libq.so b/src/pykx/q.so/libs/4-1/l64/libq.so index 1680946..21f2573 100755 Binary files a/src/pykx/q.so/libs/4-1/l64/libq.so and b/src/pykx/q.so/libs/4-1/l64/libq.so differ diff --git a/src/pykx/q.so/libs/4-1/l64arm/libq.so b/src/pykx/q.so/libs/4-1/l64arm/libq.so index 8963529..c5c519d 100755 Binary files a/src/pykx/q.so/libs/4-1/l64arm/libq.so and b/src/pykx/q.so/libs/4-1/l64arm/libq.so differ diff --git a/src/pykx/q.so/libs/4-1/m64/libq.dylib b/src/pykx/q.so/libs/4-1/m64/libq.dylib index 50d360b..84566b3 100755 Binary files a/src/pykx/q.so/libs/4-1/m64/libq.dylib and b/src/pykx/q.so/libs/4-1/m64/libq.dylib differ diff --git a/src/pykx/q.so/libs/4-1/m64arm/libq.dylib b/src/pykx/q.so/libs/4-1/m64arm/libq.dylib index 5aaaf7d..bda211c 100755 Binary files a/src/pykx/q.so/libs/4-1/m64arm/libq.dylib and b/src/pykx/q.so/libs/4-1/m64arm/libq.dylib differ diff --git a/src/pykx/q.so/libs/4-1/w64/q.dll b/src/pykx/q.so/libs/4-1/w64/q.dll index ba406f0..ee5593d 100644 Binary files a/src/pykx/q.so/libs/4-1/w64/q.dll and b/src/pykx/q.so/libs/4-1/w64/q.dll differ diff --git a/tests/test_pykx.py b/tests/test_pykx.py index 0e4ed70..5820387 100644 --- a/tests/test_pykx.py +++ b/tests/test_pykx.py @@ -440,31 +440,31 @@ def test_kx_versions(kx): if test_vars == ('Linux', 'x86_64', '4.0'): assert kx.q.z.k == kx.q('2025.02.18') elif test_vars == ('Linux', 'x86_64', '4.1'): - assert kx.q.z.k == kx.q('2026.07.06') + assert kx.q.z.k == kx.q('2026.05.01') # elif test_vars == ('Linux', 'x86_64', '4.2'): # assert kx.q.z.k == kx.q('?') elif test_vars == ('Linux', 'aarch64', '4.0'): assert kx.q.z.k == kx.q('2025.02.18') elif test_vars == ('Linux', 'aarch64', '4.1'): - assert kx.q.z.k == kx.q('2026.07.06') + assert kx.q.z.k == kx.q('2026.05.01') # elif test_vars == ('Linux', 'aarch64', '4.2'): # assert kx.q.z.k == kx.q('?') elif test_vars == ('Darwin', 'x86_64', '4.0'): assert kx.q.z.k == kx.q('2025.02.18') elif test_vars == ('Darwin', 'x86_64', '4.1'): - assert kx.q.z.k == kx.q('2026.07.06') + assert kx.q.z.k == kx.q('2026.05.01') # elif test_vars == 'Darwin', 'x86_64', '4.2'): # assert kx.q.z.k == kx.q('?') elif test_vars == ('Darwin', 'arm64', '4.0'): assert kx.q.z.k == kx.q('2025.02.18') elif test_vars == ('Darwin', 'arm64', '4.1'): - assert kx.q.z.k == kx.q('2026.07.06') + assert kx.q.z.k == kx.q('2026.05.01') # elif test_vars == ('Darwin', 'arm', '4.2'): # assert kx.q.z.k == kx.q('?') elif test_vars == ('Windows', 'AMD64', '4.0'): assert kx.q.z.k == kx.q('2025.02.18') elif test_vars == ('Windows', 'AMD64', '4.1'): - assert kx.q.z.k == kx.q('2026.07.06') + assert kx.q.z.k == kx.q('2026.05.01') # elif test_vars == ('Windows', 'AMD64', '4.2'): # assert kx.q.z.k == kx.q('?') else: