ruby-lokalise-api 1.0.1

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 (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