Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions src/SDK/Language/Ruby.php
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,6 @@ public function getTypeName($type)
case self::TYPE_INTEGER:
case self::TYPE_NUMBER:
return 'number';
break;
case self::TYPE_FILE:
return 'File';
break;
}

return $type;
Expand Down
60 changes: 58 additions & 2 deletions templates/ruby/lib/container/client.rb.twig
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ module {{ spec.title | caseUcfirst }}
class Client

def initialize
@chunk_size = 5*1024*1024
@headers = {
'user-agent' => RUBY_PLATFORM + ':{{ language.name | caseLower }}-' + RUBY_VERSION,
'x-sdk-version' => '{{ spec.title | caseDash }}:{{ language.name | caseLower }}:{{ sdk.version }}'{% if spec.global.defaultHeaders | length > 0 %},{% endif %}
Expand Down Expand Up @@ -94,6 +95,61 @@ module {{ spec.title | caseUcfirst }}
fetch(method, uri, headers, params, response_type)
end

def chunked_upload(
path:,
headers:,
params:,
param_name: '',
on_progress: nil,
response_type: nil
)
file_path = params[param_name.to_sym]
size = ::File.size(file_path)

if size < @chunk_size
slice = ::File.read(file_path)
params[param_name] = File.new(file_path, slice)
return call(
method: 'POST',
path: path,
headers: headers,
params: params,
response_type: response_type,
)
end

input = ::File.open(file_path)
offset = 0

while offset < size
slice = input.read(@chunk_size)

params[param_name] = File.new(file_path, slice)
headers['content-range'] = "bytes #{offset}-#{[offset + @chunk_size - 1, size].min}/#{size}"

result = call(
method: 'POST',
path: path,
headers: headers,
params: params,
)

offset += @chunk_size

if defined? result['$id']
headers['x-{{ spec.title }}-id'] = result['$id']
end

unless on_progress.nil?
on_progress(min(offset, size)/size * 100)
end
end

return result unless response_type.respond_to?("from")

response_type.from(map: result)
end

private

def fetch(
Expand Down Expand Up @@ -147,7 +203,7 @@ module {{ spec.title | caseUcfirst }}
end

if response.code.to_i >= 400
raise Appwrite::Exception.new(result['message'], result['status'], result)
raise {{spec.title | caseUcfirst}}::Exception.new(result['message'], result['status'], result)
end

unless response_type.respond_to?("from")
Expand All @@ -158,7 +214,7 @@ module {{ spec.title | caseUcfirst }}
end

if response.code.to_i >= 400
raise Appwrite::Exception.new(response.body, response.code, response)
raise {{spec.title | caseUcfirst}}::Exception.new(response.body, response.code, response)
end

return response.body if response.body_permitted?
Expand Down
6 changes: 4 additions & 2 deletions templates/ruby/lib/container/file.rb.twig
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ require 'mime/types'

module {{spec.title | caseUcfirst}}
class File
attr_reader :path
attr_reader :name
attr_reader :content
attr_reader :mime_type

def initialize(path)
def initialize(path, content)
@path = path
@content = content
@name = ::File.basename(path)
@content = ::File.read(path)
@mime_type = MIME::Types.type_for(path)
end
end
Expand Down
23 changes: 21 additions & 2 deletions templates/ruby/lib/container/services/service.rb.twig
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ module {{spec.title | caseUcfirst}}
{% endfor %}
#
# @return [{{ method.responseModel | caseUcfirst }}]
def {{ method.name | caseSnake }}({% for parameter in method.parameters.all %}{{ parameter.name | caseSnake | escapeKeyword }}:{% if not parameter.required %} nil{% endif %}{% if not loop.last %}, {% endif %}{% endfor %})
def {{ method.name | caseSnake }}({% for parameter in method.parameters.all %}{{ parameter.name | caseSnake | escapeKeyword }}:{% if not parameter.required %} nil{% endif %}{% if not loop.last %}, {% endif %}{% endfor %}{% if 'multipart/form-data' in method.consumes %}, on_progress: nil{% endif %})
{% for parameter in method.parameters.all %}
{% if parameter.required %}
if {{ parameter.name | caseSnake | escapeKeyword }}.nil?
Expand Down Expand Up @@ -41,15 +41,34 @@ module {{spec.title | caseUcfirst}}
{% endfor %}
}

{% if 'multipart/form-data' in method.consumes %}
{% for parameter in method.parameters.all %}
{% if parameter.type == 'file' %}
param_name = '{{ parameter.name }}'

{% endif %}
{% endfor %}
@client.chunked_upload(
path: path,
headers: headers,
params: params,
param_name: param_name,
on_progress: on_progress,
{% if method.responseModel and method.responseModel != 'any' %}
response_type: {{method.responseModel | caseUcfirst}}
{% endif %}
)
{% else %}
@client.call(
method: '{{ method.method | caseUpper }}',
path: path,
params: params,
headers: headers,
params: params,
{% if method.responseModel and method.responseModel != 'any' %}
response_type: {{method.responseModel | caseUcfirst}}
{% endif %}
)
{% endif %}
end

{% endfor %}
Expand Down
6 changes: 4 additions & 2 deletions tests/SDKTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -270,16 +270,18 @@ class SDKTest extends TestCase
'ruby' => [
'class' => 'Appwrite\SDK\Language\Ruby',
'build' => [
'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"',
'docker run --rm -v $(pwd):/app -w /app/tests/sdks/ruby --env GEM_HOME=/app/vendor ruby:3.1-alpine sh -c "apk add git build-base && bundle install"',
],
'envs' => [
'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',
'ruby-3.1' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:3.1-alpine ruby tests/languages/ruby/tests.rb',
'ruby-3.0' => 'docker run --rm -v $(pwd):/app -w /app --env GEM_HOME=vendor ruby:3.0-alpine ruby tests/languages/ruby/tests.rb',
'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',
],
'expectedOutput' => [
...FOO_RESPONSES,
...BAR_RESPONSES,
...GENERAL_RESPONSES,
'POST:/v1/mock/tests/general/upload:passed',
...EXCEPTION_RESPONSES,
],
],
Expand Down
6 changes: 4 additions & 2 deletions tests/languages/ruby/tests.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@
response = general.redirect()
puts response["result"]

file = Appwrite::File.new('./tests/resources/file.png')
response = general.upload(x: 'string', y: 123, z:['string in array'], file: file)
response = general.upload(x: 'string', y: 123, z:['string in array'], file: './tests/resources/file.png')
puts response.result

response = general.upload(x: 'string', y: 123, z:['string in array'], file: './tests/resources/large_file.mp4')
puts response.result

begin
Expand Down
Binary file added tests/resources/large_file.mp4
Binary file not shown.