ruby-lokalise-api 4.3.1 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -2
  3. data/lib/ruby-lokalise-api/base_request.rb +24 -0
  4. data/lib/ruby-lokalise-api/client.rb +5 -3
  5. data/lib/ruby-lokalise-api/collections/base.rb +19 -7
  6. data/lib/ruby-lokalise-api/collections/segment.rb +15 -0
  7. data/lib/ruby-lokalise-api/connection.rb +3 -2
  8. data/lib/ruby-lokalise-api/data/attributes.json +26 -0
  9. data/lib/ruby-lokalise-api/error.rb +2 -2
  10. data/lib/ruby-lokalise-api/oauth2/auth.rb +62 -0
  11. data/lib/ruby-lokalise-api/oauth2/connection.rb +25 -0
  12. data/lib/ruby-lokalise-api/oauth2/request.rb +23 -0
  13. data/lib/ruby-lokalise-api/oauth2_client.rb +11 -0
  14. data/lib/ruby-lokalise-api/request.rb +4 -14
  15. data/lib/ruby-lokalise-api/resources/base.rb +18 -7
  16. data/lib/ruby-lokalise-api/resources/branch.rb +3 -1
  17. data/lib/ruby-lokalise-api/resources/contributor.rb +1 -1
  18. data/lib/ruby-lokalise-api/resources/custom_translation_status.rb +1 -1
  19. data/lib/ruby-lokalise-api/resources/key.rb +1 -0
  20. data/lib/ruby-lokalise-api/resources/key_comment.rb +1 -1
  21. data/lib/ruby-lokalise-api/resources/order.rb +1 -0
  22. data/lib/ruby-lokalise-api/resources/payment_card.rb +1 -0
  23. data/lib/ruby-lokalise-api/resources/project.rb +1 -0
  24. data/lib/ruby-lokalise-api/resources/project_comment.rb +1 -0
  25. data/lib/ruby-lokalise-api/resources/project_language.rb +1 -1
  26. data/lib/ruby-lokalise-api/resources/queued_process.rb +1 -1
  27. data/lib/ruby-lokalise-api/resources/screenshot.rb +1 -0
  28. data/lib/ruby-lokalise-api/resources/segment.rb +19 -0
  29. data/lib/ruby-lokalise-api/resources/snapshot.rb +1 -0
  30. data/lib/ruby-lokalise-api/resources/task.rb +1 -0
  31. data/lib/ruby-lokalise-api/resources/team_user.rb +1 -1
  32. data/lib/ruby-lokalise-api/resources/team_user_billing_details.rb +14 -0
  33. data/lib/ruby-lokalise-api/resources/team_user_group.rb +1 -1
  34. data/lib/ruby-lokalise-api/resources/translation.rb +1 -0
  35. data/lib/ruby-lokalise-api/resources/translation_provider.rb +1 -1
  36. data/lib/ruby-lokalise-api/resources/webhook.rb +1 -0
  37. data/lib/ruby-lokalise-api/rest/segments.rb +43 -0
  38. data/lib/ruby-lokalise-api/rest/team_user_billing_details.rb +34 -0
  39. data/lib/ruby-lokalise-api/utils/attribute_helpers.rb +3 -1
  40. data/lib/ruby-lokalise-api/utils/string_utils.rb +24 -18
  41. data/lib/ruby-lokalise-api/version.rb +1 -1
  42. data/lib/ruby-lokalise-api.rb +30 -2
  43. data/ruby-lokalise-api.gemspec +18 -15
  44. data/spec/lib/ruby-lokalise-api/connection_spec.rb +28 -43
  45. data/spec/lib/ruby-lokalise-api/oauth2/auth_spec.rb +73 -0
  46. data/spec/lib/ruby-lokalise-api/rest/branches_spec.rb +8 -8
  47. data/spec/lib/ruby-lokalise-api/rest/contributors_spec.rb +2 -2
  48. data/spec/lib/ruby-lokalise-api/rest/keys_spec.rb +1 -1
  49. data/spec/lib/ruby-lokalise-api/rest/languages_spec.rb +2 -2
  50. data/spec/lib/ruby-lokalise-api/rest/projects_spec.rb +14 -1
  51. data/spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb +2 -2
  52. data/spec/lib/ruby-lokalise-api/rest/segments_spec.rb +106 -0
  53. data/spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb +1 -1
  54. data/spec/lib/ruby-lokalise-api/rest/tasks_spec.rb +2 -2
  55. data/spec/lib/ruby-lokalise-api/rest/team_user_billing_details_spec.rb +48 -0
  56. data/spec/lib/ruby-lokalise-api/rest/team_users_spec.rb +1 -1
  57. data/spec/lib/ruby-lokalise-api/rest/translations_spec.rb +1 -1
  58. data/spec/lib/ruby-lokalise-api_spec.rb +15 -7
  59. data/spec/support/test_client.rb +8 -0
  60. data/spec/support/vcr.rb +5 -0
  61. metadata +27 -12
  62. data/spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb +0 -19
@@ -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.3.1'
4
+ VERSION = '5.0.0'
5
5
  end
@@ -1,19 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'faraday'
4
- require 'faraday_middleware'
4
+ require 'faraday/gzip'
5
5
  require 'yaml'
6
6
  require 'addressable'
7
7
 
8
8
  require 'ruby-lokalise-api/version'
9
9
  require 'ruby-lokalise-api/json_handler'
10
10
  require 'ruby-lokalise-api/connection'
11
+ require 'ruby-lokalise-api/base_request'
11
12
  require 'ruby-lokalise-api/request'
12
13
  require 'ruby-lokalise-api/error'
13
14
  require 'ruby-lokalise-api/utils/string_utils'
14
15
  require 'ruby-lokalise-api/utils/attribute_helpers'
15
16
  require 'ruby-lokalise-api/utils/endpoint_helpers'
16
17
 
18
+ require 'ruby-lokalise-api/oauth2/connection'
19
+ require 'ruby-lokalise-api/oauth2/request'
20
+
17
21
  require 'ruby-lokalise-api/resources/base'
18
22
  require 'ruby-lokalise-api/resources/branch'
19
23
  require 'ruby-lokalise-api/resources/project'
@@ -37,6 +41,8 @@ require 'ruby-lokalise-api/resources/translation_provider'
37
41
  require 'ruby-lokalise-api/resources/team_user_group'
38
42
  require 'ruby-lokalise-api/resources/custom_translation_status'
39
43
  require 'ruby-lokalise-api/resources/webhook'
44
+ require 'ruby-lokalise-api/resources/segment'
45
+ require 'ruby-lokalise-api/resources/team_user_billing_details'
40
46
 
41
47
  require 'ruby-lokalise-api/collections/base'
42
48
  require 'ruby-lokalise-api/collections/branch'
@@ -61,8 +67,12 @@ require 'ruby-lokalise-api/collections/translation_provider'
61
67
  require 'ruby-lokalise-api/collections/team_user_group'
62
68
  require 'ruby-lokalise-api/collections/custom_translation_status'
63
69
  require 'ruby-lokalise-api/collections/webhook'
70
+ require 'ruby-lokalise-api/collections/segment'
64
71
 
65
72
  require 'ruby-lokalise-api/client'
73
+ require 'ruby-lokalise-api/oauth2_client'
74
+
75
+ require 'ruby-lokalise-api/oauth2/auth'
66
76
 
67
77
  module Lokalise
68
78
  class << self
@@ -72,12 +82,30 @@ module Lokalise
72
82
  # @param token [String]
73
83
  # @param params [Hash]
74
84
  def client(token, params = {})
75
- @client ||= Lokalise::Client.new token, params
85
+ @client = Lokalise::Client.new token, params
76
86
  end
77
87
 
78
88
  # Reset the currently set client
79
89
  def reset_client!
80
90
  @client = nil
81
91
  end
92
+
93
+ # Initializes a new OAuth2Client object
94
+ #
95
+ # @return [Lokalise::OAuth2Client]
96
+ # @param token [String]
97
+ # @param params [Hash]
98
+ def oauth2_client(token, params = {})
99
+ @oauth2_client = Lokalise::OAuth2Client.new token, params
100
+ end
101
+
102
+ # Reset the currently set OAuth2 client
103
+ def reset_oauth2_client!
104
+ @oauth2_client = nil
105
+ end
106
+
107
+ def auth_client(client_id, client_secret)
108
+ Lokalise::OAuth2::Auth.new client_id, client_secret
109
+ end
82
110
  end
83
111
  end
@@ -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', '~> 2.0'
27
+ spec.add_dependency 'faraday-gzip', '~> 0.1'
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
@@ -1,83 +1,68 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  RSpec.describe Lokalise::Connection do
4
- include described_class
4
+ let(:dummy) { Class.new { include Lokalise::Connection }.new }
5
5
 
6
6
  let(:project_id) { '803826145ba90b42d5d860.46800099' }
7
7
  let(:key_id) { 44_596_059 }
8
8
 
9
9
  before { Lokalise.reset_client! }
10
10
 
11
- after do
12
- Lokalise.reset_client!
13
- Faraday.default_adapter = :net_http
11
+ after { Lokalise.reset_client! }
12
+
13
+ it 'Authorization header must be present for OAuth2 client' do
14
+ conn = dummy.connection test_oauth2_client
15
+ expect(conn.headers['Authorization']).to eq(test_oauth2_client.token)
16
+ expect(conn.headers['X-api-token']).to be_nil
14
17
  end
15
18
 
16
- it 'timeouts and compression should not be set by default but the token must be present' do
17
- conn = connection test_client
19
+ it 'timeouts are not be set by default but the token must be present' do
20
+ conn = dummy.connection test_client
18
21
  expect(conn.options.timeout).to be_nil
19
22
  expect(conn.options.open_timeout).to be_nil
20
23
  expect(conn.headers['X-api-token']).to eq(test_client.token)
21
- expect(conn.builder.handlers).not_to include(FaradayMiddleware::Gzip)
22
24
  end
23
25
 
24
26
  it 'allows to customize timeouts' do
25
27
  custom_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'],
26
28
  open_timeout: 100, timeout: 500)
27
- conn = connection custom_client
29
+ conn = dummy.connection custom_client
28
30
  expect(conn.options.timeout).to eq(500)
29
31
  expect(conn.options.open_timeout).to eq(100)
30
32
  expect(conn.headers['X-api-token']).to eq(custom_client.token)
31
33
 
32
34
  custom_client.timeout = 300
33
35
  custom_client.open_timeout = 200
34
- another_conn = connection custom_client
36
+ another_conn = dummy.connection custom_client
35
37
  expect(another_conn.options.timeout).to eq(300)
36
38
  expect(another_conn.options.open_timeout).to eq(200)
37
39
  end
38
40
 
39
- it 'is possible to customize adapter' do
40
- conn = connection test_client
41
- expect(conn.builder.adapter).to eq(Faraday::Adapter::NetHttp)
42
-
43
- Faraday.default_adapter = :excon
44
-
45
- another_conn = connection test_client
46
- expect(another_conn.builder.adapter).to eq(Faraday::Adapter::Excon)
47
- expect(conn.builder.adapter).to eq(Faraday::Adapter::NetHttp)
48
- end
49
-
50
- it 'allows to customize compression' do
51
- custom_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'], enable_compression: true)
52
- conn = connection custom_client
53
- expect(conn.headers['X-api-token']).to eq(custom_client.token)
54
- expect(conn.builder.handlers).to include(FaradayMiddleware::Gzip)
55
- end
56
-
57
- it 'is possible to enable gzip compression' do
58
- gzip_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'], enable_compression: true)
41
+ it 'works with gzip compression' do
42
+ gzip_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'])
59
43
  keys = VCR.use_cassette('all_keys_gzip') do
60
- gzip_client.keys project_id
44
+ gzip_client.keys project_id, limit: 30
61
45
  end.collection
62
46
 
63
47
  expect(keys.first.key_id).to eq(key_id)
64
48
  end
65
49
 
66
- it 'is possible to disable gzip compression' do
67
- no_gzip_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'], enable_compression: false)
68
- keys = VCR.use_cassette('all_keys_no_gzip') do
69
- no_gzip_client.keys project_id
70
- end.collection
71
-
72
- expect(keys.first.key_id).to eq(key_id)
50
+ it 'gzip compression is on by default' do
51
+ custom_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'])
52
+ conn = dummy.connection custom_client
53
+ expect(conn.headers['X-api-token']).to eq(custom_client.token)
54
+ expect(conn.builder.handlers).to include(Faraday::Gzip::Middleware)
73
55
  end
74
56
 
75
- it 'gzip compression is off by default' do
76
- default_gzip_client = Lokalise.client(ENV['LOKALISE_API_TOKEN'])
77
- keys = VCR.use_cassette('all_keys_default_gzip') do
78
- default_gzip_client.keys project_id
79
- end.collection
57
+ it 'is possible to customize adapter' do
58
+ conn = dummy.connection test_client
59
+ expect(conn.builder.adapter).to eq(Faraday::Adapter::NetHttp)
80
60
 
81
- expect(keys.first.key_id).to eq(key_id)
61
+ Faraday.default_adapter = :test
62
+
63
+ another_conn = dummy.connection test_client
64
+
65
+ expect(another_conn.builder.adapter).to eq(Faraday::Adapter::Test)
66
+ expect(conn.builder.adapter).to eq(Faraday::Adapter::NetHttp)
82
67
  end
83
68
  end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Lokalise::OAuth2::Auth do
4
+ describe '#auth' do
5
+ it 'returns auth code' do
6
+ uri = auth_client.auth scope: 'read_projects'
7
+ expect(uri).to include(described_class::BASE_URL.to_s)
8
+ expect(uri).to include('auth?client_id=')
9
+ expect(uri).to include('&scope=read_projects')
10
+ end
11
+
12
+ it 'allows to pass an array of scopes' do
13
+ scopes = %w[write_projects write_team_groups write_tasks]
14
+ uri = auth_client.auth scope: scopes
15
+ expect(uri).to include(described_class::BASE_URL.to_s)
16
+ expect(uri).to include('auth?client_id=')
17
+ expect(uri).to include("&scope=#{scopes.join('+')}")
18
+ end
19
+
20
+ it 'allows to set redirect_uri' do
21
+ uri = auth_client.auth scope: 'read_projects', redirect_uri: 'http://example.com/callback'
22
+ expect(uri).to include(described_class::BASE_URL.to_s)
23
+ expect(uri).to include('example.com%2Fcallback')
24
+ end
25
+
26
+ it 'allows to set state' do
27
+ state = '123abc'
28
+ uri = auth_client.auth scope: 'read_projects', state: state
29
+ expect(uri).to include(described_class::BASE_URL.to_s)
30
+ expect(uri).to include(state)
31
+ end
32
+ end
33
+
34
+ describe '#token' do
35
+ it 'returns an OAuth2 token' do
36
+ resp = VCR.use_cassette('oauth2/token') do
37
+ auth_client.token ENV['OAUTH2_CODE']
38
+ end
39
+ expect(resp['access_token']).not_to be_nil
40
+ expect(resp['refresh_token']).not_to be_nil
41
+ expect(resp['expires_in']).to eq(3600)
42
+ expect(resp['token_type']).to eq('Bearer')
43
+ end
44
+
45
+ it 'raises an error when the code is invalid' do
46
+ expect do
47
+ VCR.use_cassette('oauth2/token_error') do
48
+ auth_client.token 'incorrect_code'
49
+ end
50
+ end.to raise_error(Lokalise::Error::BadRequest)
51
+ end
52
+ end
53
+
54
+ describe '#refresh' do
55
+ it 'returns a refreshed OAuth2 token' do
56
+ resp = VCR.use_cassette('oauth2/refresh') do
57
+ auth_client.refresh ENV['OAUTH2_REFRESH_TOKEN']
58
+ end
59
+ expect(resp['access_token']).not_to be_nil
60
+ expect(resp['refresh_token']).to be_nil
61
+ expect(resp['expires_in']).to eq(3600)
62
+ expect(resp['token_type']).to eq('Bearer')
63
+ end
64
+
65
+ it 'raises an error when the token is invalid' do
66
+ expect do
67
+ VCR.use_cassette('oauth2/refresh_error') do
68
+ auth_client.refresh 'incorrect_token'
69
+ end
70
+ end.to raise_error(Lokalise::Error::BadRequest)
71
+ end
72
+ end
73
+ end
@@ -10,20 +10,20 @@ RSpec.describe Lokalise::Client do
10
10
  test_client.branches project_id
11
11
  end.collection
12
12
 
13
- expect(branches.count).to eq(1)
13
+ expect(branches.count).to eq(4)
14
14
  end
15
15
 
16
16
  it 'supports pagination' do
17
17
  branches = VCR.use_cassette('all_branches_pagination') do
18
- test_client.branches project_id, limit: 1, page: 1
18
+ test_client.branches project_id, limit: 2, page: 2
19
19
  end
20
20
 
21
- expect(branches.collection.count).to eq(1)
22
- expect(branches.total_results).to eq(1)
23
- expect(branches.total_pages).to eq(1)
24
- expect(branches.results_per_page).to eq(1)
25
- expect(branches.current_page).to eq(1)
26
- expect(branches.collection.first.name).to eq('ruby-branch')
21
+ expect(branches.collection.count).to eq(2)
22
+ expect(branches.total_results).to eq(4)
23
+ expect(branches.total_pages).to eq(2)
24
+ expect(branches.results_per_page).to eq(2)
25
+ expect(branches.current_page).to eq(2)
26
+ expect(branches.collection.first.name).to eq('merge-me')
27
27
  end
28
28
  end
29
29
 
@@ -106,7 +106,7 @@ RSpec.describe Lokalise::Client do
106
106
  languages: [{lang_iso: 'en'}]
107
107
  end.collection.first
108
108
 
109
- expect(contributor.client).to eq(test_client)
109
+ expect(contributor.client.token).to eq(test_client.token)
110
110
  expect(contributor.fullname).to eq('chained')
111
111
 
112
112
  id = contributor.user_id
@@ -116,7 +116,7 @@ RSpec.describe Lokalise::Client do
116
116
  contributor.update fullname: 'updated!'
117
117
  end
118
118
 
119
- expect(updated_contributor.client).to eq(test_client)
119
+ expect(updated_contributor.client.token).to eq(test_client.token)
120
120
  expect(updated_contributor.fullname).to eq('updated!')
121
121
  expect(updated_contributor.user_id).to eq(id)
122
122
  expect(updated_contributor.path).to eq(path)
@@ -160,7 +160,7 @@ RSpec.describe Lokalise::Client do
160
160
  key.update key_name: 'updated!'
161
161
  end
162
162
 
163
- expect(updated_key.client).to eq(test_client)
163
+ expect(updated_key.client.token).to eq(test_client.token)
164
164
  expect(updated_key.key_name['ios']).to eq('updated!')
165
165
  expect(updated_key.path).to eq(path)
166
166
 
@@ -109,7 +109,7 @@ RSpec.describe Lokalise::Client do
109
109
  test_client.create_languages project_id, lang_iso: 'ab', custom_name: 'chained lang'
110
110
  end.collection.first
111
111
 
112
- expect(language.client).to eq(test_client)
112
+ expect(language.client.token).to eq(test_client.token)
113
113
  expect(language.lang_name).to eq('chained lang')
114
114
 
115
115
  path = language.path
@@ -118,7 +118,7 @@ RSpec.describe Lokalise::Client do
118
118
  language.update lang_name: 'updated!'
119
119
  end
120
120
 
121
- expect(updated_language.client).to eq(test_client)
121
+ expect(updated_language.client.token).to eq(test_client.token)
122
122
  expect(updated_language.lang_name).to eq('updated!')
123
123
  expect(updated_language.lang_id).to eq(language.lang_id)
124
124
  expect(updated_language.path).to eq(path)
@@ -73,6 +73,19 @@ RSpec.describe Lokalise::Client do
73
73
  expect(project.team_id).to eq(176_692)
74
74
  end
75
75
 
76
+ context 'with OAuth 2 token' do
77
+ it 'creates a project' do
78
+ name = 'OAuth 2 project'
79
+ description = 'Via OAuth 2'
80
+ project = VCR.use_cassette('oauth2/new_project') do
81
+ test_oauth2_client.create_project name: name, description: description
82
+ end
83
+
84
+ expect(project.name).to eq(name)
85
+ expect(project.description).to eq(description)
86
+ end
87
+ end
88
+
76
89
  specify '#update_project' do
77
90
  project = VCR.use_cassette('update_project') do
78
91
  test_client.update_project new_project_id,
@@ -115,7 +128,7 @@ RSpec.describe Lokalise::Client do
115
128
  project.update name: 'updated!'
116
129
  end
117
130
 
118
- expect(updated_project.client).to eq(test_client)
131
+ expect(updated_project.client.token).to eq(test_client.token)
119
132
  expect(updated_project.name).to eq('updated!')
120
133
  expect(updated_project.path).to eq(path)
121
134
 
@@ -91,7 +91,7 @@ RSpec.describe Lokalise::Client do
91
91
  end.collection.first
92
92
  end
93
93
 
94
- expect(screenshot.client).to eq(test_client)
94
+ expect(screenshot.client.token).to eq(test_client.token)
95
95
  expect(screenshot.title).to eq('chained screen')
96
96
 
97
97
  path = screenshot.path
@@ -100,7 +100,7 @@ RSpec.describe Lokalise::Client do
100
100
  screenshot.update title: 'updated!'
101
101
  end
102
102
 
103
- expect(updated_screenshot.client).to eq(test_client)
103
+ expect(updated_screenshot.client.token).to eq(test_client.token)
104
104
  expect(updated_screenshot.title).to eq('updated!')
105
105
  expect(updated_screenshot.screenshot_id).to eq(screenshot.screenshot_id)
106
106
  expect(updated_screenshot.path).to eq(path)