{"id":20314450,"url":"https://github.com/release-engineering/kobo","last_synced_at":"2025-10-12T01:08:50.285Z","repository":{"id":39176317,"uuid":"52263225","full_name":"release-engineering/kobo","owner":"release-engineering","description":"A pile of python modules used by Red Hat release engineering to build their tools.","archived":false,"fork":false,"pushed_at":"2025-09-30T12:06:07.000Z","size":1023,"stargazers_count":15,"open_issues_count":17,"forks_count":39,"subscribers_count":14,"default_branch":"master","last_synced_at":"2025-09-30T12:44:42.259Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/release-engineering.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-02-22T09:45:26.000Z","updated_at":"2025-09-30T12:06:11.000Z","dependencies_parsed_at":"2024-01-16T03:55:40.812Z","dependency_job_id":"5f4191bb-e4da-4723-887c-86defe5fcd96","html_url":"https://github.com/release-engineering/kobo","commit_stats":{"total_commits":679,"total_committers":41,"mean_commits":16.5609756097561,"dds":0.6863033873343152,"last_synced_commit":"5257d83f9bf217eca5297b2a12be3f028c59967a"},"previous_names":[],"tags_count":72,"template":false,"template_full_name":null,"purl":"pkg:github/release-engineering/kobo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/release-engineering%2Fkobo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/release-engineering%2Fkobo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/release-engineering%2Fkobo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/release-engineering%2Fkobo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/release-engineering","download_url":"https://codeload.github.com/release-engineering/kobo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/release-engineering%2Fkobo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278009081,"owners_count":25914410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-02T02:00:08.890Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T18:15:24.313Z","updated_at":"2025-10-12T01:08:50.279Z","avatar_url":"https://github.com/release-engineering.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"kobo\n====\n\nA collection of Python utilities.\n\n[![Build Status](https://travis-ci.org/release-engineering/kobo.svg?branch=master)](https://travis-ci.org/release-engineering/kobo)\n[![Coverage Status](https://coveralls.io/repos/github/release-engineering/kobo/badge.svg?branch=master)](https://coveralls.io/github/release-engineering/kobo?branch=master)\n\n\nDevelopment\n===========\n\nUse a virtualenv for development.\nFor example, install kobo and dependencies in editable mode:\n\n    virtualenv ~/kobo-dev\n    . ~/kobo-dev/bin/activate\n    pip install --editable ~/src/kobo\n    pip install -rtest-requirements.txt\n\nTo run the test suite:\n\n- Run `py.test` to run tests against installed versions\n  of python and dependencies, or...\n- Install and run `tox` to run test suite against a matrix of supported\n  python and Django versions (more thorough, slower).\n\nPlease submit pull requests against https://github.com/release-engineering/kobo.\n\n\nChangelog\n=========\n\nkobo 0.41.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: improved Django 5.2 compatibility by modernizing middleware code\n\n### BUG FIXES\n\n- hub: fixed enable-worker command to properly refresh ready state when workers are re-enabled\n- hub: added missing Django migration to avoid migration warnings\n\nkobo 0.40.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: Task model now records the user who cancelled a task.\n- client: `HubProxy` now retries PermissionDenied errors to mitigate false\n  negatives that might appear immediately after login.\n\nkobo 0.39.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- client: `HubProxy` now accepts `transport_args` to customize the\n  instantiation of the default transport\n- `kobo.pkgset.FileCache` now implements `__contains__` for improved\n  performance\n\nkobo 0.38.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: introduced `VIEW_RAW_LOG_EXTENSIONS` setting\n\nkobo 0.37.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: get_worker_tasks XMLRPC function now has an option to also return ASSIGNED tasks\n\nkobo 0.36.2\n-----------\n\n### BUG FIXES\n\n- worker: fixed another logging deadlock introduced in kobo 0.36.0\n\nkobo 0.36.1\n-----------\n\n### BUG FIXES\n\n- hub: fixed display of permissions in user details template\n- worker: fixed a logging deadlock introduced in kobo 0.36.0\n- worker: fixed a locked TaskManager sometimes opening tasks\n\nkobo 0.36.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- worker: on `SIGHUP`, will now gracefully await task completion and re-exec\n\n### BUG FIXES\n\n- client: the `--hub` option to `watch-log` command is no longer ignored\n- worker: logging thread is more robust, recovers from many errors\n- hub: minor fixes to worker detail UI\n- hub: respond with 404 error on missing logs, rather than 500\n- other minor fixes\n\nkobo 0.35.1\n-----------\n\n### BUG FIXES\n\n- client: fixed support for proxies (`https_proxy`) in XML-RPC client\n\n\nkobo 0.35.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Support Django 5.0\n\n### BUG FIXES\n\n- hub: restricted login redirects to same site only\n- hub: fixed assignment of tasks to workers with incompatible arch\n- hub: fixed display of arches/channels on worker detail page\n- hub: avoid SELinux relabelling issue during file upload\n- Minor cleanups of obsolete or deprecated code\n\n\nkobo 0.34.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: the `/` character may now be used within usernames\n\n### BUG FIXES\n\n- hub: uploads of the same name but different content are no\n  longer considered duplicates\n\n\nkobo 0.33.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: added a page for listing failed tasks, alongside the existing\n  Running/Finished task lists.\n\nkobo 0.32.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: introduced `inherit_worker` argument to `create_subtask` API, allowing workers\n  to ensure created subtasks are assigned to themselves\n\nkobo 0.31.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: introduced `settings.USERS_ACL_PERMISSION` to adjust access to user list\n\n### BUG FIXES\n\n- hub: minor fixes to page titles\n\nkobo 0.30.1\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: deleting a worker no longer deletes associated tasks\n\nkobo 0.30.0\n-----------\n\n### BUG FIXES\n\n- hub: decorate Task.save with transaction.atomic\n- hub: do not call save twice in Task.save()\n- hub: fix Task.cancel_subtasks\n- client: allow file upload size to be sent a string\n- django: use BigIntegerField for file upload sizes\n- hub: return error 404 for non-existent logs\n- hub: move filename resolution to _streamed_log_response\n- worker: do not repeatedly remove already awaited tasks from subtask list\n- django: reimplement django_version_ge in pure Python\n- hub: do not use workers without ids in a filter\n- hub: replace pipes with shlex\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Make xmlrpc timeout configurable\n- django: remove support for Django 1.10 and older\n- hub: update `Worker.update_worker` documentation\n\nkobo 0.29.1\n-----------\n\n### BUG FIXES\n\n- Fixed XML-RPC authentication regression introduced in kobo 0.29.0\n\nkobo 0.29.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Introduced `create-worker` command\n- Improved compatibility with Django 4.2\n- Improved output from admin commands on XML-RPC errors\n- Cleaned up unused code\n\nkobo 0.28.0\n-----------\n\n### BUG FIXES\n\n- Renamed deprecated get_query_set to get_queryset\n- Changed repr to properly deserialize tracebacks sent over XML-RPC\n- Fixed remaining Django 3 deprecations\n- Fixed reporting of failed uploads\n- Changed behavior that log decoding failure doesn't raise an error\n- Made it possible to interrupt assigned tasks\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Retired python 2 support\n- Added Client Credentials Flow OIDC authentication\n\nkobo 0.27.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Added logging for authN/authZ events\n- Added `--hub` option to client\n\nkobo 0.26.0\n-----------\n\n### BUG FIXES\n\n- Fixed calculating the number of task's subtasks in new Django versions\n- Fixed cli/help_RST compatibility with Python 3\n- fixed encoding errors by forcing the usage of UTF-8 in str and bytes functions\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Added an option to make subtask inherit parents priority and make it configurable\n\nkobo 0.25.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved compatibility with Django 4.1\n- Improved compatibility with python 3\n\nkobo 0.24.2\n-----------\n\n### BUG FIXES\n\n- Fixed a crash from Django dumpdata command when using Django 2 and later.\n\nkobo 0.24.1\n-----------\n\n### BUG FIXES\n\n- Fixed an encoding error when using a python 2 XML-RPC client \n  against a python 3 kobo hub.\n\nkobo 0.24.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- It is now possible to provide a custom task manager implementation into the kobo\n  worker's main loop. This can be used to alter the worker's task scheduling or\n  execution behavior.\n\n\nkobo 0.23.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Introduced `AUTH_METHOD=oidc` for XML-RPC clients. If this authentication method\n  is enabled, the OIDC endpoint introduced by kobo 0.22.0 will be used.\n- `HubProxy` now respects the system configuration for kerberos realm when\n  `KRB_REALM` has not been set.\n\n\nkobo 0.22.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- hub: added an endpoint for OIDC login. Note that kobo itself does not\n  implement any OIDC workflow, which may instead be implemented by the\n  hosting web server.\n- `HubProxy` will now retry on additional cases of XML-RPC error.\n\n\nkobo 0.21.0\n-----------\n\n### BUG FIXES\n\n- Fixed a crash bug in `LoggingThread` when mixing bytes and text.\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Added methods to `HubProxy` for explicitly logging into hub.\n\nkobo 0.20.3\n-----------\n\n### BUG FIXES\n\n- Many compatibility fixes for modern Python and Django versions.\n- Fixed loss of error details when `LoggingThread` fails.\n\n\nkobo 0.20.2\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved Django 4.x compatibility\n\n\nkobo 0.20.1\n-----------\n\n### BUG FIXES\n\n- `kobo.rpmlib.get_keys_from_header` now correctly handles RPMs using header-only signing.\n  Also fixes `pkgset.SimpleRpmWrapper.signature`.\n\n\nkobo 0.20.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- kobo workers now maintain a `last_seen` field which may be used to monitor the\n  availability of workers.\n\n\nkobo 0.19.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- The `resubmit-tasks` now supports adjusting the priority of the resubmitted task.\n  The client and server must both upgrade to kobo 0.19.0 in order to use this feature.\n\n\n### BUG FIXES\n\n- Fixed backwards-incompatible change in kobo 0.18.0: if a kobo-derived client\n  provided its own `--profile` argument, this could clash with the new argument\n  in kobo.\n\n\nkobo 0.18.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- The kobo client now supports a `--profile` argument to select an alternative\n  configuration file. To enable this functionality, users of kobo should provide\n  a `default_profile` and `configuration_directory` when creating a\n  `CommandOptionParser`.\n\n### BUG FIXES\n\n- Fixed a python3 compatibility issue in kobo.http.\n- Fixed a crash bug for projects using the default `XMLRPC_TEMPLATE` for the\n  XML-RPC help page with Django \u003e 1.\n\nkobo 0.17.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Introduced the concept of global variables to `kobo.conf.PyConfigParser`.\n  This feature allows a variable to be declared in one file and overridden\n  in a subsequently imported file.\n\n### CHANGES\n\n- The `client.get_worker_info` XML-RPC method no longer requires authentication.\n  It was formerly restricted to superusers only.\n\nkobo 0.16.0\n-----------\n\n### REMOVED\n\n- The HubProxy auto_logout feature was removed. This feature was unreliable and\n  could occasionally result in deadlocks, due to the usage of finalizers.\n  It is recommended to call `logout()` from a `finally` block in cases where it's\n  important to ensure a logout.\n\nkobo 0.15.1\n-----------\n\n### BUG FIXES\n\n- Fixed a Django 1.x compatibility issue introduced in kobo 0.15.0\n\nkobo 0.15.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved Django 3.x compatibility\n\nkobo 0.14.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Introduced `gssapi` login method, for improved Python3 compatibility.\n  This login method requires the hub's `krb5login` endpoint to be enabled.\n  The default login method is unchanged.\n\nkobo 0.13.0\n-----------\n\n### BUG FIXES\n\n- Fixed a Python3 compatibility issue in hub migrations\n- Improved Django 1.11 compatibility\n\nkobo 0.12.0\n-----------\n\n### BUG FIXES\n\n- Improved Django 1.11 and 2.x compatibility\n\nkobo 0.11.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- The resubmit-tasks command now accepts a `--nowait` argument\n\n### BUG FIXES\n\n- Fixed usage of `shortcuts.run` with text mode in Python 3\n  ([#133](https://github.com/release-engineering/kobo/issues/133))\n- Fixed decoding crashes in `shortcuts.run` when an incomplete multibyte\n  sequence is read\n  ([#119](https://github.com/release-engineering/kobo/issues/119))\n- Fixed rpmlib attempting to decode binary data in RPM headers\n- Fixed various Python 3 compatibility issues\n\nkobo 0.10.0\n-----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved Python 3 compatibility, particularly in xmlrpc and rpmlib modules\n- Improved Django 1.11 and 2.x compatibility\n\n### REMOVED\n\n- Testing of Python 2.6 has been dropped; some kobo functionality still works\n  with Python 2.6, but may break without warning in later releases\n- Support for Django 1.6 has been removed\n\nkobo 0.9.0\n----------\n\n### BUG FIXES\n\n- Fixed LoggingThread on Python 3 ([#66](https://github.com/release-engineering/kobo/issues/66))\n- Fixed `kobo.django.xmlrpc` migrations for Django 2.x\n- Fixed some exceptions discarded without logging ([#32](https://github.com/release-engineering/kobo/issues/32))\n- Fixed some reliability issues in `kobo.xmlrpc`\n\nkobo 0.8.0\n----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved Python 3 compatibility\n- Improved Django 2.0 compatibility\n- Improved tests coverage\n- Header produced by kobo.shortcuts.run(show_cmd=True) is now limited to 79 characters length\n\n### BUG FIXES\n\n- Fixed handling of string SERVER_PORT in wsgi requests\n- Fixed Worker.timeout_task wrongly setting subtasks to INTERRUPTED ([#72](https://github.com/release-engineering/kobo/issues/72))\n- Fixed Worker.set_task_weight always crashing ([#75](https://github.com/release-engineering/kobo/issues/75))\n\nkobo 0.7.0\n----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- Improved Python 3 compatibility\n- Improved tests coverage\n\n\nkobo 0.6.0\n----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- kobo worker name no longer needs to match host FQDN\n- improved error reporting when loading configuration\n- improved error reporting from kobo.shortcuts.run\n- reduced memory usage when handling large log files\n- models now respect settings.AUTH_USER_MODEL\n\n### BUG FIXES\n\n- fixed crash on xml-rpc client in python \u003c= 2.7.9\n- fixed spurious whitespace from kobo.shortcuts.run (#40)\n- fixed missing migration for User model\n\n\nkobo 0.5.0\n----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- kobo.shortcuts.run now supports all Popen keyword arguments\n- resubmit-tasks has a --force argument to resubmit successful tasks\n- new watch-log command for watching a log from CLI\n- admin UI now covers user model\n\n### BUG FIXES\n\n- kobo.shortcuts.run now resumes on interrupted system calls\n- worker load no longer includes assigned but unstarted tasks\n\n\nkobo 0.4.0\n----------\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- pkgset.SimpleRpmWrapper has now checksum_type member\n- threads.run_in_threads helper function\n\n### Django 1.5 update\n\nDjango part of kobo was udpated to be compatible with 1.5 release. Lower\nversion are no more supported. As a side-effect, only python 2.6+ is\nsupported by django part.\n\nFrom same reason there will be no builds of kobo-django package for RHEL 5\nand lower as it lacks required python version.\n\n- RemoteUserMiddleware is now used for KrbV authentication\n- LimitedRemoreUserMiddleware can be used to authenticate only on entry\npages.\n- LongnameUser model is used for auth backend. It allows 255 characters long\nuser names (as they come from KrbV)\n- Class-based generic views ExtraListView and ExtraDetailView. object_list\nhelper stays for compatibility, but it is deprecated now and will be removed\nin future.\n\n\nkobo 0.3.0\n----------\n\n\n### FEATURES \u0026 IMPROVEMENTS\n\n- State machine implementation - StateEnum, db field, form fields\n- Brand new HTML template, media, views, urls and menu\n- Menu supports django.root\n- Task logs, javascript log watcher, threaded worker stdout logger\n- XML-RPC help pages display list of contents\n- Kerberos support in CookieTransport\n- JSONField to store dicts and lists in database\n- Add relative_path() and split_path() functions to shortcuts\n\n\n### kobo.pkgset.FileWrapper\n\nfile_name attribute renamed to file_path.\nfile_name is now a property which returns actual file name.\n\nAction:\nChange file_name to file_path in your code.\n\n\n### Username hack\n\nUsername hack is enabled by default now (when kobo.django.auth is used).\nIt changes username to 255 characters and also overrides validation RE.\n\nAction:\nOn postgresql run: ALTER TABLE auth_user ALTER username TYPE VARCHAR(255);\nSqlite users have to use db_update-0.2.0-0.3.0 script.\n\n\n### Worker FQDN checking\n\nEach worker's name must match it's FQDN now.\nThis prevents cut\u0026paste configuration errors when tasks end in INTERRUPTED state.\n\nAction:\nChange worker names to FQDN.\nChange related usernames as well.\n\n\n### Changes in kobo.plugins\n\nRemoved 'lower_case' attribute.\nPlugins are now subclassed when a container is created.\nEach plugin now contains 'container' attribute.\n\nAction:\nRemove 'lower_case' attribute from plugins, do whatever is necessary in 'normalize_name() class method instead.\n\n\n- Improve PluginContainer inheritance. Also add 'container' attribute to each plugin class obtained from a container instance. (Daniel Mach)\n- Plugins are now subclassed when a container is created. (Daniel Mach)\n\n\n### kobo.hub.models.Task refactoring\n\nField 'traceback' moved to a file (traceback.log).\nField 'result' content dumped to a file (stdout.log), it is supposed to contain actual task result.\nField 'args' changed to JSONField and data is directly available without any conversion.\n\nAction:\nRun db_update-0.2.0-0.3.0 script.\n\n\n### Configuration handling in kobo.client and kobo.worker\n\nConfiguration no longer uses os.environ to get config file path.\nClientCommandContainer, HubProxy and TaskManager constructor has a new mandatory 'conf' argument.\n\nAction:\n    config_file = os.environ.get(\"\u003cPROJECT_NAME\u003e_CONFIG_FILE\", \"/etc/\u003cproject_name\u003e.conf\")\n    conf = kobo.conf.PyConfigParser()\n    conf.load_from_file(config_file)\n    ... and pass conf to ClientCommandContainer, HubProxy or TaskManager\n\n\n### Configuration passed to tasks\n\nTaskBase constructor has now a mandatory argument 'conf', which is automatically set in TaskManager.\n\nAction:\nAdd 'conf' argument to tasks classes with custom constructor.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frelease-engineering%2Fkobo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frelease-engineering%2Fkobo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frelease-engineering%2Fkobo/lists"}