{"id":37703848,"url":"https://github.com/eiffel-community/eiffel-pythonlib","last_synced_at":"2026-01-16T13:05:44.093Z","repository":{"id":36128777,"uuid":"221424179","full_name":"eiffel-community/eiffel-pythonlib","owner":"eiffel-community","description":"A python library for subscribing to and publishing Eiffel events to a message-broker.","archived":false,"fork":false,"pushed_at":"2024-02-07T09:12:45.000Z","size":158,"stargazers_count":8,"open_issues_count":12,"forks_count":11,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-09-14T06:58:04.283Z","etag":null,"topics":["hacktoberfest","library"],"latest_commit_sha":null,"homepage":"https://eiffellib.readthedocs.io/en/latest/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eiffel-community.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGELOG.rst","contributing":"docs/contributing.rst","funding":null,"license":"LICENSE.txt","code_of_conduct":"docs/code_of_conduct.rst","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-13T09:42:10.000Z","updated_at":"2025-04-14T20:53:18.000Z","dependencies_parsed_at":"2024-06-21T14:08:23.113Z","dependency_job_id":"d07e8f91-7cb9-4a7e-acf3-945da7952e5e","html_url":"https://github.com/eiffel-community/eiffel-pythonlib","commit_stats":{"total_commits":35,"total_committers":12,"mean_commits":"2.9166666666666665","dds":0.4285714285714286,"last_synced_commit":"7a527f0b17d6bebc150b5cac7fabe7b5341127bf"},"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/eiffel-community/eiffel-pythonlib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eiffel-community%2Feiffel-pythonlib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eiffel-community%2Feiffel-pythonlib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eiffel-community%2Feiffel-pythonlib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eiffel-community%2Feiffel-pythonlib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eiffel-community","download_url":"https://codeload.github.com/eiffel-community/eiffel-pythonlib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eiffel-community%2Feiffel-pythonlib/sbom","scorecard":{"id":369812,"data":{"date":"2025-08-11","repo":{"name":"github.com/eiffel-community/eiffel-pythonlib","commit":"7a527f0b17d6bebc150b5cac7fabe7b5341127bf"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.4,"checks":[{"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":"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":"Code-Review","score":8,"reason":"Found 24/28 approved changesets -- score normalized to 8","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":"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":"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":"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/eiffel-community/.github/SECURITY.md:1","Info: Found linked content: github.com/eiffel-community/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/eiffel-community/.github/SECURITY.md:1","Info: Found text in security policy: github.com/eiffel-community/.github/SECURITY.md:1"],"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":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"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"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 2.4.0 not signed: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/85292561","Warn: release artifact 2.3.0 not signed: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/57532669","Warn: release artifact 2.2.0 not signed: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/50605378","Warn: release artifact 2.4.0 does not have provenance: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/85292561","Warn: release artifact 2.3.0 does not have provenance: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/57532669","Warn: release artifact 2.2.0 does not have provenance: https://api.github.com/repos/eiffel-community/eiffel-pythonlib/releases/50605378"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 27 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T12:42:11.129Z","repository_id":36128777,"created_at":"2025-08-18T12:42:11.130Z","updated_at":"2025-08-18T12:42:11.130Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478913,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: 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":["hacktoberfest","library"],"created_at":"2026-01-16T13:05:43.467Z","updated_at":"2026-01-16T13:05:44.086Z","avatar_url":"https://github.com/eiffel-community.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"#########\nEiffellib\n#########\n\n.. image:: https://img.shields.io/badge/Stage-Sandbox-yellow.svg\n  :target: https://github.com/eiffel-community/community/blob/master/PROJECT_LIFECYCLE.md#stage-sandbox\n\nEiffellib is a python library for subscribing to and publishing Eiffel events to a message-broker.\n\nDescription\n===========\n\nEiffellib solves the problem of publishing Eiffel events and subscribing to events, removing the need of knowing how to connect to a message-broker or how to utilize the protocol it supplies.\n\nWith Eiffellib you can start subscribing to and publish valid Eiffel messages quickly and to get a feel for the event protocol.\n\nIt is designed to be fast and easy to start using while still being production quality.\n\nDocumentation: https://eiffellib.readthedocs.io/en/latest/\n\nFeatures\n========\n\n- Simple subscription and publishing of Eiffel events.\n- Event building assistance with event validation on receive and publish.\n- Following a context link.\n\nInstallation\n============\n\nInstall the project by running:\n\n    pip install eiffellib[rabbitmq]\n\nIf you only want to use the Eiffel message definitions leave out the optional dependency:\n    pip install eiffellib\n\nExamples\n========\n\nStart RabbitMQ\n--------------\n\nIn order for these examples to work you need a RabbitMQ server:\n\n.. code-block::\n\n   # From https://hub.docker.com/_/rabbitmq\n   docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management\n\nSubscribing to an event\n-----------------------\n\n.. code-block:: python\n\n    import time\n    from eiffellib.subscribers import RabbitMQSubscriber\n\n\n    def callback(event, context):\n        print(event.pretty)\n\n    SUBSCRIBER = RabbitMQSubscriber(host=\"127.0.0.1\", port=5672, ssl=False,\n                                    queue=\"eiffel\", exchange=\"amq.fanout\")\n    SUBSCRIBER.subscribe(\"EiffelActivityTriggeredEvent\", callback)\n    SUBSCRIBER.start()\n    while True:\n        time.sleep(0.1)\n\nPublishing an event\n-------------------\n\n.. code-block:: python\n\n    from eiffellib.publishers import RabbitMQPublisher\n    from eiffellib.events import EiffelActivityTriggeredEvent\n\n    PUBLISHER = RabbitMQPublisher(host=\"127.0.0.1\", exchange=\"amq.fanout\", ssl=False,\n                                  port=5672, routing_key=None)\n    PUBLISHER.start()\n    ACTIVITY_TRIGGERED = EiffelActivityTriggeredEvent()\n    ACTIVITY_TRIGGERED.data.add(\"name\", \"Test activity\")\n    PUBLISHER.send_event(ACTIVITY_TRIGGERED)\n    PUBLISHER.wait_for_unpublished_events()\n\nDeprecation of routing key\n--------------------------\n\nThe \"routing_key\" argument in the RabbitMQPublisher class has been deprecated.\n\nThis deprecation also affects the default value of the \"routing_key\" argument and you will be getting warnings while running.\n\n\nThe reason for this change is due to a misunderstanding of how routing keys are supposed to be used when eiffellib was first created.\n\nEach event will now be able to generate their own routing key every time the event is sent.\n\nThis routing key is by default \"eiffel._.$event_type._._\" where the different values are \"eiffel.$family.$event_type.$tag.$domainid\".\n\nPlease refer to https://eiffel-community.github.io/eiffel-sepia/rabbitmq-message-broker.html for more information about routing keys.\n\n\nTo change to the new routing key behavior (and thus removing the warning), please set \"routing_key\" to \"None\" when initializing a new RabbitMQPublisher.\n\n.. code-block:: python\n\n    PUBLISHER = RabbitMQPublisher(host=\"127.0.0.1\", exchange=\"amq.fanout\", ssl=False,\n                                  port=5672, routing_key=None)\n\nIn order to change \"$family\", \"$tag\" or \"$domainid\" in the routing key, they have to be set on the events.\n\n.. code-block:: python\n\n    PUBLISHER = RabbitMQPublisher(host=\"127.0.0.1\", exchange=\"amq.fanout\", ssl=False,\n                                  port=5672, routing_key=None)\n    EVENT = EiffelActivityTriggeredEvent(family=\"myfamily\", tag=\"mytag\", domain_id=\"mydomain\")\n    PUBLISHER.send_event(EVENT)\n\nContribute\n==========\n\n- Issue Tracker: https://github.com/eiffel-community/eiffel-pythonlib/issues\n- Source Code: https://github.com/eiffel-community/eiffel-pythonlib\n\nSupport\n=======\n\nIf you are having issues, please let us know.\nThere is a mailing list at: eiffel-pythonlib-maintainers@google-groups.com\nor just write an Issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feiffel-community%2Feiffel-pythonlib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feiffel-community%2Feiffel-pythonlib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feiffel-community%2Feiffel-pythonlib/lists"}