open-build-service-api 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ae3c8988ffb5be05ac23a83b479fe10eb4b3091b4265d205a9d8479d3f5b73b
4
- data.tar.gz: 48212cc3850ca449b7fcd16893d44bcefb9a0e7cdb887843d319f7d1c6c4c6a7
3
+ metadata.gz: 9bf527982bd90cbc256ebf065939281cf3f6448c3c77ae6de5bccf60e576a01b
4
+ data.tar.gz: 9de0695570ac504b8b7172cc251dcec5a1712495002c643743d286e1a35e0900
5
5
  SHA512:
6
- metadata.gz: b372876289fac3af5c3a41d2b06c17b386a33866eb8e47113eb1e1cdd936008a42836e380839ddb0109d82ca2e21e757c7c71ba2b080fe339adbac9a738d8c42
7
- data.tar.gz: e22e29039001a171acfda7cf87894837fa70a61b235a4986ed690a04068f688ebb7bab83a8a1069ccbe77d352817e5765371f22b5a14ed165c3751cc4a560b4d
6
+ metadata.gz: 23f3d09d60d92aa116caa2ad2296ed5ef9b6d525aff16e81e64a9c9905cb9f77eb1e91e359b6ac342ac7b1f45192b6abf84b4a7d0da66957f42ec5b30de46a5c
7
+ data.tar.gz: b9fe7c2dbec2cb50272097637f08236b505662dfc713b6158e0ddd794490716c9b40fa2cbf56bd9777bc077f6b9715c3be013b2ced4c5c9220d7032234508e18
@@ -0,0 +1,10 @@
1
+ ## Version: 0.0.2 (alpha)
2
+
3
+ - Adds `Connection` module to establish a connection with a Build Service instance
4
+ - Adds `About` module to query information about the current Build Service instance
5
+ - Adds `Projects` module to allow searching and listing projects
6
+ - Requires a new dependency: `date` >= 2.0.0
7
+
8
+ ## Version: 0.0.1 (alpha)
9
+
10
+ - Dummy release to register gem name on https://rubygems.org
data/README.md CHANGED
@@ -1,2 +1,29 @@
1
- # open-build-service-api
2
- The Open Build Service API wrapped into a Ruby gem.
1
+ # Open Build Service API - Library for Ruby
2
+
3
+ This library is a wrapper for the [Open Build Service API](https://github.com/openSUSE/open-build-service).
4
+
5
+ ## How to Install
6
+
7
+ It is as simple as it can be:
8
+ ```
9
+ gem install open-build-service-api
10
+ ```
11
+
12
+ ## How to Use
13
+
14
+ Please use the following links for references:
15
+
16
+ - [Wiki](https://github.com/mschnitzer/open-build-service-api/wiki)
17
+ - [Examples](https://github.com/mschnitzer/open-build-service-api/tree/master/examples)
18
+
19
+ ## Contribution
20
+
21
+ Contribution to this library is highly appreciated. You can work on [issues](https://github.com/mschnitzer/open-build-service-api/issues) at any time and open a pull request. Just clone this repository, do your changes, and open a new pull request.
22
+
23
+ If you need help, please open a [new issue](https://github.com/mschnitzer/open-build-service-api/issues/new).
24
+
25
+ ## Reporting Bugs
26
+
27
+ Please report bugs via [GitHub's issue tracker](https://github.com/mschnitzer/open-build-service-api/issues).
28
+
29
+ Security relevant issues should be reported via email: mschnitzer@suse.com
@@ -0,0 +1,30 @@
1
+ module OpenBuildServiceAPI
2
+ module API
3
+ class About
4
+ attr_reader :title, :description, :revision, :last_deployment, :commit
5
+
6
+ def initialize(connection)
7
+ @connection = connection
8
+ reload!
9
+ end
10
+
11
+ def reload!
12
+ response = @connection.send_request(:get, '/about')
13
+ data = Nokogiri::XML(response.body)
14
+
15
+ @title = data.xpath('//about/title').text
16
+ @description = data.xpath('//about/description').text
17
+ @revision = data.xpath('//about/revision').text
18
+ @commit = data.xpath('//about/commit').text
19
+
20
+ begin
21
+ @last_deployment = DateTime.parse(data.xpath('//about/last_deployment').text)
22
+ rescue ArgumentError
23
+ @last_deployment = nil
24
+ end
25
+
26
+ true
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ module OpenBuildServiceAPI
2
+ module API
3
+ class Projects
4
+ def initialize(connection)
5
+ @connection = connection
6
+ end
7
+
8
+ def list
9
+ projects = Nokogiri::XML(@connection.send_request(:get, '/source').body)
10
+ projects.xpath('//entry').map {|project| Project.new(projects: self, name: project.attr('name')) }
11
+ end
12
+
13
+ def find(name)
14
+ begin
15
+ project_data = Nokogiri::XML(@connection.send_request(:get, "/source/#{CGI.escape(name)}").body)
16
+ packages = project_data.xpath('//entry').map { |package| package.attr('name') }
17
+
18
+ Project.new(projects: self, name: name, packages: packages)
19
+ rescue NotFoundError
20
+ end
21
+ end
22
+
23
+ def find!(name)
24
+ project = find(name)
25
+
26
+ raise ProjectNotFoundError.new("Project '#{name}' does not exist.") unless project
27
+ project
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,86 @@
1
+ module OpenBuildServiceAPI
2
+ class Connection
3
+ attr_reader :api_endpoint
4
+
5
+ def initialize(username, password, opts = {})
6
+ @username = username
7
+ @password = password
8
+ @api_endpoint = opts[:api_endpoint] ? opts[:api_endpoint] : 'https://api.opensuse.org'
9
+ @request_timeout = opts[:request_timeout] ? opts[:request_timeout].to_i : 10
10
+ @ca_file = opts[:ca_file]
11
+
12
+ # send a simple request to test authentication - it raises an exception if the credentials are wrong
13
+ send_request(:get, '/')
14
+ end
15
+
16
+ def send_request(method, path, params = {})
17
+ request_body = params[:request_body] if params[:request_body]
18
+ params.delete(:request_body)
19
+
20
+ path = "/#{path}" unless path.start_with?('/')
21
+
22
+ request_params = "?#{format_params(params)}" unless format_params(params).empty?
23
+ uri = URI("#{@api_endpoint}#{path}#{request_params}")
24
+
25
+ begin
26
+ request = Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https'), open_timeout: @request_timeout, ca_file: @ca_file)
27
+
28
+ if method.to_s.downcase == 'post'
29
+ request_method = Net::HTTP::Post.new(uri)
30
+ elsif method.to_s.downcase == 'put'
31
+ request_method = Net::HTTP::Put.new(uri)
32
+ elsif method.to_s.downcase == 'get'
33
+ request_method = Net::HTTP::Get.new(uri)
34
+ end
35
+
36
+ request_method['Accept'] = 'application/xml'
37
+ request_method['User-Agent'] = "open-build-service-api (Ruby Gem Version: #{OpenBuildServiceAPI::VERSION})"
38
+
39
+ request_method.basic_auth(@username, @password)
40
+ request_method.body = request_body if request_body
41
+
42
+ response = request.request(request_method)
43
+
44
+ raise InternalServerError.new(response) if response.is_a?(Net::HTTPInternalServerError)
45
+ raise NotFoundError.new(response) if response.is_a?(Net::HTTPNotFound)
46
+ raise AuthenticationError.new(response, "Authentication failed. Please check your credentials.") if response.is_a?(Net::HTTPUnauthorized)
47
+
48
+ return response
49
+ rescue Errno::ECONNREFUSED, SocketError, Net::OpenTimeout => err
50
+ raise ConnectionError.new(err.to_s)
51
+ end
52
+ end
53
+
54
+ def about
55
+ return @ref_about if @ref_about
56
+ @ref_about = API::About.new(self)
57
+ end
58
+
59
+ def projects
60
+ return @ref_projects if @ref_projects
61
+ @ref_projects = API::Projects.new(self)
62
+ end
63
+
64
+ private
65
+
66
+ def format_params(params)
67
+ values = params.values
68
+ formatted_params = ""
69
+
70
+ params.keys.each_with_index do |param, index|
71
+ formatted_params += "&" if index != 0
72
+
73
+ if values[index].is_a?(Array)
74
+ values[index].each do |array_value|
75
+ formatted_params += '&' if formatted_params[-1] != '&' && formatted_params.length > 0
76
+ formatted_params += "#{CGI.escape(param.to_s)}[]=#{CGI.escape(array_value.to_s)}"
77
+ end
78
+ else
79
+ formatted_params += "#{CGI.escape(param.to_s)}=#{CGI.escape(values[index].to_s)}"
80
+ end
81
+ end
82
+
83
+ formatted_params
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,28 @@
1
+ module OpenBuildServiceAPI
2
+ # remote API network errors
3
+ class RemoteAPIError < Exception
4
+ attr_accessor :response, :message
5
+
6
+ def initialize(response, message=nil)
7
+ @response = response
8
+ @message = message ? message : response.body
9
+ end
10
+
11
+ def to_s
12
+ @message
13
+ end
14
+ end
15
+
16
+ class InternalServerError < RemoteAPIError; end
17
+ class AuthenticationError < RemoteAPIError; end
18
+ class NotFoundError < RemoteAPIError; end
19
+
20
+ # remote API errors
21
+ class APIError < Exception; end
22
+ class ProjectNotFoundError < APIError; end
23
+
24
+ # library specific exceptions
25
+ class GeneralError < Exception; end
26
+ class ConnectionError < GeneralError; end
27
+ class InvalidHTTPMethodWithBody < GeneralError; end
28
+ end
@@ -0,0 +1,15 @@
1
+ module OpenBuildServiceAPI
2
+ class Project
3
+ attr_accessor :name, :projects, :packages
4
+
5
+ def initialize(params = {})
6
+ @name = params[:name]
7
+ @projects = params[:projects]
8
+ @packages = params[:packages]
9
+ end
10
+
11
+ def to_s
12
+ @name
13
+ end
14
+ end
15
+ end
@@ -1,2 +1,14 @@
1
+ require 'cgi'
2
+ require 'date'
3
+ require 'net/http'
1
4
  require 'nokogiri'
2
5
  require_relative 'version'
6
+ require_relative 'exception'
7
+ require_relative 'connection'
8
+
9
+ # OBS API
10
+ require_relative 'api/about'
11
+ require_relative 'api/projects'
12
+
13
+ # Models
14
+ require_relative 'models/project'
@@ -1,3 +1,3 @@
1
1
  module OpenBuildServiceAPI
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open-build-service-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manuel Schnitzer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-03 00:00:00.000000000 Z
11
+ date: 2019-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: date
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.0
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: nokogiri
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -36,7 +56,13 @@ executables: []
36
56
  extensions: []
37
57
  extra_rdoc_files: []
38
58
  files:
59
+ - CHANGELOG.md
39
60
  - README.md
61
+ - lib/api/about.rb
62
+ - lib/api/projects.rb
63
+ - lib/connection.rb
64
+ - lib/exception.rb
65
+ - lib/models/project.rb
40
66
  - lib/open-build-service-api.rb
41
67
  - lib/version.rb
42
68
  homepage: https://github.com/mschnitzer/open-build-service-api