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
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ Bundler::GemHelper.install_tasks
6
+ rescue LoadError
7
+ puts 'although not required, bundler is recommened for running the tests'
8
+ end
9
+
10
+ task default: :spec
11
+
12
+ require 'rspec/core/rake_task'
13
+ RSpec::Core::RakeTask.new(:spec)
14
+
15
+ require 'rubocop/rake_task'
16
+ RuboCop::RakeTask.new
@@ -0,0 +1,60 @@
1
+ require 'faraday'
2
+ require 'multi_json'
3
+ require 'yaml'
4
+
5
+ require 'ruby-lokalise-api/version'
6
+ require 'ruby-lokalise-api/connection'
7
+ require 'ruby-lokalise-api/request'
8
+ require 'ruby-lokalise-api/error'
9
+ require 'ruby-lokalise-api/utils/string_utils'
10
+ require 'ruby-lokalise-api/utils/attribute_helpers'
11
+
12
+ require 'ruby-lokalise-api/resources/base'
13
+ require 'ruby-lokalise-api/resources/project'
14
+ require 'ruby-lokalise-api/resources/project_language'
15
+ require 'ruby-lokalise-api/resources/key_comment'
16
+ require 'ruby-lokalise-api/resources/contributor'
17
+ require 'ruby-lokalise-api/resources/file'
18
+ require 'ruby-lokalise-api/resources/translation'
19
+ require 'ruby-lokalise-api/resources/team_user'
20
+ require 'ruby-lokalise-api/resources/task'
21
+ require 'ruby-lokalise-api/resources/snapshot'
22
+ require 'ruby-lokalise-api/resources/screenshot'
23
+ require 'ruby-lokalise-api/resources/key'
24
+ require 'ruby-lokalise-api/resources/project_comment'
25
+ require 'ruby-lokalise-api/resources/system_language'
26
+ require 'ruby-lokalise-api/resources/team'
27
+
28
+ require 'ruby-lokalise-api/collections/base'
29
+ require 'ruby-lokalise-api/collections/project'
30
+ require 'ruby-lokalise-api/collections/team'
31
+ require 'ruby-lokalise-api/collections/system_language'
32
+ require 'ruby-lokalise-api/collections/project_language'
33
+ require 'ruby-lokalise-api/collections/project_comment'
34
+ require 'ruby-lokalise-api/collections/key_comment'
35
+ require 'ruby-lokalise-api/collections/key'
36
+ require 'ruby-lokalise-api/collections/contributor'
37
+ require 'ruby-lokalise-api/collections/file'
38
+ require 'ruby-lokalise-api/collections/translation'
39
+ require 'ruby-lokalise-api/collections/team_user'
40
+ require 'ruby-lokalise-api/collections/task'
41
+ require 'ruby-lokalise-api/collections/snapshot'
42
+ require 'ruby-lokalise-api/collections/screenshot'
43
+
44
+ require 'ruby-lokalise-api/client'
45
+
46
+ module Lokalise
47
+ class << self
48
+ # Initializes a new Client object
49
+ #
50
+ # @return [Lokalise::Client]
51
+ def client(token)
52
+ @client ||= Lokalise::Client.new token
53
+ end
54
+
55
+ # Reset the currently set client
56
+ def reset_client!
57
+ @client = nil
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,22 @@
1
+ require 'ruby-lokalise-api/rest/languages'
2
+ require 'ruby-lokalise-api/rest/teams'
3
+ require 'ruby-lokalise-api/rest/projects'
4
+ require 'ruby-lokalise-api/rest/comments'
5
+ require 'ruby-lokalise-api/rest/keys'
6
+ require 'ruby-lokalise-api/rest/contributors'
7
+ require 'ruby-lokalise-api/rest/files'
8
+ require 'ruby-lokalise-api/rest/translations'
9
+ require 'ruby-lokalise-api/rest/team_users'
10
+ require 'ruby-lokalise-api/rest/tasks'
11
+ require 'ruby-lokalise-api/rest/snapshots'
12
+ require 'ruby-lokalise-api/rest/screenshots'
13
+
14
+ module Lokalise
15
+ class Client
16
+ attr_reader :token
17
+
18
+ def initialize(token)
19
+ @token = token
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,46 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Base
4
+ extend Lokalise::Request
5
+ extend Lokalise::Utils::AttributeHelpers
6
+ include Lokalise::Utils::AttributeHelpers
7
+
8
+ attr_reader :raw_data, :total_pages, :total_results, :results_per_page, :current_page, :collection,
9
+ :project_id, :team_id
10
+
11
+ def initialize(response)
12
+ produce_collection_for response
13
+ @total_results = response['x-pagination-total-count'].to_i
14
+ @total_pages = response['x-pagination-page-count'].to_i
15
+ @results_per_page = response['x-pagination-limit'].to_i
16
+ @current_page = response['x-pagination-page'].to_i
17
+ # Project and team id may not be present in some cases
18
+ @project_id = response['content']['project_id']
19
+ @team_id = response['content']['team_id']
20
+ end
21
+
22
+ class << self
23
+ # Performs a batch query fetching multiple records
24
+ def all(client, params = {}, *ids)
25
+ new get(endpoint(*ids), client, params)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ # Dynamically produces collection of resources based on the given response
32
+ # Collection example: `{ "content": {"comments": [ ... ]} }`
33
+ def produce_collection_for(response)
34
+ model_class = self.class.name.base_class_name
35
+ data_key_plural = data_key_for model_class, true
36
+
37
+ # Fetch collection data and instantiate an individual resource for each object
38
+ # We also preserve the `client` to be able to chain API methods later
39
+ @collection = response['content'][data_key_plural].collect do |raw_model|
40
+ Module.const_get("Lokalise::Resources::#{model_class}").new 'content' => raw_model,
41
+ 'client' => response['client']
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Contributor < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/contributors"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class File < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/files"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Key < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/keys"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class KeyComment < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, key_id, *_args)
8
+ "projects/#{project_id}/keys/#{key_id}/comments"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Project < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(*_args)
8
+ 'projects'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class ProjectComment < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/comments"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class ProjectLanguage < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/languages"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Screenshot < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/screenshots"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Snapshot < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/snapshots"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class SystemLanguage < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(*_args)
8
+ 'system/languages'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Task < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/tasks"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Team < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(*_args)
8
+ 'teams'
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class TeamUser < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(team_id, *_args)
8
+ "teams/#{team_id}/users"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Lokalise
2
+ module Collections
3
+ class Translation < Base
4
+ class << self
5
+ private
6
+
7
+ def endpoint(project_id, *_args)
8
+ "projects/#{project_id}/translations"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ module Lokalise
2
+ module Connection
3
+ BASE_URL = 'https://api.lokalise.co/api2/'.freeze
4
+
5
+ def connection(token)
6
+ options = {
7
+ headers: {
8
+ accept: 'application/json',
9
+ user_agent: "ruby-lokalise-api gem/#{Lokalise::VERSION}",
10
+ 'X-Api-Token': token
11
+ },
12
+ url: BASE_URL
13
+ }
14
+ Faraday.new(options) { |faraday| faraday.adapter Faraday.default_adapter }
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,127 @@
1
+ {
2
+ "comment": [
3
+ "comment_id",
4
+ "key_id",
5
+ "comment",
6
+ "added_by",
7
+ "added_by_email",
8
+ "added_at"
9
+ ],
10
+ "contributor": [
11
+ "user_id",
12
+ "email",
13
+ "fullname",
14
+ "created_at",
15
+ "is_admin",
16
+ "is_reviewer",
17
+ "languages",
18
+ "admin_rights"
19
+ ],
20
+ "file": [
21
+ "filename",
22
+ "key_count"
23
+ ],
24
+ "key": [
25
+ "key_id",
26
+ "created_at",
27
+ "key_name",
28
+ "filenames",
29
+ "description",
30
+ "platforms",
31
+ "tags",
32
+ "comments",
33
+ "screenshots",
34
+ "translations",
35
+ "is_plural",
36
+ "plural_name",
37
+ "is_hidden",
38
+ "is_archived",
39
+ "context",
40
+ "base_words",
41
+ "char_limit",
42
+ "custom_attributes"
43
+ ],
44
+ "language": [
45
+ "lang_id",
46
+ "lang_iso",
47
+ "lang_name",
48
+ "is_rtl",
49
+ "plural_forms"
50
+ ],
51
+ "project": [
52
+ "project_id",
53
+ "name",
54
+ "description",
55
+ "created_at",
56
+ "created_by",
57
+ "created_by_email",
58
+ "team_id"
59
+ ],
60
+ "screenshot": [
61
+ "screenshot_id",
62
+ "key_ids",
63
+ "url",
64
+ "title",
65
+ "description",
66
+ "screenshot_tags",
67
+ "width",
68
+ "height"
69
+ ],
70
+ "snapshot": [
71
+ "snapshot_id",
72
+ "title",
73
+ "created_at",
74
+ "created_by",
75
+ "created_by_email"
76
+ ],
77
+ "task": [
78
+ "task_id",
79
+ "title",
80
+ "description",
81
+ "status",
82
+ "progress",
83
+ "due_date",
84
+ "keys_count",
85
+ "words_count",
86
+ "created_at",
87
+ "created_by",
88
+ "created_by_email",
89
+ "can_be_parent",
90
+ "task_type",
91
+ "parent_task_id",
92
+ "closing_tags",
93
+ "languages",
94
+ "auto_close_languages",
95
+ "auto_close_task",
96
+ "completed_at",
97
+ "completed_by",
98
+ "completed_by_email"
99
+ ],
100
+ "team": [
101
+ "team_id",
102
+ "name",
103
+ "created_at",
104
+ "plan",
105
+ "quota_usage",
106
+ "quota_allowed"
107
+ ],
108
+ "team_user": [
109
+ "user_id",
110
+ "email",
111
+ "fullname",
112
+ "created_at",
113
+ "role"
114
+ ],
115
+ "translation": [
116
+ "translation_id",
117
+ "key_id",
118
+ "language_iso",
119
+ "modified_at",
120
+ "modified_by",
121
+ "modified_by_email",
122
+ "translation",
123
+ "is_fuzzy",
124
+ "is_reviewed",
125
+ "words"
126
+ ]
127
+ }