ruby-lokalise-api 4.4.0 → 4.5.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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -0
  3. data/lib/ruby-lokalise-api/client.rb +2 -0
  4. data/lib/ruby-lokalise-api/collections/base.rb +19 -8
  5. data/lib/ruby-lokalise-api/collections/segment.rb +15 -0
  6. data/lib/ruby-lokalise-api/data/attributes.json +26 -0
  7. data/lib/ruby-lokalise-api/resources/base.rb +12 -3
  8. data/lib/ruby-lokalise-api/resources/branch.rb +1 -0
  9. data/lib/ruby-lokalise-api/resources/contributor.rb +1 -1
  10. data/lib/ruby-lokalise-api/resources/custom_translation_status.rb +1 -1
  11. data/lib/ruby-lokalise-api/resources/key.rb +1 -0
  12. data/lib/ruby-lokalise-api/resources/key_comment.rb +1 -1
  13. data/lib/ruby-lokalise-api/resources/order.rb +1 -0
  14. data/lib/ruby-lokalise-api/resources/payment_card.rb +1 -0
  15. data/lib/ruby-lokalise-api/resources/project.rb +1 -0
  16. data/lib/ruby-lokalise-api/resources/project_comment.rb +1 -0
  17. data/lib/ruby-lokalise-api/resources/project_language.rb +1 -1
  18. data/lib/ruby-lokalise-api/resources/queued_process.rb +1 -1
  19. data/lib/ruby-lokalise-api/resources/screenshot.rb +1 -0
  20. data/lib/ruby-lokalise-api/resources/segment.rb +19 -0
  21. data/lib/ruby-lokalise-api/resources/snapshot.rb +1 -0
  22. data/lib/ruby-lokalise-api/resources/task.rb +1 -0
  23. data/lib/ruby-lokalise-api/resources/team_user.rb +1 -1
  24. data/lib/ruby-lokalise-api/resources/team_user_billing_details.rb +14 -0
  25. data/lib/ruby-lokalise-api/resources/team_user_group.rb +1 -1
  26. data/lib/ruby-lokalise-api/resources/translation.rb +1 -0
  27. data/lib/ruby-lokalise-api/resources/translation_provider.rb +1 -1
  28. data/lib/ruby-lokalise-api/resources/webhook.rb +1 -0
  29. data/lib/ruby-lokalise-api/rest/segments.rb +43 -0
  30. data/lib/ruby-lokalise-api/rest/team_user_billing_details.rb +34 -0
  31. data/lib/ruby-lokalise-api/utils/attribute_helpers.rb +3 -1
  32. data/lib/ruby-lokalise-api/utils/string_utils.rb +24 -18
  33. data/lib/ruby-lokalise-api/version.rb +1 -1
  34. data/lib/ruby-lokalise-api.rb +3 -0
  35. data/ruby-lokalise-api.gemspec +18 -15
  36. data/spec/lib/ruby-lokalise-api/rest/segments_spec.rb +106 -0
  37. data/spec/lib/ruby-lokalise-api/rest/team_user_billing_details_spec.rb +48 -0
  38. metadata +15 -7
  39. data/spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb +0 -19
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f15e541afdd5e50a0e9317640b872bb04144dcaa717b2390887546b694e308fd
4
- data.tar.gz: f34bb8a44f1e8552a0bc83b3f4c15d604500d56ecea503260d6423b047b36dcc
3
+ metadata.gz: 1e1ed1ea503db64b5bf145288689885a365e35ba9520e692d65b51b311478fb5
4
+ data.tar.gz: b1636ef5cd3dafb7d1be6ca64ed6c6807c8f6f12f4383039d8312c4ce4f100b2
5
5
  SHA512:
6
- metadata.gz: dbbc75876ec0e0c9f5a611d54520585759d77cb4f13a81126d7f9a45c89852331801054ec973f94a6c0b4e58c0a8ea8c6cb88167e5b4a4b3ac9521531b911a87
7
- data.tar.gz: 2687c66c1fb1ef0012cac50329b87a7c48118cff98a890e06b7764ccce828a850750b6896d5ace0a6810e8cebb86658bbd333794e6bc94cde725c957b1c968f6
6
+ metadata.gz: 8141fe2f935cf0cc380f9824278235c5d6a0b12bd8daef9d6947556d0b73b9aa9d097f2c9e32833eb2c8261d84331ab476f7ef25b6c69965a2f8781bf3b284ff
7
+ data.tar.gz: 4bce32a0012e21830e45b12f58fb188395614a2dc64412c2c28fbd95bda4d8519565d0d38eebed1da9b6a2f7976bd0bc61ee28cb49fd466233b03d1843a90fb4
data/README.md CHANGED
@@ -49,6 +49,8 @@ Alternatively instantiate your client with an [OAuth2 token](http://docs.lokalis
49
49
 
50
50
  Detailed documentation can be found at [lokalise.github.io/ruby-lokalise-api](https://lokalise.github.io/ruby-lokalise-api/).
51
51
 
52
+ You can also check [this repo containing some usage examples](https://github.com/bodrovis-learning/Lokalise-APIv2-Samples) and [this blog post with explanations](https://lokalise.com/blog/lokalise-apiv2-in-practice).
53
+
52
54
  ## License
53
55
 
54
56
  This gem is licensed under the [BSD 3 Clause license](https://github.com/lokalise/ruby-lokalise-api/blob/master/LICENSE). Prior to version 4 the license type was MIT.
@@ -20,6 +20,8 @@ require 'ruby-lokalise-api/rest/translation_providers'
20
20
  require 'ruby-lokalise-api/rest/team_user_group'
21
21
  require 'ruby-lokalise-api/rest/custom_translation_statuses'
22
22
  require 'ruby-lokalise-api/rest/webhooks'
23
+ require 'ruby-lokalise-api/rest/segments'
24
+ require 'ruby-lokalise-api/rest/team_user_billing_details'
23
25
 
24
26
  module Lokalise
25
27
  class Client
@@ -3,6 +3,8 @@
3
3
  module Lokalise
4
4
  module Collections
5
5
  class Base
6
+ using Lokalise::Utils::StringUtils
7
+
6
8
  extend Lokalise::Request
7
9
  extend Lokalise::Utils::AttributeHelpers
8
10
  include Lokalise::Utils::AttributeHelpers
@@ -19,15 +21,8 @@ module Lokalise
19
21
  def initialize(response, params = {})
20
22
  produce_collection_for response
21
23
  populate_pagination_data_for response
22
- content = response['content']
23
- # Project, team id, user id, and branch may not be present in some cases
24
- @project_id = content['project_id']
25
- @team_id = content['team_id']
26
- @user_id = content['user_id']
27
- @branch = content['branch']
28
24
  @request_params = params
29
- @client = response['client']
30
- @path = response['path']
25
+ popular_common_attrs response
31
26
  end
32
27
 
33
28
  class << self
@@ -91,6 +86,8 @@ module Lokalise
91
86
  # Dynamically produces collection of resources based on the given response
92
87
  # Collection example: `{ "content": {"comments": [ ... ]} }`
93
88
  def produce_collection_for(response)
89
+ return unless response['content']
90
+
94
91
  model_class = self.class.name.base_class_name
95
92
  data_key_plural = data_key_for model_class: model_class, plural: true, collection: true
96
93
 
@@ -102,6 +99,20 @@ module Lokalise
102
99
  'base_path' => response['path']
103
100
  end
104
101
  end
102
+
103
+ def popular_common_attrs(response)
104
+ @client = response['client']
105
+ @path = response['path']
106
+
107
+ return unless response['content']
108
+
109
+ content = response['content']
110
+ # Project, team id, user id, and branch may not be present in some cases
111
+ @project_id = content['project_id']
112
+ @team_id = content['team_id']
113
+ @user_id = content['user_id']
114
+ @branch = content['branch']
115
+ end
105
116
  end
106
117
  end
107
118
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lokalise
4
+ module Collections
5
+ class Segment < Base
6
+ class << self
7
+ def endpoint(project_id, key_id, lang_iso, *_args)
8
+ path_from projects: project_id,
9
+ keys: key_id,
10
+ segments: lang_iso
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -134,6 +134,20 @@
134
134
  "created_at",
135
135
  "created_at_timestamp"
136
136
  ],
137
+ "segment": [
138
+ "segment_number",
139
+ "language_iso",
140
+ "modified_at",
141
+ "modified_at_timestamp",
142
+ "modified_by",
143
+ "modified_by_email",
144
+ "value",
145
+ "is_fuzzy",
146
+ "is_reviewed",
147
+ "reviewed_by",
148
+ "words",
149
+ "custom_translation_statuses"
150
+ ],
137
151
  "snapshot": [
138
152
  "snapshot_id",
139
153
  "title",
@@ -188,6 +202,18 @@
188
202
  "created_at_timestamp",
189
203
  "role"
190
204
  ],
205
+ "team_user_billing_details": [
206
+ "billing_email",
207
+ "country_code",
208
+ "zip",
209
+ "state_code",
210
+ "address1",
211
+ "address2",
212
+ "city",
213
+ "phone",
214
+ "company",
215
+ "vatnumber"
216
+ ],
191
217
  "team_user_group": [
192
218
  "group_id",
193
219
  "name",
@@ -3,12 +3,14 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Base
6
+ using Lokalise::Utils::StringUtils
7
+
6
8
  extend Lokalise::Request
7
9
  extend Lokalise::Utils::AttributeHelpers
8
10
  include Lokalise::Utils::AttributeHelpers
9
11
  extend Lokalise::Utils::EndpointHelpers
10
12
 
11
- attr_reader :raw_data, :project_id, :client, :path, :branch, :user_id, :team_id
13
+ attr_reader :raw_data, :project_id, :client, :path, :branch, :user_id, :team_id, :key_id
12
14
 
13
15
  # Initializes a new resource based on the response.
14
16
  # `endpoint_generator` is used in cases when a new instance is generated
@@ -132,7 +134,7 @@ module Lokalise
132
134
 
133
135
  def path_with_id(response, id_key, data_key, endpoint_generator = nil)
134
136
  # Some resources do not have ids at all
135
- return nil unless response['content'].key?(id_key) || response['content'].key?(data_key)
137
+ return unless response['content'] && (response['content'].key?(id_key) || response['content'].key?(data_key))
136
138
 
137
139
  # ID of the resource
138
140
  id = id_from response, id_key, data_key
@@ -156,9 +158,11 @@ module Lokalise
156
158
  # Content may be `{"project_id": '123', ...}` or {"snapshot": {"snapshot_id": '123', ...}}
157
159
  # Sometimes there is an `id_key` but it has a value of `null`
158
160
  # (for example when we do not place the actual order but only check its price).
161
+ # In rare cases the actual identifier does not have an "_id" suffix
162
+ # (for segments that have "segment_number" field instead)
159
163
  # Therefore we must explicitly check if the key is present
160
164
  content = response['content']
161
- return content[id_key] if content.key?(id_key)
165
+ return content[id_key] if content.respond_to?(:key?) && content&.key?(id_key)
162
166
 
163
167
  content[data_key][id_key]
164
168
  end
@@ -166,6 +170,8 @@ module Lokalise
166
170
  # Store all resources attributes under the corresponding instance variables.
167
171
  # `ATTRIBUTES` is defined inside resource-specific classes
168
172
  def populate_attributes_for(content)
173
+ return unless content
174
+
169
175
  data_key = data_key_for model_class: self.class.name.base_class_name
170
176
 
171
177
  self.class.const_get(:ATTRIBUTES).each do |attr|
@@ -183,10 +189,13 @@ module Lokalise
183
189
  # Some of them may be absent in certain cases.
184
190
  # rubocop:disable Naming/MemoizedInstanceVariableName
185
191
  def extract_common_attributes_for(content)
192
+ return unless content
193
+
186
194
  @raw_data = content
187
195
  @project_id ||= content['project_id']
188
196
  @user_id ||= content['user_id']
189
197
  @team_id ||= content['team_id']
198
+ @key_id ||= content['key_id']
190
199
  @branch ||= content['branch']
191
200
  end
192
201
  # rubocop:enable Naming/MemoizedInstanceVariableName
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Branch < Base
6
+ ID_KEY = 'branch_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  def merge(params = {})
@@ -3,7 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Contributor < Base
6
- ID_KEY = 'user'
6
+ ID_KEY = 'user_id'
7
7
  supports :update, :destroy, [:reload_data, '', :find]
8
8
 
9
9
  class << self
@@ -3,7 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class CustomTranslationStatus < Base
6
- ID_KEY = 'status'
6
+ ID_KEY = 'status_id'
7
7
  supports :update, :destroy, [:reload_data, '', :find]
8
8
 
9
9
  class << self
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Key < Base
6
+ ID_KEY = 'key_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -4,7 +4,7 @@ module Lokalise
4
4
  module Resources
5
5
  class KeyComment < Base
6
6
  DATA_KEY = 'Comment'
7
- ID_KEY = 'comment'
7
+ ID_KEY = 'comment_id'
8
8
  supports :destroy, [:reload_data, '', :find]
9
9
 
10
10
  class << self
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Order < Base
6
+ ID_KEY = 'order_id'
6
7
  supports [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class PaymentCard < Base
6
+ ID_KEY = 'card_id'
6
7
  supports :destroy, [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Project < Base
6
+ ID_KEY = 'project_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  def empty
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class ProjectComment < Base
6
+ ID_KEY = 'comment_id'
6
7
  DATA_KEY = 'Comment'
7
8
  end
8
9
  end
@@ -4,7 +4,7 @@ module Lokalise
4
4
  module Resources
5
5
  class ProjectLanguage < Base
6
6
  DATA_KEY = 'Language'
7
- ID_KEY = 'lang'
7
+ ID_KEY = 'lang_id'
8
8
  supports :update, :destroy, [:reload_data, '', :find]
9
9
 
10
10
  class << self
@@ -4,7 +4,7 @@ module Lokalise
4
4
  module Resources
5
5
  class QueuedProcess < Base
6
6
  DATA_KEY = 'Process'
7
- ID_KEY = 'process'
7
+ ID_KEY = 'process_id'
8
8
  supports [:reload_data, '', :find]
9
9
 
10
10
  class << self
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Screenshot < Base
6
+ ID_KEY = 'screenshot_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lokalise
4
+ module Resources
5
+ class Segment < Base
6
+ DATA_KEY = 'Segment'
7
+ ID_KEY = 'segment_number'
8
+ supports :update, [:reload_data, '', :find]
9
+
10
+ class << self
11
+ def endpoint(project_id, key_id, lang_iso, segment_number = nil)
12
+ path_from projects: project_id,
13
+ keys: key_id,
14
+ segments: [lang_iso, segment_number]
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Snapshot < Base
6
+ ID_KEY = 'snapshot_id'
6
7
  supports :destroy
7
8
 
8
9
  def restore
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Task < Base
6
+ ID_KEY = 'task_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -3,7 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class TeamUser < Base
6
- ID_KEY = 'user'
6
+ ID_KEY = 'user_id'
7
7
  supports :update, :destroy, [:reload_data, '', :find]
8
8
 
9
9
  class << self
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lokalise
4
+ module Resources
5
+ class TeamUserBillingDetails < Base
6
+ class << self
7
+ def endpoint(team_id)
8
+ path_from teams: team_id,
9
+ billing_details: ''
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -4,7 +4,7 @@ module Lokalise
4
4
  module Resources
5
5
  class TeamUserGroup < Base
6
6
  DATA_KEY = 'Group'
7
- ID_KEY = 'group'
7
+ ID_KEY = 'group_id'
8
8
  supports :update, :destroy,
9
9
  [:add_projects, '/projects/add', :update],
10
10
  [:remove_projects, '/projects/remove', :update],
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Translation < Base
6
+ ID_KEY = 'translation_id'
6
7
  supports :update, [:reload_data, '', :find]
7
8
 
8
9
  class << self
@@ -4,7 +4,7 @@ module Lokalise
4
4
  module Resources
5
5
  class TranslationProvider < Base
6
6
  supports [:reload_data, '', :find]
7
- ID_KEY = 'provider'
7
+ ID_KEY = 'provider_id'
8
8
 
9
9
  class << self
10
10
  def endpoint(team_id, provider_id = nil)
@@ -3,6 +3,7 @@
3
3
  module Lokalise
4
4
  module Resources
5
5
  class Webhook < Base
6
+ ID_KEY = 'webhook_id'
6
7
  supports :update, :destroy, [:reload_data, '', :find]
7
8
 
8
9
  def regenerate_secret
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lokalise
4
+ class Client
5
+ # Returns all segments for the given key and language ISO code
6
+ #
7
+ # @see https://app.lokalise.com/api2docs/curl/#transition-list-all-segments-for-key-language-get
8
+ # @return [Lokalise::Collection::Segments<Lokalise::Resources::Segment>]
9
+ # @param project_id [String]
10
+ # @param key_id [String, Integer]
11
+ # @param lang_iso [String]
12
+ # @param params [Hash]
13
+ def segments(project_id, key_id, lang_iso, params = {})
14
+ c_r Lokalise::Collections::Segment, :all, [project_id, key_id, lang_iso], params
15
+ end
16
+
17
+ # Returns a segment under a given number for the given key and language ISO code
18
+ #
19
+ # @see https://app.lokalise.com/api2docs/curl/#transition-retrieve-a-segment-for-key-language-get
20
+ # @return [Lokalise::Resources::Segment]
21
+ # @param project_id [String]
22
+ # @param key_id [String, Integer]
23
+ # @param lang_iso [String]
24
+ # @params segment_number [Integer, String]
25
+ # @param params [Hash]
26
+ def segment(project_id, key_id, lang_iso, segment_number, params = {})
27
+ c_r Lokalise::Resources::Segment, :find, [project_id, key_id, lang_iso, segment_number], params
28
+ end
29
+
30
+ # Updates a segment under a given number for the given key and language ISO code
31
+ #
32
+ # @see https://app.lokalise.com/api2docs/curl/#transition-update-a-segment-post
33
+ # @return [Lokalise::Resources::Segment]
34
+ # @param project_id [String]
35
+ # @param key_id [String, Integer]
36
+ # @param lang_iso [String]
37
+ # @params segment_number [Integer, String]
38
+ # @param params [Hash]
39
+ def update_segment(project_id, key_id, lang_iso, segment_number, params = {})
40
+ c_r Lokalise::Resources::Segment, :update, [project_id, key_id, lang_iso, segment_number], params
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lokalise
4
+ class Client
5
+ # Returns team user billing details
6
+ #
7
+ # @see https://app.lokalise.com/api2docs/curl/#transition-retrieve-team-user-billing-details-get
8
+ # @return [Lokalise::Resources::TeamUserBillingDetails]
9
+ # @param team_id [String]
10
+ def team_user_billing_details(team_id)
11
+ c_r Lokalise::Resources::TeamUserBillingDetails, :find, team_id
12
+ end
13
+
14
+ # Creates team user billing details
15
+ #
16
+ # @see https://app.lokalise.com/api2docs/curl/#transition-create-team-user-billing-details-post
17
+ # @return [Lokalise::Resources::TeamUserBillingDetails]
18
+ # @param team_id [String]
19
+ # @param params [Hash]
20
+ def create_team_user_billing_details(team_id, params)
21
+ c_r Lokalise::Resources::TeamUserBillingDetails, :create, team_id, params
22
+ end
23
+
24
+ # Updates team user billing details
25
+ #
26
+ # @see https://app.lokalise.com/api2docs/curl/#transition-create-team-user-billing-details-post
27
+ # @return [Lokalise::Resources::TeamUserBillingDetails]
28
+ # @param team_id [String]
29
+ # @param params [Hash]
30
+ def update_team_user_billing_details(team_id, params)
31
+ c_r Lokalise::Resources::TeamUserBillingDetails, :update, team_id, params
32
+ end
33
+ end
34
+ end
@@ -3,6 +3,8 @@
3
3
  module Lokalise
4
4
  module Utils
5
5
  module AttributeHelpers
6
+ using Lokalise::Utils::StringUtils
7
+
6
8
  UNIFIED_RESOURCES = %w[comment language].freeze
7
9
 
8
10
  # Returns the name of the API resource for the given class.
@@ -40,7 +42,7 @@ module Lokalise
40
42
  # @return [String]
41
43
  # @param model_class [String]
42
44
  def id_key_for(model_class)
43
- "#{get_key(name: 'ID_KEY', model_class: model_class)}_id"
45
+ get_key name: 'ID_KEY', model_class: model_class
44
46
  end
45
47
 
46
48
  # Loads attributes for the given resource based on its name
@@ -3,25 +3,31 @@
3
3
  # Initial code taken from Facets gem by Rubyworks
4
4
  # https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb
5
5
 
6
- class String
7
- # Underscore a string such that camelcase, dashes and spaces are
8
- # replaced by underscores.
9
- def snakecase
10
- base_class_name.
11
- gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
12
- gsub(/([a-z\d])([A-Z])/, '\1_\2').
13
- tr('-', '_').
14
- gsub(/\s/, '_').
15
- gsub(/__+/, '_').
16
- downcase
17
- end
6
+ module Lokalise
7
+ module Utils
8
+ module StringUtils
9
+ refine String do
10
+ # Underscore a string such that camelcase, dashes and spaces are
11
+ # replaced by underscores.
12
+ def snakecase
13
+ base_class_name.
14
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
15
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
16
+ tr('-', '_').
17
+ gsub(/\s/, '_').
18
+ gsub(/__+/, '_').
19
+ downcase
20
+ end
18
21
 
19
- # Turn `Module::Nested::ClassName` to just `ClassName`
20
- def base_class_name
21
- split('::').last
22
- end
22
+ # Turn `Module::Nested::ClassName` to just `ClassName`
23
+ def base_class_name
24
+ split('::').last
25
+ end
23
26
 
24
- def remove_trailing_slash
25
- delete_suffix '/'
27
+ def remove_trailing_slash
28
+ delete_suffix '/'
29
+ end
30
+ end
31
+ end
26
32
  end
27
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lokalise
4
- VERSION = '4.4.0'
4
+ VERSION = '4.5.0'
5
5
  end
@@ -37,6 +37,8 @@ require 'ruby-lokalise-api/resources/translation_provider'
37
37
  require 'ruby-lokalise-api/resources/team_user_group'
38
38
  require 'ruby-lokalise-api/resources/custom_translation_status'
39
39
  require 'ruby-lokalise-api/resources/webhook'
40
+ require 'ruby-lokalise-api/resources/segment'
41
+ require 'ruby-lokalise-api/resources/team_user_billing_details'
40
42
 
41
43
  require 'ruby-lokalise-api/collections/base'
42
44
  require 'ruby-lokalise-api/collections/branch'
@@ -61,6 +63,7 @@ require 'ruby-lokalise-api/collections/translation_provider'
61
63
  require 'ruby-lokalise-api/collections/team_user_group'
62
64
  require 'ruby-lokalise-api/collections/custom_translation_status'
63
65
  require 'ruby-lokalise-api/collections/webhook'
66
+ require 'ruby-lokalise-api/collections/segment'
64
67
 
65
68
  require 'ruby-lokalise-api/client'
66
69
  require 'ruby-lokalise-api/oauth_client'
@@ -5,7 +5,7 @@ require File.expand_path('lib/ruby-lokalise-api/version', __dir__)
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = 'ruby-lokalise-api'
7
7
  spec.version = Lokalise::VERSION
8
- spec.authors = ['Ilya Bodrov']
8
+ spec.authors = ['Ilya Bodrov-Krukowski']
9
9
  spec.email = ['golosizpru@gmail.com']
10
10
  spec.summary = 'Ruby interface to the Lokalise API'
11
11
  spec.description = 'Opinionated Ruby client for the Lokalise platform API allowing to work with translations, projects, users and other resources as with Ruby objects.'
@@ -22,19 +22,22 @@ Gem::Specification.new do |spec|
22
22
  spec.extra_rdoc_files = ['README.md']
23
23
  spec.require_paths = ['lib']
24
24
 
25
- spec.add_dependency 'addressable', '~> 2.5'
26
- spec.add_dependency 'faraday', '~> 1.0'
27
- spec.add_dependency 'faraday_middleware', '~> 1.0'
28
- spec.add_dependency 'json', '>= 1.8.0'
25
+ spec.add_dependency 'addressable', '~> 2.5'
26
+ spec.add_dependency 'faraday', '~> 1.0'
27
+ spec.add_dependency 'faraday_middleware', '~> 1.0'
28
+ spec.add_dependency 'json', '>= 1.8.0'
29
29
 
30
- spec.add_development_dependency 'codecov', '~> 0.1'
31
- spec.add_development_dependency 'dotenv', '~> 2.5'
32
- spec.add_development_dependency 'oj', '~> 3.10'
33
- spec.add_development_dependency 'rake', '~> 13.0'
34
- spec.add_development_dependency 'rspec', '~> 3.6'
35
- spec.add_development_dependency 'rubocop', '~> 1.6'
36
- spec.add_development_dependency 'rubocop-performance', '~> 1.5'
37
- spec.add_development_dependency 'rubocop-rspec', '~> 2.0'
38
- spec.add_development_dependency 'simplecov', '~> 0.16'
39
- spec.add_development_dependency 'vcr', '~> 6.0'
30
+ spec.add_development_dependency 'codecov', '~> 0.1'
31
+ spec.add_development_dependency 'dotenv', '~> 2.5'
32
+ spec.add_development_dependency 'oj', '~> 3.10'
33
+ spec.add_development_dependency 'rake', '~> 13.0'
34
+ spec.add_development_dependency 'rspec', '~> 3.6'
35
+ spec.add_development_dependency 'rubocop', '~> 1.6'
36
+ spec.add_development_dependency 'rubocop-performance', '~> 1.5'
37
+ spec.add_development_dependency 'rubocop-rspec', '~> 2.0'
38
+ spec.add_development_dependency 'simplecov', '~> 0.16'
39
+ spec.add_development_dependency 'vcr', '~> 6.0'
40
+ spec.metadata = {
41
+ 'rubygems_mfa_required' => 'true'
42
+ }
40
43
  end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Lokalise::Client do
4
+ let(:project_id) { '39066161618d4ecb9fdc12.00274309' }
5
+ let(:key_id) { 129_358_815 }
6
+
7
+ describe '#segments' do
8
+ it 'returns all segments for a key under lang_iso' do
9
+ segments = VCR.use_cassette('all_key_segments') do
10
+ test_client.segments project_id, key_id, 'en'
11
+ end.collection
12
+
13
+ expect(segments.count).to eq(4)
14
+ expect(segments.first.value).to eq('Hello!')
15
+ end
16
+ end
17
+
18
+ describe '#segment' do
19
+ it 'returns a single segment' do
20
+ lang_iso = 'en'
21
+ segment_number = 2
22
+
23
+ segment = VCR.use_cassette('key_segment') do
24
+ test_client.segment project_id, key_id, lang_iso, segment_number
25
+ end
26
+
27
+ expect(segment.key_id).to eq(key_id)
28
+ expect(segment.segment_number).to eq(segment_number)
29
+ expect(segment.language_iso).to eq(lang_iso)
30
+ expect(segment.modified_at).to eq('2021-11-22 16:46:50 (Etc/UTC)')
31
+ expect(segment.modified_at_timestamp).to eq(1_637_599_610)
32
+ expect(segment.modified_by).to eq(20_181)
33
+ expect(segment.modified_by_email).to eq('bodrovis@protonmail.com')
34
+ expect(segment.value).to eq('This is just a simple text.')
35
+ expect(segment.is_fuzzy).to eq(false)
36
+ expect(segment.is_reviewed).to eq(false)
37
+ expect(segment.reviewed_by).to eq(0)
38
+ expect(segment.words).to eq(6)
39
+ expect(segment.custom_translation_statuses.first['color']).to eq('#61bd4f')
40
+ end
41
+
42
+ it 'allows to pass params' do
43
+ lang_iso = 'en'
44
+ segment_number = 2
45
+
46
+ segment = VCR.use_cassette('key_segment_params') do
47
+ test_client.segment project_id, key_id, lang_iso, segment_number, disable_references: '1'
48
+ end
49
+
50
+ expect(segment.segment_number).to eq(segment_number)
51
+ expect(segment.value).to eq('This is just a simple text.')
52
+ expect(segment.language_iso).to eq(lang_iso)
53
+ end
54
+ end
55
+
56
+ specify '#update_segment' do
57
+ lang_iso = 'en'
58
+ segment_number = 3
59
+
60
+ segment = VCR.use_cassette('update_key_segment') do
61
+ test_client.update_segment project_id, key_id, lang_iso, segment_number,
62
+ value: 'Updated via API',
63
+ is_reviewed: true
64
+ end
65
+
66
+ expect(segment.segment_number).to eq(segment_number)
67
+ expect(segment.value).to eq('Updated via API')
68
+ expect(segment.language_iso).to eq(lang_iso)
69
+ end
70
+
71
+ context 'when segment methods are chained' do
72
+ specify '#reload_data' do
73
+ lang_iso = 'en'
74
+ segment_number = 2
75
+
76
+ segment = VCR.use_cassette('key_segment') do
77
+ test_client.segment project_id, key_id, lang_iso, segment_number
78
+ end
79
+
80
+ reloaded_segment = VCR.use_cassette('reload_key_segment') do
81
+ segment.reload_data
82
+ end
83
+
84
+ expect(reloaded_segment.segment_number).to eq(segment_number)
85
+ expect(reloaded_segment.key_id).to eq(key_id)
86
+ end
87
+
88
+ specify '#update' do
89
+ lang_iso = 'en'
90
+ segment_number = 4
91
+
92
+ segment = VCR.use_cassette('another_key_segment') do
93
+ test_client.segment project_id, key_id, lang_iso, segment_number
94
+ end
95
+
96
+ updated_segment = VCR.use_cassette('update_key_segment_chained') do
97
+ segment.update value: 'Chain Updated',
98
+ is_fuzzy: true
99
+ end
100
+
101
+ expect(updated_segment.segment_number).to eq(segment_number)
102
+ expect(updated_segment.is_fuzzy).to eq(true)
103
+ expect(updated_segment.value).to eq('Chain Updated')
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Lokalise::Client do
4
+ let(:team_id) { 176_692 }
5
+ let(:team_id2) { 273_879 }
6
+
7
+ specify '#team_user_billing_details' do
8
+ details = VCR.use_cassette('team_user_billing_details') do
9
+ test_client.team_user_billing_details team_id
10
+ end
11
+
12
+ expect(details.billing_email).to eq('hello@example.com')
13
+ expect(details.country_code).to eq('LV')
14
+ expect(details.zip).to eq('LV-6543')
15
+ expect(details.state_code).to eq('')
16
+ expect(details.address1).to eq('Sample line 1')
17
+ expect(details.address2).to eq('Sample line 2')
18
+ expect(details.city).to eq('Riga')
19
+ expect(details.phone).to eq('+371123456')
20
+ expect(details.company).to eq('Self-employed')
21
+ expect(details.vatnumber).to eq('123')
22
+ end
23
+
24
+ specify '#create_team_user_billing_details' do
25
+ details = VCR.use_cassette('create_team_user_billing_details') do
26
+ test_client.create_team_user_billing_details team_id2, billing_email: 'ruby@example.com',
27
+ country_code: 'LV',
28
+ zip: 'LV-1111'
29
+ end
30
+
31
+ expect(details.billing_email).to eq('ruby@example.com')
32
+ expect(details.country_code).to eq('LV')
33
+ expect(details.address1).to eq('')
34
+ end
35
+
36
+ specify '#update_team_user_billing_details' do
37
+ details = VCR.use_cassette('update_team_user_billing_details') do
38
+ test_client.update_team_user_billing_details team_id2, billing_email: 'ruby_rspec@example.com',
39
+ country_code: 'LV',
40
+ zip: 'LV-1111',
41
+ address1: 'Addr line 1'
42
+ end
43
+
44
+ expect(details.billing_email).to eq('ruby_rspec@example.com')
45
+ expect(details.country_code).to eq('LV')
46
+ expect(details.address1).to eq('Addr line 1')
47
+ end
48
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lokalise-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.4.0
4
+ version: 4.5.0
5
5
  platform: ruby
6
6
  authors:
7
- - Ilya Bodrov
7
+ - Ilya Bodrov-Krukowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2021-12-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -239,6 +239,7 @@ files:
239
239
  - lib/ruby-lokalise-api/collections/project_language.rb
240
240
  - lib/ruby-lokalise-api/collections/queued_process.rb
241
241
  - lib/ruby-lokalise-api/collections/screenshot.rb
242
+ - lib/ruby-lokalise-api/collections/segment.rb
242
243
  - lib/ruby-lokalise-api/collections/snapshot.rb
243
244
  - lib/ruby-lokalise-api/collections/system_language.rb
244
245
  - lib/ruby-lokalise-api/collections/task.rb
@@ -268,11 +269,13 @@ files:
268
269
  - lib/ruby-lokalise-api/resources/project_language.rb
269
270
  - lib/ruby-lokalise-api/resources/queued_process.rb
270
271
  - lib/ruby-lokalise-api/resources/screenshot.rb
272
+ - lib/ruby-lokalise-api/resources/segment.rb
271
273
  - lib/ruby-lokalise-api/resources/snapshot.rb
272
274
  - lib/ruby-lokalise-api/resources/system_language.rb
273
275
  - lib/ruby-lokalise-api/resources/task.rb
274
276
  - lib/ruby-lokalise-api/resources/team.rb
275
277
  - lib/ruby-lokalise-api/resources/team_user.rb
278
+ - lib/ruby-lokalise-api/resources/team_user_billing_details.rb
276
279
  - lib/ruby-lokalise-api/resources/team_user_group.rb
277
280
  - lib/ruby-lokalise-api/resources/translation.rb
278
281
  - lib/ruby-lokalise-api/resources/translation_provider.rb
@@ -289,8 +292,10 @@ files:
289
292
  - lib/ruby-lokalise-api/rest/projects.rb
290
293
  - lib/ruby-lokalise-api/rest/queued_processes.rb
291
294
  - lib/ruby-lokalise-api/rest/screenshots.rb
295
+ - lib/ruby-lokalise-api/rest/segments.rb
292
296
  - lib/ruby-lokalise-api/rest/snapshots.rb
293
297
  - lib/ruby-lokalise-api/rest/tasks.rb
298
+ - lib/ruby-lokalise-api/rest/team_user_billing_details.rb
294
299
  - lib/ruby-lokalise-api/rest/team_user_group.rb
295
300
  - lib/ruby-lokalise-api/rest/team_users.rb
296
301
  - lib/ruby-lokalise-api/rest/teams.rb
@@ -317,15 +322,16 @@ files:
317
322
  - spec/lib/ruby-lokalise-api/rest/projects_spec.rb
318
323
  - spec/lib/ruby-lokalise-api/rest/queued_processes_spec.rb
319
324
  - spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb
325
+ - spec/lib/ruby-lokalise-api/rest/segments_spec.rb
320
326
  - spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb
321
327
  - spec/lib/ruby-lokalise-api/rest/tasks_spec.rb
328
+ - spec/lib/ruby-lokalise-api/rest/team_user_billing_details_spec.rb
322
329
  - spec/lib/ruby-lokalise-api/rest/team_user_groups_spec.rb
323
330
  - spec/lib/ruby-lokalise-api/rest/team_users_spec.rb
324
331
  - spec/lib/ruby-lokalise-api/rest/teams_spec.rb
325
332
  - spec/lib/ruby-lokalise-api/rest/translation_providers_spec.rb
326
333
  - spec/lib/ruby-lokalise-api/rest/translations_spec.rb
327
334
  - spec/lib/ruby-lokalise-api/rest/webhooks_spec.rb
328
- - spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb
329
335
  - spec/lib/ruby-lokalise-api_spec.rb
330
336
  - spec/spec_helper.rb
331
337
  - spec/support/test_client.rb
@@ -333,7 +339,8 @@ files:
333
339
  homepage: https://github.com/lokalise/ruby-lokalise-api
334
340
  licenses:
335
341
  - BSD-3-Clause
336
- metadata: {}
342
+ metadata:
343
+ rubygems_mfa_required: 'true'
337
344
  post_install_message:
338
345
  rdoc_options: []
339
346
  require_paths:
@@ -349,7 +356,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
349
356
  - !ruby/object:Gem::Version
350
357
  version: '0'
351
358
  requirements: []
352
- rubygems_version: 3.2.26
359
+ rubygems_version: 3.2.33
353
360
  signing_key:
354
361
  specification_version: 4
355
362
  summary: Ruby interface to the Lokalise API
@@ -369,15 +376,16 @@ test_files:
369
376
  - spec/lib/ruby-lokalise-api/rest/projects_spec.rb
370
377
  - spec/lib/ruby-lokalise-api/rest/queued_processes_spec.rb
371
378
  - spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb
379
+ - spec/lib/ruby-lokalise-api/rest/segments_spec.rb
372
380
  - spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb
373
381
  - spec/lib/ruby-lokalise-api/rest/tasks_spec.rb
382
+ - spec/lib/ruby-lokalise-api/rest/team_user_billing_details_spec.rb
374
383
  - spec/lib/ruby-lokalise-api/rest/team_user_groups_spec.rb
375
384
  - spec/lib/ruby-lokalise-api/rest/team_users_spec.rb
376
385
  - spec/lib/ruby-lokalise-api/rest/teams_spec.rb
377
386
  - spec/lib/ruby-lokalise-api/rest/translation_providers_spec.rb
378
387
  - spec/lib/ruby-lokalise-api/rest/translations_spec.rb
379
388
  - spec/lib/ruby-lokalise-api/rest/webhooks_spec.rb
380
- - spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb
381
389
  - spec/lib/ruby-lokalise-api_spec.rb
382
390
  - spec/spec_helper.rb
383
391
  - spec/support/test_client.rb
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe String do
4
- let(:snake_result) { 'snake_case' }
5
- let(:bc_result) { 'Klass' }
6
-
7
- specify '#snakecase' do
8
- expect('SnakeCase'.snakecase).to eq snake_result
9
- expect('Snake-Case'.snakecase).to eq snake_result
10
- expect('Snake Case'.snakecase).to eq snake_result
11
- expect('Snake - Case'.snakecase).to eq snake_result
12
- end
13
-
14
- specify '#base_class_name' do
15
- expect('Namespace::Nested::Klass'.base_class_name).to eq bc_result
16
- expect('Nested::Klass'.base_class_name).to eq bc_result
17
- expect('Klass'.base_class_name).to eq bc_result
18
- end
19
- end