runcible 0.1.4 → 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.
- data/lib/runcible/extensions/consumer.rb +4 -4
- data/lib/runcible/extensions/distribution.rb +28 -4
- data/lib/runcible/extensions/errata.rb +5 -7
- data/lib/runcible/extensions/repository.rb +7 -2
- data/lib/runcible/extensions/rpm.rb +3 -3
- data/lib/runcible/resources/consumer.rb +80 -6
- data/lib/runcible/resources/consumer_group.rb +48 -20
- data/lib/runcible/resources/event_notifier.rb +46 -3
- data/lib/runcible/resources/repository.rb +88 -7
- data/lib/runcible/resources/repository_schedule.rb +35 -3
- data/lib/runcible/resources/role.rb +17 -2
- data/lib/runcible/resources/task.rb +22 -2
- data/lib/runcible/resources/unit.rb +35 -0
- data/lib/runcible/resources/user.rb +25 -4
- data/lib/runcible/version.rb +1 -1
- metadata +20 -39
@@ -28,16 +28,16 @@ module Runcible
|
|
28
28
|
|
29
29
|
def self.bind_all(id, repo_id)
|
30
30
|
# bind the consumer to all repositories with the given repo_id
|
31
|
-
Runcible::Extensions::Repository.retrieve_with_details(repo_id)['distributors'].
|
31
|
+
Runcible::Extensions::Repository.retrieve_with_details(repo_id)['distributors'].collect do |d|
|
32
32
|
self.bind(id, repo_id, d['id'])
|
33
|
-
end
|
33
|
+
end.flatten
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.unbind_all(id, repo_id)
|
37
37
|
# unbind the consumer from all repositories with the given repo_id
|
38
|
-
Runcible::Extensions::Repository.retrieve_with_details(repo_id)['distributors'].
|
38
|
+
Runcible::Extensions::Repository.retrieve_with_details(repo_id)['distributors'].collect do |d|
|
39
39
|
self.unbind(id, repo_id, d['id'])
|
40
|
-
end
|
40
|
+
end.flatten
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.install_content(id, type_id, units)
|
@@ -1,10 +1,34 @@
|
|
1
|
+
# Copyright (c) 2012 Red Hat
|
2
|
+
#
|
3
|
+
# MIT License
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
|
1
25
|
module Runcible
|
2
26
|
module Extensions
|
3
|
-
class Distribution < Runcible::
|
27
|
+
class Distribution < Runcible::Resources::Unit
|
4
28
|
TYPE = 'distribution'
|
5
29
|
|
6
30
|
def self.all()
|
7
|
-
|
31
|
+
search(TYPE, {})
|
8
32
|
end
|
9
33
|
|
10
34
|
def self.find(id)
|
@@ -12,11 +36,11 @@ module Runcible
|
|
12
36
|
end
|
13
37
|
|
14
38
|
def self.find_all(ids)
|
15
|
-
|
39
|
+
search(TYPE, :filters=> {:id=> {'$in'=> ids}})
|
16
40
|
end
|
17
41
|
|
18
42
|
def self.find_all_by_unit_ids(ids)
|
19
|
-
|
43
|
+
search(TYPE, :filters=> {:_id=> {'$in'=> ids}})
|
20
44
|
end
|
21
45
|
|
22
46
|
end
|
@@ -24,11 +24,11 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Extensions
|
27
|
-
class Errata < Runcible::
|
27
|
+
class Errata < Runcible::Resources::Unit
|
28
28
|
TYPE = 'erratum'
|
29
29
|
|
30
30
|
def self.all()
|
31
|
-
|
31
|
+
search(TYPE, {})
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.find(id)
|
@@ -36,13 +36,11 @@ module Runcible
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.find_all(ids)
|
39
|
-
|
40
|
-
{:include_repos => true})
|
39
|
+
search(TYPE, {:filters=> {:_id=> {'$in'=> ids}}}, {:include_repos=>true})
|
41
40
|
end
|
42
41
|
|
43
|
-
def self.
|
44
|
-
|
45
|
-
{:include_repos=>true})
|
42
|
+
def self.find_all_by_errata_ids(ids)
|
43
|
+
search(TYPE, {:filters=>{:id=> {'$in'=> ids}}}, {:include_repos => true})
|
46
44
|
end
|
47
45
|
|
48
46
|
end
|
@@ -97,14 +97,14 @@ module Runcible
|
|
97
97
|
# errata_ids
|
98
98
|
def self.errata_copy(source_repo_id, destination_repo_id, optional={})
|
99
99
|
criteria = {:type_ids => ['erratum'], :filters => {}}
|
100
|
-
criteria[:filters][
|
100
|
+
criteria[:filters]['association'] = {'unit_id' => {'$in' => optional[:errata_ids]}} if optional[:errata_ids]
|
101
101
|
payload = {:criteria => criteria}
|
102
102
|
unit_copy(destination_repo_id, source_repo_id, payload)
|
103
103
|
end
|
104
104
|
|
105
105
|
def self.errata_remove(repo_id, errata_ids)
|
106
106
|
criteria = {:type_ids => ['erratum'], :filters => {}}
|
107
|
-
criteria[:filters][
|
107
|
+
criteria[:filters]['association'] = {'unit_id' => {'$in' => errata_ids}}
|
108
108
|
self.unassociate_units(repo_id, criteria)
|
109
109
|
end
|
110
110
|
|
@@ -158,6 +158,11 @@ module Runcible
|
|
158
158
|
self.unit_search(id, criteria).collect{|i| i['unit_id']}
|
159
159
|
end
|
160
160
|
|
161
|
+
def self.errata(id, filter = {})
|
162
|
+
criteria = {:type_ids=>['erratum']}
|
163
|
+
self.unit_search(id, criteria).collect{|i| i['metadata'].with_indifferent_access}
|
164
|
+
end
|
165
|
+
|
161
166
|
def self.distributions(id)
|
162
167
|
criteria = {:type_ids=>['distribution']}
|
163
168
|
|
@@ -24,11 +24,11 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Extensions
|
27
|
-
class Rpm < Runcible::
|
27
|
+
class Rpm < Runcible::Resources::Unit
|
28
28
|
TYPE = 'rpm'
|
29
29
|
|
30
30
|
def self.all
|
31
|
-
|
31
|
+
search(TYPE, {})
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.find(id)
|
@@ -36,7 +36,7 @@ module Runcible
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.find_all(ids)
|
39
|
-
|
39
|
+
search(TYPE, {:filters => {'_id'=> {'$in'=> ids}}}, {:include_repos=>true})
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -24,65 +24,139 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/consumer/index.html
|
27
28
|
class Consumer < Runcible::Base
|
28
29
|
|
30
|
+
# Generates the API path for Consumers
|
31
|
+
#
|
32
|
+
# @param [String] id the ID of the consumer
|
33
|
+
# @return [String] the consumer path, may contain the id if passed
|
29
34
|
def self.path(id=nil)
|
30
35
|
(id == nil) ? "consumers/" : "consumers/#{id}/"
|
31
36
|
end
|
32
37
|
|
38
|
+
# Creates a consumer
|
39
|
+
#
|
40
|
+
# @param [String] id the ID of the consumer
|
41
|
+
# @param [Hash] optional container for all optional parameters
|
42
|
+
# @return [RestClient::Response]
|
33
43
|
def self.create(id, optional={})
|
34
44
|
required = required_params(binding.send(:local_variables), binding)
|
35
45
|
call(:post, path, :payload => { :required => required, :optional => optional })
|
36
46
|
end
|
37
47
|
|
48
|
+
# Retrieves a consumer
|
49
|
+
#
|
50
|
+
# @param [String] id the ID of the consumer
|
51
|
+
# @return [RestClient::Response]
|
38
52
|
def self.retrieve(id)
|
39
53
|
call(:get, path(id))
|
40
54
|
end
|
41
55
|
|
56
|
+
# Updates a consumer
|
57
|
+
#
|
58
|
+
# @param [String] id the ID of the consumer
|
59
|
+
# @param [Hash] optional container for all optional parameters
|
60
|
+
# @return [RestClient::Response]
|
42
61
|
def self.update(id, optional={})
|
43
62
|
call(:put, path(id), :payload => { :delta => optional })
|
44
63
|
end
|
45
64
|
|
65
|
+
# Deletes a consumer
|
66
|
+
#
|
67
|
+
# @param [String] id the id of the consumer
|
68
|
+
# @return [RestClient::Response]
|
69
|
+
def self.delete(id)
|
70
|
+
call(:delete, path(id))
|
71
|
+
end
|
72
|
+
|
73
|
+
# Create consumer profile
|
74
|
+
#
|
75
|
+
# @param [String] id the ID of the consumer
|
76
|
+
# @param [String] content_type the content type
|
77
|
+
# @param [Hash] profile hash representing the consumer profile
|
78
|
+
# @return [RestClient::Response]
|
46
79
|
def self.upload_profile(id, content_type, profile)
|
47
80
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
48
81
|
call(:post, path("#{id}/profiles/"), :payload => { :required => required })
|
49
82
|
end
|
50
83
|
|
51
|
-
|
84
|
+
# Retrieve a consumer profile
|
85
|
+
#
|
86
|
+
# @param [String] id the ID of the consumer
|
87
|
+
# @param [String] content_type the content type
|
88
|
+
# @return [RestClient::Response]
|
89
|
+
def self.retrieve_profile(id, content_type)
|
52
90
|
call(:get, path("#{id}/profiles/#{content_type}/"))
|
53
91
|
end
|
54
92
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
93
|
+
# Retrieve a consumer binding
|
94
|
+
#
|
95
|
+
# @param [String] id the ID of the consumer
|
96
|
+
# @param [String] repo_id the ID of the repository
|
97
|
+
# @param [String] distributor_id the ID of the distributor
|
98
|
+
# @return [RestClient::Response]
|
59
99
|
def self.retrieve_binding(id, repo_id, distributor_id)
|
60
100
|
call(:get, path("#{id}/bindings/#{repo_id}/#{distributor_id}"))
|
61
101
|
end
|
62
102
|
|
103
|
+
# Retrieve all consumer bindings
|
104
|
+
#
|
105
|
+
# @param [String] id the ID of the consumer
|
106
|
+
# @return [RestClient::Response]
|
63
107
|
def self.retrieve_bindings(id)
|
64
108
|
call(:get, path("#{id}/bindings/"))
|
65
109
|
end
|
66
110
|
|
111
|
+
# Bind a consumer to a repository for a given distributor
|
112
|
+
#
|
113
|
+
# @param [String] id the ID of the consumer
|
114
|
+
# @param [String] repo_id the ID of the repository
|
115
|
+
# @param [String] distributor_id the ID of the distributor
|
116
|
+
# @return [RestClient::Response]
|
67
117
|
def self.bind(id, repo_id, distributor_id)
|
68
118
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
69
|
-
call(:post, path("#{id}/bindings"), :payload => { :required => required })
|
119
|
+
call(:post, path("#{id}/bindings/"), :payload => { :required => required })
|
70
120
|
end
|
71
121
|
|
122
|
+
# Unbind a consumer to a repository for a given distributor
|
123
|
+
#
|
124
|
+
# @param [String] id the ID of the consumer
|
125
|
+
# @param [String] repo_id the ID of the repository
|
126
|
+
# @param [String] distributor_id the ID of the distributor
|
127
|
+
# @return [RestClient::Response]
|
72
128
|
def self.unbind(id, repo_id, distributor_id)
|
73
129
|
call(:delete, path("#{id}/bindings/#{repo_id}/#{distributor_id}"))
|
74
130
|
end
|
75
131
|
|
132
|
+
# Install a set of units onto a consumer
|
133
|
+
#
|
134
|
+
# @param [String] id the ID of the consumer
|
135
|
+
# @param [Array] units array of units to install
|
136
|
+
# @param [Hash] options hash of install options
|
137
|
+
# @return [RestClient::Response]
|
76
138
|
def self.install_units(id, units, options={})
|
77
139
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
78
140
|
call(:post, path("#{id}/actions/content/install/"), :payload => { :required => required })
|
79
141
|
end
|
80
142
|
|
143
|
+
# Update a set of units on a consumer
|
144
|
+
#
|
145
|
+
# @param [String] id the ID of the consumer
|
146
|
+
# @param [Array] units array of units to update
|
147
|
+
# @param [Hash] options hash of update options
|
148
|
+
# @return [RestClient::Response]
|
81
149
|
def self.update_units(id, units, options={})
|
82
150
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
83
151
|
call(:post, path("#{id}/actions/content/update/"), :payload => { :required => required })
|
84
152
|
end
|
85
153
|
|
154
|
+
# Uninstall a set of units from a consumer
|
155
|
+
#
|
156
|
+
# @param [String] id the ID of the consumer
|
157
|
+
# @param [Array] units array of units to uninstall
|
158
|
+
# @param [Hash] options hash of uninstall options
|
159
|
+
# @return [RestClient::Response]
|
86
160
|
def self.uninstall_units(id, units, options={})
|
87
161
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
88
162
|
call(:post, path("#{id}/actions/content/uninstall/"), :payload => { :required => required })
|
@@ -25,62 +25,90 @@ require 'active_support/core_ext/hash'
|
|
25
25
|
|
26
26
|
module Runcible
|
27
27
|
module Resources
|
28
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/consumer/group/index.html
|
28
29
|
class ConsumerGroup < Runcible::Base
|
29
30
|
|
31
|
+
# Generates the API path for Consumer Groups
|
32
|
+
#
|
33
|
+
# @param [String] id the ID of the consumer group
|
34
|
+
# @return [String] the consumer group path, may contain the id if passed
|
30
35
|
def self.path(id=nil)
|
31
36
|
groups = "consumer_groups/"
|
32
37
|
id.nil? ? groups : groups + "#{id}/"
|
33
38
|
end
|
34
39
|
|
40
|
+
# Creates a Consumer Group
|
41
|
+
#
|
42
|
+
# @param [String] id the ID of the consumer
|
43
|
+
# @param [Hash] optional container for all optional parameters
|
44
|
+
# @return [RestClient::Response]
|
35
45
|
def self.create(id, optional={})
|
36
46
|
required = required_params(binding.send(:local_variables), binding)
|
37
47
|
call(:post, path, :payload => { :required => required, :optional => optional })
|
38
48
|
end
|
39
49
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
50
|
+
# Retrieves a Consumer Group
|
51
|
+
#
|
52
|
+
# @param [String] id the ID of the consumer group
|
53
|
+
# @return [RestClient::Response]
|
44
54
|
def self.retrieve(id)
|
45
55
|
call(:get, path(id))
|
46
56
|
end
|
47
57
|
|
58
|
+
# Deletes a Consumer Group
|
59
|
+
#
|
60
|
+
# @param [String] id the ID of the consumer group
|
61
|
+
# @return [RestClient::Response]
|
62
|
+
def self.delete(id)
|
63
|
+
call(:delete, path(id))
|
64
|
+
end
|
48
65
|
|
66
|
+
# Associates Consumers with a Consumer Group
|
67
|
+
#
|
68
|
+
# @param [String] id the ID of the consumer group
|
69
|
+
# @param [Hash] criteria criteria based on Mongo syntax representing consumers to associate
|
70
|
+
# @return [RestClient::Response]
|
49
71
|
def self.associate(id, criteria)
|
50
72
|
call(:post, path(id) + "actions/associate/", :payload => {:required => criteria})
|
51
73
|
end
|
52
74
|
|
75
|
+
# Unassociates Consumers with a Consumer Group
|
76
|
+
#
|
77
|
+
# @param [String] id the ID of the consumer group
|
78
|
+
# @param [Hash] criteria criteria based on Mongo syntax representing consumers ta unassociate
|
79
|
+
# @return [RestClient::Response]
|
53
80
|
def self.unassociate(id, criteria)
|
54
81
|
call(:post, path(id) + "actions/unassociate/", :payload => {:required => criteria})
|
55
82
|
end
|
56
83
|
|
57
|
-
#
|
58
|
-
# call(:get, path("#{id}/bindings/#{repo_id}/#{distributor_id}"))
|
59
|
-
#end
|
60
|
-
#
|
61
|
-
#def self.retrieve_bindings(id)
|
62
|
-
# call(:get, path("#{id}/bindings/"))
|
63
|
-
#end
|
84
|
+
# Install a set of units to a Consumer Group
|
64
85
|
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#def self.unbind(id, repo_id, distributor_id)
|
71
|
-
# call(:delete, path("#{id}/bindings/#{repo_id}/#{distributor_id}"))
|
72
|
-
#end
|
73
|
-
|
86
|
+
# @param [String] id the ID of the consumer group
|
87
|
+
# @param [Array] units array of units to install
|
88
|
+
# @param [Hash] options hash of install options
|
89
|
+
# @return [RestClient::Response]
|
74
90
|
def self.install_units(id, units, options={})
|
75
91
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
76
92
|
call(:post, path("#{id}/actions/content/install/"), :payload => { :required => required })
|
77
93
|
end
|
78
94
|
|
95
|
+
# Update a set of units on a Consumer Group
|
96
|
+
#
|
97
|
+
# @param [String] id the ID of the consumer group
|
98
|
+
# @param [Array] units array of units to update
|
99
|
+
# @param [Hash] options hash of update options
|
100
|
+
# @return [RestClient::Response]
|
79
101
|
def self.update_units(id, units, options={})
|
80
102
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
81
103
|
call(:post, path("#{id}/actions/content/update/"), :payload => { :required => required })
|
82
104
|
end
|
83
105
|
|
106
|
+
# Uninstall a set of units from a Consumer Group
|
107
|
+
#
|
108
|
+
# @param [String] id the ID of the consumer group
|
109
|
+
# @param [Array] units array of units to uninstall
|
110
|
+
# @param [Hash] options hash of uninstall options
|
111
|
+
# @return [RestClient::Response]
|
84
112
|
def self.uninstall_units(id, units, options={})
|
85
113
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
86
114
|
call(:post, path("#{id}/actions/content/uninstall/"), :payload => { :required => required })
|
@@ -1,6 +1,30 @@
|
|
1
|
+
# Copyright (c) 2012 Red Hat
|
2
|
+
#
|
3
|
+
# MIT License
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
1
24
|
|
2
25
|
module Runcible
|
3
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/events/index.html
|
4
28
|
class EventNotifier < Runcible::Base
|
5
29
|
|
6
30
|
class EventTypes
|
@@ -14,22 +38,41 @@ module Runcible
|
|
14
38
|
REST_API = 'rest-api'
|
15
39
|
end
|
16
40
|
|
41
|
+
# Generates the API path for Event Notifiers
|
42
|
+
#
|
43
|
+
# @param [String] id the ID of the event notifier
|
44
|
+
# @return [String] the event notifier path, may contain the ID if passed
|
45
|
+
def self.path(id=nil)
|
46
|
+
(id == nil) ? "events/" : "events/#{id}/"
|
47
|
+
end
|
48
|
+
|
49
|
+
# Creates an Event Notification
|
50
|
+
#
|
51
|
+
# @param [String] notifier_type_id the type ID of the event notifier
|
52
|
+
# @param [Hash] notifier_config configuration options for the notifier
|
53
|
+
# @param [Hash] event_types event types to include in the notifier
|
54
|
+
# @return [RestClient::Response]
|
17
55
|
def self.create(notifier_type_id, notifier_config, event_types)
|
18
56
|
required = required_params(binding.send(:local_variables), binding)
|
19
57
|
call(:post, path, :payload => {:required => required})
|
20
58
|
end
|
21
59
|
|
60
|
+
# Deletes an Event Notification
|
61
|
+
#
|
62
|
+
# @param [String] id the ID of the event notifier
|
63
|
+
# @return [RestClient::Response]
|
22
64
|
def self.delete(id)
|
23
65
|
call(:delete, path(id))
|
24
66
|
end
|
25
67
|
|
68
|
+
# List all Event Notifiers
|
69
|
+
#
|
70
|
+
# @param [String] id the ID of the event notifier
|
71
|
+
# @return [RestClient::Response]
|
26
72
|
def self.list
|
27
73
|
call(:get, path)
|
28
74
|
end
|
29
75
|
|
30
|
-
def self.path(id=nil)
|
31
|
-
(id == nil) ? "events/" : "events/#{id}/"
|
32
|
-
end
|
33
76
|
end
|
34
77
|
end
|
35
78
|
end
|
@@ -25,78 +25,159 @@ require 'active_support/core_ext/hash'
|
|
25
25
|
|
26
26
|
module Runcible
|
27
27
|
module Resources
|
28
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/repo/index.html
|
28
29
|
class Repository < Runcible::Base
|
29
30
|
|
31
|
+
# Generates the API path for Repositories
|
32
|
+
#
|
33
|
+
# @param [String] id the id of the repository
|
34
|
+
# @return [String] the repository path, may contain the id if passed
|
30
35
|
def self.path(id=nil)
|
31
36
|
(id == nil) ? "repositories/" : "repositories/#{id}/"
|
32
37
|
end
|
33
38
|
|
39
|
+
# Creates a repository
|
40
|
+
#
|
41
|
+
# @param [String] id the id of the repository
|
42
|
+
# @param [Hash] optional container for all optional parameters
|
43
|
+
# @return [RestClient::Response]
|
34
44
|
def self.create(id, optional={})
|
35
45
|
required = required_params(binding.send(:local_variables), binding)
|
36
46
|
call(:post, path, :payload => { :required => required, :optional => optional })
|
37
47
|
end
|
38
48
|
|
49
|
+
# Retrieves a repository
|
50
|
+
#
|
51
|
+
# @param [String] id the id of the repository
|
52
|
+
# @param [Hash] params container for optional query parameters
|
53
|
+
# @return [RestClient::Response]
|
39
54
|
def self.retrieve(id, params={})
|
40
55
|
call(:get, path(id), :params => params)
|
41
56
|
end
|
42
57
|
|
58
|
+
# Updates a repository
|
59
|
+
#
|
60
|
+
# @param [String] id the id of the repository
|
61
|
+
# @param [Hash] optional container for all optional parameters
|
62
|
+
# @return [RestClient::Response]
|
43
63
|
def self.update(id, optional={})
|
44
64
|
call(:put, path(id), :payload => { :delta => optional })
|
45
65
|
end
|
46
66
|
|
67
|
+
# Deletes a repository
|
68
|
+
#
|
69
|
+
# @param [String] id the id of the repository
|
70
|
+
# @return [RestClient::Response]
|
47
71
|
def self.delete(id)
|
48
72
|
call(:delete, path(id))
|
49
73
|
end
|
50
74
|
|
75
|
+
# Retrieve all repositories
|
76
|
+
#
|
77
|
+
# @param [Hash] optional container for all optional parameters
|
78
|
+
# @return [RestClient::Response]
|
51
79
|
def self.retrieve_all(optional={})
|
52
80
|
call(:get, path, :payload => { :optional => optional })
|
53
81
|
end
|
54
82
|
|
83
|
+
# Searches for repositories based on criteria
|
84
|
+
#
|
85
|
+
# @param [Hash] criteria criteria object containing Mongo syntax
|
86
|
+
# @param [Hash] optional container for all optional parameters
|
87
|
+
# @return [RestClient::Response]
|
55
88
|
def self.search(criteria, optional={})
|
56
89
|
required = required_params(binding.send(:local_variables), binding)
|
57
90
|
call(:post, path("search"), :payload => { :required => required, :optional => optional })
|
58
91
|
end
|
59
92
|
|
93
|
+
# Associates an importer to a repository
|
94
|
+
#
|
95
|
+
# @param [String] id the ID of the repository
|
96
|
+
# @param [String] importer_type_id the type ID of the importer being associated
|
97
|
+
# @param [Hash] importer_config configuration options for the importer
|
98
|
+
# @return [RestClient::Response]
|
60
99
|
def self.associate_importer(id, importer_type_id, importer_config)
|
61
100
|
required = required_params(binding.send(:local_variables), binding)
|
62
101
|
call(:post, path("#{id}/importers"), :payload => { :required => required })
|
63
102
|
end
|
64
103
|
|
104
|
+
# Associates a distributor to a repository
|
105
|
+
#
|
106
|
+
# @param [String] id the ID of the repository
|
107
|
+
# @param [String] distributor_type_id the type ID of the distributor being associated
|
108
|
+
# @param [Hash] distributor_config configuration options for the distributor
|
109
|
+
# @param [Hash] optional container for all optional parameters
|
110
|
+
# @return [RestClient::Response]
|
65
111
|
def self.associate_distributor(id, distributor_type_id, distributor_config, optional={})
|
66
112
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
67
113
|
call(:post, path("#{id}/distributors"), :payload => { :required => required, :optional => optional })
|
68
114
|
end
|
69
115
|
|
116
|
+
# Syncs a repository
|
117
|
+
#
|
118
|
+
# @param [String] id the id of the repository
|
119
|
+
# @param [Hash] optional container for all optional parameters
|
120
|
+
# @return [RestClient::Response]
|
70
121
|
def self.sync(id, optional={})
|
71
122
|
call(:post, "#{path(id)}actions/sync/", :payload => { :optional => optional })
|
72
123
|
end
|
73
124
|
|
125
|
+
# History of all sync actions on a repository
|
126
|
+
#
|
127
|
+
# @param [String] id the id of the repository
|
128
|
+
# @return [RestClient::Response]
|
74
129
|
def self.sync_history(id)
|
75
130
|
call(:get, "#{path(id)}/history/sync/")
|
76
131
|
end
|
77
132
|
|
78
|
-
|
133
|
+
# Copies units from one repository to another
|
134
|
+
#
|
135
|
+
# @param [String] destination_repo_id the id of the destination repository
|
136
|
+
# @param [String] source_repo_id the id of the source repository
|
137
|
+
# @param [Hash] optional container for all optional parameters
|
138
|
+
# @return [RestClient::Response]
|
139
|
+
def self.unit_copy(destination_repo_id, source_repo_id, optional={})
|
79
140
|
required = required_params(binding.send(:local_variables), binding, ["destination_repo_id"])
|
80
141
|
call(:post, "#{path(destination_repo_id)}actions/associate/",
|
81
|
-
:payload => { :required => required, :optional=> optional })
|
142
|
+
:payload => { :required => required, :optional => optional })
|
82
143
|
end
|
83
144
|
|
145
|
+
# Unassociates units from the repository
|
146
|
+
#
|
147
|
+
# @param [String] source_repo_id the id of the source repository
|
148
|
+
# @param [Hash] criteria criteria object containing Mongo syntax
|
149
|
+
# @return [RestClient::Response]
|
84
150
|
def self.unassociate_units(source_repo_id, criteria={})
|
85
151
|
required = required_params(binding.send(:local_variables), binding, ["source_repo_id"])
|
86
152
|
call(:post, "#{path(source_repo_id)}actions/unassociate/",
|
87
|
-
:payload => { :required =>
|
153
|
+
:payload => { :required => required })
|
88
154
|
end
|
89
155
|
|
156
|
+
# Searches the repository for units based on criteria
|
157
|
+
#
|
158
|
+
# @param [String] id the id of the repository
|
159
|
+
# @param [Hash] criteria criteria object containing Mongo syntax
|
160
|
+
# @return [RestClient::Response]
|
90
161
|
def self.unit_search(id, criteria={})
|
91
162
|
call(:post, "#{path(id)}search/units/", :payload=>{:required=>{:criteria=>criteria}})
|
92
163
|
end
|
93
164
|
|
94
|
-
|
95
|
-
|
165
|
+
# Publishes a repository using the specified distributor
|
166
|
+
#
|
167
|
+
# @param [String] id the id of the repository
|
168
|
+
# @param [String] distributor_id the id of the distributor
|
169
|
+
# @return [RestClient::Response]
|
170
|
+
def self.publish(id, distributor_id)
|
171
|
+
call(:post, "#{path(id)}actions/publish/", :payload=>{:required=>{:id=>distributor_id}})
|
96
172
|
end
|
97
173
|
|
98
|
-
|
99
|
-
|
174
|
+
# Deletes the specified distributor from the repository
|
175
|
+
#
|
176
|
+
# @param [String] id the id of the repository
|
177
|
+
# @param [String] distributor_id the id of the distributor
|
178
|
+
# @return [RestClient::Response]
|
179
|
+
def self.delete_distributor(id, distributor_id)
|
180
|
+
call(:delete, "#{path(id)}/distributors/#{distributor_id}/")
|
100
181
|
end
|
101
182
|
|
102
183
|
end
|
@@ -25,32 +25,64 @@ require 'active_support/core_ext/hash'
|
|
25
25
|
|
26
26
|
module Runcible
|
27
27
|
module Resources
|
28
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/repo/sync.html#scheduling-a-sync
|
28
29
|
class RepositorySchedule < Runcible::Base
|
29
30
|
|
30
|
-
|
31
|
+
# Generates the API path for Repository Schedules
|
32
|
+
#
|
33
|
+
# @param [String] repo_id the ID of the repository
|
34
|
+
# @param [String] importer_id the ID of the importer
|
35
|
+
# @param [String] schedule_id the ID of the schedule
|
36
|
+
# @return [String] the repository schedule path, may contain the ID of the schedule if passed
|
37
|
+
def self.path(repo_id, importer_id, schedule_id=nil)
|
31
38
|
repo_path = Runcible::Resources::Repository.path(repo_id)
|
32
|
-
path = "#{repo_path}importers/#{
|
39
|
+
path = "#{repo_path}importers/#{importer_id}/schedules/sync/"
|
33
40
|
(schedule_id == nil) ? path : "#{path}#{schedule_id}/"
|
34
41
|
end
|
35
42
|
|
43
|
+
# List the schedules for a repository for a given importer type
|
44
|
+
#
|
45
|
+
# @param [String] repo_id the ID of the repository
|
46
|
+
# @param [String] importer_type the importer type
|
47
|
+
# @return [RestClient::Response]
|
36
48
|
def self.list(repo_id, importer_type)
|
37
49
|
call(:get, path(repo_id, importer_type))
|
38
50
|
end
|
39
51
|
|
52
|
+
# Create a schedule for a repository for a given importer type
|
53
|
+
#
|
54
|
+
# @param [String] repo_id the ID of the repository
|
55
|
+
# @param [String] importer_type the importer type
|
56
|
+
# @param [Hash] schedule a hash representing a schedule
|
57
|
+
# @param [Hash] optional container for all optional parameters
|
58
|
+
# @return [RestClient::Response]
|
40
59
|
def self.create(repo_id, importer_type, schedule, optional={})
|
41
60
|
call(:post, path(repo_id, importer_type),
|
42
61
|
:payload => { :required => {:schedule=>schedule}, :optional => optional })
|
43
62
|
end
|
44
63
|
|
45
|
-
#
|
64
|
+
# Update a schedule for a repository for a given importer type
|
65
|
+
#
|
66
|
+
# @param [String] repo_id the ID of the repository
|
67
|
+
# @param [String] importer_type the importer type
|
68
|
+
# @param [String] schedule_id the ID of the schedule
|
69
|
+
# @param [Hash] optional container for all optional parameters
|
70
|
+
# @return [RestClient::Response]
|
46
71
|
def self.update(repo_id, importer_type, schedule_id, optional={})
|
47
72
|
call(:put, path(repo_id, importer_type, schedule_id),
|
48
73
|
:payload => {:optional => optional })
|
49
74
|
end
|
50
75
|
|
76
|
+
# Delete a schedule for a repository for a given importer type
|
77
|
+
#
|
78
|
+
# @param [String] repo_id the ID of the repository
|
79
|
+
# @param [String] importer_type the importer type
|
80
|
+
# @param [String] schedule_id the ID of the schedule
|
81
|
+
# @return [RestClient::Response]
|
51
82
|
def self.delete(repo_id, importer_type, schedule_id)
|
52
83
|
call(:delete, path(repo_id, importer_type, schedule_id))
|
53
84
|
end
|
85
|
+
|
54
86
|
end
|
55
87
|
end
|
56
88
|
end
|
@@ -24,17 +24,32 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/role/index.html
|
27
28
|
class Role < Runcible::Base
|
28
29
|
|
29
|
-
|
30
|
-
|
30
|
+
# Generates the API path for Roles
|
31
|
+
#
|
32
|
+
# @param [String] id the ID of the role
|
33
|
+
# @return [String] the role path, may contain the ID if passed
|
34
|
+
def self.path(id=nil)
|
35
|
+
(id == nil) ? "roles/" : "roles/#{id}/"
|
31
36
|
end
|
32
37
|
|
38
|
+
# Adds a user to a role
|
39
|
+
#
|
40
|
+
# @param [String] id the ID of the role
|
41
|
+
# @param [String] login the login of the user being added
|
42
|
+
# @return [RestClient::Response]
|
33
43
|
def self.add(id, login)
|
34
44
|
required = required_params(binding.send(:local_variables), binding, ["id"])
|
35
45
|
call(:post, "#{path(id)}users/", :payload => { :required => required })
|
36
46
|
end
|
37
47
|
|
48
|
+
# Removes a user from a role
|
49
|
+
#
|
50
|
+
# @param [String] id the ID of the role
|
51
|
+
# @param [String] login the login of the user being removed
|
52
|
+
# @return [RestClient::Response]
|
38
53
|
def self.remove(id, login)
|
39
54
|
call(:delete, "#{path(id)}users/#{login}/")
|
40
55
|
end
|
@@ -24,29 +24,49 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/dispatch/index.html
|
27
28
|
class Task < Runcible::Base
|
28
29
|
|
30
|
+
# Generates the API path for Tasks
|
31
|
+
#
|
32
|
+
# @param [String] id the id of the task
|
33
|
+
# @return [String] the task path, may contain the id if passed
|
29
34
|
def self.path(id=nil)
|
30
35
|
(id == nil) ? "tasks/" : "tasks/#{id}/"
|
31
36
|
end
|
32
37
|
|
38
|
+
# Polls for the status of a task
|
39
|
+
#
|
40
|
+
# @param [String] id the id of the task
|
41
|
+
# @return [RestClient::Response]
|
33
42
|
def self.poll(id)
|
34
43
|
call(:get, path(id))
|
35
44
|
end
|
36
45
|
|
46
|
+
# Cancels a task
|
47
|
+
#
|
48
|
+
# @param [String] id the id of the task
|
49
|
+
# @return [RestClient::Response]
|
37
50
|
def self.cancel(id)
|
38
51
|
#cancelling a task may require cancelling some higher level
|
39
52
|
# task, so query the tasks _href field to make sure
|
40
53
|
call(:delete, poll(id)['_href'])
|
41
54
|
end
|
42
55
|
|
56
|
+
# List all tasks based on a set of tags
|
57
|
+
#
|
58
|
+
# @param [Array] tags array of tags to scope the list on
|
59
|
+
# @return [RestClient::Response]
|
43
60
|
def self.list(tags=[])
|
44
61
|
call(:get, path, :params=>{:tag=>tags})
|
45
62
|
end
|
46
63
|
|
64
|
+
# Polls all tasks based on array of IDs
|
65
|
+
# temporary solution until https://bugzilla.redhat.com/show_bug.cgi?id=860089
|
66
|
+
#
|
67
|
+
# @param [Array] ids array of ids to poll the status of
|
68
|
+
# @return [Array] array of RestClient::Response task poll objects
|
47
69
|
def self.poll_all(ids)
|
48
|
-
# temporary solution until https://bugzilla.redhat.com/show_bug.cgi?id=860089
|
49
|
-
# is resolved
|
50
70
|
return ids.collect{|id| self.poll(id)}
|
51
71
|
end
|
52
72
|
|
@@ -1,11 +1,46 @@
|
|
1
|
+
# Copyright (c) 2012 Red Hat
|
2
|
+
#
|
3
|
+
# MIT License
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
|
1
25
|
module Runcible
|
2
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/content/index.html
|
3
28
|
class Unit < Runcible::Base
|
4
29
|
|
30
|
+
# Generates the API path for Units
|
31
|
+
#
|
32
|
+
# @param [String] type the unit type
|
33
|
+
# @return [String] the unit search path
|
5
34
|
def self.path(type)
|
6
35
|
"content/units/#{type}/search/"
|
7
36
|
end
|
8
37
|
|
38
|
+
# Searches a given unit type based on criteria
|
39
|
+
#
|
40
|
+
# @param [String] type the unit type
|
41
|
+
# @param [Hash] criteria criteria object containing Mongo syntax
|
42
|
+
# @param [Hash] optional container for all optional parameters
|
43
|
+
# @return [RestClient::Response]
|
9
44
|
def self.search(type, criteria, optional={})
|
10
45
|
call(:post, path(type), :payload=>{:required=>{:criteria=>criteria}, :optional=>optional})
|
11
46
|
end
|
@@ -24,27 +24,48 @@
|
|
24
24
|
|
25
25
|
module Runcible
|
26
26
|
module Resources
|
27
|
+
# @see https://pulp-dev-guide.readthedocs.org/en/latest/rest-api/user/index.html
|
27
28
|
class User < Runcible::Base
|
28
29
|
|
30
|
+
# Generates the API path for Users
|
31
|
+
#
|
32
|
+
# @param [String] login the user's login
|
33
|
+
# @return [String] the user path, may contain the login if passed
|
29
34
|
def self.path(login=nil)
|
30
35
|
(login == nil) ? "users/" : "users/#{login}/"
|
31
36
|
end
|
32
37
|
|
38
|
+
# Retrieves all users
|
39
|
+
#
|
40
|
+
# @return [RestClient::Response]
|
33
41
|
def self.retrieve_all
|
34
42
|
call(:get, path)
|
35
43
|
end
|
36
44
|
|
45
|
+
# Creates a user
|
46
|
+
#
|
47
|
+
# @param [String] login the login requested for the user
|
48
|
+
# @param [Hash] optional container for all optional parameters
|
49
|
+
# @return [RestClient::Response]
|
37
50
|
def self.create(login, optional={})
|
38
51
|
required = required_params(binding.send(:local_variables), binding)
|
39
52
|
call(:post, path, :payload => { :required => required, :optional => optional })
|
40
53
|
end
|
41
54
|
|
42
|
-
|
43
|
-
|
55
|
+
# Retrieves a user
|
56
|
+
#
|
57
|
+
# @param [String] login the login of the user being retrieved
|
58
|
+
# @return [RestClient::Response]
|
59
|
+
def self.retrieve(login)
|
60
|
+
call(:get, path(login))
|
44
61
|
end
|
45
62
|
|
46
|
-
|
47
|
-
|
63
|
+
# Deletes a user
|
64
|
+
#
|
65
|
+
# @param [String] login the login of the user being deleted
|
66
|
+
# @return [RestClient::Response]
|
67
|
+
def self.delete(login)
|
68
|
+
call(:delete, path(login))
|
48
69
|
end
|
49
70
|
|
50
71
|
end
|
data/lib/runcible/version.rb
CHANGED
metadata
CHANGED
@@ -1,33 +1,23 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: runcible
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.2'
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 1
|
9
|
-
- 4
|
10
|
-
version: 0.1.4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Eric D Helms
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2012-11-12 00:00:00 Z
|
12
|
+
date: 2012-11-16 00:00:00.000000000 Z
|
19
13
|
dependencies: []
|
20
|
-
|
21
14
|
description: Exposing Pulp's juiciest components to the Ruby world.
|
22
|
-
email:
|
15
|
+
email:
|
23
16
|
- ehelms@redhat.com
|
24
17
|
executables: []
|
25
|
-
|
26
18
|
extensions: []
|
27
|
-
|
28
19
|
extra_rdoc_files: []
|
29
|
-
|
30
|
-
files:
|
20
|
+
files:
|
31
21
|
- lib/runcible.rb
|
32
22
|
- lib/runcible/base.rb
|
33
23
|
- lib/runcible/extensions/errata.rb
|
@@ -54,36 +44,27 @@ files:
|
|
54
44
|
- lib/runcible/resources/unit.rb
|
55
45
|
homepage: https://github.com/Katello/runcible
|
56
46
|
licenses: []
|
57
|
-
|
58
47
|
post_install_message:
|
59
48
|
rdoc_options: []
|
60
|
-
|
61
|
-
require_paths:
|
49
|
+
require_paths:
|
62
50
|
- lib
|
63
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
52
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
|
69
|
-
|
70
|
-
- 0
|
71
|
-
version: "0"
|
72
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
58
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
|
78
|
-
segments:
|
79
|
-
- 0
|
80
|
-
version: "0"
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
81
63
|
requirements: []
|
82
|
-
|
83
64
|
rubyforge_project:
|
84
65
|
rubygems_version: 1.8.24
|
85
66
|
signing_key:
|
86
67
|
specification_version: 3
|
87
|
-
summary:
|
68
|
+
summary: ''
|
88
69
|
test_files: []
|
89
|
-
|
70
|
+
has_rdoc:
|