{"id":15798210,"url":"https://github.com/grokify/medium-sdk-ruby","last_synced_at":"2025-05-07T14:23:59.925Z","repository":{"id":142759223,"uuid":"65522598","full_name":"grokify/medium-sdk-ruby","owner":"grokify","description":"Ruby SDK for Medium.com including OAuth 2.0 support and Swagger 2.0 spec","archived":false,"fork":false,"pushed_at":"2017-03-14T10:50:10.000Z","size":45,"stargazers_count":4,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-07T14:23:43.424Z","etag":null,"topics":[],"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/grokify.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":"2016-08-12T04:13:22.000Z","updated_at":"2020-12-23T01:59:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"a8f84d0f-e438-4a6c-b801-5cee8acfb7f3","html_url":"https://github.com/grokify/medium-sdk-ruby","commit_stats":{"total_commits":60,"total_committers":2,"mean_commits":30.0,"dds":"0.033333333333333326","last_synced_commit":"41181ef741b0865d233de59b3c8be1a94db0762c"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fmedium-sdk-ruby","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fmedium-sdk-ruby/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fmedium-sdk-ruby/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/grokify%2Fmedium-sdk-ruby/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/grokify","download_url":"https://codeload.github.com/grokify/medium-sdk-ruby/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252892858,"owners_count":21820719,"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":[],"created_at":"2024-10-05T00:24:00.552Z","updated_at":"2025-05-07T14:23:59.906Z","avatar_url":"https://github.com/grokify.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"Medium SDK for Ruby\n========================\n\n[![Gem Version][gem-version-svg]][gem-version-link]\n[![Build Status][build-status-svg]][build-status-link]\n[![Coverage Status][coverage-status-svg]][coverage-status-link]\n[![Dependency Status][dependency-status-svg]][dependency-status-link]\n[![Code Climate][codeclimate-status-svg]][codeclimate-status-link]\n[![Scrutinizer Code Quality][scrutinizer-status-svg]][scrutinizer-status-link]\n[![Downloads][downloads-svg]][downloads-link]\n[![Docs][docs-rubydoc-svg]][docs-rubydoc-link]\n[![License][license-svg]][license-link]\n\n## Description\n\nA Ruby SDK for the [Medium.com API](https://github.com/Medium/medium-api-docs) including:\n\n1. Auth via OAuth 2.0 with [automatic token refresh](https://github.com/grokify/faraday_middleware-oauth2_refresh) and [demo app](https://github.com/grokify/medium-sdk-ruby/tree/master/scripts/sinatra). This is necessary to request the `listPublications` or `uploadImage` access scopes.\n1. Auth via integration token with [demo app](https://github.com/grokify/medium-sdk-ruby/blob/master/scripts)\n1. Get and Post convenience methods\n1. Raw HTTP methods via Faraday client useful for image upload\n1. [Swagger 2.0 spec in YAML](docs/medium-api-v1-swagger.yaml) and [JSON](docs/medium-api-v1-swagger.json)\n\n## Installation\n\n### Via Bundler\n\nAdd `medium_sdk` to Gemfile and then run `bundle`:\n\n```sh\n$ echo \"gem 'medium_sdk'\" \u003e\u003e Gemfile\n$ bundle\n```\n\n### Via RubyGems\n\n```sh\n$ gem install medium_sdk\n```\n\n## Usage\n\n### Authorization\n\n#### Authorization Code Grant\n\nThe OAuth 2.0 authorization code grant is designed for where authorization needs to be granted by a 3rd party resource owner. This is required if your app wishes to request the `listPublications` or `uploadImage` scopes.\n\n* Initializing the SDK with the `client_id` parameter will use `MediumSdk::Connection::AuthCode` to manage the connection\n* Token refresh is automatically / transparently handled by `FaradayMiddleware::OAuth2Refresh`\n\n```ruby\nrequire 'medium_sdk'\n\n# Initialize SDK with OAuth redirect URI\nclient = MediumSdk.new(\n  client_id: 'my_client_id',\n  client_secret: 'my_client_secret',\n  redirect_uri: 'https://example.com/callback/medium'\n)\n\n# Retrieve OAuth authorize url using default redirect URL\nauth_url = client.connection.authorize_uri(\n  scope: 'basicProfile,listPublications,publishPost',\n  state: 'myState'\n)\n```\n\nOn your redirect page, you can exchange your authorization code for an access token using the following:\n\n```ruby\ncode  = params['code'] # e.g. using Sinatra to retrieve code param in Redirect URI\nclient.connection.authorize_code(code)\n```\n\nYou can also save and load tokens for use across SDK instances:\n\n```ruby\n# Access `OAuth2::AccessToken` object as hash including `access_token`, `refresh_token`, etc.\ntoken_hash = client.connection.token.to_hash\n\n# set_token() accepts a hash or OAuth2::AccessToken object\nclient.connection.set_token(token_hash)\n```\n\n#### Integration Token\n\nInitializing the SDK with the `integration_token` and not the `client_id` parameter will use `MediumSdk::Connection::IntegrationToken` to manage the connection.\n\n```ruby\nrequire 'medium_sdk'\n\n# Initialize SDK with integration token\nclient = MediumSdk.new integration_token: token\n\n# Set integration token after initialization\nclient.connection.token = token\n```\n\n### Resource Methods\n\nSee the Swagger 2.0 spec in [YAML](docs/medium-api-v1-swagger.yaml) and [JSON](docs/medium-api-v1-swagger.json) for more info.\n\n#### Users\n\n##### Getting the authenticated user’s details\n\n```ruby\n# Getting the authenticated user’s details\ndata = client.me\n```\n\n#### Publications\n\n##### Listing the user’s publications\n\n```ruby\n# Listing the user’s publications\ndata = client.user_publications           # uses authorized user's userId\ndata = client.user_publications 'user_id' # uses explicit userId\n```\n\n##### Fetching contributors for a publication\n\n```ruby\n# Fetching contributors for a publication\ndata = client.publication_contributors 'publication_id'\n```\n\n#### Posts\n\n##### Creating a post\n\n```ruby\n# Creating a user post\ndata = client.post, {\n  title: \"Hard things in software development\",\n  contentFormat: \"html\",\n  content: \"\u003cp\u003eCache invalidation\u003c/p\u003e\u003cp\u003eNaming things\u003c/p\u003e\",\n  tags: [\"development\", \"design\"],\n  publishStatus: \"draft\"\n}\n```\n\n##### Creating a backdated post\n\n```ruby\n# Creating a backdated user post using `publishedAt` and `notifyFollowers`\ndata = client.post, {\n  title: \"Hard things in software development\",\n  contentFormat: \"html\",\n  content: \"\u003cp\u003eCache invalidation\u003c/p\u003e\u003cp\u003eNaming things\u003c/p\u003e\",\n  tags: [\"development\", \"design\"],\n  publishStatus: \"public\",\n  publishedAt: \"2016-08-12T00:00:00+00:00\",\n  notifyFollowers: false\n}\n```\n\n##### Creating a post under a publication\n\n```ruby\n# Creating a publication post using `publicationId`\ndata = client.post, {\n  title: \"Hard things in software development\",\n  contentFormat: \"html\",\n  content: \"\u003cp\u003eCache invalidation\u003c/p\u003e\u003cp\u003eNaming things\u003c/p\u003e\",\n  tags: [\"development\", \"design\"],\n  publishStatus: \"public\",\n  publicationId: \"b45573563f5a\"\n}\n```\n\n#### Images\n\n##### Uploading an image\n\n```ruby\n# Upload image\npayload = {\n  image: Faraday::UploadIO.new('/path/to/my_image.jpg', 'image/jpeg')\n}\nresponse = client.connection.http.post 'images', payload\n```\n\n### Raw HTTP Client\n\nThe SDK's Faraday client can be accessed for sending raw requests. This can be used to upload images using `Faraday::UploadIO`.\n\n```ruby\nresponse = client.connection.http.get 'me'\n\nresponse = client.connection.http do |req|\n  req.url 'me'\nend\n```\n\nSee the [Faraday project](https://github.com/lostisland/faraday) for more info.\n\n## Swagger Spec\n\nA Swagger 2.0 spec is included with this SDK for reference.\n\n| Format | Validation |\n|--------|------------|\n| [`JSON Spec`](docs/medium-api-v1-swagger.json) | [Validate JSON](http://online.swagger.io/validator?url=https%3A%2F%2Fraw.githubusercontent.com%2Fgrokify%2Fmedium-sdk-ruby%2Fmaster%2Fdocs%2Fmedium-api-v1-swagger.json) |\n| [`YAML Spec`](docs/medium-api-v1-swagger.yaml) | [Validate YAML](http://online.swagger.io/validator?url=https%3A%2F%2Fraw.githubusercontent.com%2Fgrokify%2Fmedium-sdk-ruby%2Fmaster%2Fdocs%2Fmedium-api-v1-swagger.yaml) |\n\n## Demos\n\nDemos are in the `scripts` directory and use `.env` files for configuration.\n\n### Integration Token Demo\n\n```bash\n$ cd scripts\n$ cp example.env .env\n$ vi .env\n$ ruby me_token.rb\n```\n\n### OAuth 2.0 Demo\n\nExecute the following and then go to the URL in your browser after launching the Sinatra app.\n\n```bash\n$ cd scripts/sinatra\n$ bundle\n$ cp example.env .env\n$ vi .env\n$ ruby app.rb\n``` \n\n## Change Log\n\nSee [CHANGELOG.md](CHANGELOG.md)\n\n## Links\n\nProject Repo\n\n* https://github.com/grokify/medium-sdk-ruby\n\nMedium API Docs\n\n* https://github.com/Medium/medium-api-docs\n\n## Credits\n\n1. Swagger validation and YAML-to-JSON conversion by [`swagger-parser`](https://github.com/BigstickCarpet/swagger-parser).\n\n## Contributing\n\n1. Fork it ( http://github.com/grokify/medium-sdk-ruby/fork )\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\n## License\n\nMedium SDK for Ruby is available under an MIT-style license. See [LICENSE.txt](LICENSE.txt) for details.\n\nMedium SDK for Ruby \u0026copy; 2016 by [John Wang](https://github.com/grokify)\n\n [gem-version-svg]: https://badge.fury.io/rb/medium_sdk.svg\n [gem-version-link]: http://badge.fury.io/rb/medium_sdk\n [downloads-svg]: http://ruby-gem-downloads-badge.herokuapp.com/medium_sdk\n [downloads-link]: https://rubygems.org/gems/medium_sdk\n [build-status-svg]: https://api.travis-ci.org/grokify/medium-sdk-ruby.svg?branch=master\n [build-status-link]: https://travis-ci.org/grokify/medium-sdk-ruby\n [coverage-status-svg]: https://coveralls.io/repos/grokify/medium-sdk-ruby/badge.svg?branch=master\n [coverage-status-link]: https://coveralls.io/r/grokify/medium-sdk-ruby?branch=master\n [dependency-status-svg]: https://gemnasium.com/grokify/medium-sdk-ruby.svg\n [dependency-status-link]: https://gemnasium.com/grokify/medium-sdk-ruby\n [codeclimate-status-svg]: https://codeclimate.com/github/grokify/medium-sdk-ruby/badges/gpa.svg\n [codeclimate-status-link]: https://codeclimate.com/github/grokify/medium-sdk-ruby\n [scrutinizer-status-svg]: https://scrutinizer-ci.com/g/grokify/medium-sdk-ruby/badges/quality-score.png?b=master\n [scrutinizer-status-link]: https://scrutinizer-ci.com/g/grokify/medium-sdk-ruby/?branch=master\n [docs-rubydoc-svg]: https://img.shields.io/badge/docs-rubydoc-blue.svg\n [docs-rubydoc-link]: http://www.rubydoc.info/gems/medium_sdk/\n [license-svg]: https://img.shields.io/badge/license-MIT-blue.svg\n [license-link]: https://github.com/grokify/medium-sdk-ruby/blob/master/LICENSE.txt\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrokify%2Fmedium-sdk-ruby","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgrokify%2Fmedium-sdk-ruby","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgrokify%2Fmedium-sdk-ruby/lists"}