open-build-service-api 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 02f4ce3a2f1f328cead66065db1d5b5ff6b12c54a964d29134905bdabbcc5223
4
- data.tar.gz: 857c13405e1b116ac1607a2bf3ce3316db46d47d83fc7910b0f6402a85958409
3
+ metadata.gz: 3c5e147324f417fe00b366de7fbf147ba8226703afa23629694849d3432d1aea
4
+ data.tar.gz: 96295d4f01c7f1988e1c491977d96f45a749abab67cb8559238cb3ef63afae1b
5
5
  SHA512:
6
- metadata.gz: 9013c7b9d55d8bf2ddf3752570d6bc0c2a944728f9a675ac062bfd79ad6cb9142e3dd3d88b74c50592c0c06e306757b120a60889ac7b83794e61c279b2f27d57
7
- data.tar.gz: 24f6529b60d5a2bffefd2f705384d4c685d07b5a8b75cde9f0ea83832856e431f84b1cec4960b2083e44c14303d0febbc21170f8f65e65e155e53c9b160109d7
6
+ metadata.gz: ef3d73d904f39553846c60741c94aa52e3910140ba17ed352d686482e843aee016229aa20817bcb5f8155a889378e3783cd1e06787946c9d67a9e0339a288090
7
+ data.tar.gz: 57d6e4b7f432b578a8deb7988ddacddd3a718da08390074fa773e6264cacb071adc1163f8481236c460212116c5605fd98c2ae9b4bd813d05994b071cd2d0ae8
@@ -1,3 +1,16 @@
1
+ ## Version: 0.2.0 (alpha)
2
+
3
+ - Added `#public_key` method to `Project` model to retrieve a project's public key
4
+ - Added `#delete!` method to `Package` model to allow deletion of packages
5
+ - Added 'Collections' system to act on a dataset like an Array and use API methods as well
6
+ - Added `#rebuild!` method to `Package` model to allow rebuilding of packages
7
+ - Added `#meta` method to `Project` model to obtain a project's meta config file
8
+ - Added `#meta` method to `Package` model to obtain the meta definition of a package
9
+ - Added `#reload!` method to `Package` model to reload the cached data of a package
10
+ - Added `#title` method to `Package` model to obtain the title of a package
11
+ - Added `#description` method to `Package` model to obtain the description of a package
12
+ - Improve output of `#inspect` for `Package` model instances
13
+
1
14
  ## Version: 0.1.0 (alpha)
2
15
 
3
16
  - Exception `RemoteAPIError` does now store the `error_code` and `error_summary` if it is available
@@ -0,0 +1,27 @@
1
+ module OpenBuildServiceAPI
2
+ class AbstractCollection
3
+ include Enumerable
4
+ extend Forwardable
5
+
6
+ def_delegators :@data, :each, :count
7
+
8
+ def inspect
9
+ count = 1
10
+ output = '['
11
+
12
+ @data.each do |item|
13
+ if count == 30
14
+ output += item.to_s
15
+ output += ", ..." if @data.count > 30
16
+
17
+ break
18
+ else
19
+ output += "#{item}, "
20
+ count += 1
21
+ end
22
+ end
23
+
24
+ output += ']'
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,32 @@
1
+ module OpenBuildServiceAPI
2
+ class PackagesCollection < AbstractCollection
3
+ def initialize(params = {})
4
+ raise ArgumentError.new('The dataset needs to be provided as an Array.') if params[:data] && !params[:data].is_a?(Array)
5
+
6
+ @connection = params[:connection]
7
+ @project = params[:project]
8
+ @data = params[:data] ? params[:data] : []
9
+ end
10
+
11
+ def exists?(name)
12
+ !!find(name)
13
+ end
14
+
15
+ def find(name)
16
+ begin
17
+ package_data = Nokogiri::XML(@connection.send_request(:get, "/source/#{CGI.escape(@project.name)}/#{name}").body)
18
+ Package.new(name: package_data.root.attr('name'), connection: @connection, project: @project)
19
+ rescue RequestError => err
20
+ return if err.error_code == 'unknown_package'
21
+ raise
22
+ end
23
+ end
24
+
25
+ def find!(name)
26
+ package = find(name)
27
+
28
+ raise PackageNotFoundError.new("Package '#{name}' does not exist in project '#{@project.name}'.") unless package
29
+ package
30
+ end
31
+ end
32
+ end
@@ -47,6 +47,7 @@ module OpenBuildServiceAPI
47
47
  request_method.basic_auth(@username, @password)
48
48
  request_method.body = request_body if request_body
49
49
 
50
+ puts "[DEBUG] #{uri.to_s}" if ENV['OBS_API_LIBRARY_DEBUG']
50
51
  response = request.request(request_method)
51
52
 
52
53
  raise InternalServerError.new(response) if response.is_a?(Net::HTTPInternalServerError)
@@ -82,11 +83,13 @@ module OpenBuildServiceAPI
82
83
 
83
84
  if values[index].is_a?(Array)
84
85
  values[index].each do |array_value|
85
- formatted_params += '&' if formatted_params[-1] != '&' && formatted_params.length > 0
86
- formatted_params += "#{CGI.escape(param.to_s)}[]=#{CGI.escape(array_value.to_s)}"
86
+ if array_value
87
+ formatted_params += '&' if formatted_params[-1] != '&' && formatted_params.length > 0
88
+ formatted_params += "#{CGI.escape(param.to_s)}[]=#{CGI.escape(array_value.to_s)}"
89
+ end
87
90
  end
88
91
  else
89
- formatted_params += "#{CGI.escape(param.to_s)}=#{CGI.escape(values[index].to_s)}"
92
+ formatted_params += "#{CGI.escape(param.to_s)}=#{CGI.escape(values[index].to_s)}" if values[index]
90
93
  end
91
94
  end
92
95
 
@@ -36,8 +36,10 @@ module OpenBuildServiceAPI
36
36
  class ProjectCreationFailedError < APIError; end
37
37
  class ProjectDeletionPermissionError < APIError; end
38
38
  class ProjectAlreadyExistsError < APIError; end
39
- class PackageAlreadyExistsError < APIError; end
40
39
  class TargetProjectPermissionError < APIError; end
40
+ class PackageDeletionPermissionError < APIError; end
41
+ class PackageAlreadyExistsError < APIError; end
42
+ class PackageNotFoundError < APIError; end
41
43
 
42
44
  # library specific exceptions
43
45
  class GeneralError < Exception; end
@@ -12,5 +12,53 @@ module OpenBuildServiceAPI
12
12
  def to_s
13
13
  @name
14
14
  end
15
+
16
+ def title
17
+ title = meta.xpath('//package/title')
18
+ title.empty? ? nil : title[0].text
19
+ end
20
+
21
+ def description
22
+ description = meta.xpath('//package/description')
23
+ description.empty? ? nil : description[0].text
24
+ end
25
+
26
+ def meta(opts = {})
27
+ if !@cached_meta || @meta_reload
28
+ @cached_meta = @connection.send_request(:get, "/source/#{CGI.escape(@project.name)}/#{CGI.escape(@name)}/_meta").body
29
+ @meta_reload = false
30
+ end
31
+
32
+ if opts[:no_parse]
33
+ @cached_meta
34
+ else
35
+ Nokogiri::XML(@cached_meta)
36
+ end
37
+ end
38
+
39
+ def inspect
40
+ "#<#{self.class.name}:#{"0x00%x" % (object_id << 1)} @name=\"#{@name}\", @project=\"#{@project.name}\">"
41
+ end
42
+
43
+ def rebuild!(repository=nil, arch=nil)
44
+ @connection.send_request(:post, "/build/#{CGI.escape(@project.name)}", cmd: :rebuild, package: @name, repository: repository, arch: arch)
45
+ true
46
+ end
47
+
48
+ def delete!(message=nil)
49
+ begin
50
+ @connection.send_request(:delete, "/source/#{CGI.escape(@project.name)}/#{CGI.escape(@name)}", comment: message)
51
+ rescue RequestError => err
52
+ raise PackageDeletionPermissionError.new("No permission to delete package '#{@name}' in project " \
53
+ "'#{@project.name}'.") if err.error_code == 'delete_package_no_permission'
54
+ raise
55
+ end
56
+
57
+ true
58
+ end
59
+
60
+ def reload!
61
+ @meta_reload = true
62
+ end
15
63
  end
16
64
  end
@@ -12,6 +12,19 @@ module OpenBuildServiceAPI
12
12
  @name
13
13
  end
14
14
 
15
+ def meta(opts = {})
16
+ if !@cached_meta || @meta_reload
17
+ @cached_meta = @connection.send_request(:get, "/source/#{CGI.escape(@name)}/_meta").body
18
+ @meta_reload = false
19
+ end
20
+
21
+ if opts[:no_parse]
22
+ @cached_meta
23
+ else
24
+ Nokogiri::XML(@cached_meta)
25
+ end
26
+ end
27
+
15
28
  def delete!(message=nil)
16
29
  begin
17
30
  @connection.send_request(:delete, "/source/#{CGI.escape(@name)}", comment: message)
@@ -26,14 +39,15 @@ module OpenBuildServiceAPI
26
39
  def packages
27
40
  return @cached_packages if @cached_packages && !@package_reload
28
41
  @package_reload = false
29
- @cached_packages = []
42
+
43
+ collection_data = []
30
44
 
31
45
  packages = Nokogiri::XML(@connection.send_request(:get, "/source/#{CGI.escape(@name)}").body)
32
46
  packages.xpath('//entry').each do |package|
33
- @cached_packages << Package.new(name: package.attr('name'), connection: @connection, project: self)
47
+ collection_data << Package.new(name: package.attr('name'), connection: @connection, project: self)
34
48
  end
35
49
 
36
- @cached_packages
50
+ @cached_packages = PackagesCollection.new(connection: @connection, project: self, data: collection_data)
37
51
  end
38
52
 
39
53
  def branch_package(source_project, source_package, package_name_after_branch=nil)
@@ -55,8 +69,18 @@ module OpenBuildServiceAPI
55
69
  end
56
70
  end
57
71
 
72
+ def public_key
73
+ @cached_public_key if @cached_public_key && !@public_key_reload
74
+ @public_key_reload = false
75
+
76
+ response = @connection.send_request(:get, "/source/#{CGI.escape(@name)}/_pubkey")
77
+ response.body
78
+ end
79
+
58
80
  def reload!
59
81
  @package_reload = true
82
+ @public_key_reload = true
83
+ @meta_reload = true
60
84
  end
61
85
  end
62
86
  end
@@ -1,5 +1,6 @@
1
1
  require 'cgi'
2
2
  require 'date'
3
+ require 'forwardable'
3
4
  require 'net/http'
4
5
  require 'nokogiri'
5
6
  require_relative 'version'
@@ -10,6 +11,10 @@ require_relative 'connection'
10
11
  require_relative 'api/about'
11
12
  require_relative 'api/projects'
12
13
 
14
+ # Collections
15
+ require_relative 'collections/abstract_collection'
16
+ require_relative 'collections/packages_collection'
17
+
13
18
  # Models
14
19
  require_relative 'models/package'
15
20
  require_relative 'models/project'
@@ -1,4 +1,4 @@
1
1
  module OpenBuildServiceAPI
2
- VERSION = '0.1.0'
3
- RELEASE_DATE = '2019-06-15'
2
+ VERSION = '0.2.0'
3
+ RELEASE_DATE = '2019-06-24'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: open-build-service-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
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-15 00:00:00.000000000 Z
11
+ date: 2019-06-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: date
@@ -30,6 +30,26 @@ dependencies:
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: 2.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: forwardable
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.2'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.2.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '1.2'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.2.0
33
53
  - !ruby/object:Gem::Dependency
34
54
  name: nokogiri
35
55
  requirement: !ruby/object:Gem::Requirement
@@ -70,6 +90,26 @@ dependencies:
70
90
  - - ">="
71
91
  - !ruby/object:Gem::Version
72
92
  version: 11.0.1
93
+ - !ruby/object:Gem::Dependency
94
+ name: rspec
95
+ requirement: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '3.8'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 3.8.0
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '3.8'
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 3.8.0
73
113
  description: The Open Build Service API wrapped into a Ruby gem.
74
114
  email: webmaster@mschnitzer.de
75
115
  executables: []
@@ -80,6 +120,8 @@ files:
80
120
  - README.md
81
121
  - lib/api/about.rb
82
122
  - lib/api/projects.rb
123
+ - lib/collections/abstract_collection.rb
124
+ - lib/collections/packages_collection.rb
83
125
  - lib/connection.rb
84
126
  - lib/exception.rb
85
127
  - lib/models/package.rb