Class: GemHadar::GitHub::ReleaseCreator

Inherits:
Object
  • Object
show all
Defined in:
lib/gem_hadar/github.rb

Overview

A client for creating GitHub releases via the GitHub API.

This class provides functionality to interact with the GitHub Releases API, enabling the creation of new releases for a specified repository. It handles the HTTP request setup, including appropriate headers and authentication, and processes the API response to either return the created release data or raise an error if the creation fails.

Examples:

Creating a release

creator = GemHadar::GitHub::ReleaseCreator.new(
  owner: 'myorg',
  repo: 'myrepo',
  token: 'ghp_mytoken'
)
release_data = creator.perform(
  tag_name: 'v1.0.0',
  target_commitish: 'main',
  body: 'Release notes here',
  name: 'Version 1.0.0'
)

Class Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(owner:, repo:, token:, api_version: '2022-11-28') ⇒ ReleaseCreator

The initialize method sets up the ReleaseCreator instance with required GitHub API configuration.

This method stores the owner, repository, and authentication token needed to interact with the GitHub Releases API. It also accepts an optional API version parameter to specify which version of the GitHub API to use.



51
52
53
54
55
56
# File 'lib/gem_hadar/github.rb', line 51

def initialize(owner:, repo:, token:, api_version: '2022-11-28')
  @owner       = owner
  @repo        = repo
  @token       = token
  @api_version = api_version
end

Class Attribute Details

.github_api_urlObject

Returns the value of attribute github_api_url.



36
37
38
# File 'lib/gem_hadar/github.rb', line 36

def github_api_url
  @github_api_url
end

Instance Method Details

#perform(tag_name:, target_commitish:, body:, name: tag_name, draft: false, prerelease: false) ⇒ JSON::GenericObject

The perform method creates a new GitHub release using the GitHub API.

This method sends a POST request to the GitHub Releases API to create a new release for the specified repository. It constructs the appropriate HTTP headers including authentication and content type, prepares the release data with the provided parameters, and handles the API response by parsing successful responses or raising an error for failed requests.

Raises:

  • (RuntimeError)

    if the GitHub API request fails with a non-success status code



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/gem_hadar/github.rb', line 77

def perform(tag_name:, target_commitish:, body:, name: tag_name, draft: false, prerelease: false)
  uri = URI("#{self.class.github_api_url}/repos/#@owner/#@repo/releases")

  headers = {
    "Accept"               => "application/vnd.github+json",
    "Authorization"        => "Bearer #@token",
    "Content-Type"         => "application/json",
    "X-GitHub-Api-Version" => @api_version,
    "User-Agent"           => [ GemHadar.name, GemHadar::VERSION ] * ?/,
  }

  data = {
    tag_name:,
    target_commitish:,
    body:,
    name:,
    draft:,
    prerelease:,
  }.compact

  response = Net::HTTP.post(uri, JSON(data), headers)
  case response
  when Net::HTTPSuccess
    JSON.parse(response.body, object_class: JSON::GenericObject)
  else
    error_data =
      begin
        JSON.pretty_generate(JSON.parse(response.body))
      rescue
        response.body
      end
    raise "Failed to create release. Status: #{response.code}\n\n#{error_data}"
  end
end