{"id":15663116,"url":"https://github.com/nickstenning/annotator-store-py","last_synced_at":"2026-03-02T22:47:13.892Z","repository":{"id":999285,"uuid":"811000","full_name":"nickstenning/annotator-store-py","owner":"nickstenning","description":"Python backend for Annotator (http://github.com/nickstenning/annotator)","archived":false,"fork":false,"pushed_at":"2010-11-21T22:27:35.000Z","size":407,"stargazers_count":18,"open_issues_count":0,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-05-06T14:47:17.671Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/nickstenning.png","metadata":{"files":{"readme":"README.rst","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":"2010-08-01T19:27:20.000Z","updated_at":"2024-04-02T17:40:55.000Z","dependencies_parsed_at":"2022-08-16T11:45:23.711Z","dependency_job_id":null,"html_url":"https://github.com/nickstenning/annotator-store-py","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nickstenning/annotator-store-py","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickstenning%2Fannotator-store-py","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickstenning%2Fannotator-store-py/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickstenning%2Fannotator-store-py/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickstenning%2Fannotator-store-py/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nickstenning","download_url":"https://codeload.github.com/nickstenning/annotator-store-py/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickstenning%2Fannotator-store-py/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30023000,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T22:30:10.381Z","status":"ssl_error","status_checked_at":"2026-03-02T22:23:34.650Z","response_time":60,"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":"2024-10-03T13:35:31.983Z","updated_at":"2026-03-02T22:47:13.875Z","avatar_url":"https://github.com/nickstenning.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Reference implementation backend for `Annotator` web annotation system.\n\nDefines the reference RESTFul API and connects to a database backend to\npersist annotations created by the frontend, Annotator_.\n\n.. _Annotator: http://github.com/nickstenning/annotator\n\nThere is also an experimental CouchDB implementation. See the `couchdb` branch\nof the repository.\n\nGetting Started\n===============\n\nThe following instructions assume you have a working installation of `python`\n(2.6 or higher) and `sqlite` (any recent version). You will also need `pip` and\n`virtualenv`, which can be installed quickly with one command::\n\n    easy_install virtualenv\n\nNow, you should be ok to set up annotator-store-py::\n\n    git clone git://github.com/nickstenning/annotator-store-py.git\n    cd annotator-store-py\n    pip install -E pyenv -r requirements.txt -e .\n\nIf that worked ok, you should see something like::\n\n    [...]\n    Successfully installed annotator HTTPEncode httplib2 Paste PasteDeploy PasteScript routes SQLAlchemy webob wsgifilter\n    Cleaning up...\n\nYou should now be able to run the demo server::\n\n    source pyenv/bin/activate\n    paster serve store.ini\n\nYou might a deprecation warning from SQLAlchemy. We're working on removing this but\nin the mean time you can safely ignore it. You can take a peek at the (little)\nthat the backend is now doing::\n\n    curl -i http://localhost:5000/annotations\n\nYou'll see that the store responds with \"[]\": there aren't any annotations in\nthe store at the moment. That's not surprising: you haven't created any. For that,\nyou'll need to go get Annotator_ and hook it up to the backend.\n\nRESTFul Interface\n=================\n\nThe RESTful interface is provided by the WSGI application in annotator/store.py.\n\nIt can be mounted anywhere you like and provides a RESTful resource 'annotations'.\n\nFor example if you have mounted it at '/store' you would have::\n\n    GET    /store/annotations      # list\n    POST   /store/annotations      # create\n    GET    /store/annotations/{id} # show\n    PUT    /store/annotations/{id} # update\n    DELETE /store/annotations/{id} # delete\n\nAttributes for these methods (in particular annotation values) may be provided\neither as individual query parameters or as as json payload (encoded in\nstandard way as argument to a parameter named json). Returned data will be\nJSON encoded. If a \"callback\" query parameter is supplied, any response will be \nJSONP encoded using the value of \"callback\" as the name of the callback function.\n\nNotes:\n\n  * A create request returns a Location header redirecting to the created\n    annotation.\n\nSearching\n---------\n\nSearch API is located at: {mount_point}/annotations/search\n\nResults are returned in JSON format::\n\n    {\n        'total': number of results,\n        'results': results list\n    }\n\nYou can search by any annotation attribute (but not \"extras\"). For example to\nsearch for annotation with a particular 'uri' field you'd visit::\n\n    /annotations/search?uri=http://example.com\n\nIn addition to search parameters there are three additional control parameters:\n\n  * limit=val: limit the number of results returned to val (defaults to 100 if\n    not set). To have all results returned set to -1.\n  * offset=val: return results from val onwards\n  * all_fields=1: if absent only return ids of annotations, if present (true)\n    return all fields of the annotation\n\n\nSpecification of Annotations\n============================\n\nAnnotations can have the following attributes:\n\n  * id: unique identifier of the annotation -- usually provided by the store at creation.\n  * uri: document identifier\n  * user: an identifier for the user who created the annotation. To avoid\n    cross-application collision it is recommended that you either:\n    * Generate uuids for your users stored as: urn:uuid:{uuid} (or just {uuid})\n    * (or) Prefix your usernames with a unique (e.g. uuid) string (e.g. {uuid-identifying-application}::{your-username}\n  * text: text of annotation\n  * range(s): list of range objects. Each range object has:\n    * [optional] format: range format (defines syntax/semantics of start end)\n    * start: xpath, offset (for default html format)\n    * end: xpath, offset (for default html format)\n  * [optional] quote (the quoted text -- or snippet thereof)\n  * [optional] created (datetime of creation)\n\nYou can also add arbitrary additional key/value pairs to annotations, these \nare serialized as \"extras\" in the database in this version of the annotation \nstore.\n\nChangelog\n=========\n\nHEAD\n----\n\nv0.4 2010-11-10\n---------------\n\n**Beta release**: this annotator store has now been successfully used in\nproduction deployments.\n\n  * New attributes on Annotation: user, tags\n  * Support for jsonp and returning id on annotation create\n  * Allow arbitrary attributes on annotations\n  * Searching annotations (essential for multi-document annotation!)\n  * Improved documentation\n  * Support locating annotation RESTFul url within store (e.g.\n    {store}/annotations instead {store}/annotation)\n  * Preliminary CORS support for cross-domain requests\n  * Preliminary CouchDB support\n\nv0.3 2009-10-18\n---------------\n\nMajor release:\n\n  * RESTful interface is JSON-based by default\n  * Much improved demo with WSGI middleware\n  * Switch from existing marginalia js library to new jsannotate library\n  * Rename from annotater to annotator\n  * Make model code easily reusable inside another project\n  * Simplify and refactor code throughout\n\nv0.2 2009-07-26\n---------------\n\n  * Significant polishing\n  * Convert backend store to use SQLAlchemy\n  * Load RESTful interface at an arbitrary url\n  * Last version to be based on marginalia\n\nv0.1 2007-04-01\n---------------\n\n  * Fully functioning web annotation using marginalia\n  * SQLObject based backend store\n  * WSGI RESTful interface to store\n  * WSGI app for mounting marginalia media (js, css etc)\n  * Demo app in demo/\n\nCopyright and License\n=====================\n\nCopyright (c) 2006-2010 the Open Knowledge Foundation.\n\nLicensed under the MIT license:\n\n  \u003chttp://www.opensource.org/licenses/mit-license.php\u003e\n\nVersions earlier than 0.3 used js code derived from Geof Glass' code which are\ntherefore (c) Geoff Glass and collaborators and are licensed under the GPL v2.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickstenning%2Fannotator-store-py","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnickstenning%2Fannotator-store-py","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickstenning%2Fannotator-store-py/lists"}