ruby-lokalise-api 1.1.0 → 2.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/CHANGELOG.md +8 -2
  3. data/README.md +172 -10
  4. data/lib/ruby-lokalise-api.rb +2 -0
  5. data/lib/ruby-lokalise-api/client.rb +18 -0
  6. data/lib/ruby-lokalise-api/collections/base.rb +11 -10
  7. data/lib/ruby-lokalise-api/collections/contributor.rb +1 -3
  8. data/lib/ruby-lokalise-api/collections/file.rb +1 -3
  9. data/lib/ruby-lokalise-api/collections/key.rb +8 -3
  10. data/lib/ruby-lokalise-api/collections/key_comment.rb +2 -3
  11. data/lib/ruby-lokalise-api/collections/project.rb +1 -3
  12. data/lib/ruby-lokalise-api/collections/project_comment.rb +1 -3
  13. data/lib/ruby-lokalise-api/collections/project_language.rb +1 -3
  14. data/lib/ruby-lokalise-api/collections/screenshot.rb +1 -3
  15. data/lib/ruby-lokalise-api/collections/snapshot.rb +1 -3
  16. data/lib/ruby-lokalise-api/collections/system_language.rb +1 -3
  17. data/lib/ruby-lokalise-api/collections/task.rb +1 -3
  18. data/lib/ruby-lokalise-api/collections/team.rb +1 -3
  19. data/lib/ruby-lokalise-api/collections/team_user.rb +1 -3
  20. data/lib/ruby-lokalise-api/collections/translation.rb +1 -3
  21. data/lib/ruby-lokalise-api/error.rb +2 -0
  22. data/lib/ruby-lokalise-api/request.rb +11 -3
  23. data/lib/ruby-lokalise-api/resources/base.rb +51 -41
  24. data/lib/ruby-lokalise-api/resources/contributor.rb +6 -4
  25. data/lib/ruby-lokalise-api/resources/file.rb +7 -12
  26. data/lib/ruby-lokalise-api/resources/key.rb +5 -4
  27. data/lib/ruby-lokalise-api/resources/key_comment.rb +6 -4
  28. data/lib/ruby-lokalise-api/resources/project.rb +10 -7
  29. data/lib/ruby-lokalise-api/resources/project_language.rb +5 -4
  30. data/lib/ruby-lokalise-api/resources/screenshot.rb +5 -4
  31. data/lib/ruby-lokalise-api/resources/snapshot.rb +10 -5
  32. data/lib/ruby-lokalise-api/resources/task.rb +5 -4
  33. data/lib/ruby-lokalise-api/resources/team_user.rb +6 -4
  34. data/lib/ruby-lokalise-api/resources/translation.rb +5 -4
  35. data/lib/ruby-lokalise-api/rest/comments.rb +6 -6
  36. data/lib/ruby-lokalise-api/rest/contributors.rb +6 -6
  37. data/lib/ruby-lokalise-api/rest/files.rb +3 -3
  38. data/lib/ruby-lokalise-api/rest/keys.rb +9 -9
  39. data/lib/ruby-lokalise-api/rest/languages.rb +7 -7
  40. data/lib/ruby-lokalise-api/rest/projects.rb +7 -7
  41. data/lib/ruby-lokalise-api/rest/screenshots.rb +6 -6
  42. data/lib/ruby-lokalise-api/rest/snapshots.rb +5 -5
  43. data/lib/ruby-lokalise-api/rest/tasks.rb +6 -6
  44. data/lib/ruby-lokalise-api/rest/team_users.rb +5 -5
  45. data/lib/ruby-lokalise-api/rest/teams.rb +1 -1
  46. data/lib/ruby-lokalise-api/rest/translations.rb +3 -3
  47. data/lib/ruby-lokalise-api/utils/attribute_helpers.rb +19 -5
  48. data/lib/ruby-lokalise-api/utils/endpoint_helpers.rb +12 -0
  49. data/lib/ruby-lokalise-api/utils/string_utils.rb +4 -0
  50. data/lib/ruby-lokalise-api/version.rb +1 -1
  51. data/ruby-lokalise-api.gemspec +1 -0
  52. data/spec/lib/ruby-lokalise-api/rest/comments_spec.rb +22 -5
  53. data/spec/lib/ruby-lokalise-api/rest/contributors_spec.rb +35 -2
  54. data/spec/lib/ruby-lokalise-api/rest/keys_spec.rb +55 -4
  55. data/spec/lib/ruby-lokalise-api/rest/languages_spec.rb +31 -2
  56. data/spec/lib/ruby-lokalise-api/rest/projects_spec.rb +36 -2
  57. data/spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb +45 -8
  58. data/spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb +25 -2
  59. data/spec/lib/ruby-lokalise-api/rest/tasks_spec.rb +38 -2
  60. data/spec/lib/ruby-lokalise-api/rest/team_users_spec.rb +25 -2
  61. data/spec/lib/ruby-lokalise-api/rest/translations_spec.rb +17 -3
  62. metadata +17 -2
@@ -7,7 +7,7 @@ module Lokalise
7
7
  # @param project_id [String]
8
8
  # @param params [Hash]
9
9
  def screenshots(project_id, params = {})
10
- Lokalise::Collections::Screenshot.all self, params, project_id
10
+ c_r Lokalise::Collections::Screenshot, :all, project_id, params
11
11
  end
12
12
 
13
13
  # Returns a single screenshot for the given project
@@ -17,7 +17,7 @@ module Lokalise
17
17
  # @param project_id [String]
18
18
  # @param screenshot_id [String, Integer]
19
19
  def screenshot(project_id, screenshot_id)
20
- Lokalise::Resources::Screenshot.find self, project_id, screenshot_id
20
+ c_r Lokalise::Resources::Screenshot, :find, [project_id, screenshot_id]
21
21
  end
22
22
 
23
23
  # Creates one or more screenshots for the given project
@@ -27,7 +27,7 @@ module Lokalise
27
27
  # @param project_id [String]
28
28
  # @param params [Hash]
29
29
  def create_screenshots(project_id, params = {})
30
- Lokalise::Resources::Screenshot.create self, project_id, params, :screenshots
30
+ c_r Lokalise::Resources::Screenshot, :create, project_id, params, :screenshots
31
31
  end
32
32
 
33
33
  # Updates screenshot
@@ -38,7 +38,7 @@ module Lokalise
38
38
  # @param screenshot_id [String, Integer]
39
39
  # @param params [Hash]
40
40
  def update_screenshot(project_id, screenshot_id, params = {})
41
- Lokalise::Resources::Screenshot.update self, project_id, screenshot_id, params
41
+ c_r Lokalise::Resources::Screenshot, :update, [project_id, screenshot_id], params
42
42
  end
43
43
 
44
44
  # Deletes screenshot
@@ -47,8 +47,8 @@ module Lokalise
47
47
  # @return [Hash]
48
48
  # @param project_id [String]
49
49
  # @param screenshot_id [String, Integer]
50
- def delete_screenshot(project_id, screenshot_id)
51
- Lokalise::Resources::Screenshot.destroy self, project_id, screenshot_id
50
+ def destroy_screenshot(project_id, screenshot_id)
51
+ c_r Lokalise::Resources::Screenshot, :destroy, [project_id, screenshot_id]
52
52
  end
53
53
  end
54
54
  end
@@ -7,7 +7,7 @@ module Lokalise
7
7
  # @param project_id [String]
8
8
  # @param params [Hash]
9
9
  def snapshots(project_id, params = {})
10
- Lokalise::Collections::Snapshot.all self, params, project_id
10
+ c_r Lokalise::Collections::Snapshot, :all, project_id, params
11
11
  end
12
12
 
13
13
  # Creates snapshot for the given project
@@ -17,7 +17,7 @@ module Lokalise
17
17
  # @param project_id [String]
18
18
  # @param params [Hash]
19
19
  def create_snapshot(project_id, params = {})
20
- Lokalise::Resources::Snapshot.create self, project_id, params
20
+ c_r Lokalise::Resources::Snapshot, :create, project_id, params
21
21
  end
22
22
 
23
23
  # Restore project from the given snapshot by producing project's copy
@@ -27,7 +27,7 @@ module Lokalise
27
27
  # @param project_id [String]
28
28
  # @param snapshot_id [String, Integer]
29
29
  def restore_snapshot(project_id, snapshot_id)
30
- Lokalise::Resources::Snapshot.restore self, project_id, snapshot_id
30
+ c_r Lokalise::Resources::Snapshot, :restore, [project_id, snapshot_id]
31
31
  end
32
32
 
33
33
  # Deletes snapshot
@@ -36,8 +36,8 @@ module Lokalise
36
36
  # @return [Hash]
37
37
  # @param project_id [String]
38
38
  # @param snapshot_id [String, Integer]
39
- def delete_snapshot(project_id, snapshot_id)
40
- Lokalise::Resources::Snapshot.destroy self, project_id, snapshot_id
39
+ def destroy_snapshot(project_id, snapshot_id)
40
+ c_r Lokalise::Resources::Snapshot, :destroy, [project_id, snapshot_id]
41
41
  end
42
42
  end
43
43
  end
@@ -7,7 +7,7 @@ module Lokalise
7
7
  # @param project_id [String]
8
8
  # @param params [Hash]
9
9
  def tasks(project_id, params = {})
10
- Lokalise::Collections::Task.all self, params, project_id
10
+ c_r Lokalise::Collections::Task, :all, project_id, params
11
11
  end
12
12
 
13
13
  # Returns a single task for the given project
@@ -17,7 +17,7 @@ module Lokalise
17
17
  # @param project_id [String]
18
18
  # @param task_id [String, Integer]
19
19
  def task(project_id, task_id)
20
- Lokalise::Resources::Task.find self, project_id, task_id
20
+ c_r Lokalise::Resources::Task, :find, [project_id, task_id]
21
21
  end
22
22
 
23
23
  # Creates task for the given project
@@ -27,7 +27,7 @@ module Lokalise
27
27
  # @param project_id [String]
28
28
  # @param params [Hash]
29
29
  def create_task(project_id, params)
30
- Lokalise::Resources::Task.create self, project_id, params
30
+ c_r Lokalise::Resources::Task, :create, project_id, params
31
31
  end
32
32
 
33
33
  # Updates task for the given project
@@ -38,7 +38,7 @@ module Lokalise
38
38
  # @param task_id [String, Integer]
39
39
  # @param params [Hash]
40
40
  def update_task(project_id, task_id, params = {})
41
- Lokalise::Resources::Task.update self, project_id, task_id, params
41
+ c_r Lokalise::Resources::Task, :update, [project_id, task_id], params
42
42
  end
43
43
 
44
44
  # Deletes task for the given project
@@ -47,8 +47,8 @@ module Lokalise
47
47
  # @return [Hash]
48
48
  # @param project_id [String]
49
49
  # @param task_id [String, Integer]
50
- def delete_task(project_id, task_id)
51
- Lokalise::Resources::Task.destroy self, project_id, task_id
50
+ def destroy_task(project_id, task_id)
51
+ c_r Lokalise::Resources::Task, :destroy, [project_id, task_id]
52
52
  end
53
53
  end
54
54
  end
@@ -7,7 +7,7 @@ module Lokalise
7
7
  # @param team_id [String]
8
8
  # @param params [Hash]
9
9
  def team_users(team_id, params = {})
10
- Lokalise::Collections::TeamUser.all self, params, team_id
10
+ c_r Lokalise::Collections::TeamUser, :all, team_id, params
11
11
  end
12
12
 
13
13
  # Returns team user from the given team
@@ -17,7 +17,7 @@ module Lokalise
17
17
  # @param team_id [String]
18
18
  # @param user_id [String, Integer]
19
19
  def team_user(team_id, user_id)
20
- Lokalise::Resources::TeamUser.find self, team_id, user_id
20
+ c_r Lokalise::Resources::TeamUser, :find, [team_id, user_id]
21
21
  end
22
22
 
23
23
  # Updates team user for the given team
@@ -28,7 +28,7 @@ module Lokalise
28
28
  # @param user_id [String, Integer]
29
29
  # @param params [Hash]
30
30
  def update_team_user(team_id, user_id, params)
31
- Lokalise::Resources::TeamUser.update self, team_id, user_id, params
31
+ c_r Lokalise::Resources::TeamUser, :update, [team_id, user_id], params
32
32
  end
33
33
 
34
34
  # Deletes team user from the given team
@@ -37,8 +37,8 @@ module Lokalise
37
37
  # @return [Lokalise::Resources::TeamUser]
38
38
  # @param team_id [String]
39
39
  # @param user_id [String, Integer]
40
- def delete_team_user(team_id, user_id)
41
- Lokalise::Resources::TeamUser.destroy self, team_id, user_id
40
+ def destroy_team_user(team_id, user_id)
41
+ c_r Lokalise::Resources::TeamUser, :destroy, [team_id, user_id]
42
42
  end
43
43
  end
44
44
  end
@@ -6,7 +6,7 @@ module Lokalise
6
6
  # @return [Lokalise::Collection::Team<Lokalise::Resources::Team>]
7
7
  # @param params [Hash]
8
8
  def teams(params = {})
9
- Lokalise::Collections::Team.all self, params
9
+ c_r Lokalise::Collections::Team, :all, nil, params
10
10
  end
11
11
  end
12
12
  end
@@ -7,7 +7,7 @@ module Lokalise
7
7
  # @param project_id [String]
8
8
  # @param params [Hash]
9
9
  def translations(project_id, params = {})
10
- Lokalise::Collections::Translation.all self, params, project_id
10
+ c_r Lokalise::Collections::Translation, :all, project_id, params
11
11
  end
12
12
 
13
13
  # Returns translation of the given project
@@ -18,7 +18,7 @@ module Lokalise
18
18
  # @param translation_id [String, Integer]
19
19
  # @param params [Hash]
20
20
  def translation(project_id, translation_id, params = {})
21
- Lokalise::Resources::Translation.find self, project_id, translation_id, params
21
+ c_r Lokalise::Resources::Translation, :find, [project_id, translation_id], params
22
22
  end
23
23
 
24
24
  # Updates translation of the given project
@@ -29,7 +29,7 @@ module Lokalise
29
29
  # @param translation_id [String, Integer]
30
30
  # @param params [Hash]
31
31
  def update_translation(project_id, translation_id, params)
32
- Lokalise::Resources::Translation.update self, project_id, translation_id, params
32
+ c_r Lokalise::Resources::Translation, :update, [project_id, translation_id], params
33
33
  end
34
34
  end
35
35
  end
@@ -12,17 +12,23 @@ module Lokalise
12
12
  # @param model_class [String]
13
13
  # @param plural [Boolean] Should the returned value be pluralized?
14
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
15
+ data_key = get_key 'DATA_KEY', model_class
20
16
 
21
17
  return data_key unless plural
22
18
 
23
19
  data_key + 's'
24
20
  end
25
21
 
22
+ # Returns key used to determine resource id (for example `user_id` or `project_id`).
23
+ # Most ids corresponds to resources' class names, but some may differ (for instance,
24
+ # `Contributor` has `user_id` attribute).
25
+ #
26
+ # @return [String]
27
+ # @param model_class [String]
28
+ def id_key_for(model_class)
29
+ get_key('ID_KEY', model_class) + '_id'
30
+ end
31
+
26
32
  # Loads attributes for the given resource based on its name
27
33
  #
28
34
  # @return [Array<String>]
@@ -37,6 +43,14 @@ module Lokalise
37
43
 
38
44
  private
39
45
 
46
+ def get_key(name, model_class)
47
+ if Module.const_defined? "Lokalise::Resources::#{model_class}::#{name}"
48
+ Module.const_get "Lokalise::Resources::#{model_class}::#{name}"
49
+ else
50
+ model_class
51
+ end.snakecase
52
+ end
53
+
40
54
  # Unify some resources' names (eg, `ProjectComment` and `KeyComment` have the same attributes which are stored under `comment`)
41
55
  #
42
56
  # @return [String]
@@ -0,0 +1,12 @@
1
+ module Lokalise
2
+ module Utils
3
+ module EndpointHelpers
4
+ def path_from(raw_mapping)
5
+ template = Addressable::Template.new '{/segments*}'
6
+ template.expand(
7
+ segments: raw_mapping.to_a.flatten
8
+ ).to_s
9
+ end
10
+ end
11
+ end
12
+ end
@@ -18,4 +18,8 @@ class String
18
18
  def base_class_name
19
19
  split('::').last
20
20
  end
21
+
22
+ def remove_trailing_slash
23
+ gsub %r{/\z}, ''
24
+ end
21
25
  end
@@ -1,3 +1,3 @@
1
1
  module Lokalise
2
- VERSION = '1.1.0'.freeze
2
+ VERSION = '2.0.0'.freeze
3
3
  end
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.extra_rdoc_files = ['README.md']
21
21
  spec.require_paths = ['lib']
22
22
 
23
+ spec.add_dependency 'addressable', '~> 2.5'
23
24
  spec.add_dependency 'faraday', '~> 0.13'
24
25
  spec.add_dependency 'multi_json', '~> 1.12'
25
26
 
@@ -1,6 +1,7 @@
1
1
  RSpec.describe Lokalise::Client do
2
2
  let(:project_id) { '803826145ba90b42d5d860.46800099' }
3
3
  let(:key_id) { 15_305_182 }
4
+ let(:another_key_id) { 15_519_786 }
4
5
 
5
6
  describe '#comments' do
6
7
  it 'should return all comments' do
@@ -28,19 +29,18 @@ RSpec.describe Lokalise::Client do
28
29
  expect(comments.prev_page?).to eq(true)
29
30
  expect(comments.first_page?).to eq(false)
30
31
 
31
- expect(comments.ids).to include(project_id, key_id)
32
32
  expect(comments.client).to be_an_instance_of(Lokalise::Client)
33
33
  end
34
34
  end
35
35
 
36
36
  specify '#comment' do
37
37
  comment = VCR.use_cassette('comment') do
38
- test_client.comment project_id, '15519786', '800746'
38
+ test_client.comment project_id, another_key_id, '800746'
39
39
  end
40
40
 
41
41
  expect(comment.comment).to eq('rspec comment')
42
42
  expect(comment.comment_id).to eq(800_746)
43
- expect(comment.key_id).to eq(15_519_786)
43
+ expect(comment.key_id).to eq(another_key_id)
44
44
  expect(comment.added_by).to eq(20_181)
45
45
  expect(comment.added_by_email).to eq('bodrovis@protonmail.com')
46
46
  expect(comment.added_at).to eq('2018-12-09 19:41:44 (Etc/UTC)')
@@ -76,11 +76,28 @@ RSpec.describe Lokalise::Client do
76
76
  expect(comment.comment_id).to eq(767_938)
77
77
  end
78
78
 
79
- specify '#delete_comment' do
79
+ specify '#destroy_comment' do
80
80
  response = VCR.use_cassette('delete_comment') do
81
- test_client.delete_comment project_id, key_id, 767_938
81
+ test_client.destroy_comment project_id, key_id, 767_938
82
82
  end
83
83
  expect(response['project_id']).to eq(project_id)
84
84
  expect(response['comment_deleted']).to eq(true)
85
85
  end
86
+
87
+ context 'comment chained methods' do
88
+ it 'should support destroy' do
89
+ comment = VCR.use_cassette('create_another_comment') do
90
+ test_client.create_comments project_id, another_key_id, comment: 'chained comment'
91
+ end.collection.first
92
+
93
+ expect(comment.comment).to eq('chained comment')
94
+
95
+ delete_response = VCR.use_cassette('delete_comment_chained') do
96
+ comment.destroy
97
+ end
98
+
99
+ expect(delete_response['project_id']).to eq(project_id)
100
+ expect(delete_response['comment_deleted']).to eq(true)
101
+ end
102
+ end
86
103
  end
@@ -74,11 +74,44 @@ RSpec.describe Lokalise::Client do
74
74
  expect(contributor.languages.length).to eq(1)
75
75
  end
76
76
 
77
- specify '#delete_contributor' do
77
+ specify '#destroy_contributor' do
78
78
  response = VCR.use_cassette('delete_contributor') do
79
- test_client.delete_contributor project_id, contributor_id
79
+ test_client.destroy_contributor project_id, contributor_id
80
80
  end
81
81
  expect(response['project_id']).to eq(project_id)
82
82
  expect(response['contributor_deleted']).to eq(true)
83
83
  end
84
+
85
+ context 'contributor chained methods' do
86
+ it 'should support update and destroy' do
87
+ contributor = VCR.use_cassette('create_another_contributor') do
88
+ test_client.create_contributors project_id,
89
+ email: 'demo@test.com',
90
+ fullname: 'chained',
91
+ languages: [{lang_iso: 'en'}]
92
+ end.collection.first
93
+
94
+ expect(contributor.client).to eq(test_client)
95
+ expect(contributor.fullname).to eq('chained')
96
+
97
+ id = contributor.user_id
98
+ path = contributor.path
99
+
100
+ updated_contributor = VCR.use_cassette('update_contributor_chained') do
101
+ contributor.update fullname: 'updated!'
102
+ end
103
+
104
+ expect(updated_contributor.client).to eq(test_client)
105
+ expect(updated_contributor.fullname).to eq('updated!')
106
+ expect(updated_contributor.user_id).to eq(id)
107
+ expect(updated_contributor.path).to eq(path)
108
+
109
+ delete_response = VCR.use_cassette('delete_contributor_chained') do
110
+ updated_contributor.destroy
111
+ end
112
+
113
+ expect(delete_response['project_id']).to eq(project_id)
114
+ expect(delete_response['contributor_deleted']).to eq(true)
115
+ end
116
+ end
84
117
  end
@@ -108,21 +108,72 @@ RSpec.describe Lokalise::Client do
108
108
  expect(second_key.description).to eq('bulk updated')
109
109
  end
110
110
 
111
- specify '#delete_key' do
111
+ specify '#destroy_key' do
112
112
  response = VCR.use_cassette('delete_key') do
113
- test_client.delete_key project_id, '15519771'
113
+ test_client.destroy_key project_id, '15519771'
114
114
  end
115
115
 
116
116
  expect(response['project_id']).to eq(project_id)
117
117
  expect(response['key_removed']).to eq(true)
118
118
  end
119
119
 
120
- specify '#delete_keys' do
120
+ specify '#destroy_keys' do
121
121
  response = VCR.use_cassette('delete_keys') do
122
- test_client.delete_keys project_id, [new_key_id, key_id]
122
+ test_client.destroy_keys project_id, [new_key_id, key_id]
123
123
  end
124
124
 
125
125
  expect(response['project_id']).to eq(project_id)
126
126
  expect(response['keys_removed']).to eq(true)
127
127
  end
128
+
129
+ context 'key chained methods' do
130
+ it 'should support update and destroy' do
131
+ key = VCR.use_cassette('create_another_key') do
132
+ test_client.create_keys project_id, key_name: 'chained_k', platforms: %w[ios]
133
+ end.collection.first
134
+
135
+ expect(key.key_name['ios']).to eq('chained_k')
136
+
137
+ path = key.path
138
+
139
+ updated_key = VCR.use_cassette('update_key_chained') do
140
+ key.update key_name: 'updated!'
141
+ end
142
+
143
+ expect(updated_key.client).to eq(test_client)
144
+ expect(updated_key.key_name['ios']).to eq('updated!')
145
+ expect(updated_key.path).to eq(path)
146
+
147
+ delete_response = VCR.use_cassette('delete_key_chained') do
148
+ updated_key.destroy
149
+ end
150
+
151
+ expect(delete_response['project_id']).to eq(project_id)
152
+ expect(delete_response['key_removed']).to eq(true)
153
+ end
154
+ end
155
+
156
+ context 'keys collection chained methods' do
157
+ it 'should support destroy_all' do
158
+ keys = VCR.use_cassette('create_keys_collection') do
159
+ test_client.create_keys project_id, [
160
+ {
161
+ key_name: 'key_collect1', platforms: %w[ios]
162
+ },
163
+ {
164
+ key_name: 'key_collect2', platforms: %w[ios]
165
+ }
166
+ ]
167
+ end
168
+
169
+ expect(keys.collection.length).to eq(2)
170
+
171
+ delete_response = VCR.use_cassette('delete_all_keys_chained') do
172
+ keys.destroy_all
173
+ end
174
+
175
+ expect(delete_response['project_id']).to eq(project_id)
176
+ expect(delete_response['keys_removed']).to eq(true)
177
+ end
178
+ end
128
179
  end