onlyoffice_digitalocean_wrapper 0.4.1 → 0.8.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: 0756716e26a6789e98ffc4a22d58cb04587a93536680b183e600c233ae313dc8
4
- data.tar.gz: de4e2ef86ffac922ad2c44d65e8034320db3f18137d2a64d491e7314cdcb9413
3
+ metadata.gz: 0b5f288d8ace3eb4b4233a65a15ad7205c993361a5218939ecae254902e57d39
4
+ data.tar.gz: 987062f1ec25e58d45c5c0fadfdd672ac7f4a9908a4b0563be2e000051dca0d2
5
5
  SHA512:
6
- metadata.gz: 2d9c8941038d5e597f50fdce3d210f52d1902377b02e6c37c7b3f7fc6ac177de27d000f6da7edb28548d41029347694ada56467412746ac41a16368d1c892894
7
- data.tar.gz: 101b02d252365ea34d1888e0452c7ce49bdf0e3f640e4566d322a52c28fe463b4af3e9b277a8266d7e111cc2c39dd7f4887c3b045b896f35c19ed1d579c2025b
6
+ metadata.gz: 8780c445ee63541b12093435e816a555c05e6d9afeac0244cbb95d88b73b8d5a41b3c4567645ffee12340cfad00ddd1f8a7b2c0c85bfecb7500a292080c0e5e8
7
+ data.tar.gz: a73c0ce3bfde1c16ad9b96b90ec2cf6a5f4b53dc573ff228930d8f680309a0801c008cb26e473eb4cad194730757a5055ec93a3043137070813b8ec3bd671bdf
@@ -15,8 +15,8 @@ module OnlyofficeDigitaloceanWrapper
15
15
  yield
16
16
  rescue exception => e
17
17
  try += 1
18
- OnlyofficeLoggerHelper.log("Error '#{exception}, #{e}' happened during "\
19
- "operation. Retrying #{try} of #{retries}")
18
+ logger.error("Error '#{exception}, #{e}' happened during "\
19
+ "operation. Retrying #{try} of #{retries}")
20
20
  sleep timeout # Time to cooldown error
21
21
  try <= retries ? retry : raise
22
22
  end
@@ -8,7 +8,7 @@ module OnlyofficeDigitaloceanWrapper
8
8
  image = all_droplets.find { |x| x.name == image_name }
9
9
  raise DigitalOceanImageNotFound, image_name if image.nil?
10
10
 
11
- OnlyofficeLoggerHelper.log("get_image_id_by_name(#{image_name}): #{image.id}")
11
+ logger.info("get_image_id_by_name(#{image_name}): #{image.id}")
12
12
  image.id
13
13
  end
14
14
 
@@ -22,40 +22,73 @@ module OnlyofficeDigitaloceanWrapper
22
22
  end
23
23
  end
24
24
 
25
+ # Get project by name
26
+ # @param [String] project_name
27
+ # @return [DropletKit::Project] object representing a project
28
+ def project_by_name(project_name)
29
+ retry_exception do
30
+ projects = @client.projects.all
31
+ projects.find { |x| x.name == project_name }
32
+ end
33
+ end
34
+
35
+ # Get project id by name
36
+ # @param [String] project_name
37
+ # @return [nil, String] id of current project or nil is no project found
38
+ def get_project_id_by_name(project_name)
39
+ project = project_by_name(project_name)
40
+ if project.nil?
41
+ logger.info("get_project_id_by_name(#{project_name}): not found any projects")
42
+ nil
43
+ else
44
+ logger.info("get_project_id_by_name(#{project_name}): #{project.id}")
45
+ project.id
46
+ end
47
+ end
48
+
49
+ # Return droplet id by it's name
50
+ # @param droplet_name [String] name of droplet
51
+ # @return [nil, Integer] id of droplet or nil is no one droplet found
25
52
  def get_droplet_id_by_name(droplet_name)
26
53
  droplet = droplet_by_name(droplet_name)
27
54
  if droplet.nil?
28
- OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
55
+ logger.info("get_droplet_id_by_name(#{droplet_name}): not found any droplets")
29
56
  nil
30
57
  else
31
- OnlyofficeLoggerHelper.log("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
58
+ logger.info("get_droplet_id_by_name(#{droplet_name}): #{droplet.id}")
32
59
  droplet.id
33
60
  end
34
61
  end
35
62
 
63
+ # Return droplet ip by it's name
64
+ # @param droplet_name [String] name of droplet
65
+ # @return [String] ip of droplet
36
66
  def get_droplet_ip_by_name(droplet_name)
37
67
  droplet = droplet_by_name(droplet_name)
38
68
  if droplet.nil?
39
- OnlyofficeLoggerHelper.log("There is no created droplet with name: #{droplet_name}")
69
+ logger.info("There is no created droplet with name: #{droplet_name}")
40
70
  return
41
71
  end
42
72
  retry_exception do
43
73
  ip = public_ip(droplet)
44
- OnlyofficeLoggerHelper.log("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
74
+ logger.info("get_droplet_ip_by_name(#{droplet_name}): #{ip}")
45
75
  ip
46
76
  end
47
77
  end
48
78
 
79
+ # Return droplet status by it's name
80
+ # @param droplet_name [String] name of droplet
81
+ # @return [Symbol] droplet status
49
82
  def get_droplet_status_by_name(droplet_name)
50
83
  droplet = droplet_by_name(droplet_name)
51
84
  if droplet.nil?
52
- OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
85
+ logger.info("get_droplet_status_by_name(#{droplet_name}): not found any droplets")
53
86
  nil
54
87
  else
55
88
  retry_exception do
56
89
  status = droplet.status
57
90
  status = :locked if droplet.locked
58
- OnlyofficeLoggerHelper.log("get_droplet_status_by_name(#{droplet_name}): #{status}")
91
+ logger.info("get_droplet_status_by_name(#{droplet_name}): #{status}")
59
92
  status
60
93
  end
61
94
  end
@@ -66,7 +99,7 @@ module OnlyofficeDigitaloceanWrapper
66
99
  # @return [String] public ip
67
100
  def public_ip(droplet)
68
101
  networks = droplet.networks.to_a.first
69
- public_network = networks.find { |net| net.type == 'public'}
102
+ public_network = networks.find { |net| net.type == 'public' }
70
103
  public_network.ip_address
71
104
  end
72
105
  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
@@ -3,18 +3,27 @@
3
3
  module OnlyofficeDigitaloceanWrapper
4
4
  # Actions with power (turn on/off, reboot)
5
5
  module PowerActions
6
+ # Turn off droplet
7
+ # @param droplet_name [String] droplet to turn off
8
+ # @return [Symbol] droplet result status
6
9
  def power_off_droplet(droplet_name)
7
10
  droplet_id = get_droplet_id_by_name(droplet_name)
8
11
  client.droplet_actions.power_off(droplet_id: droplet_id)
9
12
  wait_until_droplet_have_status(droplet_name, 'off')
10
13
  end
11
14
 
15
+ # Turn on droplet
16
+ # @param droplet_name [String] droplet to turn on
17
+ # @return [Symbol] droplet result status
12
18
  def power_on_droplet(droplet_name)
13
19
  droplet_id = get_droplet_id_by_name(droplet_name)
14
20
  client.droplet_actions.power_on(droplet_id: droplet_id)
15
21
  wait_until_droplet_have_status(droplet_name)
16
22
  end
17
23
 
24
+ # Reboot droplet
25
+ # @param droplet_name [String] droplet to reboot
26
+ # @return [Symbol] droplet result status
18
27
  def reboot_droplet(droplet_name)
19
28
  droplet_id = get_droplet_id_by_name(droplet_name)
20
29
  client.droplet_actions.reboot(droplet_id: droplet_id)
@@ -15,14 +15,17 @@ module OnlyofficeDigitaloceanWrapper
15
15
  end
16
16
 
17
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
18
20
  # @return [String] token
19
- def read_token
20
- return ENV['DO_ACCESS_TOKEN'] if ENV['DO_ACCESS_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
21
24
 
22
- File.read(Dir.home + '/.do/access_token').delete("\n")
25
+ File.read(token_file_path).delete("\n")
23
26
  rescue Errno::ENOENT
24
- raise Errno::ENOENT, "No access token found in #{Dir.home}/.do/ directory." \
25
- "Please create files #{Dir.home}/.do/access_token"
27
+ raise Errno::ENOENT, "No access token found in #{token_file_path}. " \
28
+ "Please create file #{token_file_path} with token"
26
29
  end
27
30
  end
28
31
  end
@@ -1,21 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'droplet_kit'
4
- require 'onlyoffice_logger_helper'
5
4
  require_relative 'digitalocean_wrapper/digitalocean_exceptions'
6
5
  require_relative 'digitalocean_wrapper/exceptions_retryer'
7
6
  require_relative 'digitalocean_wrapper/getters'
7
+ require_relative 'digitalocean_wrapper/logger_wrapper'
8
8
  require_relative 'digitalocean_wrapper/power_actions'
9
9
  require_relative 'digitalocean_wrapper/token_methods'
10
10
 
11
+ # Namespace for this gem
11
12
  module OnlyofficeDigitaloceanWrapper
12
13
  # Class for wrapping DigitalOcean API gem
13
14
  class DigitalOceanWrapper
14
15
  include Getters
16
+ include LoggerWrapper
15
17
  include ExceptionsRetryer
16
18
  include PowerActions
17
19
  include TokenMethods
18
20
 
21
+ # @return [Array<String>] list of allowed droplet sizes
19
22
  DROPLET_SIZES = %w[512mb 1gb 2gb 4gb 8gb 16gb 32gb 48gb 64gb].freeze
20
23
  attr_accessor :client
21
24
 
@@ -25,20 +28,32 @@ module OnlyofficeDigitaloceanWrapper
25
28
  raise ArgumentError, 'DigitalOceanWrapper: Your Access Token is Incorrect' unless correct_access_token?
26
29
  end
27
30
 
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
28
36
  def wait_until_droplet_have_status(droplet_name, status = 'active', params = {})
29
37
  timeout = params.fetch(:timeout, 300)
30
38
  counter = 0
31
39
  while get_droplet_status_by_name(droplet_name) != status && counter < timeout
32
40
  counter += 10
33
41
  sleep 10
34
- OnlyofficeLoggerHelper.log("waiting for droplet (#{droplet_name}) to have "\
35
- "status: #{status} for #{counter} seconds of #{timeout}")
42
+ logger.info("waiting for droplet (#{droplet_name}) to have "\
43
+ "status: #{status} for #{counter} seconds of #{timeout}")
36
44
  end
37
45
  raise DropletOperationTimeout, "#{droplet_name} was not #{status} for #{timeout}s" if counter >= timeout
38
46
 
39
47
  get_droplet_status_by_name(droplet_name)
40
48
  end
41
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
42
57
  def restore_image_by_name(image_name = 'nct-at-stable',
43
58
  droplet_name = image_name,
44
59
  region = 'nyc3',
@@ -56,7 +71,7 @@ module OnlyofficeDigitaloceanWrapper
56
71
  monitoring: true,
57
72
  size: size)
58
73
  created = @client.droplets.create(droplet)
59
- OnlyofficeLoggerHelper.log("restore_image_by_name(#{image_name}, #{droplet_name})")
74
+ logger.info("restore_image_by_name(#{image_name}, #{droplet_name})")
60
75
  if created.is_a?(String)
61
76
  raise "Problem, while creating '#{droplet_name}' from image '#{image_name}'\n" \
62
77
  "Error: #{created}"
@@ -64,10 +79,13 @@ module OnlyofficeDigitaloceanWrapper
64
79
  created
65
80
  end
66
81
 
82
+ # Destroy droplet by name
83
+ # @param droplet_name [String] name of droplet
84
+ # @return [Symbol] Droplet status after destruction
67
85
  def destroy_droplet_by_name(droplet_name = 'nct-at1')
68
86
  droplet_id = get_droplet_id_by_name(droplet_name)
69
87
  client.droplets.delete(id: droplet_id)
70
- OnlyofficeLoggerHelper.log("destroy_droplet_by_name(#{droplet_name})")
88
+ logger.info("destroy_droplet_by_name(#{droplet_name})")
71
89
  wait_until_droplet_have_status(droplet_name, nil)
72
90
  end
73
91
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OnlyofficeDigitaloceanWrapper
4
+ # Class raised if droplet ssh is not up for defined timeout
5
+ class SshCheckerSshUpTimeout < StandardError
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net-telnet'
4
+
5
+ require_relative 'ssh_checker/ssh_checker_exceptions'
6
+
7
+ module OnlyofficeDigitaloceanWrapper
8
+ # Class for check if ssh can be connected
9
+ class SshChecker
10
+ include LoggerWrapper
11
+ # @return [String] ip of server
12
+ attr_reader :ip
13
+
14
+ # @param ip [String] ip of server to check
15
+ def initialize(ip)
16
+ @ip = ip
17
+ end
18
+
19
+ # Wait until ssh server on server is up and available for connection
20
+ # @param timeout [Integer] how much we should wait for connection
21
+ # @return [void]
22
+ def wait_until_ssh_up(timeout: 60)
23
+ wait_between_tries = 5
24
+ tries = timeout / wait_between_tries
25
+ tries.times do |try|
26
+ if ssh_up?
27
+ logger.info("SSH on `#{@ip}` is up. Waiting finished")
28
+ return true
29
+ end
30
+
31
+ logger.info("SSH on `#{@ip}` is not up. Waited for #{try * wait_between_tries} seconds of #{timeout}")
32
+ sleep wait_between_tries
33
+ end
34
+ raise SshCheckerSshUpTimeout, "SSH on `#{@ip}` is not up for #{timeout} seconds. Could not proceed"
35
+ end
36
+
37
+ # Check is ssh available for connection right now
38
+ # @return [Boolean]
39
+ def ssh_up?
40
+ Net::Telnet.new('Host' => @ip,
41
+ 'Timeout' => 1,
42
+ 'Port' => 22)
43
+ true
44
+ rescue StandardError
45
+ false
46
+ end
47
+ end
48
+ end
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OnlyofficeDigitaloceanWrapper
4
- VERSION = '0.4.1'
4
+ # @return [String] version of gem
5
+ VERSION = '0.8.0'
6
+ # @return [String] name of gem
5
7
  NAME = 'onlyoffice_digitalocean_wrapper'
6
8
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'onlyoffice_digitalocean_wrapper/digitalocean_wrapper'
4
+ require_relative 'onlyoffice_digitalocean_wrapper/ssh_checker'
4
5
  require_relative 'onlyoffice_digitalocean_wrapper/version'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: onlyoffice_digitalocean_wrapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ONLYOFFICE
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-10-05 00:00:00.000000000 Z
13
+ date: 2021-09-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: droplet_kit
@@ -27,19 +27,47 @@ dependencies:
27
27
  - !ruby/object:Gem::Version
28
28
  version: '3'
29
29
  - !ruby/object:Gem::Dependency
30
- name: onlyoffice_logger_helper
30
+ name: net-telnet
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
33
  - - "~>"
34
34
  - !ruby/object:Gem::Version
35
- version: '1'
35
+ version: '0'
36
36
  type: :runtime
37
37
  prerelease: false
38
38
  version_requirements: !ruby/object:Gem::Requirement
39
39
  requirements:
40
40
  - - "~>"
41
41
  - !ruby/object:Gem::Version
42
- version: '1'
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: codecov
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: overcommit
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
43
71
  - !ruby/object:Gem::Dependency
44
72
  name: rake
45
73
  requirement: !ruby/object:Gem::Requirement
@@ -54,6 +82,90 @@ dependencies:
54
82
  - - "~>"
55
83
  - !ruby/object:Gem::Version
56
84
  version: '13.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: rspec
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '3'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '3'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rubocop
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 0.49.0
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ version: 0.49.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: rubocop-performance
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '1'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '1'
127
+ - !ruby/object:Gem::Dependency
128
+ name: rubocop-rake
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: rubocop-rspec
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '2'
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '2'
155
+ - !ruby/object:Gem::Dependency
156
+ name: yard
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ version: 0.9.20
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ">="
167
+ - !ruby/object:Gem::Version
168
+ version: 0.9.20
57
169
  description: Wrapper gem for DigitalOcean. Use in testing projects
58
170
  email:
59
171
  - shockwavenn@gmail.com
@@ -67,18 +179,21 @@ files:
67
179
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/digitalocean_exceptions.rb
68
180
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/exceptions_retryer.rb
69
181
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/getters.rb
182
+ - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/logger_wrapper.rb
70
183
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/power_actions.rb
71
184
  - lib/onlyoffice_digitalocean_wrapper/digitalocean_wrapper/token_methods.rb
185
+ - lib/onlyoffice_digitalocean_wrapper/ssh_checker.rb
186
+ - lib/onlyoffice_digitalocean_wrapper/ssh_checker/ssh_checker_exceptions.rb
72
187
  - lib/onlyoffice_digitalocean_wrapper/version.rb
73
- homepage: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
188
+ homepage: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
74
189
  licenses:
75
190
  - AGPL-3.0
76
191
  metadata:
77
- bug_tracker_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper/issues
78
- changelog_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper/blob/master/CHANGELOG.md
192
+ bug_tracker_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/issues
193
+ changelog_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper/blob/master/CHANGELOG.md
79
194
  documentation_uri: https://www.rubydoc.info/gems/onlyoffice_digitalocean_wrapper
80
- homepage_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
81
- source_code_uri: https://github.com/onlyoffice-testing-robot/onlyoffice_digitalocean_wrapper
195
+ homepage_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
196
+ source_code_uri: https://github.com/ONLYOFFICE-QA/onlyoffice_digitalocean_wrapper
82
197
  post_install_message:
83
198
  rdoc_options: []
84
199
  require_paths:
@@ -87,14 +202,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
202
  requirements:
88
203
  - - ">="
89
204
  - !ruby/object:Gem::Version
90
- version: '2.3'
205
+ version: '2.5'
91
206
  required_rubygems_version: !ruby/object:Gem::Requirement
92
207
  requirements:
93
208
  - - ">="
94
209
  - !ruby/object:Gem::Version
95
210
  version: '0'
96
211
  requirements: []
97
- rubygems_version: 3.1.4
212
+ rubygems_version: 3.2.27
98
213
  signing_key:
99
214
  specification_version: 4
100
215
  summary: Wrapper gem for DigitalOcean