squarecloud-unofficial 1.0.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 +7 -0
- data/LICENSE +20 -0
- data/README.md +169 -0
- data/bin/console +7 -0
- data/lib/squarecloud/application.rb +146 -0
- data/lib/squarecloud/http/client.rb +274 -0
- data/lib/squarecloud/http/endpoint.rb +158 -0
- data/lib/squarecloud/models.rb +419 -0
- data/lib/squarecloud/version.rb +3 -0
- data/lib/squarecloud.rb +331 -0
- metadata +167 -0
@@ -0,0 +1,158 @@
|
|
1
|
+
module Squarecloud
|
2
|
+
module HTTP
|
3
|
+
class Endpoint
|
4
|
+
ENDPOINTS = {
|
5
|
+
'USER' => { 'METHOD' => 'GET', 'PATH' => '/users/me' },
|
6
|
+
'APP_DATA' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}' },
|
7
|
+
'APP_STATUS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/status' },
|
8
|
+
'ALL_APPS_STATUS' => { 'METHOD' => 'GET', 'PATH' => '/apps/status' },
|
9
|
+
'ALL_BACKUPS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/backups' },
|
10
|
+
'LOGS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/logs' },
|
11
|
+
'START' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/start' },
|
12
|
+
'STOP' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/stop' },
|
13
|
+
'RESTART' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/restart' },
|
14
|
+
'BACKUP' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/backups' },
|
15
|
+
'COMMIT' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/commit' },
|
16
|
+
'DELETE_APP' => { 'METHOD' => 'DELETE', 'PATH' => '/apps/{app_id}' },
|
17
|
+
'UPLOAD_APP' => { 'METHOD' => 'POST', 'PATH' => '/apps' },
|
18
|
+
'FILES_LIST' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/files?path={path}' },
|
19
|
+
'FILES_READ' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/files/content?path={path}' },
|
20
|
+
'FILES_CREATE' => { 'METHOD' => 'PUT', 'PATH' => '/apps/{app_id}/files' },
|
21
|
+
'FILES_DELETE' => { 'METHOD' => 'DELETE', 'PATH' => '/apps/{app_id}/files' },
|
22
|
+
'MOVE_FILE' => { 'METHOD' => 'PATCH', 'PATH' => '/apps/{app_id}/files' },
|
23
|
+
'LAST_DEPLOYS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/deployments' },
|
24
|
+
'CURRENT_INTEGRATION' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/deployments/current' },
|
25
|
+
'GITHUB_INTEGRATION' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/deploy/webhook' },
|
26
|
+
'CUSTOM_DOMAIN' => { 'METHOD' => 'POST', 'PATH' => '/apps/{app_id}/network/custom' },
|
27
|
+
'DOMAIN_ANALYTICS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/network/analytics' },
|
28
|
+
'DNSRECORDS' => { 'METHOD' => 'GET', 'PATH' => '/apps/{app_id}/network/dns' }
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
attr_reader :name, :method, :path
|
32
|
+
|
33
|
+
def initialize(name)
|
34
|
+
endpoint = ENDPOINTS[name]
|
35
|
+
raise ArgumentError, "Invalid endpoint: '
|
36
|
+
|
37
|
+
@name = name
|
38
|
+
@method = endpoint['METHOD']
|
39
|
+
@path = endpoint['PATH']
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_path(params = {})
|
43
|
+
path = @path.dup
|
44
|
+
params.each do |key, value|
|
45
|
+
placeholder = "{
|
46
|
+
path = path.gsub(placeholder, value.to_s) if path.include?(placeholder)
|
47
|
+
end
|
48
|
+
path
|
49
|
+
end
|
50
|
+
|
51
|
+
def ==(other)
|
52
|
+
other.is_a?(Endpoint) && @name == other.name
|
53
|
+
end
|
54
|
+
|
55
|
+
def to_s
|
56
|
+
"Endpoint('
|
57
|
+
end
|
58
|
+
|
59
|
+
class << self
|
60
|
+
def user
|
61
|
+
new('USER')
|
62
|
+
end
|
63
|
+
|
64
|
+
def app_data
|
65
|
+
new('APP_DATA')
|
66
|
+
end
|
67
|
+
|
68
|
+
def app_status
|
69
|
+
new('APP_STATUS')
|
70
|
+
end
|
71
|
+
|
72
|
+
def logs
|
73
|
+
new('LOGS')
|
74
|
+
end
|
75
|
+
|
76
|
+
def start
|
77
|
+
new('START')
|
78
|
+
end
|
79
|
+
|
80
|
+
def stop
|
81
|
+
new('STOP')
|
82
|
+
end
|
83
|
+
|
84
|
+
def restart
|
85
|
+
new('RESTART')
|
86
|
+
end
|
87
|
+
|
88
|
+
def backup
|
89
|
+
new('BACKUP')
|
90
|
+
end
|
91
|
+
|
92
|
+
def commit
|
93
|
+
new('COMMIT')
|
94
|
+
end
|
95
|
+
|
96
|
+
def delete_app
|
97
|
+
new('DELETE_APP')
|
98
|
+
end
|
99
|
+
|
100
|
+
def upload
|
101
|
+
new('UPLOAD_APP')
|
102
|
+
end
|
103
|
+
|
104
|
+
def files_list
|
105
|
+
new('FILES_LIST')
|
106
|
+
end
|
107
|
+
|
108
|
+
def files_read
|
109
|
+
new('FILES_READ')
|
110
|
+
end
|
111
|
+
|
112
|
+
def files_create
|
113
|
+
new('FILES_CREATE')
|
114
|
+
end
|
115
|
+
|
116
|
+
def files_delete
|
117
|
+
new('FILES_DELETE')
|
118
|
+
end
|
119
|
+
|
120
|
+
def last_deploys
|
121
|
+
new('LAST_DEPLOYS')
|
122
|
+
end
|
123
|
+
|
124
|
+
def github_integration
|
125
|
+
new('GITHUB_INTEGRATION')
|
126
|
+
end
|
127
|
+
|
128
|
+
def domain_analytics
|
129
|
+
new('DOMAIN_ANALYTICS')
|
130
|
+
end
|
131
|
+
|
132
|
+
def custom_domain
|
133
|
+
new('CUSTOM_DOMAIN')
|
134
|
+
end
|
135
|
+
|
136
|
+
def all_backups
|
137
|
+
new('ALL_BACKUPS')
|
138
|
+
end
|
139
|
+
|
140
|
+
def all_apps_status
|
141
|
+
new('ALL_APPS_STATUS')
|
142
|
+
end
|
143
|
+
|
144
|
+
def current_integration
|
145
|
+
new('CURRENT_INTEGRATION')
|
146
|
+
end
|
147
|
+
|
148
|
+
def move_file
|
149
|
+
new('MOVE_FILE')
|
150
|
+
end
|
151
|
+
|
152
|
+
def dns_records
|
153
|
+
new('DNSRECORDS')
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
@@ -0,0 +1,419 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Squarecloud
|
4
|
+
class PlanData
|
5
|
+
attr_reader :name, :memory, :duration
|
6
|
+
|
7
|
+
def initialize(data)
|
8
|
+
return unless data.is_a?(Hash)
|
9
|
+
|
10
|
+
@name = data[:name]
|
11
|
+
@memory = data[:memory]
|
12
|
+
@duration = data[:duration]
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_h
|
16
|
+
{
|
17
|
+
name: @name,
|
18
|
+
memory: @memory,
|
19
|
+
duration: @duration
|
20
|
+
}
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Language
|
25
|
+
attr_reader :name, :version
|
26
|
+
|
27
|
+
def initialize(data)
|
28
|
+
return unless data.is_a?(Hash)
|
29
|
+
|
30
|
+
@name = data[:name]
|
31
|
+
@version = data[:version]
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_h
|
35
|
+
{
|
36
|
+
name: @name,
|
37
|
+
version: @version
|
38
|
+
}
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class StatusData
|
43
|
+
attr_reader :cpu, :ram, :status, :running, :storage, :network, :requests, :uptime, :time
|
44
|
+
|
45
|
+
def initialize(data)
|
46
|
+
return unless data.is_a?(Hash)
|
47
|
+
|
48
|
+
@cpu = data[:cpu]
|
49
|
+
@ram = data[:ram]
|
50
|
+
@status = data[:status]
|
51
|
+
@running = data[:running]
|
52
|
+
@storage = data[:storage]
|
53
|
+
@network = data[:network]
|
54
|
+
@requests = data[:requests]
|
55
|
+
@uptime = data[:uptime]
|
56
|
+
@time = data[:time]
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_h
|
60
|
+
{
|
61
|
+
cpu: @cpu,
|
62
|
+
ram: @ram,
|
63
|
+
status: @status,
|
64
|
+
running: @running,
|
65
|
+
storage: @storage,
|
66
|
+
network: @network,
|
67
|
+
requests: @requests,
|
68
|
+
uptime: @uptime,
|
69
|
+
time: @time
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
class ResumedStatus
|
75
|
+
attr_reader :id, :running, :cpu, :ram
|
76
|
+
|
77
|
+
def initialize(data)
|
78
|
+
return unless data.is_a?(Hash)
|
79
|
+
|
80
|
+
@id = data[:id]
|
81
|
+
@running = data[:running]
|
82
|
+
@cpu = data[:cpu]
|
83
|
+
@ram = data[:ram]
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_h
|
87
|
+
{
|
88
|
+
id: @id,
|
89
|
+
running: @running,
|
90
|
+
cpu: @cpu,
|
91
|
+
ram: @ram
|
92
|
+
}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class AppData
|
97
|
+
attr_reader :id, :name, :cluster, :ram, :language, :domain, :custom, :desc
|
98
|
+
|
99
|
+
def initialize(data)
|
100
|
+
return unless data.is_a?(Hash)
|
101
|
+
|
102
|
+
@id = data[:id]
|
103
|
+
@name = data[:name]
|
104
|
+
@cluster = data[:cluster]
|
105
|
+
@ram = data[:ram]
|
106
|
+
@language = data[:language]
|
107
|
+
@domain = data[:domain]
|
108
|
+
@custom = data[:custom]
|
109
|
+
@desc = data[:desc]
|
110
|
+
end
|
111
|
+
|
112
|
+
def to_h
|
113
|
+
{
|
114
|
+
id: @id,
|
115
|
+
name: @name,
|
116
|
+
cluster: @cluster,
|
117
|
+
ram: @ram,
|
118
|
+
language: @language,
|
119
|
+
domain: @domain,
|
120
|
+
custom: @custom,
|
121
|
+
desc: @desc
|
122
|
+
}
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
class UserData
|
127
|
+
attr_reader :id, :name, :plan, :email, :apps
|
128
|
+
|
129
|
+
def initialize(data)
|
130
|
+
return unless data.is_a?(Hash)
|
131
|
+
|
132
|
+
@id = data[:id]
|
133
|
+
@name = data[:name]
|
134
|
+
@plan = data[:plan] ? PlanData.new(data[:plan]) : nil
|
135
|
+
@email = data[:email]
|
136
|
+
@apps = data[:apps] || []
|
137
|
+
end
|
138
|
+
|
139
|
+
def to_h
|
140
|
+
{
|
141
|
+
id: @id,
|
142
|
+
name: @name,
|
143
|
+
plan: @plan&.to_h,
|
144
|
+
email: @email,
|
145
|
+
apps: @apps
|
146
|
+
}
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
class LogsData
|
151
|
+
attr_reader :logs
|
152
|
+
|
153
|
+
def initialize(data)
|
154
|
+
@logs = data[:logs] || ''
|
155
|
+
end
|
156
|
+
|
157
|
+
def ==(other)
|
158
|
+
other.is_a?(LogsData) && @logs == other.logs
|
159
|
+
end
|
160
|
+
|
161
|
+
def to_h
|
162
|
+
{
|
163
|
+
logs: @logs
|
164
|
+
}
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class BackupInfo
|
169
|
+
attr_reader :name, :size, :modified, :key
|
170
|
+
|
171
|
+
def initialize(data)
|
172
|
+
return unless data.is_a?(Hash)
|
173
|
+
|
174
|
+
@name = data[:name]
|
175
|
+
@size = data[:size]
|
176
|
+
@modified = data[:modified] ? DateTime.parse(data[:modified]) : nil
|
177
|
+
@key = data[:key]
|
178
|
+
end
|
179
|
+
|
180
|
+
def to_h
|
181
|
+
{
|
182
|
+
name: @name,
|
183
|
+
size: @size,
|
184
|
+
modified: @modified,
|
185
|
+
key: @key
|
186
|
+
}
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
class Backup
|
191
|
+
attr_reader :url, :key
|
192
|
+
|
193
|
+
def initialize(data)
|
194
|
+
return unless data.is_a?(Hash)
|
195
|
+
|
196
|
+
@url = data[:url]
|
197
|
+
@key = data[:key]
|
198
|
+
end
|
199
|
+
|
200
|
+
def to_h
|
201
|
+
{
|
202
|
+
url: @url,
|
203
|
+
key: @key
|
204
|
+
}
|
205
|
+
end
|
206
|
+
|
207
|
+
def download(path = './')
|
208
|
+
require 'open-uri'
|
209
|
+
require 'zip'
|
210
|
+
|
211
|
+
zip_path = File.join(path, "backup_
|
212
|
+
IO.copy_stream(URI.open(@url), zip_path)
|
213
|
+
Zip::File.open(zip_path)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
|
217
|
+
class UploadData
|
218
|
+
attr_reader :id, :name, :language, :ram, :cpu, :domain, :description
|
219
|
+
|
220
|
+
def initialize(data)
|
221
|
+
return unless data.is_a?(Hash)
|
222
|
+
|
223
|
+
@id = data[:id]
|
224
|
+
@name = data[:name]
|
225
|
+
@language = data[:language] ? Language.new(data[:language]) : nil
|
226
|
+
@ram = data[:ram]
|
227
|
+
@cpu = data[:cpu]
|
228
|
+
@domain = data[:domain]
|
229
|
+
@description = data[:description]
|
230
|
+
end
|
231
|
+
|
232
|
+
def to_h
|
233
|
+
{
|
234
|
+
id: @id,
|
235
|
+
name: @name,
|
236
|
+
language: @language&.to_h,
|
237
|
+
ram: @ram,
|
238
|
+
cpu: @cpu,
|
239
|
+
domain: @domain,
|
240
|
+
description: @description
|
241
|
+
}
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
class FileInfo
|
246
|
+
attr_reader :app_id, :type, :name, :last_modified, :path, :size
|
247
|
+
|
248
|
+
def initialize(app_id, data)
|
249
|
+
@app_id = app_id
|
250
|
+
return unless data.is_a?(Hash)
|
251
|
+
|
252
|
+
@type = data[:type]
|
253
|
+
@name = data[:name]
|
254
|
+
@last_modified = data[:lastModified]
|
255
|
+
@path = data[:path]
|
256
|
+
@size = data[:size] || 0
|
257
|
+
end
|
258
|
+
|
259
|
+
def to_h
|
260
|
+
{
|
261
|
+
app_id: @app_id,
|
262
|
+
type: @type,
|
263
|
+
name: @name,
|
264
|
+
last_modified: @last_modified,
|
265
|
+
path: @path,
|
266
|
+
size: @size
|
267
|
+
}
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
class DeployData
|
272
|
+
attr_reader :id, :state, :date
|
273
|
+
|
274
|
+
def initialize(data)
|
275
|
+
return unless data.is_a?(Hash)
|
276
|
+
|
277
|
+
@id = data[:id]
|
278
|
+
@state = data[:state]
|
279
|
+
@date = data[:date] ? DateTime.parse(data[:date]) : nil
|
280
|
+
end
|
281
|
+
|
282
|
+
def to_h
|
283
|
+
{
|
284
|
+
id: @id,
|
285
|
+
state: @state,
|
286
|
+
date: @date
|
287
|
+
}
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
class AnalyticsTotal
|
292
|
+
attr_reader :visits, :megabytes, :bytes
|
293
|
+
|
294
|
+
def initialize(data)
|
295
|
+
return unless data.is_a?(Hash)
|
296
|
+
|
297
|
+
@visits = data[:visits]
|
298
|
+
@megabytes = data[:megabytes]
|
299
|
+
@bytes = data[:bytes]
|
300
|
+
end
|
301
|
+
|
302
|
+
def to_h
|
303
|
+
{
|
304
|
+
visits: @visits,
|
305
|
+
megabytes: @megabytes,
|
306
|
+
bytes: @bytes
|
307
|
+
}
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
class DomainAnalytics
|
312
|
+
class Analytics
|
313
|
+
attr_reader :total, :countries, :methods, :referers, :browsers,
|
314
|
+
:device_types, :operating_systems, :agents, :hosts, :paths
|
315
|
+
|
316
|
+
def initialize(data)
|
317
|
+
return unless data.is_a?(Hash)
|
318
|
+
|
319
|
+
@total = data[:total] ? data[:total].map { |t| AnalyticsTotal.new(t) } : []
|
320
|
+
@countries = data[:countries] || []
|
321
|
+
@methods = data[:methods] || []
|
322
|
+
@referers = data[:referers] || []
|
323
|
+
@browsers = data[:browsers] || []
|
324
|
+
@device_types = data[:deviceTypes] || []
|
325
|
+
@operating_systems = data[:operatingSystems] || []
|
326
|
+
@agents = data[:agents] || []
|
327
|
+
@hosts = data[:hosts] || []
|
328
|
+
@paths = data[:paths] || []
|
329
|
+
end
|
330
|
+
|
331
|
+
def to_h
|
332
|
+
{
|
333
|
+
total: @total.map(&:to_h),
|
334
|
+
countries: @countries,
|
335
|
+
methods: @methods,
|
336
|
+
referers: @referers,
|
337
|
+
browsers: @browsers,
|
338
|
+
device_types: @device_types,
|
339
|
+
operating_systems: @operating_systems,
|
340
|
+
agents: @agents,
|
341
|
+
hosts: @hosts,
|
342
|
+
paths: @paths
|
343
|
+
}
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
class Domain
|
348
|
+
attr_reader :hostname, :analytics
|
349
|
+
|
350
|
+
def initialize(data)
|
351
|
+
return unless data.is_a?(Hash)
|
352
|
+
|
353
|
+
@hostname = data[:hostname]
|
354
|
+
@analytics = data[:analytics] ? Analytics.new(data[:analytics]) : nil
|
355
|
+
end
|
356
|
+
|
357
|
+
def to_h
|
358
|
+
{
|
359
|
+
hostname: @hostname,
|
360
|
+
analytics: @analytics&.to_h
|
361
|
+
}
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
class Custom
|
366
|
+
attr_reader :analytics
|
367
|
+
|
368
|
+
def initialize(data)
|
369
|
+
return unless data.is_a?(Hash)
|
370
|
+
|
371
|
+
@analytics = data[:analytics] ? Analytics.new(data[:analytics]) : nil
|
372
|
+
end
|
373
|
+
|
374
|
+
def to_h
|
375
|
+
{
|
376
|
+
analytics: @analytics&.to_h
|
377
|
+
}
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
attr_reader :domain, :custom
|
382
|
+
|
383
|
+
def initialize(data)
|
384
|
+
return unless data.is_a?(Hash)
|
385
|
+
|
386
|
+
@domain = data[:domain] ? Domain.new(data[:domain]) : nil
|
387
|
+
@custom = data[:custom] ? Custom.new(data[:custom]) : nil
|
388
|
+
end
|
389
|
+
|
390
|
+
def to_h
|
391
|
+
{
|
392
|
+
domain: @domain&.to_h,
|
393
|
+
custom: @custom&.to_h
|
394
|
+
}
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
class DNSRecord
|
399
|
+
attr_reader :type, :name, :value, :status
|
400
|
+
|
401
|
+
def initialize(data)
|
402
|
+
return unless data.is_a?(Hash)
|
403
|
+
|
404
|
+
@type = data[:type]
|
405
|
+
@name = data[:name]
|
406
|
+
@value = data[:value]
|
407
|
+
@status = data[:status]
|
408
|
+
end
|
409
|
+
|
410
|
+
def to_h
|
411
|
+
{
|
412
|
+
type: @type,
|
413
|
+
name: @name,
|
414
|
+
value: @value,
|
415
|
+
status: @status
|
416
|
+
}
|
417
|
+
end
|
418
|
+
end
|
419
|
+
end
|