Skip to content

Commit 1965545

Browse files
authored
Merge pull request #90 from lohanidamodar/feat-ruby-sdk-upload-support
Feature Ruby SDK upload support
2 parents 72bc343 + 98b618e commit 1965545

File tree

8 files changed

+69
-9
lines changed

8 files changed

+69
-9
lines changed

src/SDK/Language/Ruby.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ public function getFiles()
130130
'template' => '/ruby/lib/container/service.rb.twig',
131131
'minify' => false,
132132
],
133+
[
134+
'scope' => 'default',
135+
'destination' => 'lib/{{ spec.title | caseDash }}/file.rb',
136+
'template' => '/ruby/lib/container/file.rb.twig',
137+
'minify' => false,
138+
],
133139
[
134140
'scope' => 'service',
135141
'destination' => '/lib/{{ spec.title | caseDash}}/services/{{service.name | caseDash}}.rb',

templates/ruby/Gemfile.twig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
source 'https://rubygems.org'
22

3+
gem 'mime-types', '~> 3.1'
34
gemspec

templates/ruby/docs/example.md.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ client
1212

1313
{{ service.name | caseSnake }} = {{spec.title | caseUcfirst}}::{{ service.name | caseUcfirst }}.new(client);
1414

15-
response = {{ service.name | caseSnake }}.{{ method.name | caseSnake }}({% for parameter in method.parameters.all %}{% if parameter.required %}{% if not loop.first %}, {% endif %}{{parameter.name|caseSnake}}: {{ parameter | paramExample }}{% endif %}{% endfor %});
15+
response = {{ service.name | caseSnake }}.{{ method.name | caseSnake }}({% for parameter in method.parameters.all %}{% if parameter.required %}{% if not loop.first %}, {% endif %}{{parameter.name|caseSnake}}: {% if parameter | paramExample == "File.new()" %}{{spec.title | caseUcfirst}}::{{ parameter | paramExample }}{% else %}{{ parameter | paramExample }}{% endif %}{% endif %}{% endfor %});
1616

1717
puts response
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
require 'net/http'
22
require 'uri'
33
require 'json'
4+
require 'mime/types'
45
require_relative '{{ spec.title | caseDash }}/client'
56
require_relative '{{ spec.title | caseDash }}/service'
7+
require_relative '{{ spec.title | caseDash }}/file'
68
{% for service in spec.services %}
79
require_relative '{{ spec.title | caseDash }}/services/{{ service.name | caseDash }}'
810
{% endfor %}

templates/ruby/lib/container/client.rb.twig

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,14 @@ module {{spec.title | caseUcfirst}}
6767
payload = ''
6868

6969
headers = @headers.merge(headers)
70-
70+
@BOUNDARY = "----A30#3ad1"
7171
if (method != METHOD_GET)
7272
case headers['content-type'][0, headers['content-type'].index(';') || headers['content-type'].length]
7373
when 'application/json'
7474
payload = params.to_json
75+
when 'multipart/form-data'
76+
payload = "--#{@BOUNDARY}\r\n" + encodeFormData(params)
77+
headers['content-type'] = "multipart/form-data; boundary=#{@BOUNDARY}"
7578
else
7679
payload = encode(params)
7780
end
@@ -93,6 +96,27 @@ module {{spec.title | caseUcfirst}}
9396

9497
return JSON.parse(response.body);
9598
end
99+
100+
def encodeFormData(value, key=nil)
101+
case value
102+
when Hash then value.map { |k,v| encodeFormData(v,k) }.join
103+
when Array then value.map { |v| encodeFormData(v, "#{key}[]") }.join
104+
when nil then ''
105+
else
106+
post_body = []
107+
if(value.instance_of? File)
108+
post_body << "Content-Disposition: form-data; name=\"#{key}\"; filename=\"#{value.name}\"\r\n"
109+
post_body << "Content-Type: #{value.mimeType}\r\n\r\n"
110+
post_body << value.content
111+
post_body << "\r\n--#{@BOUNDARY}--\r\n"
112+
else
113+
post_body << "Content-Disposition: form-data; name=\"#{key}\"\r\n\r\n"
114+
post_body << "#{value.to_s}"
115+
post_body << "\r\n--#{@BOUNDARY}\r\n"
116+
end
117+
post_body.join
118+
end
119+
end
96120

97121
def encode(value, key = nil)
98122
case value
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
require 'mime/types'
2+
3+
module {{spec.title | caseUcfirst}}
4+
class File
5+
def initialize(path)
6+
@name = ::File.basename(path)
7+
@content = ::File.read(path)
8+
@mimeType = MIME::Types.type_for(path)
9+
end
10+
11+
def name
12+
@name
13+
end
14+
15+
def content
16+
@content
17+
end
18+
19+
def mimeType
20+
@mimeType
21+
end
22+
end
23+
end

tests/SDKTest.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,16 @@ class SDKTest extends TestCase
124124
'ruby' => [
125125
'class' => 'Appwrite\SDK\Language\Ruby',
126126
'build' => [
127+
'docker run --rm -v $(pwd):/app -w /app/tests/sdks/ruby --env GEM_HOME=/app/vendor ruby:2.7-alpine sh -c "apk add git build-base && bundle install"'
127128
],
128129
'envs' => [
129-
'ruby-2.7' => 'docker run --rm -v $(pwd):/app -w /app ruby:2.7-alpine ruby tests/languages/ruby/tests.rb',
130-
'ruby-2.6' => 'docker run --rm -v $(pwd):/app -w /app ruby:2.6-alpine ruby tests/languages/ruby/tests.rb',
131-
'ruby-2.5' => 'docker run --rm -v $(pwd):/app -w /app ruby:2.5-alpine ruby tests/languages/ruby/tests.rb',
132-
'ruby-2.4' => 'docker run --rm -v $(pwd):/app -w /app ruby:2.4-alpine ruby tests/languages/ruby/tests.rb',
130+
'ruby-2.7' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:2.7-alpine ruby tests/languages/ruby/tests.rb',
131+
'ruby-2.6' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:2.6-alpine ruby tests/languages/ruby/tests.rb',
132+
'ruby-2.5' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:2.5-alpine ruby tests/languages/ruby/tests.rb',
133+
'ruby-2.4' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:2.4-alpine ruby tests/languages/ruby/tests.rb',
133134
],
134135
'supportRedirect' => true,
135-
'supportUpload' => false,
136+
'supportUpload' => true,
136137
],
137138

138139
'python' => [
@@ -184,7 +185,6 @@ public function testHTTPSuccess()
184185
}
185186

186187
$whitelist = ['php', 'java', 'node', 'ruby', 'python', 'typescript', 'deno', 'dotnet', 'dart'];
187-
188188
foreach ($this->languages as $language => $options) {
189189
if(!empty($whitelist) && !in_array($language, $whitelist)) {
190190
continue;
@@ -228,7 +228,6 @@ public function testHTTPSuccess()
228228
}
229229
}
230230
}
231-
232231
/**
233232
* Run tests on all different envs
234233
*/

tests/languages/ruby/tests.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,8 @@
4545

4646
response = general.redirect();
4747
puts response['result']
48+
49+
50+
file = Appwrite::File.new('./tests/resources/file.png')
51+
response = general.upload(x:'string',y: 123,z:['string in array'], file: file);
52+
puts response['result']

0 commit comments

Comments
 (0)