{"id":32178016,"url":"https://github.com/psychopy/pyosf","last_synced_at":"2026-02-22T19:03:49.042Z","repository":{"id":60721435,"uuid":"50383300","full_name":"psychopy/pyosf","owner":"psychopy","description":"A pure python library for simple sync with Open Science Framework","archived":false,"fork":false,"pushed_at":"2018-12-04T10:44:04.000Z","size":159,"stargazers_count":9,"open_issues_count":4,"forks_count":5,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-11-24T06:35:11.986Z","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":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/psychopy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-01-25T21:47:18.000Z","updated_at":"2024-09-23T01:15:19.000Z","dependencies_parsed_at":"2022-10-03T20:16:51.077Z","dependency_job_id":null,"html_url":"https://github.com/psychopy/pyosf","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/psychopy/pyosf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psychopy%2Fpyosf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psychopy%2Fpyosf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psychopy%2Fpyosf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psychopy%2Fpyosf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/psychopy","download_url":"https://codeload.github.com/psychopy/pyosf/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/psychopy%2Fpyosf/sbom","scorecard":{"id":748527,"data":{"date":"2025-08-11","repo":{"name":"github.com/psychopy/pyosf","commit":"7309b3f016c125c743311afcf572a4fe79dc5e9b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2,"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":"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":"Code-Review","score":2,"reason":"Found 6/21 approved changesets -- score normalized to 2","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":"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":"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":"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":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.0.5 not signed: https://api.github.com/repos/psychopy/pyosf/releases/5439792","Warn: release artifact v1.0.5 does not have provenance: https://api.github.com/repos/psychopy/pyosf/releases/5439792"],"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"}},{"name":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2014-14 / GHSA-652x-xj99-gmcc","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2014-13 / GHSA-cfj3-7x9c-4p3h","Warn: Project is vulnerable to: PYSEC-2018-28 / GHSA-x84v-xcm2-53pg"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 15 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-22T19:35:29.378Z","repository_id":60721435,"created_at":"2025-08-22T19:35:29.378Z","updated_at":"2025-08-22T19:35:29.378Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29723574,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-22T15:10:41.462Z","status":"ssl_error","status_checked_at":"2026-02-22T15:10:04.636Z","response_time":110,"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":[],"created_at":"2025-10-21T20:45:27.896Z","updated_at":"2026-02-22T19:03:49.037Z","avatar_url":"https://github.com/psychopy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"`pyosf` is a pure Python library for simple file sync with Open Science\nFramework\n\nThis package is for simple synchronisation of files from the local file space\nto the Open Science Framework (OSF). There is a more complex fully-featured\nsync package by the Center for Open Science, who created OSF, called [osf-sync](https://github.com/CenterForOpenScience/osf-sync)\n\nThe OSF official package is designed for continuous automated synchronisation\nof many projects (a la Dropbox). We needed something simpler (for combination\nwith PsychoPy). The `pyosf` package aims to perform basic search/login/sync\noperations with single projects on OSF but only when instructed to do so (no\ncontinuous sync).\n\nIn implementation `pyosf` differs from osf-sync in the following ways:\n- fewer dependencies\n- support for Python2.x\n- no GUI included (yet)\n- local database of files saved as flat json format (no database)\n- simpler handling of sync resolution rules(?)\n\nIt can be distributed freely under the MIT license.\n\n[![Build Status](https://travis-ci.org/psychopy/pyosf.svg?branch=master)](https://travis-ci.org/psychopy/pyosf)\n[![codecov.io](https://codecov.io/github/psychopy/pyosf/coverage.svg?branch=master)](https://codecov.io/github/psychopy/pyosf?branch=master)\n\nInstallation\n------------\n\n`pyosf` is compatible with Linux, OS X and Windows, and with Python 2.7 and\nPython 3.4 (upwards)\n\nInstall it with:\n\n\tpip install pyosf\n\nUsage\n-----\n\nWhen you first create a `Project`, or to perform searches for projects, you\nneed to create a `Session`::\n\n    import pyosf\n    session = pyosf.Session(username='name@gmail.com', password='xxyxyayxy')\n\nThe `Session` allows you to conduct searches::\n\n```python\nusers = session.find_users('Peirce')  # a list of user ids\nprint(users)\njon_id = users[0]['id']  # we're just using the first one\nprojs = session.find_user_projects(user_id=jon_id)  # id=None to find your own projects\nfor proj in projs:\n    print('{}: {}'.format(proj.id, proj.title))\n\nosf_proj = session.open_project(proj_id)  # or this if you know the project id\n```\n\nThen you can create a `Project` object to track the remote and local files. A\n`Project` consists of:\n\n- `project_file`: your project info\n- `root_path`: the location where your osf project is permanently stored\n  locally\n- `osf`: an OSF project object from a `Session`\n\n    OR\n\n- simply a project file location, on subsequent repeats (provided you did not\n  change the `root_path`.)\n\nIf initially, you do not have a `project_file`, just specify the location where\nyou want to save it later. `pyosf` will give you a warning that it did not find\na `project_file`, which is ok because we are going to create it.\n\n```python\n# Make a project object\nproj = pyosf.Project(project_file='/Home/myUserName/pyosfProjects/first.proj',\n                     root_path='/Home/myUserName/experiments/firstExperiment',\n                     osf=osf_proj)\n\n# get the difference between local and remote project\t\t\t\t\t\t\t\t\t\t \nchanges = proj.get_changes()  \n\n# inspect the changes\nprint(changes)  \n\n# do the sync\nchanges.apply()\n\n# If you did not have a project file initially, the following will create one\n# and save it under the path that you have given when calling `pyosf.Project`  \nproj.save()  \n```\n\nThe project file saves your username (but not password) and, if the username\nhas previously been used to authenticate a `Session` with OSF then an\nauthentication token will have been saved to `~/.pyosf/tokens.json` and that\nwill allow the project to create a new session. i.e. on subsequent logins you\ncan do just:\n\n```python\nimport pyosf\n# no need to create a session second time around\nproj = pyosf.Project(project_file='/Home/myUserName/pyosfProjects/first.proj')\nchanges = proj.get_changes()\nchanges.apply()\n```\n\nSecurity and passwords\n----------------------\n\nWhen you first create a `Session` you need to provide a username (email\naddress) and your OSF password. These will be sent securely (over https) and an\nauth token will be retrieved. That auth token will be stored in readable text\nin the current user space of your computer (in ~/.pyosf/tokens.json). When a\n`Session` is subsequently created the username is used to check for a previous\nauth token and if one is found a password will not be needed.\n\nThe second step is from the `Project`. The `Project` stores in its .proj file\n(json format) the username that was being used for this sync (as supplied on\nfirst access). That username will be used to create a `Session` which will then\nfetch the appropriate token as described above.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsychopy%2Fpyosf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpsychopy%2Fpyosf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpsychopy%2Fpyosf/lists"}