init repository
This commit is contained in:
commit
baf4860e46
|
@ -0,0 +1,7 @@
|
||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem 'rest-client'
|
||||||
|
|
||||||
|
group :test do
|
||||||
|
gem 'rake'
|
||||||
|
end
|
|
@ -0,0 +1,31 @@
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
domain_name (0.5.20190701)
|
||||||
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
|
http-accept (1.7.0)
|
||||||
|
http-cookie (1.0.4)
|
||||||
|
domain_name (~> 0.5)
|
||||||
|
mime-types (3.4.1)
|
||||||
|
mime-types-data (~> 3.2015)
|
||||||
|
mime-types-data (3.2022.0105)
|
||||||
|
netrc (0.11.0)
|
||||||
|
rake (13.0.6)
|
||||||
|
rest-client (2.1.0)
|
||||||
|
http-accept (>= 1.7.0, < 2.0)
|
||||||
|
http-cookie (>= 1.0.2, < 2.0)
|
||||||
|
mime-types (>= 1.16, < 4.0)
|
||||||
|
netrc (~> 0.8)
|
||||||
|
unf (0.1.4)
|
||||||
|
unf_ext
|
||||||
|
unf_ext (0.0.8.1)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
x86_64-darwin-20
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
rake
|
||||||
|
rest-client
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.2.19
|
|
@ -0,0 +1,41 @@
|
||||||
|
<!--
|
||||||
|
* @Description: Do not edit
|
||||||
|
* @Date: 2022-04-15 15:42:52
|
||||||
|
* @LastEditors: viletyy
|
||||||
|
* @Author: viletyy
|
||||||
|
* @LastEditTime: 2022-04-15 15:49:49
|
||||||
|
* @FilePath: /gitea-client/README.md
|
||||||
|
-->
|
||||||
|
# GiteaClient
|
||||||
|
|
||||||
|
[![GiteaClient](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/viletyy/gitea-client)
|
||||||
|
|
||||||
|
Gitea Api 库
|
||||||
|
|
||||||
|
## 内容列表
|
||||||
|
|
||||||
|
- [GiteaClient](#giteaclient)
|
||||||
|
- [内容列表](#内容列表)
|
||||||
|
- [使用说明](#使用说明)
|
||||||
|
- [如何贡献](#如何贡献)
|
||||||
|
- [使用许可](#使用许可)
|
||||||
|
|
||||||
|
## 使用说明
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require 'gitea-client'
|
||||||
|
|
||||||
|
client = Gitea::Api::Client.new({domain: YOUR_GITEA_SERVER_DOMAIN, base_url: YOUR_GITEA_API_BASE_URL, token: YOUR_TOKRN, username: YOUR_USERNAME, password: YOUR_PASSWORD})
|
||||||
|
|
||||||
|
client.get_users_search({query: {q: 'viletyy'}})
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## 如何贡献
|
||||||
|
|
||||||
|
非常欢迎你的加入![提一个 Issue](https://github.com/viletyy/gitea-client/issues/new) 或者提交一个 Pull Request。
|
||||||
|
|
||||||
|
|
||||||
|
## 使用许可
|
||||||
|
|
||||||
|
[MIT]() © ViletYy
|
|
@ -0,0 +1,8 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require 'rest-client'
|
||||||
|
require './lib/gitea/api'
|
||||||
|
require './lib/gitea/version'
|
||||||
|
|
||||||
|
require "irb"
|
||||||
|
IRB.start
|
|
@ -0,0 +1,6 @@
|
||||||
|
require_relative 'common'
|
||||||
|
require_relative 'api/user'
|
||||||
|
require_relative 'api/client'
|
||||||
|
require_relative 'api/config'
|
||||||
|
require_relative 'api/exception'
|
||||||
|
require_relative 'api/http'
|
|
@ -0,0 +1,23 @@
|
||||||
|
module Gitea
|
||||||
|
module Api
|
||||||
|
class Client
|
||||||
|
|
||||||
|
# 构造Api client,用于操作Api数据
|
||||||
|
# @param opts [Hash] 构造client时的参数选项
|
||||||
|
# @option opts [string] domain [必填] gitea服务地址
|
||||||
|
# @option opts [string] base_url [必填] api相对路径
|
||||||
|
# @option opts [string] admin_username [必填] 管理员账号
|
||||||
|
# @option opts [string] admin_password [必填] 管理员密码
|
||||||
|
# @option opts [string] username [选填] 用户账号
|
||||||
|
# @option opts [string] password [选填] 用户密码
|
||||||
|
# @option opts [string] gitea_token [选填] 用户token
|
||||||
|
def initialize(opts)
|
||||||
|
@config = Config.new(opts)
|
||||||
|
@http = Http.new(@config)
|
||||||
|
end
|
||||||
|
|
||||||
|
include Gitea::Api::User
|
||||||
|
|
||||||
|
end
|
||||||
|
end # User
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,34 @@
|
||||||
|
module Gitea
|
||||||
|
module Api
|
||||||
|
|
||||||
|
class Config < Common::Struct::Base
|
||||||
|
attrs :domain, :base_url, :username, :password, :token, :open_timeout, :read_timeout
|
||||||
|
|
||||||
|
def initialize(opts = {})
|
||||||
|
super(opts)
|
||||||
|
|
||||||
|
valid!
|
||||||
|
normalize_domain
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def valid!
|
||||||
|
if @domain.nil? || @base_url.nil?
|
||||||
|
fail Exception, "@domain, @base_url not permit blank."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def normalize_domain
|
||||||
|
uri = URI.parse(domain)
|
||||||
|
uri = URI.parse(domain)
|
||||||
|
uri = URI.parse("http://#{domain}") unless uri.scheme
|
||||||
|
|
||||||
|
if uri.scheme != 'http' and uri.scheme != 'https'
|
||||||
|
fail ClientError, "Only HTTP and HTTPS domain are accepted."
|
||||||
|
end
|
||||||
|
|
||||||
|
@domain = uri
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end # Common
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,25 @@
|
||||||
|
module Gitea
|
||||||
|
module Api
|
||||||
|
class ServerError < Common::Exception
|
||||||
|
attr_reader :http_code, :error_code, :message
|
||||||
|
|
||||||
|
def initialize(response)
|
||||||
|
@http_code = response.code
|
||||||
|
|
||||||
|
puts response
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
@attrs.merge({'HTTPCode' => @http_code}).map do |k, v|
|
||||||
|
[k, v].join(": ")
|
||||||
|
end.join(", ")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class CallBackError < ServerError
|
||||||
|
end # CallBackError
|
||||||
|
|
||||||
|
class ClientError < Common::Exception
|
||||||
|
end # ClientError
|
||||||
|
end # Api
|
||||||
|
end # Git
|
|
@ -0,0 +1,112 @@
|
||||||
|
require 'base64'
|
||||||
|
|
||||||
|
module Gitea
|
||||||
|
module Api
|
||||||
|
class Http
|
||||||
|
DEFAULT_CONTENT_TYPE = 'application/json'
|
||||||
|
TOKEN_HEADER = 'Authorization'
|
||||||
|
OPEN_TIMEOUT = 10
|
||||||
|
READ_TIMEOUT = 120
|
||||||
|
|
||||||
|
include Common::Logging
|
||||||
|
|
||||||
|
def initialize(config)
|
||||||
|
@config = config
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_request_url(api_url)
|
||||||
|
url = @config.domain.dup
|
||||||
|
url.query = nil
|
||||||
|
url.fragment = nil
|
||||||
|
[url.to_s, @config.base_url, api_url].join('')
|
||||||
|
end
|
||||||
|
|
||||||
|
def get(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('GET', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def put(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('PUT', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('POST', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('DELETE', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def head(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('HEAD', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def options(api_url = '', http_options = {}, &block)
|
||||||
|
do_request('OPTIONS', api_url, http_options, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
# Do Http request
|
||||||
|
def do_request(verb, api_url, http_options = {}, &block)
|
||||||
|
|
||||||
|
headers = http_options[:headers] || {}
|
||||||
|
headers['user-agent'] = get_user_agent
|
||||||
|
headers['date'] = Time.now.httpdate
|
||||||
|
headers['content-type'] ||= DEFAULT_CONTENT_TYPE
|
||||||
|
headers[TOKEN_HEADER] = @config.token if @config.token
|
||||||
|
|
||||||
|
if @config.username and @config.password
|
||||||
|
headers[TOKEN_HEADER] = 'Basic ' + Base64::Encoding(@config.username + ":" + @config.password)
|
||||||
|
end
|
||||||
|
|
||||||
|
headers[:params] = http_options[:query] || {}
|
||||||
|
|
||||||
|
logger.debug("Send HTTP request, verb: #{verb}, http_options: #{http_options}")
|
||||||
|
|
||||||
|
request = RestClient::Request.new(
|
||||||
|
:method => verb,
|
||||||
|
:url => get_request_url(api_url),
|
||||||
|
:headers => headers,
|
||||||
|
:payload => http_options[:body],
|
||||||
|
:open_timeout => @config.open_timeout || OPEN_TIMEOUT,
|
||||||
|
:read_timeout => @config.read_timeout || READ_TIMEOUT
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
response = request.execute do |resp, &blk|
|
||||||
|
if resp.code >= 300
|
||||||
|
e = ServerError.new(resp)
|
||||||
|
logger.error(e.to_s)
|
||||||
|
raise e
|
||||||
|
else
|
||||||
|
resp.return!(&blk)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# If streaming read_body is used, we need to create the
|
||||||
|
# RestClient::Response ourselves
|
||||||
|
unless response.is_a?(RestClient::Response)
|
||||||
|
if response.code.to_i >= 300
|
||||||
|
body = response.body
|
||||||
|
if RestClient::version < '2.1.0'
|
||||||
|
body = RestClient::Request.decode(response['content-encoding'], response.body)
|
||||||
|
end
|
||||||
|
response = RestClient::Response.create(body, response, request)
|
||||||
|
e = ServerError.new(response)
|
||||||
|
logger.error(e.to_s)
|
||||||
|
raise e
|
||||||
|
end
|
||||||
|
response = RestClient::Response.create(nil, response, request)
|
||||||
|
response.return!
|
||||||
|
end
|
||||||
|
|
||||||
|
response
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_agent
|
||||||
|
"gitea-client/#{VERSION}"
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end # Common
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,199 @@
|
||||||
|
module Gitea
|
||||||
|
module Api
|
||||||
|
module User
|
||||||
|
|
||||||
|
def get_user(opt={})
|
||||||
|
@http.get("/user", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_applications_oauth2(opt={})
|
||||||
|
@http.get("/user/applications/oauth2", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_applications_oauth2(opt={})
|
||||||
|
@http.post("/user/applications/oauth2", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_applications_oauth2_by_id(id, opt={})
|
||||||
|
@http.get("/user/applications/oauth2/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_applications_oauth2_by_id(id, opt={})
|
||||||
|
@http.delete("/user/applications/oauth2/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def patch_user_applications_oauth2_by_id(id, opt={})
|
||||||
|
@http.patch("/user/applications/oauth2/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_emails(opt={})
|
||||||
|
@http.get("/user/emails", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_emails(opt={})
|
||||||
|
@http.post("/user/emails", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_emails(opt={})
|
||||||
|
@http.delete("/user/emails", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_followers(opt={})
|
||||||
|
@http.get("/user/followers", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_following(opt={})
|
||||||
|
@http.get("/user/following", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_following_by_username(username, opt={})
|
||||||
|
@http.get("/user/following/#{username}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def put_user_following_by_username(username, opt={})
|
||||||
|
@http.put("/user/following/#{username}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_following_by_username(username, opt={})
|
||||||
|
@http.delete("/user/following/#{username}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_gpg_key_token(opt={})
|
||||||
|
@http.get("/user/gpg_key_token", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_gpg_key_verify(opt={})
|
||||||
|
@http.get("/user/gpg_key_verify", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_gpg_keys(opt={})
|
||||||
|
@http.get("/user/gpg_keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_gpg_keys(opt={})
|
||||||
|
@http.post("/user/gpg_keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_gpg_keys_by_id(id, opt={})
|
||||||
|
@http.get("/user/gpg_keys/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_gpg_keys_by_id(id, opt={})
|
||||||
|
@http.delete("/user/gpg_keys/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_keys(opt={})
|
||||||
|
@http.get("/user/keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_keys(opt={})
|
||||||
|
@http.post("/user/keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_keys_by_id(id, opt={})
|
||||||
|
@http.get("/user/keys/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_keys_by_id(id, opt={})
|
||||||
|
@http.delete("/user/keys/#{id}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_repos(opt={})
|
||||||
|
@http.get("/user/repos", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_user_repos(opt={})
|
||||||
|
@http.post("/user/repos", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_settings(opt={})
|
||||||
|
@http.get("/user/settings", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def patch_user_settings(opt={})
|
||||||
|
@http.patch("/user/settings", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_starred(opt={})
|
||||||
|
@http.get("/user/starred", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_starred_by_owner_repo(owner, repo, opt={})
|
||||||
|
@http.get("/user/starred/#{owner}/#{repo}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def put_user_starred_by_owner_repo(owner, repo, opt={})
|
||||||
|
@http.put("/user/starred/#{owner}/#{repo}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_user_starred_by_owner_repo(owner, repo, opt={})
|
||||||
|
@http.delete("/user/starred/#{owner}/#{repo}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_stopwatches(opt={})
|
||||||
|
@http.get("/user/stopwatches", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_subscriptions(opt={})
|
||||||
|
@http.get("/user/subscriptions", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_teams(opt={})
|
||||||
|
@http.get("/user/teams", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_user_times(opt={})
|
||||||
|
@http.get("/user/times", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_search(opt={})
|
||||||
|
@http.get("/users/search", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_following_by_follower_followee(follower, followee, opt={})
|
||||||
|
@http.get("/users/#{follower}/following/#{followee}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_followers_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/followers", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_following_by_username(username, opt={})
|
||||||
|
@http.get("/user/#{username}/following", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_gpg_keys_by_username(username, opt={})
|
||||||
|
@http.get("/user/#{username}/gpg_keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_keys_by_username(username, opt={})
|
||||||
|
@http.get("/user/#{username}/keys", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_repos_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/repos", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_starred_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/starred", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_subscriptions_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/subscriptions", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_users_token_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/tokens", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def post_users_token_by_username(username, opt={})
|
||||||
|
@http.get("/users/#{username}/tokens", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_users_token_by_username_token(username, token, opt={})
|
||||||
|
@http.delete("/users/#{username}/tokens/#{token}", opt)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end # Api
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,3 @@
|
||||||
|
require_relative 'common/exception'
|
||||||
|
require_relative 'common/logging'
|
||||||
|
require_relative 'common/struct'
|
|
@ -0,0 +1,12 @@
|
||||||
|
module Gitea
|
||||||
|
module Common
|
||||||
|
|
||||||
|
class Exception < RuntimeError
|
||||||
|
attr_reader :message
|
||||||
|
|
||||||
|
def initialize(message)
|
||||||
|
@message = message
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end # Common
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,62 @@
|
||||||
|
require 'logger'
|
||||||
|
|
||||||
|
module Gitea
|
||||||
|
module Common
|
||||||
|
|
||||||
|
##
|
||||||
|
# Logging support
|
||||||
|
# @example
|
||||||
|
# include Logging
|
||||||
|
# logger.info(xxx)
|
||||||
|
|
||||||
|
module Logging
|
||||||
|
|
||||||
|
MAX_NUM_LOG = 100
|
||||||
|
ROTATE_SIZE = 10 * 1024 * 1024
|
||||||
|
|
||||||
|
# level = Logger::DEBUG | Logger::INFO | Logger::ERROR | Logger::FATAL
|
||||||
|
def self.set_log_level(level)
|
||||||
|
Logging.logger.level = level
|
||||||
|
end
|
||||||
|
|
||||||
|
# 设置日志输出的文件
|
||||||
|
def self.set_log_file(file)
|
||||||
|
@log_file = file
|
||||||
|
end
|
||||||
|
|
||||||
|
# 获取logger
|
||||||
|
def logger
|
||||||
|
Logging.logger
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def self.logger
|
||||||
|
unless @logger
|
||||||
|
@log_file ||= ENV["GITEA_CLIENT_LOG_PATH"]
|
||||||
|
@logger = Logger.new(
|
||||||
|
@log_file, MAX_NUM_LOG, ROTATE_SIZE)
|
||||||
|
@logger.level = get_env_log_level || Logger::INFO
|
||||||
|
end
|
||||||
|
@logger
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.get_env_log_level
|
||||||
|
return unless ENV["GITEA_CLIENT_LOG_LEVEL"]
|
||||||
|
case ENV["GITEA_CLIENT_LOG_LEVEL"].upcase
|
||||||
|
when "DEBUG"
|
||||||
|
Logger::DEBUG
|
||||||
|
when "WARN"
|
||||||
|
Logger::WARN
|
||||||
|
when "ERROR"
|
||||||
|
Logger::ERROR
|
||||||
|
when "FATAL"
|
||||||
|
Logger::FATAL
|
||||||
|
when "UNKNOWN"
|
||||||
|
Logger::UNKNOWN
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end # Common
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,37 @@
|
||||||
|
module Gitea
|
||||||
|
module Common
|
||||||
|
module Struct
|
||||||
|
class Base
|
||||||
|
module AttrHelper
|
||||||
|
def attrs(*s)
|
||||||
|
define_method(:attrs) {s}
|
||||||
|
attr_reader(*s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
extend AttrHelper
|
||||||
|
|
||||||
|
def initialize(opts = {})
|
||||||
|
extra_keys = opts.keys - attrs
|
||||||
|
unless extra_keys.empty?
|
||||||
|
fail Common::Exception,
|
||||||
|
"Unexpected extra keys: #{extra_keys.join(', ')}"
|
||||||
|
end
|
||||||
|
|
||||||
|
attrs.each do |attr|
|
||||||
|
instance_variable_set("@#{attr}", opts[attr])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
attrs.map do |attr|
|
||||||
|
v = instance_variable_get("@#{attr}")
|
||||||
|
"#{attr.to_s}: #{v}"
|
||||||
|
end.join(", ")
|
||||||
|
end
|
||||||
|
|
||||||
|
end # Base
|
||||||
|
end # Struct
|
||||||
|
|
||||||
|
end # Common
|
||||||
|
end # Gitea
|
|
@ -0,0 +1,5 @@
|
||||||
|
module Gitea
|
||||||
|
|
||||||
|
VERSION = "0.0.1"
|
||||||
|
|
||||||
|
end
|
Loading…
Reference in New Issue