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.
@@ -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
@@ -0,0 +1,3 @@
1
+ module Squarecloud
2
+ VERSION = '1.0.0'
3
+ end