change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik
, '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

change: Reorganize as griffe and griffelib packages with uv workspaces - #435

Merged
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434
Nov 30, 2025
Merged

change: Reorganize as griffe and griffelib packages with uv workspaces#435
johnslavik merged 6 commits into
b/migratefrom
copilot/sub-pr-434

Conversation

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown

For reviewers

  • I did not use AI
  • I used AI and thoroughly reviewed every code/docs change

Description of the change

Fixes package separation issues from the migration script. The three packages now have correct dependencies with 1:1 version matching using {{version}} interpolation:

  • griffelib: Library package with no CLI dependencies, includes the [pypi] extra for PyPI loading functionality
  • griffecli: CLI package depending on griffelib=={{version}}
  • griffe: Backward-compatible wrapper depending on both griffelib=={{version}} and griffecli=={{version}}, with [pypi] extra re-exporting griffelib[pypi]=={{version}}

Key fixes:

  • Removed incorrect griffecli imports from griffelib/__init__.py (library must not depend on CLI)
  • Added proper CLI exports to griffecli/__init__.py (main, check, dump, get_parser, DEFAULT_LOG_LEVEL)
  • Removed deprecated git functions from exports (assert_git_repo, get_latest_tag, get_repo_root, tmp_worktree)
  • Fixed logger name to remain "griffe" for backward compatibility
  • Updated all pyproject.toml files with uv-dynamic-versioning using double brackets {{version}} for version-locked dependencies
  • Updated root griffe [pypi] extra to re-export griffelib[pypi]=={{version}}
  • Updated ruff.toml paths for new package structure
  • Fixed test imports for new package locations
# All three import patterns now work correctly:importgriffe# Backward-compatible, re-exports everythingimportgriffelib# Library-only (216 exports)importgriffecli# CLI-only (5 exports)# Logger name preserved for existing configurationsimportlogginglogging.getLogger("griffe") # Still works# Public interface usage (recommended):# griffe check ...# python -m griffe ...

Relevant resources


💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

@johnslavik

johnslavik commented Nov 30, 2025

Copy link
Copy Markdown
Member

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime behaviors in regular use as before the migration.

CopilotAIand others added 3 commits November 30, 2025 20:41
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI changed the title [WIP] Reorganize as griffe and griffelib packages with uv workspaceschange: Reorganize as griffe and griffelib packages with uv workspacesNov 30, 2025
CopilotAI requested a review from johnslavikNovember 30, 2025 20:56
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>

CopilotAI commented Nov 30, 2025

Copy link
Copy Markdown
Author

@copilot Remember that griffe is supposed to be a backward-compatible package depending on both griffelib and griffecli that match the version 1:1, with all the previous packaging and runtime b...

Updated the root griffe package to use uv-dynamic-versioning with version-locked dependencies: griffelib=={version} and griffecli=={version}. This ensures all three packages always have 1:1 version matching. Commit af6489c adds this configuration. The griffe package now properly depends on exact versions of both sub-packages while maintaining full backward compatibility.

@johnslavikjohnslavik left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Try to promote public interface usage (griffe check, python -m griffe ...) instead of griffecli directly.

Comment threadpyproject.toml Outdated
[tool.hatch.metadata.hooks.uv-dynamic-versioning.optional-dependencies]
# The 'pypi' extra provides dependencies needed for the load_pypi functionality
# to download and inspect packages from PyPI.
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Move this out to griffelib configuration and here do:

Suggested change
pypi = ["pip>=24.0", "platformdirs>=4.2", "wheel>=0.42"]
pypi = ["griffelib[pypi]=={{version}}"]

And use double brackets for version interpolation with uv dynamic versioning everywhere

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated in commit 1ef3a63. Changed pypi optional dependency in root griffe to re-export griffelib[pypi]=={{version}} and updated all version interpolations to use double brackets {{version}}.

…[pypi]
Co-authored-by: johnslavik <64036239+johnslavik@users.noreply.github.com>
CopilotAI requested a review from johnslavikNovember 30, 2025 21:08
@johnslavik
johnslavik marked this pull request as ready for review November 30, 2025 21:11
@johnslavik
johnslavik merged commit a2e13bf into b/migrateNov 30, 2025
1 check passed
@pawamoy
pawamoy deleted the copilot/sub-pr-434 branch February 20, 2026 15:44
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@johnslavik