{"id":35038181,"url":"https://github.com/ramusus/fabriclassed","last_synced_at":"2026-04-02T01:06:40.265Z","repository":{"id":1816429,"uuid":"2740611","full_name":"ramusus/fabriclassed","owner":"ramusus","description":"Class-based Fabric scripts via a Python metaprogramming hack","archived":false,"fork":false,"pushed_at":"2015-03-02T06:57:06.000Z","size":143,"stargazers_count":16,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-12-28T21:59:19.976Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://www.saltycrane.com/blog/2010/09/class-based-fabric-scripts-metaprogramming-hack/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jlong/css-spinners","license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ramusus.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2011-11-09T09:45:34.000Z","updated_at":"2017-07-07T15:32:51.000Z","dependencies_parsed_at":"2022-08-25T16:50:13.843Z","dependency_job_id":null,"html_url":"https://github.com/ramusus/fabriclassed","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/ramusus/fabriclassed","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramusus%2Ffabriclassed","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramusus%2Ffabriclassed/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramusus%2Ffabriclassed/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramusus%2Ffabriclassed/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ramusus","download_url":"https://codeload.github.com/ramusus/fabriclassed/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ramusus%2Ffabriclassed/sbom","scorecard":{"id":761043,"data":{"date":"2025-08-11","repo":{"name":"github.com/ramusus/fabriclassed","commit":"8920d2cf4874a3c6836fb999f66c4afe44d93ced"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-22T23:30:53.134Z","repository_id":1816429,"created_at":"2025-08-22T23:30:53.134Z","updated_at":"2025-08-22T23:30:53.134Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293636,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:05:07.454Z","status":"ssl_error","status_checked_at":"2026-04-02T00:56:46.496Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":"2025-12-27T08:04:50.235Z","updated_at":"2026-04-02T01:06:40.244Z","avatar_url":"https://github.com/ramusus.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"#### Introduction\n\nWe had several Fabric scripts which violated DRY. Class-based Fabric script can solve this issue.\nThis is a hack to enable the definition of Fabric tasks as methods in a class instead of just as module level functions.\nThis class-based approach provides the benefits of inheritance and method overriding.\n\n#### Example usage:\n\n```python\nfrom fabriclassed import initialize\nfrom fabriclassed.base import BaseFabric, DjangoFabric, VirtualenvFabric\nfrom fabric import api as fab\n\nclass Fabric(BaseFabric):\n    remote_project_path = '/local/path/to/my_project'\n    local_project_path = '/remote/path/to/my_project'\n\n    def fab_task(self):\n        '''My website task'''\n        fab.local('echo \"Hello world\"')\n\n__all__ = initialize(Fabric(), __name__)\n```\n\nEvery method with prefix 'fab_' will became a fabric command. Running fab -l gives:\n\n```\n$ fab -l\nAvailable commands:\n\n    del_pyc          Remove all .pyc files inside in fabfile and child direc...\n    search           Search string amoung source code inside directories fro...\n    task             My website task\n```\n\nRunning fab task gives:\n\n```\n$ fab task\n[localhost] local: echo \"Hello world\"\nHello world\n\nDone.\n```\n\n#### Extended usage with Django under Virtualenv:\n\nDjangoFabric and VirtualenvFabric classes contains various of tools to work with Django in Virtualenv environment. You can use both of these toos together or separately, as you like.\n\nExample of Fabric class with a bunch of properies:\n\n```python\nfrom fabriclassed import initialize\nfrom fabriclassed.base import BaseFabric, DjangoFabric, VirtualenvFabric\nfrom fabric.api import lcd, local\n\nclass Fabric(BaseFabric, DjangoFabric, VirtualenvFabric):\n    search_dirs = []\n\n    hosts = ['website.com']\n    remote_project_path = '/local/path/to/my_project'\n    local_project_path = '/remote/path/to/my_project'\n\n    # django settings\n    managefile_path = './manage.py'\n    test_default_app = 'name_of_my_main_django_application'\n    test_settings = 'settings_test_special_file'\n    shell_plus = True\n    devserver_port = 8000\n    devserver_params = ''\n    fixtures_dir = 'fixtures'\n    fixtures_format = 'json'\n    fixtures_map = (\n        'sites.site',\n    )\n\n    # virtualenv settings\n    use_virtualenv = True\n    virtualenv_dir = 'env'\n    patched_applications = [\n        # list of virtualenv patched applications\n    ]\n    diff_dir = 'my_relative_to_project_diffs_dir'\n    applications_dir = 'my_relative_to_project_apps_dir'\n\n__all__ = initialize(Fabric(), __name__)\n```\n\nRunning fab -l gives:\n\n```\nAvailable commands:\n\n    del_pyc          Remove all .pyc files inside in fabfile and child direc...\n    dev              Run Django's dev server\n    diff_dump        Walk over map of patched applications and make diff fil...\n    patch            Walk over 'diffs' directory and patch every application\n    search           Search string amoung source code inside directories fro...\n    sh               Run Django's standart shell or shell from django_extent...\n    symlink          Create symlink from 'apps' dir to the site-packages or ...\n    test             Run Django's tests. Argument can be application name, n...\n    update_fixtures  Put remote fixtures to repository on production, get an...\n```\n\n#### Installation:\n\nTo install the latest version of fabriclassed, just use command:\n\n```\npip install fabriclassed\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framusus%2Ffabriclassed","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Framusus%2Ffabriclassed","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Framusus%2Ffabriclassed/lists"}