open-build-service-api 0.1.0 → 0.2.0

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: 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