# hubcap
A py2store (i.e. dict-like) interface to github
To install: ```pip install hubcap```
# Examples
## Basics
The simplest facade to github data.
Interact with github like you'd interact with a `dict` object.
Warning: You'll need to have a github api token (google it if you don't have one;
it's easy to get). You'll have to specify this token when making hubcap objects,
or put it in an environmental variable under the name `GITHUB_TOKEN` or `HUBCAP_GITHUB_TOKEN`
(useful since github actions doesn't allow you to have env variables starting with `GITHUB`).
```python
>>> s = GitHubReader('thorwhalen') # connnecting to a particular user/organization
>>> list(s) # doctest: +SKIP
['agen',
'aix',
...
'viral',
'wealth',
'wrapt']
>>> 'a_non_existing_repository_name' in s
False
>>> 'hubcap' in s # of course, this will be true, it's what you're using now!
True
>>> repo = s['hubcap']
>>> list(repo)
['master']
>>> branch = repo['master']
>>> list(branch) # doctest: +NORMALIZE_WHITESPACE
['/.gitattributes',
'/.github/',
'/.gitignore',
'/LICENSE',
'/README.md',
'/docsrc/',
'/hubcap/',
'/setup.cfg',
'/setup.py']
>>> content = branch['/setup.cfg']
>>> print(content[:32].decode())
[metadata]
name = hubcap
version
```
## Listing repositories and information about them
List repositories for a given user or organization, along with 78 fields of info.
```python
>>> from hubcap.examples import repos_info, actions_info
>>>
>>> repos = repos_info('i2mint') # doctest: +SKIP
>>> print(repos.shape) # doctest: +SKIP
(60, 78)
>>> repos.head() # doctest: +SKIP
id node_id name ... watchers default_branch permissions
full_name ...
i2mint/py2mqtt 425694616 R_kgDOGV-VmA py2mqtt ... 0 main {'admin': True, 'maintain': True, 'push': True...
i2mint/mongodol 341721959 MDEwOlJlcG9zaXRvcnkzNDE3MjE5NTk= mongodol ... 0 master {'admin': True, 'maintain': True, 'push': True...
i2mint/dol 299438731 MDEwOlJlcG9zaXRvcnkyOTk0Mzg3MzE= dol ... 4 master {'admin': True, 'maintain': True, 'push': True...
i2mint/stream2py 238989487 MDEwOlJlcG9zaXRvcnkyMzg5ODk0ODc= stream2py ... 2 master {'admin': True, 'maintain': True, 'push': True...
i2mint/creek 321448350 MDEwOlJlcG9zaXRvcnkzMjE0NDgzNTA= creek ... 0 master {'admin': True, 'maintain': True, 'push': True...
[5 rows x 78 columns]
>>> list(repos.columns) # doctest: +SKIP
['id', 'node_id', 'name', 'full_name', 'private', 'owner', 'html_url', 'description',
'fork', 'url', 'forks_url', 'keys_url', 'collaborators_url', 'teams_url', 'hooks_url
', 'issue_events_url', 'events_url', 'assignees_url', 'branches_url', 'tags_url',
'blobs_url', 'git_tags_url', 'git_refs_url', 'trees_url', 'statuses_url', 'languages_url
', 'stargazers_url', 'contributors_url', 'subscribers_url', 'subscription_url',
'commits_url', 'git_commits_url', 'comments_url', 'issue_comment_url', 'contents_url',
'compare_url', 'merges_url', 'archive_url', 'downloads_url', 'issues_url', 'pulls_url',
'milestones_url', 'notifications_url', 'labels_url', 'releases_url', 'deployments_url
', 'created_at', 'updated_at', 'pushed_at', 'git_url', 'ssh_url', 'clone_url', 'svn_url',
'homepage', 'size', 'stargazers_count', 'watchers_count', 'language', 'has_issue
s', 'has_projects', 'has_downloads', 'has_wiki', 'has_pages', 'forks_count',
'mirror_url', 'archived', 'disabled', 'open_issues_count', 'license', 'allow_forking',
'is_template', 'topics', 'visibility', 'forks', 'open_issues', 'watchers',
'default_branch', 'permissions']
```
Get info about github actions for a given repository.
```python
>>> actions = actions_info('i2mint/mongodol') # doctest: +SKIP
>>> print(actions.shape) # doctest: +SKIP
(10, 30)
>>> actions.head() # doctest: +SKIP
id name ... repository head_repository
0 1468986198 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...
1 1445456774 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...
2 1437461380 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...
3 1343133456 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...
4 1262878182 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...
[5 rows x 30 columns]
>>>
>>> list(actions.columns) # doctest: +SKIP
['id', 'name', 'node_id', 'head_branch', 'head_sha', 'run_number', 'event', 'status',
'conclusion', 'workflow_id', 'check_suite_id', 'check_suite_node_id', 'url', 'html_url',
'pull_requests', 'created_at', 'updated_at', 'run_attempt', 'run_started_at',
'jobs_url', 'logs_url', 'check_suite_url', 'artifacts_url', 'cancel_url', 'rerun_url',
'previous_attempt_url', 'workflow_url', 'head_commit', 'repository', 'head_repository']
```
Find most recently changed repositories and check if their CI failed or not.
```python
>>> from hubcap.examples import date_selection_lidx
>>> updated_recently = repos.iloc
... [date_selection_lidx(repos, hours_ago=24)] # doctest: +SKIP
>>> {repo: get_last_build_status(repo)
... for repo in updated_recently['full_name']} # doctest: +SKIP
{'i2mint/py2mqtt': 'failure',
'i2mint/mongodol': 'success',
'i2mint/dol': 'success',
'i2mint/stream2py': 'success',
'i2mint/creek': 'success'}
```
Note: You can get this directly using the `ci_status` function
```python
>>> from hubcap.examples import ci_status
>>> ci_status('i2mint', hours_ago=24) # doctest: +SKIP
{'i2mint/py2mqtt': 'failure',
'i2mint/mongodol': 'success',
'i2mint/dol': 'success',
'i2mint/stream2py': 'success',
'i2mint/creek': 'success'}
```
Raw data
{
"_id": null,
"home_page": "https://github.com/thorwhalen/hubcap",
"name": "hubcap",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "github",
"author": "Thor Whalen",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/a2/64/9db9c103cb154d2b682763d84c2745a03a121f6348b786146f4a2aa3df72/hubcap-0.1.1.tar.gz",
"platform": "any",
"description": "# hubcap\nA py2store (i.e. dict-like) interface to github\n\nTo install:\t```pip install hubcap```\n\n\n# Examples\n\n## Basics\n\nThe simplest facade to github data.\n\nInteract with github like you'd interact with a `dict` object.\n\nWarning: You'll need to have a github api token (google it if you don't have one;\nit's easy to get). You'll have to specify this token when making hubcap objects,\nor put it in an environmental variable under the name `GITHUB_TOKEN` or `HUBCAP_GITHUB_TOKEN` \n(useful since github actions doesn't allow you to have env variables starting with `GITHUB`).\n\n\n```python\n>>> s = GitHubReader('thorwhalen') # connnecting to a particular user/organization\n>>> list(s) # doctest: +SKIP\n['agen',\n 'aix',\n ...\n 'viral',\n 'wealth',\n 'wrapt']\n>>> 'a_non_existing_repository_name' in s\nFalse\n>>> 'hubcap' in s # of course, this will be true, it's what you're using now!\nTrue\n>>> repo = s['hubcap']\n>>> list(repo)\n['master']\n>>> branch = repo['master']\n>>> list(branch) # doctest: +NORMALIZE_WHITESPACE\n['/.gitattributes',\n '/.github/',\n '/.gitignore',\n '/LICENSE',\n '/README.md',\n '/docsrc/',\n '/hubcap/',\n '/setup.cfg',\n '/setup.py']\n>>> content = branch['/setup.cfg']\n>>> print(content[:32].decode())\n[metadata]\nname = hubcap\nversion\n```\n\n\n## Listing repositories and information about them\n\n\nList repositories for a given user or organization, along with 78 fields of info.\n\n```python\n>>> from hubcap.examples import repos_info, actions_info\n>>>\n>>> repos = repos_info('i2mint') # doctest: +SKIP\n>>> print(repos.shape) # doctest: +SKIP\n(60, 78)\n>>> repos.head() # doctest: +SKIP\n id node_id name ... watchers default_branch permissions\nfull_name ...\ni2mint/py2mqtt 425694616 R_kgDOGV-VmA py2mqtt ... 0 main {'admin': True, 'maintain': True, 'push': True...\ni2mint/mongodol 341721959 MDEwOlJlcG9zaXRvcnkzNDE3MjE5NTk= mongodol ... 0 master {'admin': True, 'maintain': True, 'push': True...\ni2mint/dol 299438731 MDEwOlJlcG9zaXRvcnkyOTk0Mzg3MzE= dol ... 4 master {'admin': True, 'maintain': True, 'push': True...\ni2mint/stream2py 238989487 MDEwOlJlcG9zaXRvcnkyMzg5ODk0ODc= stream2py ... 2 master {'admin': True, 'maintain': True, 'push': True...\ni2mint/creek 321448350 MDEwOlJlcG9zaXRvcnkzMjE0NDgzNTA= creek ... 0 master {'admin': True, 'maintain': True, 'push': True...\n\n[5 rows x 78 columns]\n>>> list(repos.columns) # doctest: +SKIP\n['id', 'node_id', 'name', 'full_name', 'private', 'owner', 'html_url', 'description',\n'fork', 'url', 'forks_url', 'keys_url', 'collaborators_url', 'teams_url', 'hooks_url\n', 'issue_events_url', 'events_url', 'assignees_url', 'branches_url', 'tags_url',\n'blobs_url', 'git_tags_url', 'git_refs_url', 'trees_url', 'statuses_url', 'languages_url\n', 'stargazers_url', 'contributors_url', 'subscribers_url', 'subscription_url',\n'commits_url', 'git_commits_url', 'comments_url', 'issue_comment_url', 'contents_url',\n'compare_url', 'merges_url', 'archive_url', 'downloads_url', 'issues_url', 'pulls_url',\n'milestones_url', 'notifications_url', 'labels_url', 'releases_url', 'deployments_url\n', 'created_at', 'updated_at', 'pushed_at', 'git_url', 'ssh_url', 'clone_url', 'svn_url',\n'homepage', 'size', 'stargazers_count', 'watchers_count', 'language', 'has_issue\ns', 'has_projects', 'has_downloads', 'has_wiki', 'has_pages', 'forks_count',\n'mirror_url', 'archived', 'disabled', 'open_issues_count', 'license', 'allow_forking',\n'is_template', 'topics', 'visibility', 'forks', 'open_issues', 'watchers',\n'default_branch', 'permissions']\n\n```\n\n\nGet info about github actions for a given repository.\n\n```python\n>>> actions = actions_info('i2mint/mongodol') # doctest: +SKIP\n>>> print(actions.shape) # doctest: +SKIP\n(10, 30)\n>>> actions.head() # doctest: +SKIP\n id name ... repository head_repository\n0 1468986198 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...\n1 1445456774 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...\n2 1437461380 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...\n3 1343133456 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...\n4 1262878182 Continuous Integration ... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv... {'id': 341721959, 'node_id': 'MDEwOlJlcG9zaXRv...\n\n[5 rows x 30 columns]\n>>>\n>>> list(actions.columns) # doctest: +SKIP\n['id', 'name', 'node_id', 'head_branch', 'head_sha', 'run_number', 'event', 'status',\n'conclusion', 'workflow_id', 'check_suite_id', 'check_suite_node_id', 'url', 'html_url',\n'pull_requests', 'created_at', 'updated_at', 'run_attempt', 'run_started_at',\n'jobs_url', 'logs_url', 'check_suite_url', 'artifacts_url', 'cancel_url', 'rerun_url',\n'previous_attempt_url', 'workflow_url', 'head_commit', 'repository', 'head_repository']\n```\n\n\nFind most recently changed repositories and check if their CI failed or not.\n\n```python\n>>> from hubcap.examples import date_selection_lidx\n>>> updated_recently = repos.iloc\n... [date_selection_lidx(repos, hours_ago=24)] # doctest: +SKIP\n>>> {repo: get_last_build_status(repo)\n... for repo in updated_recently['full_name']} # doctest: +SKIP\n{'i2mint/py2mqtt': 'failure',\n 'i2mint/mongodol': 'success',\n 'i2mint/dol': 'success',\n 'i2mint/stream2py': 'success',\n 'i2mint/creek': 'success'}\n```\n\n\nNote: You can get this directly using the `ci_status` function\n\n```python\n>>> from hubcap.examples import ci_status\n>>> ci_status('i2mint', hours_ago=24) # doctest: +SKIP\n{'i2mint/py2mqtt': 'failure',\n 'i2mint/mongodol': 'success',\n 'i2mint/dol': 'success',\n 'i2mint/stream2py': 'success',\n 'i2mint/creek': 'success'}\n```\n",
"bugtrack_url": null,
"license": "apache-2.0",
"summary": "A py2store (i.e. dict-like) interface to github",
"version": "0.1.1",
"project_urls": {
"Homepage": "https://github.com/thorwhalen/hubcap"
},
"split_keywords": [
"github"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a2649db9c103cb154d2b682763d84c2745a03a121f6348b786146f4a2aa3df72",
"md5": "d1fc38a3820e68f006bd68c2c6034ea4",
"sha256": "5b3c88a464948651c2f7ee4e665f01042e551bc120e42e53f579881cb2de0783"
},
"downloads": -1,
"filename": "hubcap-0.1.1.tar.gz",
"has_sig": false,
"md5_digest": "d1fc38a3820e68f006bd68c2c6034ea4",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 25779,
"upload_time": "2024-02-09T12:48:57",
"upload_time_iso_8601": "2024-02-09T12:48:57.424682Z",
"url": "https://files.pythonhosted.org/packages/a2/64/9db9c103cb154d2b682763d84c2745a03a121f6348b786146f4a2aa3df72/hubcap-0.1.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-02-09 12:48:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "thorwhalen",
"github_project": "hubcap",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "hubcap"
}