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
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
+ }