From 3be7826b8052001ff826ad707a20b9d2f612d459 Mon Sep 17 00:00:00 2001 From: Darrien Rushing Date: Fri, 28 Nov 2025 17:57:56 -0700 Subject: [PATCH 1/3] get started with standard venv --- .gitignore | 4 ++++ docs/dev-docs.md | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 docs/dev-docs.md diff --git a/.gitignore b/.gitignore index 34df971..42ffb51 100755 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,9 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. +# virtual environment +venv/* +venv + # Ignore sqlite database files *.db diff --git a/docs/dev-docs.md b/docs/dev-docs.md new file mode 100644 index 0000000..c9d6fd2 --- /dev/null +++ b/docs/dev-docs.md @@ -0,0 +1,8 @@ +# Development Docs + +Database: SQLite + +Virtual Environment: venv + +- `python3 -m venv ven` +- `source venv/bin/activate` \ No newline at end of file From 9ca9489eb981fa6dd9662c18e991923812673ce2 Mon Sep 17 00:00:00 2001 From: Darrien Rushing Date: Fri, 28 Nov 2025 18:10:57 -0700 Subject: [PATCH 2/3] moved things into standard directories --- NOTES.md => docs/NOTES.md | 0 docs/dev-docs.md | 10 +++++++++- {database => src/github_cli/database}/manager.py | 0 {database => src/github_cli/database}/util.py | 0 {github => src/github_cli}/gh_actions.py | 0 {github => src/github_cli}/models/owner.py | 0 {github => src/github_cli}/models/repo_permissions.py | 0 {github => src/github_cli}/models/repository.py | 0 {github => src/github_cli}/models/workflow.py | 0 {github => src/github_cli}/repos.py | 0 main.py => src/main.py | 6 ++++-- 11 files changed, 13 insertions(+), 3 deletions(-) rename NOTES.md => docs/NOTES.md (100%) rename {database => src/github_cli/database}/manager.py (100%) rename {database => src/github_cli/database}/util.py (100%) rename {github => src/github_cli}/gh_actions.py (100%) rename {github => src/github_cli}/models/owner.py (100%) rename {github => src/github_cli}/models/repo_permissions.py (100%) rename {github => src/github_cli}/models/repository.py (100%) rename {github => src/github_cli}/models/workflow.py (100%) rename {github => src/github_cli}/repos.py (100%) rename main.py => src/main.py (94%) diff --git a/NOTES.md b/docs/NOTES.md similarity index 100% rename from NOTES.md rename to docs/NOTES.md diff --git a/docs/dev-docs.md b/docs/dev-docs.md index c9d6fd2..40ca75f 100644 --- a/docs/dev-docs.md +++ b/docs/dev-docs.md @@ -5,4 +5,12 @@ Database: SQLite Virtual Environment: venv - `python3 -m venv ven` -- `source venv/bin/activate` \ No newline at end of file +- `source venv/bin/activate` + +## Project Structure & Build State + +If everything is structured correctly, you should be able to run: + +- `source venv/bin/activate` +- `github-cli list repos` + diff --git a/database/manager.py b/src/github_cli/database/manager.py similarity index 100% rename from database/manager.py rename to src/github_cli/database/manager.py diff --git a/database/util.py b/src/github_cli/database/util.py similarity index 100% rename from database/util.py rename to src/github_cli/database/util.py diff --git a/github/gh_actions.py b/src/github_cli/gh_actions.py similarity index 100% rename from github/gh_actions.py rename to src/github_cli/gh_actions.py diff --git a/github/models/owner.py b/src/github_cli/models/owner.py similarity index 100% rename from github/models/owner.py rename to src/github_cli/models/owner.py diff --git a/github/models/repo_permissions.py b/src/github_cli/models/repo_permissions.py similarity index 100% rename from github/models/repo_permissions.py rename to src/github_cli/models/repo_permissions.py diff --git a/github/models/repository.py b/src/github_cli/models/repository.py similarity index 100% rename from github/models/repository.py rename to src/github_cli/models/repository.py diff --git a/github/models/workflow.py b/src/github_cli/models/workflow.py similarity index 100% rename from github/models/workflow.py rename to src/github_cli/models/workflow.py diff --git a/github/repos.py b/src/github_cli/repos.py similarity index 100% rename from github/repos.py rename to src/github_cli/repos.py diff --git a/main.py b/src/main.py similarity index 94% rename from main.py rename to src/main.py index 8eadff0..d64f13d 100644 --- a/main.py +++ b/src/main.py @@ -1,8 +1,10 @@ +"""Main module +""" import argparse import textwrap from dotenv import load_dotenv -import github.repos as gh_repos +from github_cli import repos def start_repl(): print("Welcome to the REPL") @@ -42,7 +44,7 @@ def main(): repo_parser.add_argument('--report', type = str, help = 'Type of report to execute') repo_parser.add_argument('--user', type = str, help = 'GitHub username') repo_parser.add_argument('--csv', action = argparse.BooleanOptionalAction) - repo_parser.set_defaults(func = gh_repos.handle_args) + repo_parser.set_defaults(func = repos.handle_args) args = parser.parse_args() if hasattr(args, 'func'): From 5661d008083dbffab491d94e2f05d5abad04ccb3 Mon Sep 17 00:00:00 2001 From: Darrien Rushing Date: Fri, 28 Nov 2025 23:47:38 -0700 Subject: [PATCH 3/3] project runs with "github --help" now --- build.sh | 48 ++++++++++++++++++ docs/dev-docs.md | 14 +++++ pyproject.toml | 40 +++++++++++++++ requirements-dev.txt | 0 src/github_cli.egg-info/PKG-INFO | 33 ++++++++++++ src/github_cli.egg-info/SOURCES.txt | 22 ++++++++ src/github_cli.egg-info/dependency_links.txt | 1 + src/github_cli.egg-info/entry_points.txt | 2 + src/github_cli.egg-info/requires.txt | 13 +++++ src/github_cli.egg-info/top_level.txt | 1 + src/github_cli/__init__.py | 2 + src/github_cli/__main__.py | 8 +++ .../__pycache__/__init__.cpython-313.pyc | Bin 0 -> 202 bytes .../__pycache__/__main__.cpython-313.pyc | Bin 0 -> 384 bytes .../__pycache__/gh_actions.cpython-313.pyc | Bin 0 -> 1374 bytes .../__pycache__/main.cpython-313.pyc | Bin 0 -> 2942 bytes .../__pycache__/repos.cpython-313.pyc | Bin 0 -> 4362 bytes .../__pycache__/manager.cpython-313.pyc | Bin 0 -> 1382 bytes src/{ => github_cli}/main.py | 0 .../__pycache__/workflow.cpython-313.pyc | Bin 0 -> 1487 bytes src/github_cli/models/repository.py | 4 +- src/github_cli/repos.py | 6 +-- 22 files changed, 189 insertions(+), 5 deletions(-) create mode 100755 build.sh create mode 100644 pyproject.toml create mode 100644 requirements-dev.txt create mode 100644 src/github_cli.egg-info/PKG-INFO create mode 100644 src/github_cli.egg-info/SOURCES.txt create mode 100644 src/github_cli.egg-info/dependency_links.txt create mode 100644 src/github_cli.egg-info/entry_points.txt create mode 100644 src/github_cli.egg-info/requires.txt create mode 100644 src/github_cli.egg-info/top_level.txt create mode 100644 src/github_cli/__init__.py create mode 100644 src/github_cli/__main__.py create mode 100644 src/github_cli/__pycache__/__init__.cpython-313.pyc create mode 100644 src/github_cli/__pycache__/__main__.cpython-313.pyc create mode 100644 src/github_cli/__pycache__/gh_actions.cpython-313.pyc create mode 100644 src/github_cli/__pycache__/main.cpython-313.pyc create mode 100644 src/github_cli/__pycache__/repos.cpython-313.pyc create mode 100644 src/github_cli/database/__pycache__/manager.cpython-313.pyc rename src/{ => github_cli}/main.py (100%) create mode 100644 src/github_cli/models/__pycache__/workflow.cpython-313.pyc diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..b4e05c2 --- /dev/null +++ b/build.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Build script for GitHub CLI using PyInstaller +# This script creates a single binary executable + +set -e # Exit on any error + +echo "๐Ÿ”จ Building GitHub Inventory CLI binary..." + +# Clean previous builds +echo "๐Ÿงน Cleaning previous builds..." +rm -rf build/ dist/ + +# Install/update dependencies +echo "๐Ÿ“ฆ Installing dependencies..." +# Use the virtual environment's pip if available, otherwise use system pip +if [ -f "venv/bin/pip" ]; then + ./venv/bin/pip install -r requirements.txt + ./venv/bin/pip install -r requirements-dev.txt + ./venv/bin/pip install pyinstaller +else + pip install -r requirements.txt + pip install -r requirements-dev.txt + pip install pyinstaller +fi + +# Build the binary using PyInstaller +echo "โš™๏ธ Building binary with PyInstaller..." +# Use the virtual environment's Python if available, otherwise use system Python +if [ -f "venv/bin/pyinstaller" ]; then + ./venv/bin/pyinstaller github.spec +else + pyinstaller github.spec +fi + +# Check if build was successful +if [ -f "dist/github" ]; then + echo "โœ… Build successful!" + echo "๐Ÿ“ Binary location: dist/github" + echo "๐Ÿ“Š Binary size: $(du -h dist/github | cut -f1)" + echo "" + echo "๐Ÿš€ You can now:" + echo " - Copy dist/github to your Docker image" + echo " - Run ./dist/github --help to test locally" +else + echo "โŒ Build failed!" + exit 1 +fi diff --git a/docs/dev-docs.md b/docs/dev-docs.md index 40ca75f..6c69fab 100644 --- a/docs/dev-docs.md +++ b/docs/dev-docs.md @@ -14,3 +14,17 @@ If everything is structured correctly, you should be able to run: - `source venv/bin/activate` - `github-cli list repos` +### Setup for Modules and Development + +a) Move things under `/src` directory + +b) Make sure module references are updated + +c) Add `__init__.py` and `__main__.py` to the + +Setup these two files: + +- pyproject.toml +- build.sh + +Then run: `pip install -e .` \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..cd44342 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,40 @@ +[build-system] +requires = ["setuptools>=61.0"] +build-backend = "setuptools.build_meta" + +[project] +name = "github-cli" +version = "0.0.1" +description = "Manage your GitHub inventory" +readme = "README.md" +requires-python = ">=3.11" +# license = "MIT" +authors = [{ name = "Darrien Rushing" }] +# We declare that deps come from elsewhere: +dynamic = ["dependencies", "optional-dependencies"] + +[tool.setuptools.dynamic] +dependencies = { file = ["requirements.txt"] } +optional-dependencies.dev = { file = ["requirements-dev.txt"] } # optional + +[project.urls] +Homepage = "https://github.com/meddlin/github-inventory" + +# creates the `github` shell command +[project.scripts] +github = "github_cli.main:main" + +[tool.pytest.ini_options] +minversion = "8.0" +addopts = "-ra -q" +testpaths = [ + "tests", +] + +[tool.setuptools] +package-dir = {"" = "src"} +include-package-data = false # keep wheels lean unless you add data files explicitly + +[tool.setuptools.packages.find] +where = ["src"] +exclude = ["tests*", "docs*"] # package name patterns (not file globs) \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/github_cli.egg-info/PKG-INFO b/src/github_cli.egg-info/PKG-INFO new file mode 100644 index 0000000..6eae3e3 --- /dev/null +++ b/src/github_cli.egg-info/PKG-INFO @@ -0,0 +1,33 @@ +Metadata-Version: 2.4 +Name: github-cli +Version: 0.0.1 +Summary: Manage your GitHub inventory +Author: Darrien Rushing +Project-URL: Homepage, https://github.com/meddlin/github-inventory +Requires-Python: >=3.11 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: certifi==2025.7.14 +Requires-Dist: charset-normalizer==3.4.2 +Requires-Dist: idna==3.10 +Requires-Dist: markdown-it-py==3.0.0 +Requires-Dist: mdurl==0.1.2 +Requires-Dist: Pygments==2.19.2 +Requires-Dist: python-dotenv==1.1.1 +Requires-Dist: requests==2.32.4 +Requires-Dist: rich==14.0.0 +Requires-Dist: typing_extensions==4.14.1 +Requires-Dist: urllib3==2.5.0 +Provides-Extra: dev +Dynamic: license-file + +# GitHub Inventory + +A better way to manage your GitHub. + +## Useful Tools for this repo + +- Draw.io Integration (VSCode extension) +- Draw.io Integration: Mermaid plugin (VSCode extension) +- Draw.io Integration: Markdown plug (VSCode extension) +- SQLite client/browser diff --git a/src/github_cli.egg-info/SOURCES.txt b/src/github_cli.egg-info/SOURCES.txt new file mode 100644 index 0000000..a0b758f --- /dev/null +++ b/src/github_cli.egg-info/SOURCES.txt @@ -0,0 +1,22 @@ +LICENSE +README.md +pyproject.toml +requirements-dev.txt +requirements.txt +src/github_cli/__init__.py +src/github_cli/__main__.py +src/github_cli/gh_actions.py +src/github_cli/main.py +src/github_cli/repos.py +src/github_cli.egg-info/PKG-INFO +src/github_cli.egg-info/SOURCES.txt +src/github_cli.egg-info/dependency_links.txt +src/github_cli.egg-info/entry_points.txt +src/github_cli.egg-info/requires.txt +src/github_cli.egg-info/top_level.txt +src/github_cli/database/manager.py +src/github_cli/database/util.py +src/github_cli/models/owner.py +src/github_cli/models/repo_permissions.py +src/github_cli/models/repository.py +src/github_cli/models/workflow.py \ No newline at end of file diff --git a/src/github_cli.egg-info/dependency_links.txt b/src/github_cli.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/github_cli.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/github_cli.egg-info/entry_points.txt b/src/github_cli.egg-info/entry_points.txt new file mode 100644 index 0000000..0b789eb --- /dev/null +++ b/src/github_cli.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +github = github_cli.main:main diff --git a/src/github_cli.egg-info/requires.txt b/src/github_cli.egg-info/requires.txt new file mode 100644 index 0000000..f2a23e2 --- /dev/null +++ b/src/github_cli.egg-info/requires.txt @@ -0,0 +1,13 @@ +certifi==2025.7.14 +charset-normalizer==3.4.2 +idna==3.10 +markdown-it-py==3.0.0 +mdurl==0.1.2 +Pygments==2.19.2 +python-dotenv==1.1.1 +requests==2.32.4 +rich==14.0.0 +typing_extensions==4.14.1 +urllib3==2.5.0 + +[dev] diff --git a/src/github_cli.egg-info/top_level.txt b/src/github_cli.egg-info/top_level.txt new file mode 100644 index 0000000..65ea9e9 --- /dev/null +++ b/src/github_cli.egg-info/top_level.txt @@ -0,0 +1 @@ +github_cli diff --git a/src/github_cli/__init__.py b/src/github_cli/__init__.py new file mode 100644 index 0000000..d1b18f6 --- /dev/null +++ b/src/github_cli/__init__.py @@ -0,0 +1,2 @@ +"""GitHub CLI package +""" \ No newline at end of file diff --git a/src/github_cli/__main__.py b/src/github_cli/__main__.py new file mode 100644 index 0000000..f0da5e9 --- /dev/null +++ b/src/github_cli/__main__.py @@ -0,0 +1,8 @@ +"""Entry point so `python -m github_cli` works and PyInstaller can target the package.""" + +# from recipes_cli.main import main +from github_cli.main import main + + +if __name__ == "__main__": + main() diff --git a/src/github_cli/__pycache__/__init__.cpython-313.pyc b/src/github_cli/__pycache__/__init__.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dce9c87348cbc6de558caf53bb6acd525fd93340 GIT binary patch literal 202 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 LCahN&cH{mRlBupv literal 0 HcmV?d00001 diff --git a/src/github_cli/__pycache__/repos.cpython-313.pyc b/src/github_cli/__pycache__/repos.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a2b70d9daeb00e8c269ab545409fe5f9c4baee9 GIT binary patch literal 4362 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 Qg=2rzV@mM=NQE_j0m(2Fy8r+H literal 0 HcmV?d00001 diff --git a/src/main.py b/src/github_cli/main.py similarity index 100% rename from src/main.py rename to src/github_cli/main.py diff --git a/src/github_cli/models/__pycache__/workflow.cpython-313.pyc b/src/github_cli/models/__pycache__/workflow.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76bead4cfe08c0da8d2caceb59bda5addf6fd91c GIT binary patch literal 1487 zcmb7EOONA35H81Y5Jx|)H$#xPQe`{YU2fY_ecxB^hs#yf-jqrf;P~O!tErX+ z_=BA7KtCRv7Sav0;5Bfd1CDl*NhSnLGCkc*oCIsBv-twW4GckO4v37S3EjyIvyMJA zoGhAwmP5;<70^sH3#~Xb-l;iu2cBd_ZkTsU9XLsk6a}X&%t@tJRpk%;@T0}~mviy; z1)o3tQ^zGLNr{+aZI?2ku6_+B6ua_R?@{=^T-ri=5p{oq?K2vWG?snGb|66 z{ikW+9$a3j0%LyQhm5J_%T;}_ouI_YcM+~3>OiZr%CEckR`$Amv@#Ru++A7gyS-H< zf!5)wus(WYRa)P9^QZC#cY?dC3ObaOxR#Gm+`t(&_L=5rlvCtP%6iJ#l#P^gDd$rz zq->^a5ue1@3gC52{OPOb{1@nDl61Nzor4i#;S|UWoaOjeR#%t^Z|gH`B$1 z@+*XE_`R~fwyV!-%a4iL%g=}!%SSIzbNMNG-CO(4i(FrRLT=~Q?h+r~+DDsuv1&z7 zG%Z0l9UGB)D`~p8)#%%kmW-S8d0*~Y61$gbPWKaQZZU>EvEZa_#=cpMcsf&I?7|l^ z!}TlG-D+ z5Bv4#fK&~dov2Q#0j List[Any]: """Get repos for a GitHub user