toptranslation_api 3.0.0 → 4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a7a5e459dc186fd8dc7ca31ed08de8aa2f59489f13c5a7921c0b6e276feaf11
4
- data.tar.gz: 90ef9708e838df69119982d77fdf27b5427f037cb1fc34391ec563a54d89ba73
3
+ metadata.gz: 700cce0881675c0dafc87f6b0164c4de80495fc146ff9487584c1c2d7d1abf02
4
+ data.tar.gz: 23384b7748432e0d96ac60f45dba8e6e1c0219fe6c0ed53fdd70c54b7a2e3388
5
5
  SHA512:
6
- metadata.gz: a50b0d1ad993cff3c7b2477e694022d4042be6ed62792a679a8e0a1559a1db5670f0484cace778f37810663fffa1ec836071d24e0ec501c57f1383cda2d16a96
7
- data.tar.gz: 5ae7cbb4208769f291386f72ad420071d54328babe299028d2f2df9208f8e46457efbc00368df5ef541a7f36c779c36c20bee49c53938fcbb989766403ff9f19
6
+ metadata.gz: 770ef06cea32101858e51b52c0ac6322315174ed484f01ee16809d44242a4d639d12bb18861cb9fbc4ffb0959605095a310ef0255749f595ec8361ea0409617a
7
+ data.tar.gz: 710217d985fd2fd1094de9f4d3152cdb8452599b9b414303ad063c326ce6d1b818ef2fa1875a586d23e0c89e658574f35a5463edbea9f584a8c14ed33296e3ec
@@ -1,6 +1,8 @@
1
1
  module Toptranslation
2
2
  class Connection
3
- attr_accessor :upload_token, :verbose, :access_token
3
+ attr_accessor :verbose, :access_token
4
+
5
+ API_VERSION = 'v2'.freeze
4
6
 
5
7
  def initialize(options = {})
6
8
  @base_url = options[:base_url] || 'https://api.toptranslation.com'
@@ -11,15 +13,15 @@ module Toptranslation
11
13
  end
12
14
 
13
15
  def get(path, options = {})
14
- transform_response(request(:get, path, options), options)
16
+ transform_response(request(:get, path, options))
15
17
  end
16
18
 
17
19
  def post(path, options = {})
18
- transform_response(request(:post, path, options), options)
20
+ transform_response(request(:post, path, options))
19
21
  end
20
22
 
21
23
  def patch(path, options = {})
22
- transform_response(request(:patch, path, options), options)
24
+ transform_response(request(:patch, path, options))
23
25
  end
24
26
 
25
27
  def download(url, path, &block)
@@ -28,10 +30,12 @@ module Toptranslation
28
30
  download_uri(uri, path, &block)
29
31
  end
30
32
 
31
- def upload(filepath, type, &block)
32
- uri = URI.parse("#{@files_url}/documents")
33
+ # Uploads go directly to the document store (castor): the response
34
+ # carries the document token that authorizes further use of the file.
35
+ def upload(filepath, _type = 'document', &block)
36
+ uri = URI.parse("#{@files_url}/v2/documents")
33
37
  file = File.new(filepath)
34
- upload_file(file, type, uri, &block)
38
+ upload_file(file, uri, &block)
35
39
  end
36
40
 
37
41
  def sign_in!(options)
@@ -43,7 +47,7 @@ module Toptranslation
43
47
  application_id: 'pollux'
44
48
  }.merge(options)
45
49
 
46
- @access_token = post('/auth/sign_in', sign_in_options.merge(version: 2))['access_token']
50
+ @access_token = post('/auth/sign_in', sign_in_options)['access_token']
47
51
 
48
52
  puts "# Requested access token #{@access_token}" if @verbose
49
53
 
@@ -52,12 +56,8 @@ module Toptranslation
52
56
 
53
57
  private
54
58
 
55
- def version(options)
56
- options[:version] || 0
57
- end
58
-
59
59
  def request(method, path, options)
60
- url = "#{@base_url}/v#{version(options)}#{path}"
60
+ url = "#{@base_url}/#{API_VERSION}#{path}"
61
61
  puts "# #{method}-request #{url}" if @verbose
62
62
  puts "options: #{prepare_request_options(options, method)}" if @verbose
63
63
  RestClient.send(method, url, prepare_request_options(options, method))
@@ -66,30 +66,13 @@ module Toptranslation
66
66
  raise e
67
67
  end
68
68
 
69
- def upload_token
70
- @upload_token ||= request_upload_token
71
- end
72
-
73
- def request_upload_token
74
- puts '# Requesting upload-token' if @verbose
75
- token = post('/upload_tokens')['upload_token']
76
- puts "# Upload-token retrieved: #{token}" if @verbose
77
- token
78
- end
79
-
80
- def transform_response(response, options)
69
+ def transform_response(response)
81
70
  puts response if @verbose
82
- parsed = JSON.parse(response)
83
- if version(options) == 2
84
- parsed
85
- else
86
- parsed['data']
87
- end
71
+ JSON.parse(response)
88
72
  end
89
73
 
90
74
  def prepare_request_options(options, method)
91
75
  request_options = options.dup
92
- request_options.delete(:version)
93
76
  if [:post, :patch].include? method
94
77
  request_options.merge(auth_params)
95
78
  else
@@ -139,15 +122,17 @@ module Toptranslation
139
122
  end
140
123
  end
141
124
 
142
- def upload_file(file, type, uri)
125
+ def upload_file(file, uri)
143
126
  response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
144
127
  request = Net::HTTP::Post.new(uri)
145
- request.set_form({ 'file' => file, 'token' => upload_token, 'type' => type }, 'multipart/form-data')
128
+ # stable per upload (not per attempt): the document store recognizes
129
+ # retries and returns the already created document instead of a duplicate
130
+ request.set_form({ 'file' => file, 'idempotency_key' => SecureRandom.uuid }, 'multipart/form-data')
146
131
 
147
132
  http.request(request)
148
133
  end
149
134
 
150
- transform_response(response.body, version: 0)
135
+ transform_response(response.body)
151
136
  end
152
137
  end
153
138
  end
@@ -8,17 +8,6 @@ module Toptranslation::Resource
8
8
  update_from_response(options)
9
9
  end
10
10
 
11
- def add_translation(filepath, locale_code, options = {})
12
- upload = Upload.new(@connection).upload(filepath)
13
-
14
- response = @connection.post("/documents/#{@identifier}/translations", options.merge(
15
- document_store_id: upload.document_store_id,
16
- document_token: upload.document_token,
17
- locale_code: locale_code,
18
- sha1: upload.sha1
19
- ))
20
- end
21
-
22
11
  def download_url(locale_code, options = {})
23
12
  params = { file_format: options[:file_format], locale_code: locale_code }.compact
24
13
  @connection.get("/documents/#{@identifier}/download", params: params)['download_url']
@@ -36,24 +25,8 @@ module Toptranslation::Resource
36
25
  @connection.download(download_url(locale_code, options), download_path, &block)
37
26
  end
38
27
 
39
- def save
40
- response = @connection.patch("/documents/#{@identifier}", remote_hash)
41
- update_and_return_from_response(response)
42
- end
43
-
44
- def strings
45
- StringList.new(@connection, document_identifier: @identifier)
46
- end
47
-
48
28
  private
49
29
 
50
- def update_and_return_from_response(response)
51
- if response
52
- update_from_response(response)
53
- self
54
- end
55
- end
56
-
57
30
  def update_from_response(response)
58
31
  @identifier = response['identifier'] if response['identifier']
59
32
  @name = response['name'] if response['name']
@@ -70,10 +43,5 @@ module Toptranslation::Resource
70
43
  end
71
44
  end
72
45
 
73
- def remote_hash
74
- hash = {}
75
- hash[:name] = @name if @name
76
- hash
77
- end
78
46
  end
79
47
  end
@@ -7,11 +7,6 @@ module Toptranslation::Resource
7
7
  @options = options
8
8
  end
9
9
 
10
- def find(identifier)
11
- result = @connection.get("/documents/#{identifier}")
12
- Document.new(@connection, result)
13
- end
14
-
15
10
  def each
16
11
  documents.each { |document| yield Document.new(@connection, document) }
17
12
  end
@@ -33,10 +33,6 @@ module Toptranslation::Resource
33
33
  ProjectDocumentList.new(@connection, options)
34
34
  end
35
35
 
36
- def strings
37
- StringList.new(@connection, project_identifier: @identifier)
38
- end
39
-
40
36
  def save
41
37
  response = @identifier ? update_remote_project : create_remote_project
42
38
  update_and_return_from_response(response)
@@ -62,11 +58,13 @@ module Toptranslation::Resource
62
58
  def update_from_response(response)
63
59
  @identifier = response['identifier'] if response['identifier']
64
60
  @created_at = DateTime.parse(response['created_at']) if response['created_at']
65
- @locales = response['locales'].inject([]) do |accu, locale_data|
61
+ @locales = Array(response['locales']).inject([]) do |accu, locale_data|
66
62
  locale = Locale.new(locale_data)
67
63
  @source_locale = locale if locale_data['is_source_locale'] # Set source locale of the project
68
64
  accu << locale
69
65
  end
66
+ # API v2 liefert die Ausgangssprache zusätzlich als eigenes Feld
67
+ @source_locale = Locale.new(response['source_locale']) if response['source_locale']
70
68
  @name = response['name'] if response['name']
71
69
  end
72
70
 
@@ -1,5 +1,11 @@
1
1
  module Toptranslation::Resource
2
2
  class ProjectDocumentList < DocumentList
3
+ # projektbezogener Lookup — API v2 kennt kein unscoped GET /documents/:id
4
+ def find(identifier)
5
+ result = @connection.get("/projects/#{@options[:project_identifier]}/documents/#{identifier}")
6
+ Document.new(@connection, result)
7
+ end
8
+
3
9
  def create(name, path, options = {})
4
10
  response = @connection.post("/projects/#{@options[:project_identifier]}/documents", options.merge(name: name, path: path))
5
11
  Document.new(@connection, response)
@@ -19,7 +19,7 @@ module Toptranslation::Resource
19
19
  private
20
20
 
21
21
  def translations
22
- @connection.get("/orders/#{@options[:order_identifier]}/translations") if @options[:order_identifier]
22
+ @connection.get('/translations', params: { order_identifier: @options[:order_identifier] }) if @options[:order_identifier]
23
23
  end
24
24
  end
25
25
  end
@@ -12,7 +12,8 @@ module Toptranslation::Resource
12
12
  response = @connection.upload(filepath, type, &block)
13
13
 
14
14
  @document_store_id = response['identifier']
15
- @document_token = response['document_token']
15
+ # Document-Store v2 nennt das Feld token
16
+ @document_token = response['token'] || response['document_token']
16
17
  @sha1 = response['sha1']
17
18
 
18
19
  self
@@ -1,3 +1,3 @@
1
1
  module Toptranslation
2
- VERSION = '3.0.0'.freeze
2
+ VERSION = '4.0.0'.freeze
3
3
  end
@@ -1,4 +1,5 @@
1
1
  require 'json'
2
+ require 'securerandom'
2
3
  require 'rest-client'
3
4
  require 'toptranslation/client'
4
5
  require 'toptranslation/connection'
@@ -13,8 +14,6 @@ require 'toptranslation/resource/project'
13
14
  require 'toptranslation/resource/project_list'
14
15
  require 'toptranslation/resource/quote'
15
16
  require 'toptranslation/resource/reference_document'
16
- require 'toptranslation/resource/string_list'
17
- require 'toptranslation/resource/string'
18
17
  require 'toptranslation/resource/translation'
19
18
  require 'toptranslation/resource/translation_list'
20
19
  require 'toptranslation/resource/upload'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: toptranslation_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toptranslation GmbH
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-21 00:00:00.000000000 Z
11
+ date: 2026-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -156,8 +156,6 @@ files:
156
156
  - lib/toptranslation/resource/project_list.rb
157
157
  - lib/toptranslation/resource/quote.rb
158
158
  - lib/toptranslation/resource/reference_document.rb
159
- - lib/toptranslation/resource/string.rb
160
- - lib/toptranslation/resource/string_list.rb
161
159
  - lib/toptranslation/resource/translation.rb
162
160
  - lib/toptranslation/resource/translation_list.rb
163
161
  - lib/toptranslation/resource/upload.rb
@@ -184,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
182
  - !ruby/object:Gem::Version
185
183
  version: '0'
186
184
  requirements: []
187
- rubygems_version: 3.3.26
185
+ rubygems_version: 3.5.9
188
186
  signing_key:
189
187
  specification_version: 4
190
188
  summary: A ruby client for the Toptranslation API
@@ -1,64 +0,0 @@
1
- module Toptranslation::Resource
2
- class String
3
- attr_reader :identifier, :updated_at, :created_at
4
- attr_accessor :value, :state, :project_identifier, :document_identifier, :key, :comment, :context, :array_index, :plural_form, :locale_code
5
-
6
- def initialize(connection, options = {})
7
- @connection = connection
8
- @options = options
9
-
10
- update_from_response(options)
11
- end
12
-
13
- def save
14
- response = @identifier ? update_remote_string : create_remote_string
15
- update_and_return_from_response(response)
16
- end
17
-
18
- private
19
-
20
- def update_remote_string
21
- @connection.patch("/strings/#{@identifier}", remote_hash)
22
- end
23
-
24
- def create_remote_string
25
- @connection.post('/strings', remote_hash)
26
- end
27
-
28
- def update_and_return_from_response(response)
29
- if response
30
- update_from_response(response)
31
- self
32
- end
33
- end
34
-
35
- def update_from_response(response)
36
- @identifier = response['identifier'] if response['identifier']
37
- @key = response['key'] if response['key']
38
- @value = response['value'] if response['value']
39
- @state = response['state'] if response['state']
40
- @comment = response['comment'] if response['comment']
41
- @context = response['context'] if response['context']
42
- @array_index = response['array_index'] if response['array_index']
43
- @plural_form = response['plural_form'] if response['plural_form']
44
- @locale_code = response['locale_code'] if response['locale_code']
45
- @project_identifier = response['project_identifier'] if response['project_identifier']
46
- @document_identifier = response['document_identifier'] if response['document_identifier']
47
- @updated_at = DateTime.parse(response['updated_at']) if response['updated_at']
48
- @created_at = DateTime.parse(response['created_at']) if response['created_at']
49
- end
50
-
51
- def remote_hash
52
- hash = {}
53
- hash[:key] = @key if @key
54
- hash[:value] = @value if @value
55
- hash[:state] = @state if @state
56
- hash[:comment] = @comment if @comment
57
- hash[:locale_code] = @locale_code if @locale_code
58
- hash[:plural_form] = @plural_form if @plural_form
59
- hash[:project_identifier] = @project_identifier if @project_identifier
60
- hash[:document_identifier] = @document_identifier if @document_identifier
61
- hash
62
- end
63
- end
64
- end
@@ -1,32 +0,0 @@
1
- module Toptranslation::Resource
2
- class StringList
3
- include Enumerable
4
-
5
- def initialize(connection, options = {})
6
- @connection = connection
7
- @options = options
8
- end
9
-
10
- def find(identifier)
11
- result = @connection.get("/strings/#{identifier}")
12
- Document.new(@connection, result)
13
- end
14
-
15
- def each
16
- strings.each { |string| yield String.new(@connection, string) }
17
- end
18
-
19
- def create(options = {})
20
- project_identifier = options['project_identifier'] || @options[:project_identifier]
21
- document_identifier = options['document_identifier'] || @options[:document_identifier]
22
-
23
- String.new(@connection, options.merge('project_identifier' => project_identifier, 'document_identifier' => document_identifier))
24
- end
25
-
26
- private
27
-
28
- def strings
29
- @connection.get('/strings', params: { project_identifier: @options[:project_identifier], document_identifier: @options[:document_identifier] })
30
- end
31
- end
32
- end