transifex-interface-ruby 0.0.1 → 0.0.2

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 (118) hide show
  1. checksums.yaml +6 -14
  2. data/.gitignore +17 -17
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -4
  5. data/LICENSE.txt +22 -22
  6. data/README.md +517 -513
  7. data/Rakefile +1 -1
  8. data/lib/transifex.rb +84 -87
  9. data/lib/transifex/crud_requests.rb +43 -33
  10. data/lib/transifex/errors.rb +4 -4
  11. data/lib/transifex/project_components/language.rb +1 -1
  12. data/lib/transifex/project_components/language_components/coordinators.rb +4 -6
  13. data/lib/transifex/project_components/language_components/reviewers.rb +5 -8
  14. data/lib/transifex/project_components/language_components/translators.rb +6 -9
  15. data/lib/transifex/project_components/languages.rb +1 -1
  16. data/lib/transifex/resource.rb +1 -1
  17. data/lib/transifex/resource_components/content.rb +1 -1
  18. data/lib/transifex/resource_components/source.rb +1 -1
  19. data/lib/transifex/resource_components/stats.rb +1 -1
  20. data/lib/transifex/resource_components/translation.rb +1 -1
  21. data/lib/transifex/resource_components/translation_components/string.rb +1 -1
  22. data/lib/transifex/resource_components/translation_components/strings.rb +1 -1
  23. data/lib/transifex/resources.rb +1 -1
  24. data/lib/transifex/version.rb +3 -3
  25. data/spec/cassettes/fetch_formats.yml +121 -0
  26. data/spec/cassettes/language/fetch_language_info.yml +58 -0
  27. data/spec/cassettes/language/fetch_languages_info.yml +58 -0
  28. data/spec/cassettes/project/components/create_language.yml +95 -0
  29. data/spec/cassettes/project/components/create_language_non_existing_coordinator.yml +48 -0
  30. data/spec/cassettes/project/components/create_language_without_coordinator.yml +48 -0
  31. data/spec/cassettes/project/components/fetch_languages.yml +53 -0
  32. data/spec/cassettes/project/delete_project.yml +108 -0
  33. data/spec/cassettes/project/fetch_private_project_info.yml +59 -0
  34. data/spec/cassettes/project/fetch_with_details_private_project_info.yml +66 -0
  35. data/spec/cassettes/project/language/delete_language.yml +140 -0
  36. data/spec/cassettes/project/language/fetch_coordinators.yml +56 -0
  37. data/spec/cassettes/project/language/fetch_language_info.yml +52 -0
  38. data/spec/cassettes/project/language/fetch_reviewers.yml +56 -0
  39. data/spec/cassettes/project/language/fetch_translators.yml +54 -0
  40. data/spec/cassettes/project/language/fetch_with_details_language_info.yml +54 -0
  41. data/spec/cassettes/project/language/update_coordinators.yml +104 -0
  42. data/spec/cassettes/project/language/update_language.yml +100 -0
  43. data/spec/cassettes/project/language/update_non_existing_coordinator.yml +48 -0
  44. data/spec/cassettes/project/language/update_non_existing_language.yml +49 -0
  45. data/spec/cassettes/project/language/update_non_existing_reviewer.yml +101 -0
  46. data/spec/cassettes/project/language/update_non_existing_translator.yml +101 -0
  47. data/spec/cassettes/project/language/update_reviewers.yml +157 -0
  48. data/spec/cassettes/project/language/update_translators.yml +157 -0
  49. data/spec/cassettes/project/update_non_existing_attribute_private_project.yml +54 -0
  50. data/spec/cassettes/project/update_private_project.yml +120 -0
  51. data/spec/cassettes/project/update_with_missing_params_private_project.yml +54 -0
  52. data/spec/cassettes/projects/create_private_project.yml +111 -0
  53. data/spec/cassettes/projects/create_public_project.yml +111 -0
  54. data/spec/cassettes/projects/create_used_slug_project.yml +55 -0
  55. data/spec/cassettes/projects/fetch_projects.yml +61 -0
  56. data/spec/cassettes/resource/delete_not_existing_resource.yml +55 -0
  57. data/spec/cassettes/resource/delete_resource.yml +160 -0
  58. data/spec/cassettes/resource/fetch_all_languages_stats.yml +66 -0
  59. data/spec/cassettes/resource/fetch_content_as_file.yml +56 -0
  60. data/spec/cassettes/resource/fetch_content_as_hash.yml +58 -0
  61. data/spec/cassettes/resource/fetch_language_stats.yml +61 -0
  62. data/spec/cassettes/resource/fetch_not_existing_resource.yml +55 -0
  63. data/spec/cassettes/resource/fetch_resource_info.yml +59 -0
  64. data/spec/cassettes/resource/fetch_source_string_metadata.yml +52 -0
  65. data/spec/cassettes/resource/fetch_translations.yml +57 -0
  66. data/spec/cassettes/resource/fetch_updated_resource_info.yml +60 -0
  67. data/spec/cassettes/resource/fetch_updated_source_string_metadata.yml +52 -0
  68. data/spec/cassettes/resource/fetch_with_details_resource_info.yml +65 -0
  69. data/spec/cassettes/resource/fetch_with_file_and_mode_translations.yml +56 -0
  70. data/spec/cassettes/resource/fetch_with_file_translations.yml +56 -0
  71. data/spec/cassettes/resource/update_content_json.yml +115 -0
  72. data/spec/cassettes/resource/update_content_with_wrong_mimetype.yml +59 -0
  73. data/spec/cassettes/resource/update_content_yml.yml +114 -0
  74. data/spec/cassettes/resource/update_not_existing_resource.yml +55 -0
  75. data/spec/cassettes/resource/update_resource_info.yml +114 -0
  76. data/spec/cassettes/resource/update_source_language.yml +54 -0
  77. data/spec/cassettes/resource/update_source_string_metadata.yml +100 -0
  78. data/spec/cassettes/resource/update_translation_for_language.yml +62 -0
  79. data/spec/cassettes/resources/create_from_file.yml +55 -0
  80. data/spec/cassettes/resources/create_from_string.yml +54 -0
  81. data/spec/cassettes/resources/fetch_as_array.yml +62 -0
  82. data/spec/cassettes/resources/non_existing_project.yml +55 -0
  83. data/spec/cassettes/translation/fetch_string.yml +55 -0
  84. data/spec/cassettes/translation/fetch_strings.yml +54 -0
  85. data/spec/cassettes/translation/fetch_with_details_and_context_strings.yml +51 -0
  86. data/spec/cassettes/translation/fetch_with_details_and_key_strings.yml +56 -0
  87. data/spec/cassettes/translation/fetch_with_details_strings.yml +56 -0
  88. data/spec/cassettes/translation/update_multiple_translation_strings.yml +107 -0
  89. data/spec/cassettes/translation/update_single_translation_strings.yml +104 -0
  90. data/spec/cassettes/translation/update_string.yml +104 -0
  91. data/spec/lib/transifex/coordinators_spec.rb +22 -16
  92. data/spec/lib/transifex/formats_spec.rb +8 -8
  93. data/spec/lib/transifex/language_spec.rb +9 -10
  94. data/spec/lib/transifex/languages_spec.rb +8 -8
  95. data/spec/lib/transifex/project_language_spec.rb +41 -28
  96. data/spec/lib/transifex/project_languages_spec.rb +34 -18
  97. data/spec/lib/transifex/project_spec.rb +46 -73
  98. data/spec/lib/transifex/projects_spec.rb +72 -37
  99. data/spec/lib/transifex/resource_content_spec.rb +41 -24
  100. data/spec/lib/transifex/resource_source_spec.rb +21 -19
  101. data/spec/lib/transifex/resource_spec.rb +69 -41
  102. data/spec/lib/transifex/resources_spec.rb +42 -34
  103. data/spec/lib/transifex/reviewers_spec.rb +23 -17
  104. data/spec/lib/transifex/stats_spec.rb +20 -24
  105. data/spec/lib/transifex/translation_spec.rb +60 -38
  106. data/spec/lib/transifex/translation_string_spec.rb +26 -20
  107. data/spec/lib/transifex/translation_strings_spec.rb +65 -43
  108. data/spec/lib/transifex/translators_spec.rb +23 -17
  109. data/spec/lib/transifex_spec.rb +15 -0
  110. data/spec/lib/yaml/eo.yml +3 -0
  111. data/spec/spec_helper.rb +19 -83
  112. data/spec/support/client_helper.rb +8 -0
  113. data/spec/support/content_helper.rb +346 -0
  114. data/transifex-interface-ruby.gemspec +28 -25
  115. metadata +198 -21
  116. data/spec/lib/transifex/configuration_spec.rb +0 -17
  117. data/spec/lib/yaml/resource_translation_default_content_test.yml +0 -4
  118. data/spec/lib/yaml/resource_translation_reviewed_content_test.yml +0 -9
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require "bundler/gem_tasks"
@@ -1,87 +1,84 @@
1
- require 'net/http'
2
- require 'multi_json'
3
- require 'yaml'
4
- require 'uri'
5
- require 'digest/md5'
6
-
7
- require "transifex/version"
8
- require "transifex/resource_components/translation_components/utilities"
9
- require "transifex/crud_requests"
10
- require "transifex/errors"
11
- require "transifex/formats"
12
- require "transifex/project"
13
- require "transifex/projects"
14
- require "transifex/json"
15
- require "transifex/languages"
16
- require "transifex/language"
17
- require "transifex/project_components/language"
18
- require "transifex/project_components/language_components/coordinators"
19
- require "transifex/project_components/language_components/reviewers"
20
- require "transifex/project_components/language_components/translators"
21
- require "transifex/project_components/languages"
22
- require "transifex/resource"
23
- require "transifex/resource_components/content"
24
- require "transifex/resource_components/source"
25
- require "transifex/resource_components/stats"
26
- require "transifex/resource_components/translation"
27
- require "transifex/resource_components/translation_components/string"
28
- require "transifex/resource_components/translation_components/strings"
29
- require "transifex/resources"
30
-
31
-
32
-
33
- module Transifex
34
-
35
- class Configuration
36
- attr_accessor :client_login, :client_secret, :root_url
37
-
38
- def root_url
39
- @root_url ||= "https://www.transifex.com/api/2"
40
- end
41
- end
42
-
43
- class << self
44
- attr_accessor :configuration
45
- end
46
-
47
- def self.configure
48
- self.configuration ||= Configuration.new
49
- yield configuration
50
- end
51
-
52
- def self.build_request_url(url='')
53
- URI(self.configuration.root_url + url)
54
- end
55
-
56
- def self.query_api(method, url, params={})
57
- uri = build_request_url(url)
58
-
59
- res = Net::HTTP.start(uri.host, 80) do |http|
60
- req = Net::HTTP::const_get(method.capitalize).new(uri.request_uri, request_headers)
61
- req.basic_auth self.configuration.client_login, self.configuration.client_secret
62
- req.body = Transifex::JSON.dump(params)
63
- http.request req
64
- end
65
-
66
- begin
67
- data = Transifex::JSON.load(res.body.nil? ? '' : res.body)
68
- rescue
69
- data = res.body
70
- end
71
-
72
- unless (res.is_a? Net::HTTPOK) || (res.is_a? Net::HTTPCreated) || (res.is_a? Net::HTTPNoContent)
73
- error = TransifexError.new(uri, res.code, data)
74
- raise error
75
- end
76
-
77
- data
78
- end
79
-
80
- def self.request_headers
81
- request_headers = {
82
- 'Content-Type' => 'application/json',
83
- 'Accept' => 'application/json',
84
- 'User-Agent' => "Transifex-interface-ruby/#{Transifex::VERSION}"
85
- }
86
- end
87
- end
1
+ require 'net/http'
2
+ require 'multi_json'
3
+ require 'yaml'
4
+ require 'uri'
5
+ require 'digest/md5'
6
+
7
+ require "transifex/version"
8
+ require "transifex/resource_components/translation_components/utilities"
9
+ require "transifex/crud_requests"
10
+ require "transifex/errors"
11
+ require "transifex/formats"
12
+ require "transifex/project"
13
+ require "transifex/projects"
14
+ require "transifex/json"
15
+ require "transifex/languages"
16
+ require "transifex/language"
17
+ require "transifex/project_components/language"
18
+ require "transifex/project_components/language_components/coordinators"
19
+ require "transifex/project_components/language_components/reviewers"
20
+ require "transifex/project_components/language_components/translators"
21
+ require "transifex/project_components/languages"
22
+ require "transifex/resource"
23
+ require "transifex/resource_components/content"
24
+ require "transifex/resource_components/source"
25
+ require "transifex/resource_components/stats"
26
+ require "transifex/resource_components/translation"
27
+ require "transifex/resource_components/translation_components/string"
28
+ require "transifex/resource_components/translation_components/strings"
29
+ require "transifex/resources"
30
+
31
+ module Transifex
32
+ class << self
33
+ attr_accessor :configuration
34
+
35
+ def configure
36
+ self.configuration ||= Configuration.new
37
+ yield configuration
38
+ end
39
+
40
+ def build_request_url(url='')
41
+ URI(self.configuration.root_url + url)
42
+ end
43
+
44
+ def query_api(method, url, params={})
45
+ uri = build_request_url(url)
46
+
47
+ res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
48
+ req = Net::HTTP::const_get(method.capitalize).new(uri.request_uri, request_headers)
49
+ req.basic_auth self.configuration.client_login, self.configuration.client_secret
50
+ req.body = Transifex::JSON.dump(params)
51
+ http.request req
52
+ end
53
+
54
+ begin
55
+ data = Transifex::JSON.load(res.body.nil? ? '' : res.body)
56
+ rescue
57
+ data = res.body
58
+ end
59
+
60
+ unless (res.is_a? Net::HTTPOK) || (res.is_a? Net::HTTPCreated) || (res.is_a? Net::HTTPNoContent)
61
+ error = TransifexError.new(uri, res.code, data)
62
+ raise error
63
+ end
64
+
65
+ data
66
+ end
67
+
68
+ def request_headers
69
+ request_headers = {
70
+ 'Content-Type' => 'application/json',
71
+ 'Accept' => 'application/json',
72
+ 'User-Agent' => "Transifex-interface-ruby/#{Transifex::VERSION}"
73
+ }
74
+ end
75
+ end
76
+
77
+ class Configuration
78
+ attr_accessor :client_login, :client_secret, :root_url
79
+
80
+ def root_url
81
+ @root_url ||= "https://www.transifex.com/api/2"
82
+ end
83
+ end
84
+ end
@@ -1,15 +1,15 @@
1
1
  module Transifex
2
2
  module CrudRequests
3
- class << self
3
+ class << self
4
4
  def generate_url(object, params = {})
5
5
  class_name_string = object.class.name.split("::").last.downcase.to_s
6
6
  url = ""
7
- if object.class.respond_to?(:parents)
8
- object.class.parents.map{|parent| url += "/" + parent.to_s + "/" + object.instance_variable_get("@" + parent.to_s + "_slug")}
9
- end
7
+ if object.class.respond_to?(:authors)
8
+ object.class.authors.map{|author| url += "/" + author.to_s + "/" + object.instance_variable_get("@" + author.to_s + "_slug")}
9
+ end
10
10
  url += "/" + class_name_string
11
11
  url += "/" + object.instance_variable_get("@" + class_name_string + "_slug") if object.instance_variable_defined?("@" + class_name_string + "_slug")
12
- params.each do |param|
12
+ params.each do |param|
13
13
  url = add_param(url, param[0], param[1])
14
14
  end
15
15
  url
@@ -17,7 +17,7 @@ module Transifex
17
17
 
18
18
  def add_param(url, param_name, param_value)
19
19
  uri = URI(url)
20
- params = URI.decode_www_form(uri.query || []) << [param_name, param_value]
20
+ params = URI.decode_www_form(uri.query || "") << [param_name, param_value]
21
21
  uri.query = URI.encode_www_form(params)
22
22
  uri.to_s
23
23
  end
@@ -26,12 +26,12 @@ module Transifex
26
26
  module Fetch
27
27
  module InstanceMethods
28
28
  def fetch(options = {})
29
- url = CrudRequests.generate_url(self, options)
29
+ url = CrudRequests.generate_url(self, options)
30
30
  Transifex.query_api(:get, url)
31
31
  end
32
32
  end
33
33
  def self.included(receiver)
34
- receiver.send(:include, InstanceMethods)
34
+ receiver.send(:include, InstanceMethods)
35
35
  end
36
36
  end
37
37
  module Create
@@ -40,7 +40,7 @@ module Transifex
40
40
  missing_keys = self.class::CREATE_REQUIRED_PARAMS - params.keys
41
41
  raise MissingParametersError.new(missing_keys) unless (missing_keys == [:repository_url] || missing_keys == [:private]) || missing_keys.empty?
42
42
  if params[:repository_url] && !params[:repository_url].empty? && params[:repository_url].match(/^(http|https|ftp):\/\/[a-zA-Z]+\.[a-zA-Z]+\.[a-zA-Z]+/).nil?
43
- raise ParametersFormatError.new(:repository_url, "http|https|ftp://x.x.x")
43
+ raise ParametersFormatError.new(:repository_url, "http|https|ftp://x.x.x")
44
44
  end
45
45
  unless options[:trad_from_file].nil?
46
46
  if params[:i18n_type] == "YAML"
@@ -54,46 +54,56 @@ module Transifex
54
54
  url = CrudRequests.generate_url(self)
55
55
  Transifex.query_api(:post, url, params)
56
56
  end
57
- end
58
-
57
+ end
58
+
59
59
  def self.included(receiver)
60
- receiver.send(:include, InstanceMethods)
60
+ receiver.send(:include, InstanceMethods)
61
61
  end
62
- end
62
+ end
63
63
  module Update
64
64
  module InstanceMethods
65
- def update(params = {}, options = {})
66
- if params.is_a?(Hash) && params[:i18n_type] && params[:i18n_type] != "TXT"
67
- if params[:i18n_type] == "YML"
68
- params[:content] = YAML::load_file(params[:content]).to_yaml
69
- else
70
- file = File.open(params[:content], "rb")
71
- params[:content] = file.read
72
- file.close
65
+ def update(params = {}, options = {})
66
+ if params.is_a?(Hash) && params[:i18n_type]
67
+ if options[:trad_from_file]
68
+ case params[:i18n_type]
69
+ when "YML"
70
+ params[:content] = YAML::load_file(params[:content]).to_yaml
71
+ else
72
+ file = File.open(params[:content], "rb")
73
+ params[:content] = file.read
74
+ file.close
75
+ end
76
+ end
77
+
78
+ if params[:i18n_type] == "KEYVALUEJSON"
79
+ params[:content] = params[:content].to_json
73
80
  end
81
+
74
82
  # Deal with accents
75
- params[:content] = params[:content].force_encoding('UTF-8')
76
- end
83
+ params[:content] = params[:content].force_encoding("UTF-8")
84
+ end
85
+
77
86
  url = CrudRequests.generate_url(self)
87
+
78
88
  Transifex.query_api(:put, url, params)
79
89
  end
80
- end
81
-
90
+ end
91
+
82
92
  def self.included(receiver)
83
- receiver.send(:include, InstanceMethods)
93
+ receiver.send(:include, InstanceMethods)
84
94
  end
85
95
  end
86
96
  module Delete
87
97
  module InstanceMethods
88
- def delete(params = {}, options = {})
98
+ def delete(params = {}, options = {})
89
99
  url = CrudRequests.generate_url(self)
90
100
  Transifex.query_api(:delete, url, params)
91
101
  end
92
- end
93
-
102
+ end
103
+
94
104
  def self.included(receiver)
95
- receiver.send(:include, InstanceMethods)
105
+ receiver.send(:include, InstanceMethods)
96
106
  end
97
- end
98
- end
99
- end
107
+ end
108
+ end
109
+ end
@@ -1,11 +1,10 @@
1
1
  module Transifex
2
-
3
2
  class Error < StandardError
4
3
  end
5
4
 
6
5
  class MissingParametersError < Error
7
6
  def initialize(*missing_attributes)
8
- super("The following attributes are missing:" + missing_attributes.join(','))
7
+ super("The following attributes are missing: " + missing_attributes.join(", "))
9
8
  end
10
9
  end
11
10
 
@@ -14,12 +13,13 @@ module Transifex
14
13
  super("The following parameter: " + parameter.to_s + " must follow the format: " + format_expected)
15
14
  end
16
15
  end
17
-
16
+
18
17
  class TransifexError < Error
19
18
  attr_reader :request_url, :code, :details
19
+
20
20
  def initialize(request_url, code, details)
21
21
  @request_url, @code, @details = request_url, code, details
22
22
  super(details) if details
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -14,7 +14,7 @@ module Transifex
14
14
  @language_slug = language_code
15
15
  end
16
16
 
17
- def self.parents
17
+ def self.authors
18
18
  [:project]
19
19
  end
20
20
 
@@ -14,16 +14,14 @@ module Transifex
14
14
  @language_slug = language_code
15
15
  end
16
16
 
17
- def self.parents
17
+ def self.authors
18
18
  [:project, :language]
19
19
  end
20
20
 
21
- def update(coordinators_list = {}, options = {})
22
- params = {}
23
- params[:coordinators] = coordinators_list
24
- super(params, options)
21
+ def update(coordinators = [], options = {})
22
+ super({"coordinators" => coordinators}, options)
25
23
  end
26
24
  end
27
25
  end
28
26
  end
29
- end
27
+ end
@@ -14,20 +14,17 @@ module Transifex
14
14
  @language_slug = language_code
15
15
  end
16
16
 
17
- def self.parents
17
+ def self.authors
18
18
  [:project, :language]
19
19
  end
20
20
 
21
- def update(reviewers_list = {}, options = {})
21
+ def update(reviewers = [], options = {})
22
22
  # Transifex needs coordinators list to be passed also when updating reviewers list. Strange
23
23
  # Fetch the current coordinators list and add it to the params as a workaround.
24
- fetched_language_infos = Transifex::Project.new(@project_slug).language(@language_slug).fetch
25
- params = {}
26
- params[:coordinators] = fetched_language_infos["coordinators"]
27
- params[:reviewers] = reviewers_list
28
- super(params, options)
24
+ coordinators = Transifex::Project.new(@project_slug).language(@language_slug).coordinators.fetch
25
+ super(coordinators.merge({"reviewers" => reviewers}), options)
29
26
  end
30
27
  end
31
28
  end
32
29
  end
33
- end
30
+ end
@@ -14,20 +14,17 @@ module Transifex
14
14
  @language_slug = language_code
15
15
  end
16
16
 
17
- def self.parents
17
+ def self.authors
18
18
  [:project, :language]
19
19
  end
20
-
21
- def update(translators_list = {}, options = {})
20
+
21
+ def update(translators = {}, options = {})
22
22
  # Transifex needs coordinators list to be passed also when updating reviewers list. Strange
23
23
  # Fetch the current coordinators list and add it to the params as a workaround.
24
- fetched_language_infos = Transifex::Project.new(@project_slug).language(@language_slug).fetch
25
- params = {}
26
- params[:coordinators] = fetched_language_infos["coordinators"]
27
- params[:translators] = translators_list
28
- super(params, options)
24
+ coordinators = Transifex::Project.new(@project_slug).language(@language_slug).coordinators.fetch
25
+ super(coordinators.merge({"translators" => translators}), options)
29
26
  end
30
27
  end
31
28
  end
32
29
  end
33
- end
30
+ end
@@ -13,7 +13,7 @@ module Transifex
13
13
  @project_slug = project_slug
14
14
  end
15
15
 
16
- def self.parents
16
+ def self.authors
17
17
  [:project]
18
18
  end
19
19
  end
@@ -13,7 +13,7 @@ module Transifex
13
13
  @resource_slug = resource_slug
14
14
  end
15
15
 
16
- def self.parents
16
+ def self.authors
17
17
  [:project]
18
18
  end
19
19
 
@@ -12,7 +12,7 @@ module Transifex
12
12
  @project_slug = project_slug
13
13
  @resource_slug = resource_slug
14
14
  end
15
- def self.parents
15
+ def self.authors
16
16
  [:project, :resource]
17
17
  end
18
18
  def fetch_with_file(path_to_file = nil)