ruby-lokalise-api 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +7 -0
  2. data/.github/CODE_OF_CONDUCT.md +46 -0
  3. data/.github/CONTRIBUTING.md +14 -0
  4. data/.github/ISSUE_TEMPLATE.md +13 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +11 -0
  6. data/CHANGELOG.md +5 -0
  7. data/Gemfile +3 -0
  8. data/LICENSE +22 -0
  9. data/README.md +917 -0
  10. data/Rakefile +16 -0
  11. data/lib/ruby-lokalise-api.rb +60 -0
  12. data/lib/ruby-lokalise-api/client.rb +22 -0
  13. data/lib/ruby-lokalise-api/collections/base.rb +46 -0
  14. data/lib/ruby-lokalise-api/collections/contributor.rb +13 -0
  15. data/lib/ruby-lokalise-api/collections/file.rb +13 -0
  16. data/lib/ruby-lokalise-api/collections/key.rb +13 -0
  17. data/lib/ruby-lokalise-api/collections/key_comment.rb +13 -0
  18. data/lib/ruby-lokalise-api/collections/project.rb +13 -0
  19. data/lib/ruby-lokalise-api/collections/project_comment.rb +13 -0
  20. data/lib/ruby-lokalise-api/collections/project_language.rb +13 -0
  21. data/lib/ruby-lokalise-api/collections/screenshot.rb +13 -0
  22. data/lib/ruby-lokalise-api/collections/snapshot.rb +13 -0
  23. data/lib/ruby-lokalise-api/collections/system_language.rb +13 -0
  24. data/lib/ruby-lokalise-api/collections/task.rb +13 -0
  25. data/lib/ruby-lokalise-api/collections/team.rb +13 -0
  26. data/lib/ruby-lokalise-api/collections/team_user.rb +13 -0
  27. data/lib/ruby-lokalise-api/collections/translation.rb +13 -0
  28. data/lib/ruby-lokalise-api/connection.rb +17 -0
  29. data/lib/ruby-lokalise-api/data/attributes.json +127 -0
  30. data/lib/ruby-lokalise-api/error.rb +47 -0
  31. data/lib/ruby-lokalise-api/request.rb +60 -0
  32. data/lib/ruby-lokalise-api/resources/base.rb +117 -0
  33. data/lib/ruby-lokalise-api/resources/contributor.rb +13 -0
  34. data/lib/ruby-lokalise-api/resources/file.rb +25 -0
  35. data/lib/ruby-lokalise-api/resources/key.rb +13 -0
  36. data/lib/ruby-lokalise-api/resources/key_comment.rb +15 -0
  37. data/lib/ruby-lokalise-api/resources/project.rb +18 -0
  38. data/lib/ruby-lokalise-api/resources/project_comment.rb +7 -0
  39. data/lib/ruby-lokalise-api/resources/project_language.rb +15 -0
  40. data/lib/ruby-lokalise-api/resources/screenshot.rb +13 -0
  41. data/lib/ruby-lokalise-api/resources/snapshot.rb +17 -0
  42. data/lib/ruby-lokalise-api/resources/system_language.rb +7 -0
  43. data/lib/ruby-lokalise-api/resources/task.rb +13 -0
  44. data/lib/ruby-lokalise-api/resources/team.rb +6 -0
  45. data/lib/ruby-lokalise-api/resources/team_user.rb +13 -0
  46. data/lib/ruby-lokalise-api/resources/translation.rb +13 -0
  47. data/lib/ruby-lokalise-api/rest/comments.rb +57 -0
  48. data/lib/ruby-lokalise-api/rest/contributors.rb +54 -0
  49. data/lib/ruby-lokalise-api/rest/files.rb +33 -0
  50. data/lib/ruby-lokalise-api/rest/keys.rb +75 -0
  51. data/lib/ruby-lokalise-api/rest/languages.rb +63 -0
  52. data/lib/ruby-lokalise-api/rest/projects.rb +58 -0
  53. data/lib/ruby-lokalise-api/rest/screenshots.rb +54 -0
  54. data/lib/ruby-lokalise-api/rest/snapshots.rb +43 -0
  55. data/lib/ruby-lokalise-api/rest/tasks.rb +54 -0
  56. data/lib/ruby-lokalise-api/rest/team_users.rb +44 -0
  57. data/lib/ruby-lokalise-api/rest/teams.rb +12 -0
  58. data/lib/ruby-lokalise-api/rest/translations.rb +35 -0
  59. data/lib/ruby-lokalise-api/utils/attribute_helpers.rb +52 -0
  60. data/lib/ruby-lokalise-api/utils/string_utils.rb +21 -0
  61. data/lib/ruby-lokalise-api/version.rb +3 -0
  62. data/ruby-lokalise-api.gemspec +32 -0
  63. data/spec/lib/ruby-lokalise-api/error_spec.rb +23 -0
  64. data/spec/lib/ruby-lokalise-api/rest/comments_spec.rb +78 -0
  65. data/spec/lib/ruby-lokalise-api/rest/contributors_spec.rb +79 -0
  66. data/spec/lib/ruby-lokalise-api/rest/files_spec.rb +53 -0
  67. data/spec/lib/ruby-lokalise-api/rest/keys_spec.rb +119 -0
  68. data/spec/lib/ruby-lokalise-api/rest/languages_spec.rb +91 -0
  69. data/spec/lib/ruby-lokalise-api/rest/projects_spec.rb +79 -0
  70. data/spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb +76 -0
  71. data/spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb +61 -0
  72. data/spec/lib/ruby-lokalise-api/rest/tasks_spec.rb +89 -0
  73. data/spec/lib/ruby-lokalise-api/rest/team_users_spec.rb +56 -0
  74. data/spec/lib/ruby-lokalise-api/rest/teams_spec.rb +22 -0
  75. data/spec/lib/ruby-lokalise-api/rest/translations_spec.rb +54 -0
  76. data/spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb +17 -0
  77. data/spec/lib/ruby-lokalise-api_spec.rb +13 -0
  78. data/spec/spec_helper.rb +15 -0
  79. data/spec/support/test_client.rb +5 -0
  80. data/spec/support/vcr.rb +8 -0
  81. metadata +255 -0
@@ -0,0 +1,12 @@
1
+ module Lokalise
2
+ class Client
3
+ # Returns all teams available to the user
4
+ #
5
+ # @see https://lokalise.co/api2docs/ruby/#transition-list-all-teams-get
6
+ # @return [Lokalise::Collection::Team<Lokalise::Resources::Team>]
7
+ # @param params [Hash]
8
+ def teams(params = {})
9
+ Lokalise::Collections::Team.all self, params
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ module Lokalise
2
+ class Client
3
+ # Returns all translations for the given project (ungrouped)
4
+ #
5
+ # @see https://lokalise.co/api2docs/ruby/#transition-list-all-translations-get
6
+ # @return [Lokalise::Collection::Translation<Lokalise::Resources::Translation>]
7
+ # @param project_id [String]
8
+ # @param params [Hash]
9
+ def translations(project_id, params = {})
10
+ Lokalise::Collections::Translation.all self, params, project_id
11
+ end
12
+
13
+ # Returns translation of the given project
14
+ #
15
+ # @see https://lokalise.co/api2docs/ruby/#transition-retrieve-a-translation-get
16
+ # @return [Lokalise::Resources::Translation]
17
+ # @param project_id [String]
18
+ # @param translation_id [String, Integer]
19
+ # @param params [Hash]
20
+ def translation(project_id, translation_id, params = {})
21
+ Lokalise::Resources::Translation.find self, project_id, translation_id, params
22
+ end
23
+
24
+ # Updates translation of the given project
25
+ #
26
+ # @see https://lokalise.co/api2docs/ruby/#transition-update-a-translation-put
27
+ # @return [Lokalise::Resources::Translation]
28
+ # @param project_id [String]
29
+ # @param translation_id [String, Integer]
30
+ # @param params [Hash]
31
+ def update_translation(project_id, translation_id, params)
32
+ Lokalise::Resources::Translation.update self, project_id, translation_id, params
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,52 @@
1
+ module Lokalise
2
+ module Utils
3
+ module AttributeHelpers
4
+ UNIFIED_RESOURCES = %w[comment language].freeze
5
+
6
+ # Returns the name of the API resource for the given class.
7
+ # Most class names correspond to resource names (eg, `Project`, `Team`)
8
+ # but some may differ (`ProjectComment` corresponds to `Comment` resource).
9
+ # The resource name is in lowercase, with underscores as separators.
10
+ #
11
+ # @return [String]
12
+ # @param model_class [String]
13
+ # @param plural [Boolean] Should the returned value be pluralized?
14
+ def data_key_for(model_class, plural = false)
15
+ data_key = if Module.const_defined? "Lokalise::Resources::#{model_class}::DATA_KEY"
16
+ Module.const_get "Lokalise::Resources::#{model_class}::DATA_KEY"
17
+ else
18
+ model_class
19
+ end.snakecase
20
+
21
+ return data_key unless plural
22
+
23
+ data_key + 's'
24
+ end
25
+
26
+ # Loads attributes for the given resource based on its name
27
+ #
28
+ # @return [Array<String>]
29
+ def attributes_for(klass)
30
+ @attributes ||= begin
31
+ YAML.load_file(File.expand_path('../data/attributes.json', __dir__)).freeze
32
+ end
33
+
34
+ name = unify klass.name.snakecase
35
+ @attributes[name]
36
+ end
37
+
38
+ private
39
+
40
+ # Unify some resources' names (eg, `ProjectComment` and `KeyComment` have the same attributes which are stored under `comment`)
41
+ #
42
+ # @return [String]
43
+ def unify(name)
44
+ UNIFIED_RESOURCES.each do |u_a|
45
+ return u_a if name.match?(/#{u_a}/)
46
+ end
47
+
48
+ name
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,21 @@
1
+ # Initial code taken from Facets gem by Rubyworks
2
+ # https://github.com/rubyworks/facets/blob/master/lib/core/facets/string/snakecase.rb
3
+
4
+ class String
5
+ # Underscore a string such that camelcase, dashes and spaces are
6
+ # replaced by underscores.
7
+ def snakecase
8
+ base_class_name.
9
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
10
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
11
+ tr('-', '_').
12
+ gsub(/\s/, '_').
13
+ gsub(/__+/, '_').
14
+ downcase
15
+ end
16
+
17
+ # Turn `Module::Nested::ClassName` to just `ClassName`
18
+ def base_class_name
19
+ split('::').last
20
+ end
21
+ end
@@ -0,0 +1,3 @@
1
+ module Lokalise
2
+ VERSION = '1.0.1'.freeze
3
+ end
@@ -0,0 +1,32 @@
1
+ require File.expand_path('lib/ruby-lokalise-api/version', __dir__)
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'ruby-lokalise-api'
5
+ spec.version = Lokalise::VERSION
6
+ spec.authors = ['Ilya Bodrov']
7
+ spec.email = ['golosizpru@gmail.com']
8
+ spec.summary = 'Ruby interface to the Lokalise API'
9
+ spec.description = 'Opinionated Ruby client for the Lokalise platform API allowing to work with translations, projects, users and other resources as with Ruby objects.'
10
+ spec.homepage = 'https://github.com/lokalise/ruby-lokalise-api'
11
+ spec.license = 'MIT'
12
+ spec.platform = Gem::Platform::RUBY
13
+ spec.required_ruby_version = '>= 2.4.0'
14
+
15
+ spec.files = Dir['README.md', 'LICENSE',
16
+ 'CHANGELOG.md', 'lib/**/*.rb', 'lib/ruby-lokalise-api/data/attributes.json',
17
+ 'ruby-lokalise-api.gemspec', '.github/*.md',
18
+ 'Gemfile', 'Rakefile']
19
+ spec.test_files = Dir['spec/**/*.rb']
20
+ spec.extra_rdoc_files = ['README.md']
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_dependency 'faraday', '~> 0.13'
24
+ spec.add_dependency 'multi_json', '~> 1.12'
25
+
26
+ spec.add_development_dependency 'dotenv', '~> 2.5'
27
+ spec.add_development_dependency 'rake', '~> 12.1'
28
+ spec.add_development_dependency 'rspec', '~> 3.6'
29
+ spec.add_development_dependency 'rubocop', '~> 0.60'
30
+ spec.add_development_dependency 'simplecov', '~> 0.16'
31
+ spec.add_development_dependency 'vcr', '~> 4.0'
32
+ end
@@ -0,0 +1,23 @@
1
+ # TODO: rewrite with raw `get` method
2
+ RSpec.describe Lokalise::Error do
3
+ include Lokalise::Request
4
+
5
+ before(:each) { Lokalise.reset_client! }
6
+ after(:each) { Lokalise.reset_client! }
7
+
8
+ it 'should raise BadRequest when API token is invalid' do
9
+ expect do
10
+ VCR.use_cassette('error_invalid_token') do
11
+ get 'projects', Lokalise.client('invalid')
12
+ end
13
+ end.to raise_error(Lokalise::Error::BadRequest)
14
+ end
15
+
16
+ it 'should raise NotFound when the provided path cannot be found' do
17
+ expect do
18
+ VCR.use_cassette('error_not_found') do
19
+ get 'invalid_path', test_client
20
+ end
21
+ end.to raise_error(Lokalise::Error::NotFound)
22
+ end
23
+ end
@@ -0,0 +1,78 @@
1
+ RSpec.describe Lokalise::Client do
2
+ let(:project_id) { '803826145ba90b42d5d860.46800099' }
3
+ let(:key_id) { 15_305_182 }
4
+
5
+ describe '#comments' do
6
+ it 'should return all comments' do
7
+ comments = VCR.use_cassette('all_comments') do
8
+ test_client.comments project_id, key_id
9
+ end.collection
10
+
11
+ expect(comments.count).to eq(3)
12
+ end
13
+
14
+ it 'should support pagination' do
15
+ comments = VCR.use_cassette('all_comments_pagination') do
16
+ test_client.comments project_id, key_id, limit: 1, page: 2
17
+ end
18
+
19
+ expect(comments.collection.count).to eq(1)
20
+ expect(comments.total_results).to eq(3)
21
+ expect(comments.total_pages).to eq(3)
22
+ expect(comments.results_per_page).to eq(1)
23
+ expect(comments.current_page).to eq(2)
24
+ expect(comments.collection.first.comment).to eq('demo comment')
25
+ end
26
+ end
27
+
28
+ specify '#comment' do
29
+ comment = VCR.use_cassette('comment') do
30
+ test_client.comment project_id, '15519786', '800746'
31
+ end
32
+
33
+ expect(comment.comment).to eq('rspec comment')
34
+ expect(comment.comment_id).to eq(800_746)
35
+ expect(comment.key_id).to eq(15_519_786)
36
+ expect(comment.added_by).to eq(20_181)
37
+ expect(comment.added_by_email).to eq('bodrovis@protonmail.com')
38
+ expect(comment.added_at).to eq('2018-12-09 19:41:44 (Etc/UTC)')
39
+ end
40
+
41
+ specify '#create_comments' do
42
+ comments = VCR.use_cassette('create_comments') do
43
+ test_client.create_comments project_id, key_id, [
44
+ {comment: 'demo comment'},
45
+ {comment: 'from rspec'}
46
+ ]
47
+ end
48
+
49
+ first_comment = comments.collection.first
50
+ second_comment = comments.collection[1]
51
+
52
+ expect(comments.project_id).to eq(project_id)
53
+ expect(first_comment.comment).to eq('demo comment')
54
+ expect(first_comment.key_id).to eq(key_id)
55
+ expect(second_comment.comment).to eq('from rspec')
56
+ expect(second_comment.key_id).to eq(key_id)
57
+ end
58
+
59
+ specify '#project_comments' do
60
+ comments = VCR.use_cassette('project_comments') do
61
+ test_client.project_comments project_id
62
+ end
63
+
64
+ comment = comments.collection.first
65
+
66
+ expect(comments.total_results).to eq(3)
67
+ expect(comment.comment).to eq('test')
68
+ expect(comment.comment_id).to eq(767_938)
69
+ end
70
+
71
+ specify '#delete_comment' do
72
+ response = VCR.use_cassette('delete_comment') do
73
+ test_client.delete_comment project_id, key_id, 767_938
74
+ end
75
+ expect(response['project_id']).to eq(project_id)
76
+ expect(response['comment_deleted']).to eq(true)
77
+ end
78
+ end
@@ -0,0 +1,79 @@
1
+ RSpec.describe Lokalise::Client do
2
+ let(:project_id) { '803826145ba90b42d5d860.46800099' }
3
+ let(:contributor_id) { 25_953 }
4
+
5
+ describe '#contributors' do
6
+ it 'should return all contributors' do
7
+ contributors = VCR.use_cassette('all_contributors') do
8
+ test_client.contributors project_id
9
+ end.collection
10
+
11
+ expect(contributors.count).to eq(2)
12
+ expect(contributors.first.fullname).to eq('John Doe')
13
+ end
14
+
15
+ it 'should support pagination' do
16
+ contributors = VCR.use_cassette('all_contributors_pagination') do
17
+ test_client.contributors project_id, limit: 1, page: 2
18
+ end
19
+
20
+ expect(contributors.collection.count).to eq(1)
21
+ expect(contributors.total_results).to eq(2)
22
+ expect(contributors.total_pages).to eq(2)
23
+ expect(contributors.results_per_page).to eq(1)
24
+ expect(contributors.current_page).to eq(2)
25
+ end
26
+ end
27
+
28
+ specify '#contributor' do
29
+ contributor = VCR.use_cassette('contributor') do
30
+ test_client.contributor project_id, '20181'
31
+ end
32
+
33
+ expect(contributor.user_id).to eq(20_181)
34
+ expect(contributor.email).to eq('bodrovis@protonmail.com')
35
+ expect(contributor.fullname).to eq('Ilya')
36
+ expect(contributor.created_at).to eq('2018-08-21 17:35:25 (Etc/UTC)')
37
+ expect(contributor.is_admin).to eq(true)
38
+ expect(contributor.is_reviewer).to eq(true)
39
+ expect(contributor.languages.first['lang_id']).to eq(640)
40
+ expect(contributor.admin_rights.first).to eq('upload')
41
+ end
42
+
43
+ specify '#create_contributors' do
44
+ contributor = VCR.use_cassette('create_contributors') do
45
+ test_client.create_contributors project_id,
46
+ email: 'rspec@test.com',
47
+ fullname: 'Rspec test',
48
+ languages: [{
49
+ lang_iso: 'en'
50
+ },
51
+ {
52
+ lang_iso: 'ru'
53
+ }]
54
+ end.collection.first
55
+
56
+ expect(contributor.fullname).to eq('Rspec test')
57
+ expect(contributor.email).to eq('rspec@test.com')
58
+ expect(contributor.languages[1]['lang_iso']).to eq('ru')
59
+ end
60
+
61
+ specify '#update_contributor' do
62
+ contributor = VCR.use_cassette('update_contributor') do
63
+ test_client.update_contributor project_id, contributor_id,
64
+ languages: [{lang_iso: 'en'}]
65
+ end
66
+
67
+ expect(contributor.user_id).to eq(contributor_id)
68
+ expect(contributor.languages[0]['lang_iso']).to eq('en')
69
+ expect(contributor.languages.length).to eq(1)
70
+ end
71
+
72
+ specify '#delete_contributor' do
73
+ response = VCR.use_cassette('delete_contributor') do
74
+ test_client.delete_contributor project_id, contributor_id
75
+ end
76
+ expect(response['project_id']).to eq(project_id)
77
+ expect(response['contributor_deleted']).to eq(true)
78
+ end
79
+ end
@@ -0,0 +1,53 @@
1
+ RSpec.describe Lokalise::Client do
2
+ let(:project_id) { '803826145ba90b42d5d860.46800099' }
3
+
4
+ describe '#files' do
5
+ it 'should return all files' do
6
+ files = VCR.use_cassette('files') do
7
+ test_client.files project_id
8
+ end.collection
9
+
10
+ file = files.first
11
+
12
+ expect(files.count).to eq(1)
13
+ expect(file.filename).to eq('__unassigned__')
14
+ expect(file.key_count).to eq(1)
15
+ end
16
+
17
+ it 'should support pagination' do
18
+ files = VCR.use_cassette('all_files_pagination') do
19
+ test_client.files project_id, limit: 1, page: 1
20
+ end
21
+
22
+ expect(files.collection.count).to eq(1)
23
+ expect(files.total_results).to eq(1)
24
+ expect(files.total_pages).to eq(1)
25
+ expect(files.results_per_page).to eq(1)
26
+ expect(files.current_page).to eq(1)
27
+ end
28
+ end
29
+
30
+ specify '#download_files' do
31
+ response = VCR.use_cassette('download_files') do
32
+ test_client.download_files project_id,
33
+ "format": 'po',
34
+ "original_filenames": true
35
+ end
36
+
37
+ expect(response['project_id']).to eq(project_id)
38
+ expect(response['bundle_url']).to include('amazonaws.com')
39
+ end
40
+
41
+ specify '#upload_file' do
42
+ response = VCR.use_cassette('upload_file') do
43
+ test_client.upload_file project_id,
44
+ "data": 'ZnI6DQogIHRlc3Q6IHRyYW5zbGF0aW9u',
45
+ "filename": 'rspec.yml',
46
+ 'lang_iso': 'ru'
47
+ end
48
+
49
+ expect(response['project_id']).to eq(project_id)
50
+ expect(response['file']).to eq('rspec.yml')
51
+ expect(response['result']['skipped']).to eq(1)
52
+ end
53
+ end
@@ -0,0 +1,119 @@
1
+ RSpec.describe Lokalise::Client do
2
+ let(:project_id) { '803826145ba90b42d5d860.46800099' }
3
+ let(:key_id) { 15_305_182 }
4
+ let(:new_key_id) { 15_519_770 }
5
+
6
+ describe '#keys' do
7
+ it 'should return all keys' do
8
+ keys = VCR.use_cassette('all_keys') do
9
+ test_client.keys project_id
10
+ end.collection
11
+
12
+ expect(keys.count).to eq(1)
13
+ end
14
+
15
+ it 'should support pagination' do
16
+ keys = VCR.use_cassette('all_keys_pagination') do
17
+ test_client.keys project_id, limit: 1, page: 1
18
+ end
19
+
20
+ expect(keys.collection.count).to eq(1)
21
+ expect(keys.total_results).to eq(1)
22
+ expect(keys.total_pages).to eq(1)
23
+ expect(keys.results_per_page).to eq(1)
24
+ expect(keys.current_page).to eq(1)
25
+ end
26
+ end
27
+
28
+ specify '#key' do
29
+ key = VCR.use_cassette('key') do
30
+ test_client.key project_id, key_id, disable_references: 0
31
+ end
32
+
33
+ expect(key.key_id).to eq(key_id)
34
+ expect(key.created_at).to eq('2018-12-03 19:11:30 (Etc/UTC)')
35
+ expect(key.key_name['ios']).to eq('test')
36
+ expect(key.filenames['web']).to eq('rspec.yml')
37
+ expect(key.description).to eq('')
38
+ expect(key.platforms).to eq(%w[web])
39
+ expect(key.tags).to eq([])
40
+ expect(key.comments.first['comment']).to eq('demo comment')
41
+ expect(key.comments[1]['comment_id']).to eq(800_632)
42
+ expect(key.screenshots).to eq([])
43
+ expect(key.translations.first['modified_by_email']).to eq('bodrovis@protonmail.com')
44
+ expect(key.is_plural).to eq(false)
45
+ expect(key.plural_name).to eq('')
46
+ expect(key.is_hidden).to eq(false)
47
+ expect(key.is_archived).to eq(false)
48
+ expect(key.context).to eq('')
49
+ expect(key.char_limit).to eq(0)
50
+ expect(key.custom_attributes).to eq('')
51
+ expect(key.base_words).to eq(1)
52
+ end
53
+
54
+ specify '#create_keys' do
55
+ keys = VCR.use_cassette('create_keys') do
56
+ test_client.create_keys project_id, key_name: 'rspec_k', platforms: %w[ios]
57
+ end
58
+
59
+ key = keys.collection.first
60
+
61
+ expect(keys.project_id).to eq(project_id)
62
+ expect(key.key_name['ios']).to eq('rspec_k')
63
+ expect(key.platforms).to eq(%w[ios])
64
+ end
65
+
66
+ specify '#update_key' do
67
+ key = VCR.use_cassette('update_key') do
68
+ test_client.update_key project_id, new_key_id, key_name: 'updated_rspec_k', description: 'desc here'
69
+ end
70
+
71
+ expect(key.key_name['ios']).to eq('updated_rspec_k')
72
+ expect(key.platforms).to eq(%w[ios])
73
+ expect(key.description).to eq('desc here')
74
+ end
75
+
76
+ specify '#update_keys' do
77
+ keys = VCR.use_cassette('update_keys') do
78
+ test_client.update_keys project_id, [
79
+ {
80
+ key_id: new_key_id,
81
+ description: 'bulk updated'
82
+ },
83
+ {
84
+ key_id: key_id,
85
+ tags: %w[bulk upd]
86
+ }
87
+ ]
88
+ end.collection
89
+
90
+ first_key = keys.first
91
+ second_key = keys[1]
92
+
93
+ expect(first_key.key_id).to eq(key_id)
94
+ expect(first_key.key_name['ios']).to eq('test')
95
+ expect(first_key.tags).to eq(%w[bulk upd])
96
+
97
+ expect(second_key.key_id).to eq(new_key_id)
98
+ expect(second_key.key_name['web']).to eq('updated_rspec_k')
99
+ expect(second_key.description).to eq('bulk updated')
100
+ end
101
+
102
+ specify '#delete_key' do
103
+ response = VCR.use_cassette('delete_key') do
104
+ test_client.delete_key project_id, '15519771'
105
+ end
106
+
107
+ expect(response['project_id']).to eq(project_id)
108
+ expect(response['key_removed']).to eq(true)
109
+ end
110
+
111
+ specify '#delete_keys' do
112
+ response = VCR.use_cassette('delete_keys') do
113
+ test_client.delete_keys project_id, [new_key_id, key_id]
114
+ end
115
+
116
+ expect(response['project_id']).to eq(project_id)
117
+ expect(response['keys_removed']).to eq(true)
118
+ end
119
+ end