appstage 1.0.13 → 1.0.14

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/upload_file.rb +67 -16
  3. data/lib/version.rb +1 -1
  4. metadata +30 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c57adb1333c669207b9a035da067c3e18269a1a7d1374a21b96853d86f642a8f
4
- data.tar.gz: 3287d80b26a3ad3af4f7c7f3cf668a1e775781733e73d00b1d2da4c09999073c
3
+ metadata.gz: abd47c469c67962abbd21a00ff35de1c8b19c8eac7797bc2b5ae46294ff787d2
4
+ data.tar.gz: dafedeba6440b3a4cc764fffe52520949bd96462219581a9053cd86ba5e48fa0
5
5
  SHA512:
6
- metadata.gz: 26c8c813893dcacd2fe3e01c0f798cb5cf22dcd87528574757102c9a767103483200f3c02e6f31eb7560ff169fd1c2cf2ae854fd032fea1c3b05f4fb6071f986
7
- data.tar.gz: 6ee2bc35eea83b525f279f709b306e0b42dd4107d401fe16310dde78453a82ba5c32915ed1cbb0e06128360ee25e67797c6884600d74452dedf3e2e0809b38f6
6
+ metadata.gz: 4c71d6fdf272bb87e236c330ec118e1fe4635969ecb71a7abb7419cfa653cd9c5726a1ee03b6c2960901f41479b8c35ccf979699e6f41a985f0559569a6b488d
7
+ data.tar.gz: f6a1cfafa61258559a772ffe3bf06ebb667c6e7a249655190ce2c4dac8fee3f2b9fa012855fd04d6f54829bc0d7155ce405a0d09984466f47e54a0df15fcd854
data/lib/upload_file.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'json'
2
+ require 'digest'
3
+ require 'base64'
2
4
 
3
5
  module AppStage
4
6
 
@@ -18,23 +20,14 @@ module AppStage
18
20
  raise('Invalid project token') unless @options[:jwt]
19
21
  token = @options[:jwt]
20
22
 
21
- puts "Uploading #{filename} #{File.size(file_path)} bytes..."
23
+ file_size = File.size(file_path)
24
+ puts "Uploading #{filename} #{file_size} bytes..."
22
25
 
23
- json = {
24
- release_file: {
25
- cloud_stored_file: File.open(file_path)
26
- }
27
- }
28
-
29
- response = HTTParty.post(host+"/api/live_builds",
30
- :body => json,
31
- :multipart => true,
32
- :headers => {
33
- 'Authorization' => "Bearer #{token}"
34
- },
35
- :verify => false
36
- )
37
- raise(JSON.parse(response.body)['error']) unless response.code == 200
26
+ checksum = calculate_checksum(file_path)
27
+
28
+ direct_upload_response = request_direct_upload(host, token, filename, file_size, checksum)
29
+ upload_to_cdn(file_path, direct_upload_response)
30
+ create_release_file(host, token, direct_upload_response['signed_id'])
38
31
 
39
32
  puts "Upload complete"
40
33
  0
@@ -43,5 +36,63 @@ module AppStage
43
36
  -1
44
37
  end
45
38
  end
39
+
40
+ private
41
+
42
+ def calculate_checksum(file_path)
43
+ Base64.strict_encode64(Digest::MD5.file(file_path).digest)
44
+ end
45
+
46
+ def request_direct_upload(host, token, filename, byte_size, checksum)
47
+ response = HTTParty.post(
48
+ "#{host}/api/direct_uploads",
49
+ body: {
50
+ blob: {
51
+ filename: filename,
52
+ byte_size: byte_size,
53
+ checksum: checksum,
54
+ content_type: 'application/octet-stream'
55
+ }
56
+ }.to_json,
57
+ headers: {
58
+ 'Authorization' => "Bearer #{token}",
59
+ 'Content-Type' => 'application/json'
60
+ },
61
+ verify: false
62
+ )
63
+
64
+ raise(JSON.parse(response.body)['error']) unless response.code == 200
65
+ JSON.parse(response.body)
66
+ end
67
+
68
+ def upload_to_cdn(file_path, direct_upload_data)
69
+ url = direct_upload_data['direct_upload']['url']
70
+ headers = direct_upload_data['direct_upload']['headers']
71
+
72
+ response = HTTParty.put(
73
+ url,
74
+ body: File.read(file_path),
75
+ headers: headers,
76
+ verify: false
77
+ )
78
+
79
+ raise("CDN upload failed with status #{response.code}") unless [200, 204].include?(response.code)
80
+ end
81
+
82
+ def create_release_file(host, token, signed_blob_id)
83
+ response = HTTParty.post(
84
+ "#{host}/api/live_builds",
85
+ body: {
86
+ signed_blob_id: signed_blob_id
87
+ }.to_json,
88
+ headers: {
89
+ 'Authorization' => "Bearer #{token}",
90
+ 'Content-Type' => 'application/json'
91
+ },
92
+ verify: false
93
+ )
94
+
95
+ raise(JSON.parse(response.body)['error']) unless response.code == 200
96
+ end
46
97
  end
47
98
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Appstage
2
- VERSION = "1.0.13"
2
+ VERSION = "1.0.14"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appstage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - P4 Innovation Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-07-11 00:00:00.000000000 Z
11
+ date: 2025-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.21'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - "~>"
39
53
  - !ruby/object:Gem::Version
40
54
  version: '3.6'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.22'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.22'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: webmock
43
71
  requirement: !ruby/object:Gem::Requirement