onlyoffice_digitalocean_wrapper 0.1.0 → 0.6.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 +5 -5
- data/lib/onlyoffice_digitalocean_wrapper.rb +2 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper.rb +46 -124
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/digitalocean_exceptions.rb +10 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/exceptions_retryer.rb +25 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/getters.rb +82 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/logger_wrapper.rb +13 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/power_actions.rb +33 -0
- data/lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/token_methods.rb +31 -0
- data/lib/onlyoffice_digitalocean_wrapper/version.rb +6 -1
- metadata +128 -21
- data/README.md +0 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2a48169cbc53f211b24f0956d8591465c7569450a04fa7f38a4614d004f7e748
|
4
|
+
data.tar.gz: aeda8616dfbc66abe0674cd79daf564b1aa98941b1eb66cc08aa03c9af831282
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 05c74d20d448499946ef83c8710aed8f7fcdf2bebd65b6f522c672f602956868920b4377056fc505ce5ac6b0a6fef364f9a0a23547cdab43713cbc24112a4902
|
7
|
+
data.tar.gz: 7da944f64237a89ecf4bc966099c8ab102e783ca5d262075159bb8e5b2fbf37c44e2379ed6307d0c3880bdbbd361eb2b40787527b66139df3b910ab099cfe8e6
|
@@ -1,130 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'droplet_kit'
|
2
|
-
require 'onlyoffice_logger_helper'
|
3
4
|
require_relative 'digitalocean_wrapper/digitalocean_exceptions'
|
5
|
+
require_relative 'digitalocean_wrapper/exceptions_retryer'
|
6
|
+
require_relative 'digitalocean_wrapper/getters'
|
7
|
+
require_relative 'digitalocean_wrapper/logger_wrapper'
|
8
|
+
require_relative 'digitalocean_wrapper/power_actions'
|
9
|
+
require_relative 'digitalocean_wrapper/token_methods'
|
4
10
|
|
11
|
+
# Namespace for this gem
|
5
12
|
module OnlyofficeDigitaloceanWrapper
|
6
13
|
# Class for wrapping DigitalOcean API gem
|
7
14
|
class DigitalOceanWrapper
|
15
|
+
include Getters
|
16
|
+
include LoggerWrapper
|
17
|
+
include ExceptionsRetryer
|
18
|
+
include PowerActions
|
19
|
+
include TokenMethods
|
20
|
+
|
21
|
+
# @return [Array<String>] list of allowed droplet sizes
|
22
|
+
DROPLET_SIZES = %w[512mb 1gb 2gb 4gb 8gb 16gb 32gb 48gb 64gb].freeze
|
8
23
|
attr_accessor :client
|
9
24
|
|
10
25
|
def initialize(access_token = nil)
|
11
|
-
access_token ||=
|
26
|
+
access_token ||= read_token
|
12
27
|
@client = DropletKit::Client.new(access_token: access_token)
|
13
28
|
raise ArgumentError, 'DigitalOceanWrapper: Your Access Token is Incorrect' unless correct_access_token?
|
14
29
|
end
|
15
30
|
|
16
|
-
#
|
17
|
-
# @
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
true
|
25
|
-
end
|
26
|
-
|
27
|
-
# Check if token is correct. If not trying to read new token
|
28
|
-
# If reading failed - fail
|
29
|
-
def assure_correct_token
|
30
|
-
return if correct_access_token?
|
31
|
-
@client = DropletKit::Client.new(access_token: DigitalOceanWrapper.read_token)
|
32
|
-
return if correct_access_token?
|
33
|
-
raise ArgumentError, 'Access token for DigitalOcean API is incorrect'
|
34
|
-
end
|
35
|
-
|
36
|
-
def get_image_id_by_name(image_name)
|
37
|
-
assure_correct_token
|
38
|
-
all_droplets = @client.images.all
|
39
|
-
image = all_droplets.find { |x| x.name == image_name }
|
40
|
-
raise DigitalOceanImageNotFound, image_name if image.nil?
|
41
|
-
OnlyofficeLoggerHelper.log("get_image_id_by_name(#{image_name}): #{image.id}")
|
42
|
-
image.id
|
43
|
-
end
|
44
|
-
|
45
|
-
# Get droplet by its name
|
46
|
-
# @param [String] droplet_name
|
47
|
-
# @return [DropletKit::Droplet] droplet
|
48
|
-
def droplet_by_name(droplet_name)
|
49
|
-
assure_correct_token
|
50
|
-
droplets = @client.droplets.all
|
51
|
-
droplets.find { |x| x.name == droplet_name }
|
52
|
-
end
|
53
|
-
|
54
|
-
def get_droplet_id_by_name(droplet_name)
|
55
|
-
droplet = droplet_by_name(droplet_name)
|
56
|
-
if droplet.nil?
|
57
|
-
OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
|
58
|
-
nil
|
59
|
-
else
|
60
|
-
OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
|
61
|
-
droplet.id
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def get_droplet_ip_by_name(droplet_name)
|
66
|
-
droplet = droplet_by_name(droplet_name)
|
67
|
-
if droplet.nil?
|
68
|
-
OnlyofficeLoggerHelper.log("There is no created droplet with name: #{droplet_name}")
|
69
|
-
return
|
70
|
-
end
|
71
|
-
ip = droplet.networks.first.first.ip_address
|
72
|
-
OnlyofficeLoggerHelper.log("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
|
73
|
-
ip
|
74
|
-
end
|
75
|
-
|
76
|
-
def current_kernel(droplet_name)
|
77
|
-
droplet = droplet_by_name(droplet_name)
|
78
|
-
kernel_name = droplet.kernel.name
|
79
|
-
OnlyofficeLoggerHelper.log("get_droplet_kernel_by_name(#{droplet_name}): #{kernel_name}")
|
80
|
-
kernel_name
|
81
|
-
end
|
82
|
-
|
83
|
-
def get_droplet_status_by_name(droplet_name)
|
84
|
-
droplet = droplet_by_name(droplet_name)
|
85
|
-
if droplet.nil?
|
86
|
-
OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
|
87
|
-
nil
|
88
|
-
else
|
89
|
-
status = droplet.status
|
90
|
-
status = :locked if droplet.locked
|
91
|
-
OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): #{status}")
|
92
|
-
status
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def wait_until_droplet_have_status(droplet_name, status = 'active')
|
97
|
-
timeout = 300
|
31
|
+
# Wait until droplet has status
|
32
|
+
# @param droplet_name [String] name of droplet
|
33
|
+
# @param status [String] status to wait
|
34
|
+
# @param params [Hash] additiona params
|
35
|
+
# @return [Symbol] droplet status after wait over
|
36
|
+
def wait_until_droplet_have_status(droplet_name, status = 'active', params = {})
|
37
|
+
timeout = params.fetch(:timeout, 300)
|
98
38
|
counter = 0
|
99
39
|
while get_droplet_status_by_name(droplet_name) != status && counter < timeout
|
100
40
|
counter += 10
|
101
41
|
sleep 10
|
102
|
-
|
103
|
-
|
42
|
+
logger.info("waiting for droplet (#{droplet_name}) to have "\
|
43
|
+
"status: #{status} for #{counter} seconds of #{timeout}")
|
104
44
|
end
|
105
|
-
|
106
|
-
end
|
45
|
+
raise DropletOperationTimeout, "#{droplet_name} was not #{status} for #{timeout}s" if counter >= timeout
|
107
46
|
|
108
|
-
|
109
|
-
droplet_id = get_droplet_id_by_name(droplet_name)
|
110
|
-
kernels = client.droplets.kernels(id: droplet_id).to_a
|
111
|
-
OnlyofficeLoggerHelper.log("Got kernels_of_droplet(#{droplet_name})")
|
112
|
-
kernels
|
47
|
+
get_droplet_status_by_name(droplet_name)
|
113
48
|
end
|
114
49
|
|
50
|
+
# Restore droplet from image by name
|
51
|
+
# @param image_name [String] name of image
|
52
|
+
# @param droplet_name [String] name for droplet
|
53
|
+
# @param region [String] region to restore
|
54
|
+
# @param size [String] size of droplet
|
55
|
+
# @param tags [String, Array<String>] name of tags to apply
|
56
|
+
# @return [Object] object with droplet data
|
115
57
|
def restore_image_by_name(image_name = 'nct-at-stable',
|
116
58
|
droplet_name = image_name,
|
117
|
-
region = '
|
59
|
+
region = 'nyc3',
|
118
60
|
size = '2gb',
|
119
61
|
tags: nil)
|
62
|
+
unless DROPLET_SIZES.include?(size)
|
63
|
+
raise DigitalOceanSizeNotSupported,
|
64
|
+
"There is no support of droplets with size: #{size}"
|
65
|
+
end
|
120
66
|
image_id = get_image_id_by_name(image_name)
|
121
67
|
droplet = DropletKit::Droplet.new(name: droplet_name,
|
122
68
|
region: region,
|
123
69
|
image: image_id.to_i,
|
124
70
|
tags: Array(tags),
|
71
|
+
monitoring: true,
|
125
72
|
size: size)
|
126
73
|
created = @client.droplets.create(droplet)
|
127
|
-
|
74
|
+
logger.info("restore_image_by_name(#{image_name}, #{droplet_name})")
|
128
75
|
if created.is_a?(String)
|
129
76
|
raise "Problem, while creating '#{droplet_name}' from image '#{image_name}'\n" \
|
130
77
|
"Error: #{created}"
|
@@ -132,39 +79,14 @@ module OnlyofficeDigitaloceanWrapper
|
|
132
79
|
created
|
133
80
|
end
|
134
81
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
wait_until_droplet_have_status(droplet_name, 'off')
|
139
|
-
end
|
140
|
-
|
141
|
-
def power_on_droplet(droplet_name)
|
142
|
-
droplet_id = get_droplet_id_by_name(droplet_name)
|
143
|
-
client.droplet_actions.power_on(droplet_id: droplet_id)
|
144
|
-
wait_until_droplet_have_status(droplet_name)
|
145
|
-
end
|
146
|
-
|
147
|
-
def reboot_droplet(droplet_name)
|
148
|
-
droplet_id = get_droplet_id_by_name(droplet_name)
|
149
|
-
client.droplet_actions.reboot(droplet_id: droplet_id)
|
150
|
-
wait_until_droplet_have_status(droplet_name)
|
151
|
-
end
|
152
|
-
|
82
|
+
# Destroy droplet by name
|
83
|
+
# @param droplet_name [String] name of droplet
|
84
|
+
# @return [Symbol] Droplet status after destruction
|
153
85
|
def destroy_droplet_by_name(droplet_name = 'nct-at1')
|
154
86
|
droplet_id = get_droplet_id_by_name(droplet_name)
|
155
87
|
client.droplets.delete(id: droplet_id)
|
156
|
-
|
88
|
+
logger.info("destroy_droplet_by_name(#{droplet_name})")
|
157
89
|
wait_until_droplet_have_status(droplet_name, nil)
|
158
90
|
end
|
159
|
-
|
160
|
-
# Read access token from file system
|
161
|
-
# @return [String] token
|
162
|
-
def self.read_token
|
163
|
-
return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_TOKEN']
|
164
|
-
File.read(Dir.home + '/.do/access_token').delete("\n")
|
165
|
-
rescue Errno::ENOENT
|
166
|
-
raise Errno::ENOENT, "No access token found in #{Dir.home}/.do/ directory." \
|
167
|
-
"Please create files #{Dir.home}/.do/access_token"
|
168
|
-
end
|
169
91
|
end
|
170
92
|
end
|
@@ -1,5 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module OnlyofficeDigitaloceanWrapper
|
2
4
|
# Class raised if image with name is not found
|
3
5
|
class DigitalOceanImageNotFound < StandardError
|
4
6
|
end
|
7
|
+
|
8
|
+
# Class raised if droplet size is not supported
|
9
|
+
class DigitalOceanSizeNotSupported < StandardError
|
10
|
+
end
|
11
|
+
|
12
|
+
# Class raised if droplet opertaion is timeout
|
13
|
+
class DropletOperationTimeout < StandardError
|
14
|
+
end
|
5
15
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeDigitaloceanWrapper
|
4
|
+
# Module to ignore DigitalOcean exception if they happen irregularly
|
5
|
+
module ExceptionsRetryer
|
6
|
+
# Retry if exception happened
|
7
|
+
# @param exception [Exception] exception to retry
|
8
|
+
# @param retries [Integer] how much to retry
|
9
|
+
# @param timeout [Integer] wait until next retry
|
10
|
+
def retry_exception(exception = DropletKit::Error,
|
11
|
+
retries: 5,
|
12
|
+
timeout: 10)
|
13
|
+
try = 0
|
14
|
+
begin
|
15
|
+
yield
|
16
|
+
rescue exception => e
|
17
|
+
try += 1
|
18
|
+
logger.error("Error '#{exception}, #{e}' happened during "\
|
19
|
+
"operation. Retrying #{try} of #{retries}")
|
20
|
+
sleep timeout # Time to cooldown error
|
21
|
+
try <= retries ? retry : raise
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeDigitaloceanWrapper
|
4
|
+
# Get image, droplet by metadata
|
5
|
+
module Getters
|
6
|
+
def get_image_id_by_name(image_name)
|
7
|
+
all_droplets = @client.images.all
|
8
|
+
image = all_droplets.find { |x| x.name == image_name }
|
9
|
+
raise DigitalOceanImageNotFound, image_name if image.nil?
|
10
|
+
|
11
|
+
logger.info("get_image_id_by_name(#{image_name}): #{image.id}")
|
12
|
+
image.id
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get droplet by its name
|
16
|
+
# @param [String] droplet_name
|
17
|
+
# @return [DropletKit::Droplet] droplet
|
18
|
+
def droplet_by_name(droplet_name)
|
19
|
+
retry_exception do
|
20
|
+
droplets = @client.droplets.all
|
21
|
+
droplets.find { |x| x.name == droplet_name }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Return droplet id by it's name
|
26
|
+
# @param droplet_name [String] name of droplet
|
27
|
+
# @return [Integer] id of droplet
|
28
|
+
def get_droplet_id_by_name(droplet_name)
|
29
|
+
droplet = droplet_by_name(droplet_name)
|
30
|
+
if droplet.nil?
|
31
|
+
logger.info("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
|
32
|
+
nil
|
33
|
+
else
|
34
|
+
logger.info("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
|
35
|
+
droplet.id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Return droplet ip by it's name
|
40
|
+
# @param droplet_name [String] name of droplet
|
41
|
+
# @return [String] ip of droplet
|
42
|
+
def get_droplet_ip_by_name(droplet_name)
|
43
|
+
droplet = droplet_by_name(droplet_name)
|
44
|
+
if droplet.nil?
|
45
|
+
logger.info("There is no created droplet with name: #{droplet_name}")
|
46
|
+
return
|
47
|
+
end
|
48
|
+
retry_exception do
|
49
|
+
ip = public_ip(droplet)
|
50
|
+
logger.info("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
|
51
|
+
ip
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Return droplet status by it's name
|
56
|
+
# @param droplet_name [String] name of droplet
|
57
|
+
# @return [Symbol] droplet status
|
58
|
+
def get_droplet_status_by_name(droplet_name)
|
59
|
+
droplet = droplet_by_name(droplet_name)
|
60
|
+
if droplet.nil?
|
61
|
+
logger.info("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
|
62
|
+
nil
|
63
|
+
else
|
64
|
+
retry_exception do
|
65
|
+
status = droplet.status
|
66
|
+
status = :locked if droplet.locked
|
67
|
+
logger.info("get_droplet_status_by_name(#{droplet_name}): #{status}")
|
68
|
+
status
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# Get public ip of droplet
|
74
|
+
# @param [DropletKit] droplet to get ip
|
75
|
+
# @return [String] public ip
|
76
|
+
def public_ip(droplet)
|
77
|
+
networks = droplet.networks.to_a.first
|
78
|
+
public_network = networks.find { |net| net.type == 'public' }
|
79
|
+
public_network.ip_address
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module OnlyofficeDigitaloceanWrapper
|
6
|
+
# Logger module for logging stuff
|
7
|
+
module LoggerWrapper
|
8
|
+
# @return [Logger] default logger
|
9
|
+
def logger
|
10
|
+
@logger ||= Logger.new($stdout)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeDigitaloceanWrapper
|
4
|
+
# Actions with power (turn on/off, reboot)
|
5
|
+
module PowerActions
|
6
|
+
# Turn off droplet
|
7
|
+
# @param droplet_name [String] droplet to turn off
|
8
|
+
# @return [Symbol] droplet result status
|
9
|
+
def power_off_droplet(droplet_name)
|
10
|
+
droplet_id = get_droplet_id_by_name(droplet_name)
|
11
|
+
client.droplet_actions.power_off(droplet_id: droplet_id)
|
12
|
+
wait_until_droplet_have_status(droplet_name, 'off')
|
13
|
+
end
|
14
|
+
|
15
|
+
# Turn on droplet
|
16
|
+
# @param droplet_name [String] droplet to turn on
|
17
|
+
# @return [Symbol] droplet result status
|
18
|
+
def power_on_droplet(droplet_name)
|
19
|
+
droplet_id = get_droplet_id_by_name(droplet_name)
|
20
|
+
client.droplet_actions.power_on(droplet_id: droplet_id)
|
21
|
+
wait_until_droplet_have_status(droplet_name)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Reboot droplet
|
25
|
+
# @param droplet_name [String] droplet to reboot
|
26
|
+
# @return [Symbol] droplet result status
|
27
|
+
def reboot_droplet(droplet_name)
|
28
|
+
droplet_id = get_droplet_id_by_name(droplet_name)
|
29
|
+
client.droplet_actions.reboot(droplet_id: droplet_id)
|
30
|
+
wait_until_droplet_have_status(droplet_name)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module OnlyofficeDigitaloceanWrapper
|
4
|
+
# Methods to login in account
|
5
|
+
module TokenMethods
|
6
|
+
# Check if access token is correct
|
7
|
+
# @return [true, false] result of check
|
8
|
+
def correct_access_token?
|
9
|
+
begin
|
10
|
+
@client.droplets.all.first
|
11
|
+
rescue DropletKit::Error
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
true
|
15
|
+
end
|
16
|
+
|
17
|
+
# Read access token from file system
|
18
|
+
# @param token_file_path [String] path to token
|
19
|
+
# @param force_file_read [True, False] should read from file be forced
|
20
|
+
# @return [String] token
|
21
|
+
def read_token(token_file_path: "#{Dir.home}/.do/access_token",
|
22
|
+
force_file_read: false)
|
23
|
+
return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_TOKEN'] && !force_file_read
|
24
|
+
|
25
|
+
File.read(token_file_path).delete("\n")
|
26
|
+
rescue Errno::ENOENT
|
27
|
+
raise Errno::ENOENT, "No access token found in #{token_file_path}. " \
|
28
|
+
"Please create file #{token_file_path} with token"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
metadata
CHANGED
@@ -1,58 +1,157 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: onlyoffice_digitalocean_wrapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- ONLYOFFICE
|
7
8
|
- Pavel Lobashov
|
8
9
|
- Oleg Nazarov
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2021-02-12 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
+
name: droplet_kit
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
19
|
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
21
|
+
version: '3'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
26
|
- - "~>"
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
28
|
+
version: '3'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
+
name: codecov
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
33
|
- - "~>"
|
33
34
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
35
|
-
type: :
|
35
|
+
version: '0'
|
36
|
+
type: :development
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
40
|
- - "~>"
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
42
|
+
version: '0'
|
42
43
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
44
|
+
name: overcommit
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
|
-
- -
|
47
|
+
- - "~>"
|
47
48
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
-
type: :
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
|
-
- -
|
54
|
+
- - "~>"
|
54
55
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rake
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '13.0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '13.0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rspec
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '3'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '3'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: rubocop
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: 0.49.0
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: 0.49.0
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: rubocop-performance
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - "~>"
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '1'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - "~>"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '1'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rubocop-rake
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - "~>"
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: rubocop-rspec
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - "~>"
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '2'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - "~>"
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '2'
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: yard
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 0.9.20
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - ">="
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 0.9.20
|
56
155
|
description: Wrapper gem for DigitalOcean. Use in testing projects
|
57
156
|
email:
|
58
157
|
- shockwavenn@gmail.com
|
@@ -61,15 +160,24 @@ executables: []
|
|
61
160
|
extensions: []
|
62
161
|
extra_rdoc_files: []
|
63
162
|
files:
|
64
|
-
- README.md
|
65
163
|
- lib/onlyoffice_digitalocean_wrapper.rb
|
66
164
|
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper.rb
|
67
165
|
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/digitalocean_exceptions.rb
|
166
|
+
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/exceptions_retryer.rb
|
167
|
+
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/getters.rb
|
168
|
+
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/logger_wrapper.rb
|
169
|
+
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/power_actions.rb
|
170
|
+
- lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/token_methods.rb
|
68
171
|
- lib/onlyoffice_digitalocean_wrapper/version.rb
|
69
|
-
homepage: https://github.com/
|
172
|
+
homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
|
70
173
|
licenses:
|
71
174
|
- AGPL-3.0
|
72
|
-
metadata:
|
175
|
+
metadata:
|
176
|
+
bug_tracker_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/issues
|
177
|
+
changelog_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/blob/master/CHANGELOG.md
|
178
|
+
documentation_uri: https://www.rubydoc.info/gems/onlyoffice_digitalocean_wrapper
|
179
|
+
homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
|
180
|
+
source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
|
73
181
|
post_install_message:
|
74
182
|
rdoc_options: []
|
75
183
|
require_paths:
|
@@ -78,15 +186,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
78
186
|
requirements:
|
79
187
|
- - ">="
|
80
188
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
189
|
+
version: '2.5'
|
82
190
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
191
|
requirements:
|
84
192
|
- - ">="
|
85
193
|
- !ruby/object:Gem::Version
|
86
194
|
version: '0'
|
87
195
|
requirements: []
|
88
|
-
|
89
|
-
rubygems_version: 2.5.1
|
196
|
+
rubygems_version: 3.2.9
|
90
197
|
signing_key:
|
91
198
|
specification_version: 4
|
92
199
|
summary: Wrapper gem for DigitalOcean
|
data/README.md
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
# OnlyofficeDigitaloceanWrapper
|
2
|
-
|
3
|
-
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library
|
4
|
-
into a gem. Put your Ruby code in the file `lib/onlyoffice_digitalocean_wrapper`. To experiment with that code, run
|
5
|
-
`bin/console` for an interactive prompt.
|
6
|
-
|
7
|
-
TODO: Delete this and the text above, and describe your gem
|
8
|
-
|
9
|
-
## Installation
|
10
|
-
|
11
|
-
Add this line to your application's Gemfile:
|
12
|
-
|
13
|
-
```ruby
|
14
|
-
gem 'onlyoffice_digitalocean_wrapper'
|
15
|
-
```
|
16
|
-
|
17
|
-
And then execute:
|
18
|
-
|
19
|
-
$ bundle
|
20
|
-
|
21
|
-
Or install it yourself as:
|
22
|
-
|
23
|
-
$ gem install onlyoffice_digitalocean_wrapper
|
24
|
-
|
25
|
-
## Usage
|
26
|
-
|
27
|
-
TODO: Write usage instructions here
|
28
|
-
|
29
|
-
## Development
|
30
|
-
|
31
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests.
|
32
|
-
You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
33
|
-
|
34
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update
|
35
|
-
the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for
|
36
|
-
the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
37
|
-
|
38
|
-
## Contributing
|
39
|
-
|
40
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/onlyoffice_digitalocean_wrapper.
|
41
|
-
|