• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

piotrmurach/github: Ruby interface to GitHub API

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

piotrmurach/github

开源软件地址:

https://github.com/piotrmurach/github

开源编程语言:

Ruby 88.9%

开源软件介绍:

github api logo

GithubAPI Gitter

Gem Version Build Status Maintainability Coverage Status Inline docs

Website | Wiki | RDocs

A Ruby client for the official GitHub API.

Supports all the API methods. It's built in a modular way. You can either instantiate the whole API wrapper Github.new or use parts of it i.e. Github::Client::Repos.new if working solely with repositories is your main concern. Intuitive query methods allow you easily call API endpoints.

Features

  • Intuitive GitHub API interface navigation.
  • It's comprehensive. You can request all GitHub API resources.
  • Modular design allows for working with parts of API.
  • Fully customizable including advanced middleware stack construction.
  • Supports OAuth2 authorization.
  • Flexible argument parsing. You can write expressive and natural queries.
  • Requests pagination with convenient DSL and automatic options.
  • Easy error handling split for client and server type errors.
  • Supports multithreaded environment.
  • Custom media type specification through the 'media' parameter.
  • Request results caching
  • Fully tested with unit and feature tests hitting the live api.

Installation

Install the gem by running

gem install github_api

or put it in your Gemfile and run bundle install

gem "github_api"

Contents

1 Usage

To start using the gem, you can either perform requests directly on Github namespace:

Github.repos.list user: 'piotrmurach'

or create a new client instance like so

github = Github.new

and then call api methods, for instance, to list a given user repositories do

github.repos.list user: 'piotrmurach'

1.1 API Navigation

The github_api closely mirrors the GitHub API hierarchy. For example, if you want to create a new file in a repository, look up the GitHub API spec. In there you will find contents sub category underneath the repository category. This would translate to the request:

github = Github.new
github.repos.contents.create 'piotrmurach', 'finite_machine', 'hello.rb',
                             path: 'hello.rb',
                             content: "puts 'hello ruby'"

The whole library reflects the same api navigation. Therefore, if you need to list releases for a repository do:

github.repos.releases.list 'piotrmurach', 'finite_machine'

or to list a user's followers:

github.users.followers.list 'piotrmurach'

The code base has been extensively documented with examples of how to use each method. Please refer to the documentation under the Github::Client class name.

Alternatively, you can find out which methods are supported by an api by calling actions on a class or instance. For example, in order to find out available endpoints for Github::Client::Repos::Contents api call actions method:

Github::Client::Repos::Contents.actions
=> [:archive, :create, :delete, :find, :get, :readme, :update]

1.2 Modularity

The code base is modular. This means that you can work specifically with a given part of GitHub API. If you want to only work with activity starring API do the following:

starring = Github::Client::Activity::Starring.new oauth_token: token
starring.star 'piotrmurach', 'github'

Please refer to the documentation and look under Github::Client to see all available classes.

1.3 Arguments

The github_api library allows for flexible argument parsing.

Arguments can be passed directly inside the method called. The required arguments are passed in first, followed by optional parameters supplied as hash options:

issues = Github::Client::Issues.new
issues.milestones.list 'piotrmurach', 'github', state: 'open'

In the previous example, the order of arguments is important. However, each method also allows you to specify required arguments using hash symbols and thus remove the need for ordering. Therefore, the same example could be rewritten like so:

issues = Github::Client::Issues.new
issues.milestones.list user: 'piotrmurach', repo: 'github', state: 'open'

Furthermore, required arguments can be passed during instance creation:

issues = Github::Client::Issues.new user: 'piotrmurach', repo: 'github'
issues.milestones.list state: 'open'

Similarly, the required arguments for the request can be passed inside the current scope such as:

issues = Github::Client::Issues.new
issues.milestones(user: 'piotrmurach', repo: 'github').list state: 'open'

But why limit ourselves? You can mix and match arguments, for example:

issues = Github::Client::Issues.new user: 'piotrmurach'
issues.milestones(repo: 'github').list
issues.milestones(repo: 'tty').list

You can also use a bit of syntactic sugar whereby "username/repository" can be passed as well:

issues = Github::Client::Issues.new
issues.milestones('piotrmurach/github').list
issues.milestones.list 'piotrmurach/github'

Finally, use the with scope to clearly denote your requests

issues = Github::Client::Issues.new
issues.milestones.with(user: 'piotrmurach', repo: 'github').list

Please consult the method documentation or GitHub specification to see which arguments are required and what are the option parameters.

1.4 Response Querying

The response is of type Github::ResponseWrapper and allows traversing all the json response attributes like method calls. In addition, if the response returns more than one resource, these will be automatically yielded to the provided block one by one.

For example, when request is issued to list all the branches on a given repository, each branch will be yielded one by one:

repos = Github::Client::Repos.new
repos.branches user: 'piotrmurach', repo: 'github' do |branch|
  puts branch.name
end

1.4.1 Response Body

The ResponseWrapper allows you to call json attributes directly as method calls. there is no magic here, all calls are delegated to the response body. Therefore, you can directly inspect request body by calling body method on the ResponseWrapper like so:

response = repos.branches user: 'piotrmurach', repo: 'github'
response.body  # => Array of branches

1.4.2 Response Headers

Each response comes packaged with methods allowing for inspection of HTTP start line and headers. For example, to check for rate limits and status codes do:

response = Github::Client::Repos.branches 'piotrmurach', 'github'
response.headers.ratelimit_limit     # "5000"
response.headers.ratelimit_remaining # "4999"
response.headers.status              # "200"
response.headers.content_type        # "application/json; charset=utf-8"
response.headers.etag                # "\"2c5dfc54b3fe498779ef3a9ada9a0af9\""
response.headers.cache_control       # "public, max-age=60, s-maxage=60"

1.4.3 Response Success

If you want to verify if the response was success, namely, that the 200 code was returned call the success? like so:

response = Github::Client::Repos.branches 'piotrmurach', 'github'
response.success?  # => true

1.5 Request Headers

It is possible to specify additional header information which will be added to the final request.

For example, to set etag and X-Poll_Interval headers, use the :headers hash key inside the :options hash like in the following:

events = Github::Client::Activity::Events.new
events.public headers: {
    'X-Poll-Interval': 60,
    'ETag': "a18c3bded88eb5dbb5c849a489412bf3"
  }

1.5.1 Media Types

In order to set custom media types for a request use the accept header. By using the :accept key you can determine media type like in the example:

issues = Github::Client::Issues.new
issues.get 'piotrmurach', 'github', 108, accept: 'application/vnd.github.raw'

2 Configuration

The github_api provides ability to specify global configuration options. These options will be available to all api calls.

2.1 Basic

The configuration options can be set by using the configure helper

Github.configure do |c|
  c.basic_auth = "login:password"
  c.adapter    = :typheous
  c.user       = 'piotrmurach'
  c.repo       = 'finite_machine'
end

Alternatively, you can configure the settings by passing a block to an instance like:

Github.new do |c|
  c.endpoint    = 'https://github.company.com/api/v3'
  c.site        = 'https://github.company.com'
  c.upload_endpoint = 'https://github.company.com/api/uploads'
end

or simply by passing hash of options to an instance like so

github = Github.new basic_auth: 'login:password',
                    adapter: :typheous,
                    user: 'piotrmurach',
                    repo: 'finite_machine'

The following is the full list of available configuration options:

adapter            # Http client used for performing requests. Default :net_http
auto_pagination    # Automatically traverse requests page links. Default false
basic_auth         # Basic authentication in form login:password.
client_id          # Oauth client id.
client_secret      # Oauth client secret.
connection_options # Hash of connection options.
endpoint           # Enterprise API endpoint. Default: 'https://api.github.com'
oauth_token        # Oauth authorization token.
org                # Global organization used in requests if none provided
per_page           # Number of items per page. Max of 100. Default 30.
repo               # Global repository used in requests in none provided
site               # enterprise API web endpoint
ssl                # SSL settings in hash form.
user               # Global user used for requests if none provided
user_agent         # Custom user agent name. Default 'Github API Ruby Gem'

2.2 Advanced

The github_api will use the default middleware stack which is exposed by calling stack on a client instance. However, this stack can be freely modified with methods such as insert, insert_after, delete and swap. For instance, to add your CustomMiddleware do:

Github.configure do |c|
  c.stack.insert_after Github::Response::Helpers, CustomMiddleware
end

Furthermore, you can build your entire custom stack and specify other connection options such as adapter by doing:

Github.new do |c|
  c.adapter :excon

  c.stack do |builder|
    builder.use Github::Response::Helpers
    builder.use Github::Response::Jsonize
  end
end

2.3 SSL

By default requests over SSL are set to OpenSSL::SSL::VERIFY_PEER. However, you can turn off peer verification by

github = Github.new ssl: { verify: false }

If your client fails to find CA certs, you can pass other SSL options to specify exactly how the information is sourced

ssl: {
  client_cert: "/usr/local/www.example.com/client_cert.pem"
  client_key:  "/user/local/www.example.com/client_key.pem"
  ca_file:     "example.com.cert"
  ca_path:     "/etc/ssl/"
}

For instance, download CA root certificates from Mozilla cacert and point ca_file at your certificate bundle location. This will allow the client to verify the github.com ssl certificate as authentic.

2.4 Caching

Caching is supported through the faraday-http-cache gem.

Add the gem to your Gemfile:

gem 'faraday-http-cache'

You can now configure cache parameters as follows

Github.configure do |config|
  config.stack = proc do |builder|
    builder.use Faraday::HttpCache, store: Rails.cache
  end
end

More details on the available options can be found in the gem's own documentation: https://github.com/plataformatec/faraday-http-cache#faraday-http-cache

3 Authentication

3.1 Basic

To start making requests as authenticated user you can use your GitHub username and password like so

Github.new basic_auth: 'login:password'

Though this method is convenient you should strongly consider using OAuth for improved security reasons.

3.2 Authorizations API

3.2.1 For a User

To create an access token through the GitHub Authorizations API, you are required to pass your basic credentials and scopes you wish to have for the authentication token.

github = Github.new basic_auth: 'login:password'
github.auth.create scopes: ['repo'], note: 'admin script'

You can add more than one scope from the user, public_repo, repo, gist or leave the scopes parameter out, in which case, the default read-only access will be assumed (includes public user profile info, public repo info, and gists).

3.2.2 For an App

Furthermore, to create auth token for an application you need to pass :app argument together with :client_id and :client_secret parameters.

github = Github.new basic_auth: 'login:password'
github.auth.app.create 'client-id', scopes: ['repo']

In order to revoke auth token(s) for an application you must use basic authentication with client_id as login and client_secret as password.

github = Github.new basic_auth: "client_id:client_secret"
github.auth.app.delete 'client-id'

Revoke a specific app token.

github.auth.app.delete 'client-id', 'access-token'

3.3 Scopes

You can check OAuth scopes you have by:

github = Github.new oauth_token: 'token'
github.scopes.list    # => ['repo']

or inidividually for a given user:

github = Github.new
github.scopes.list 'token'

To list the scopes that the particular GitHub API action checks for do:

repos = Github::Client::Repos.
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap