{"id":15512339,"url":"https://github.com/irphilli/tracker_api","last_synced_at":"2026-03-16T16:39:11.117Z","repository":{"id":15242224,"uuid":"17971112","full_name":"irphilli/tracker_api","owner":"irphilli","description":"Ruby Wrapper for Pivotal Tracker v5 API","archived":false,"fork":false,"pushed_at":"2024-08-19T18:36:05.000Z","size":577,"stargazers_count":106,"open_issues_count":7,"forks_count":109,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-04-10T00:16:36.770Z","etag":null,"topics":["api-client","pivotal-tracker","ruby"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/irphilli.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2014-03-21T06:58:55.000Z","updated_at":"2025-01-01T17:18:14.000Z","dependencies_parsed_at":"2024-06-18T13:45:26.882Z","dependency_job_id":"36ab799c-39b1-4278-b775-1de33521f75b","html_url":"https://github.com/irphilli/tracker_api","commit_stats":null,"previous_names":["dashofcode/tracker_api","irphilli/tracker_api","productplan/tracker_api"],"tags_count":35,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irphilli%2Ftracker_api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irphilli%2Ftracker_api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irphilli%2Ftracker_api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/irphilli%2Ftracker_api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/irphilli","download_url":"https://codeload.github.com/irphilli/tracker_api/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248131318,"owners_count":21052820,"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","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":["api-client","pivotal-tracker","ruby"],"created_at":"2024-10-02T09:53:36.097Z","updated_at":"2026-03-16T16:39:11.106Z","avatar_url":"https://github.com/irphilli.png","language":"Ruby","readme":"⚠   **NOTICE**: With Pivotal Tracker [announcing end-of-life](https://www.pivotaltracker.com/blog/2024-09-18-end-of-life), support for this gem is discontinued as well.\n\n# TrackerApi\n\n[![Gem Version](https://badge.fury.io/rb/tracker_api.svg)](http://badge.fury.io/rb/tracker_api)\n[![Build Status](https://github.com/irphilli/tracker_api/actions/workflows/ruby-tests.yml/badge.svg?branch=master)](https://github.com/irphilli/tracker_api/actions)\n[![Maintainability](https://api.codeclimate.com/v1/badges/71aa9cdefa7ff7e9561c/maintainability)](https://codeclimate.com/github/irphilli/tracker_api/maintainability)\n[![Test Coverage](https://api.codeclimate.com/v1/badges/71aa9cdefa7ff7e9561c/test_coverage)](https://codeclimate.com/github/irphilli/tracker_api/test_coverage)\n\nThis gem allows you to easily use the [Pivotal Tracker v5 API](https://www.pivotaltracker.com/help/api/rest/v5).\n\nIt’s powered by [Faraday](https://github.com/lostisland/faraday) and [Virtus](https://github.com/solnic/virtus).\n\n## Compatibility\n\nThis gem is tested against the following officially supported Ruby versions:\n - Minimum Ruby Version: 2.7.x\n - Latest Ruby Supported: 3.2.x\n\n## Installation\n\nAdd this line to your application's Gemfile:\n```ruby\ngem 'tracker_api'\n```\n\nAnd then execute:\n```bash\n$ bundle install\n```\n\nOr install it yourself as:\n```bash\n$ gem install tracker_api\n```\n\n## Basic Usage\n\n```ruby\nclient = TrackerApi::Client.new(token: 'my-api-token')                    # Create API client\n\nclient.me.email                                                           # Get email for the authenticated person\nclient.activity                                                           # Get a list of all the activity performed the authenticated person\nclient.notifications                                                      # Get notifications for the authenticated person\n\nprojects = client.projects                                                # Get all projects\nproject  = client.project(123456)                                         # Find project with given ID\nproject.activity                                                          # Get a list of all the activity performed on this project\n\nproject.stories                                                           # Get all stories for a project\nproject.stories(with_state: :unscheduled, limit: 10)                      # Get 10 unscheduled stories for a project\nproject.stories(filter: 'requester:OWK label:\"jedi stuff\"')               # Get all stories that match the given filters\nproject.create_story(name: 'Destroy death star')                          # Create a story with the name 'Destroy death star'\n\nproject.search('Destroy death star')                                      # Get a search result with all epics and stories relevant to the query\n\nstory = project.story(847762630)                                          # Find a story with the given ID\nstory.activity                                                            # Get a list of all the activity performed on this story\nstory.transitions                                                         # Get a list of all the story transitions on this story\n\nstory.name = 'Save the Ewoks'                                             # Update a single story attribute\nstory.attributes = { name: 'Save the Ewoks', description: '...' }         # Update multiple story attributes\nstory.add_label('Endor')                                                  # Add a new label to an existing story\nstory.save                                                                # Save changes made to a story\n\nstory = client.story(117596687)                                           # Get a story with story ID only\n\nstory = TrackerApi::Resources::Story.new( client:     client,\n                                          project_id: 123456,\n                                          id:         847762630)          # Use the Story resource to get the story\ncomments = story.comments                                                 #   comments without first fetching the story\n\ncomment = story.create_comment(text: \"Use the force!\")                    # Create a new comment on the story\n\ncomment = story.create_comment(text: \"Use the force again !\",             # Create a new comment on the story with\n                                files: ['path/to/an/existing/file'])      #     file attachments\n\ncomment.text += \" (please be careful)\"\ncomment.save                                                              # Update text of an existing comment\ncomment.delete                                                            # Delete an existing comment\n\ncomment.create_attachments(files: ['path/to/an/existing/file'])           # Add attachments to existing comment\ncomment.delete_attachments                                                # Delete all attachments from a comment\n\nattachments = comment.attachments                                         # Get attachments associated with a comment\nattachments.first.delete                                                  # Delete a specific attachment\n\ncomment.attachments(reload: true)                                         # Re-load the attachments after modification\ntask = story.tasks.first                                                  # Get story tasks\ntask.complete = true\ntask.save                                                                 # Mark a task complete\n\nreview = story.reviews.first                                              # Mark a review as complete\nreview.status = 'pass'\nreview.save\n\nepics = project.epics                                                     # Get all epics for a project\nepic  = epics.first\nlabel = epic.label                                                        # Get an epic's label\n\nworkspaces = client.workspaces                                            # Get person's multi-project workspaces\n```\n\n## Eager Loading\n\nSee Pivotal Tracker API [documentation](https://www.pivotaltracker.com/help/api#Response_Controlling_Parameters) for how to use the `fields` parameter.\n\n```ruby\nclient = TrackerApi::Client.new(token: 'my-api-token')                    # Create API client\n\nclient.project(project_id, fields: ':default,labels(name)')               # Eagerly get labels with a project\nclient.project(project_id, fields: ':default,epics')                      # Eagerly get epics with a project\nclient.project(project_id).stories(fields: ':default,tasks')              # Eagerly get stories with tasks\nstory.comments(fields: ':default,person')                                 # Eagerly get comments and the person that made the comment for a story\n```\n\n## Error Handling\n`TrackerApi::Errors::ClientError` is raised for 4xx HTTP status codes  \n`TrackerApi::Errors::ServerError` is raised for 5xx HTTP status codes\n\n## Warning\n\nDirect mutation of an attribute value skips coercion and dirty tracking. Please use direct assignment or the specialized add_* methods to get expected behavior.\nhttps://github.com/solnic/virtus#important-note-about-member-coercions\n\nThis will cause coercion and dirty tracking to be bypassed and the new label will not be saved.\n```ruby\nstory = project.story(847762630)\n\nlabel = TrackerApi::Resources::Label.new(name: 'Special Snowflake')\n# BAD\nstory.labels \u003c\u003c label\nstory.save\n\n# GOOD\nstory.labels = story.labels.dup.push(label)\nstory.save\n```\n\n## TODO\n\n- Add missing resources and endpoints\n- Add create, update, delete for resources\n- Error handling for [error responses](https://www.pivotaltracker.com/help/api#Error_Responses)\n\n## Semantic Versioning\nhttp://semver.org/\n\nGiven a version number MAJOR.MINOR.PATCH, increment the:\n\n1. MAJOR version when you make incompatible API changes,\n2. MINOR version when you add functionality in a backwards-compatible manner, and\n3. PATCH version when you make backwards-compatible bug fixes.\n\nAdditional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.\n\n## Contributing\n\nCurrently this client supports read-only access to Pivotal Tracker.\nWe will be extending it as our use cases require, but are always happy to accept contributions.\n\n1. Fork it\n2. Create your feature branch (`git checkout -b my-new-feature`)\n3. Commit your changes (`git commit -am 'Add some feature'`)\n4. Push to the branch (`git push origin my-new-feature`)\n5. Create new Pull Request\n","funding_links":[],"categories":["Ruby"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Firphilli%2Ftracker_api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Firphilli%2Ftracker_api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Firphilli%2Ftracker_api/lists"}