phrase 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/.gitignore +0 -2
  2. data/.travis.yml +1 -0
  3. data/lib/phrase.rb +1 -0
  4. data/lib/phrase/api/client.rb +11 -2
  5. data/lib/phrase/delegate.rb +6 -2
  6. data/lib/phrase/formats.rb +151 -0
  7. data/lib/phrase/formats/csv.rb +19 -0
  8. data/lib/phrase/{tool/formats → formats}/custom.rb +3 -1
  9. data/lib/phrase/formats/gettext.rb +27 -0
  10. data/lib/phrase/formats/gettext_template.rb +19 -0
  11. data/lib/phrase/formats/ini.rb +19 -0
  12. data/lib/phrase/formats/json.rb +19 -0
  13. data/lib/phrase/formats/plist.rb +19 -0
  14. data/lib/phrase/formats/properties.rb +19 -0
  15. data/lib/phrase/formats/properties_xml.rb +19 -0
  16. data/lib/phrase/formats/qt_phrase_book.rb +19 -0
  17. data/lib/phrase/formats/qt_translation_source.rb +19 -0
  18. data/lib/phrase/formats/resx.rb +19 -0
  19. data/lib/phrase/formats/resx_windowsphone.rb +19 -0
  20. data/lib/phrase/formats/simple_json.rb +19 -0
  21. data/lib/phrase/formats/strings.rb +39 -0
  22. data/lib/phrase/formats/tmx.rb +19 -0
  23. data/lib/phrase/formats/xliff.rb +19 -0
  24. data/lib/phrase/formats/xml.rb +49 -0
  25. data/lib/phrase/formats/yaml.rb +19 -0
  26. data/lib/phrase/formats/yaml_symfony.rb +19 -0
  27. data/lib/phrase/hash_flattener.rb +15 -14
  28. data/lib/phrase/tool.rb +1 -1
  29. data/lib/phrase/tool/commands/pull.rb +4 -4
  30. data/lib/phrase/tool/commands/push.rb +14 -6
  31. data/lib/phrase/tool/options.rb +2 -1
  32. data/lib/phrase/tool/options_factory.rb +5 -1
  33. data/lib/phrase/version.rb +1 -1
  34. metadata +43 -38
  35. data/lib/phrase/tool/formats.rb +0 -87
  36. data/lib/phrase/tool/formats/base.rb +0 -37
  37. data/lib/phrase/tool/formats/gettext.rb +0 -19
  38. data/lib/phrase/tool/formats/gettext_pot.rb +0 -11
  39. data/lib/phrase/tool/formats/ini.rb +0 -11
  40. data/lib/phrase/tool/formats/json.rb +0 -11
  41. data/lib/phrase/tool/formats/plist.rb +0 -11
  42. data/lib/phrase/tool/formats/properties.rb +0 -11
  43. data/lib/phrase/tool/formats/qt_phrase_book.rb +0 -11
  44. data/lib/phrase/tool/formats/qt_translation_source.rb +0 -11
  45. data/lib/phrase/tool/formats/resx.rb +0 -11
  46. data/lib/phrase/tool/formats/strings.rb +0 -31
  47. data/lib/phrase/tool/formats/xliff.rb +0 -11
  48. data/lib/phrase/tool/formats/xml.rb +0 -41
  49. data/lib/phrase/tool/formats/yaml.rb +0 -11
data/.gitignore CHANGED
@@ -21,5 +21,3 @@ test/version_tmp
21
21
  /phrase
22
22
  .rspec
23
23
  /locales
24
- /ru.lproj
25
- /res
data/.travis.yml CHANGED
@@ -1,3 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
+ - 2.0.0
data/lib/phrase.rb CHANGED
@@ -49,6 +49,7 @@ module Phrase
49
49
  autoload :ViewHelpers, 'phrase/view_helpers'
50
50
 
51
51
  require 'phrase/api'
52
+ require 'phrase/formats'
52
53
  require 'phrase/version'
53
54
  require 'phrase/engine'
54
55
  require 'phrase/backend'
@@ -84,9 +84,10 @@ class Phrase::Api::Client
84
84
  end
85
85
  end
86
86
 
87
- def upload(filename, file_content, tags=[], locale=nil)
87
+ def upload(filename, file_content, tags=[], locale=nil, format=nil)
88
88
  begin
89
89
  params = {
90
+ "file_format" => format,
90
91
  "filename" => filename,
91
92
  "file_content" => file_content,
92
93
  "tags[]" => tags
@@ -94,7 +95,7 @@ class Phrase::Api::Client
94
95
  params["locale_name"] = locale unless locale.nil?
95
96
  perform_api_request("/translation_keys/upload", :post, params)
96
97
  rescue Phrase::Api::Exceptions::ServerError => e
97
- raise "File #{filename} could not be uploaded"
98
+ raise "File #{filename} could not be uploaded (#{e})"
98
99
  end
99
100
  true
100
101
  end
@@ -121,6 +122,7 @@ private
121
122
  def display_api_error(response)
122
123
  error_message = api_error_message(response)
123
124
  $stderr.puts error_message
125
+ $stderr.puts error_message
124
126
  end
125
127
 
126
128
  def api_error_message(response)
@@ -129,6 +131,12 @@ private
129
131
  error = parsed(response.body)["error"]
130
132
  if error.class == String
131
133
  message = error
134
+ elsif error.class == Hash
135
+ error.each_pair do |field, messages|
136
+ messages.each do |msg|
137
+ message << "#{msg}"
138
+ end
139
+ end
132
140
  else
133
141
  message = parsed(response.body)["message"]
134
142
  end
@@ -151,6 +159,7 @@ private
151
159
  end
152
160
  response = http_client.request(request)
153
161
  code = response.code.to_i
162
+
154
163
  if (code == 200)
155
164
  return response.body
156
165
  else
@@ -17,7 +17,11 @@ module Phrase::Delegate
17
17
 
18
18
  protected
19
19
  def decorated_key_name
20
- "#{Phrase.prefix}phrase_#{@display_key}#{Phrase.suffix}"
20
+ "#{Phrase.prefix}phrase_#{normalized_display_key}#{Phrase.suffix}"
21
+ end
22
+
23
+ def normalized_display_key
24
+ @display_key.gsub("<", "[[[[[[html_open]]]]]]").gsub(">", "[[[[[[html_close]]]]]]")
21
25
  end
22
26
  end
23
- end
27
+ end
@@ -0,0 +1,151 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ autoload :Custom, 'phrase/formats/custom'
6
+ autoload :Json, 'phrase/formats/json'
7
+ autoload :Csv, 'phrase/formats/csv'
8
+ autoload :Gettext, 'phrase/formats/gettext'
9
+ autoload :GettextTemplate, 'phrase/formats/gettext_template'
10
+ autoload :Ini, 'phrase/formats/ini'
11
+ autoload :Properties, 'phrase/formats/properties'
12
+ autoload :PropertiesXml, 'phrase/formats/properties_xml'
13
+ autoload :Plist, 'phrase/formats/plist'
14
+ autoload :QtPhraseBook, 'phrase/formats/qt_phrase_book'
15
+ autoload :QtTranslationSource, 'phrase/formats/qt_translation_source'
16
+ autoload :Resx, 'phrase/formats/resx'
17
+ autoload :ResxWindowsphone, 'phrase/formats/resx_windowsphone'
18
+ autoload :SimpleJson, 'phrase/formats/simple_json'
19
+ autoload :Strings, 'phrase/formats/strings'
20
+ autoload :Xml, 'phrase/formats/xml'
21
+ autoload :Tmx, 'phrase/formats/tmx'
22
+ autoload :Xliff, 'phrase/formats/xliff'
23
+ autoload :Yaml, 'phrase/formats/yaml'
24
+ autoload :YamlSymfony, 'phrase/formats/yaml_symfony'
25
+
26
+ class Base
27
+ def self.supports_extension?(extension)
28
+ self.extensions.map(&:to_s).include?(extension.to_s)
29
+ end
30
+
31
+ def self.extensions
32
+ []
33
+ end
34
+
35
+ def self.directory_for_locale(locale)
36
+ "./"
37
+ end
38
+
39
+ def self.filename_for_locale(locale)
40
+ raise "not implemented"
41
+ end
42
+
43
+ def self.extract_locale_name_from_file_path(file_path)
44
+ nil
45
+ end
46
+
47
+ def self.default_locale_name
48
+ Phrase::Tool::Locale.find_default_locale.try(:name)
49
+ end
50
+
51
+ def self.locale_aware?
52
+ false
53
+ end
54
+
55
+ def self.target_directory
56
+ "phrase/locales/"
57
+ end
58
+
59
+ def self.config
60
+ @config ||= get_config
61
+ end
62
+
63
+ def self.get_config
64
+ config = Phrase::Tool::Config.new
65
+ config.load
66
+ end
67
+ private_class_method :config
68
+ end
69
+
70
+ SUPPORTED_FORMATS = {
71
+ custom: Phrase::Formats::Custom,
72
+ json: Phrase::Formats::Json,
73
+ csv: Phrase::Formats::Csv,
74
+ gettext: Phrase::Formats::Gettext,
75
+ gettext_template: Phrase::Formats::GettextTemplate,
76
+ ini: Phrase::Formats::Ini,
77
+ properties: Phrase::Formats::Properties,
78
+ properties_xml: Phrase::Formats::PropertiesXml,
79
+ plist: Phrase::Formats::Plist,
80
+ qph: Phrase::Formats::QtPhraseBook,
81
+ ts: Phrase::Formats::QtTranslationSource,
82
+ resx: Phrase::Formats::Resx,
83
+ resx_windowsphone: Phrase::Formats::ResxWindowsphone,
84
+ simple_json: Phrase::Formats::SimpleJson,
85
+ strings: Phrase::Formats::Strings,
86
+ xml: Phrase::Formats::Xml,
87
+ tmx: Phrase::Formats::Tmx,
88
+ xlf: Phrase::Formats::Xliff,
89
+ yml: Phrase::Formats::Yaml,
90
+ yml_symfony: Phrase::Formats::YamlSymfony,
91
+ }
92
+
93
+ def self.config
94
+ @config ||= get_config
95
+ end
96
+
97
+ def self.get_config
98
+ config = Phrase::Tool::Config.new
99
+ config.load
100
+ end
101
+
102
+ def self.custom_handler
103
+ handler_class_for_format(:custom)
104
+ end
105
+
106
+ def self.target_directory(format_name)
107
+ handler = handler_class_for_format(format_name)
108
+ custom_handler.target_directory || handler.target_directory
109
+ end
110
+
111
+ def self.directory_for_locale_in_format(locale, format_name)
112
+ handler = handler_class_for_format(format_name)
113
+ custom_directory = custom_handler.directory_for_locale(locale, format_name)
114
+ custom_directory || handler.directory_for_locale(locale)
115
+ end
116
+
117
+ def self.filename_for_locale_in_format(locale, format_name)
118
+ handler = handler_class_for_format(format_name)
119
+ custom_filename = custom_handler.filename_for_locale(locale, format_name)
120
+ custom_filename || handler.filename_for_locale(locale)
121
+ end
122
+
123
+ def self.file_format_exposes_locale?(file_path)
124
+ format = guess_possible_file_format_from_file_path(file_path)
125
+ format.nil? ? false : handler_class_for_format(format).locale_aware?
126
+ end
127
+
128
+ def self.detect_locale_name_from_file_path(file_path)
129
+ format = guess_possible_file_format_from_file_path(file_path)
130
+ format.nil? ? nil : handler_class_for_format(format).extract_locale_name_from_file_path(file_path)
131
+ end
132
+
133
+ def self.handler_class_for_format(format_name)
134
+ SUPPORTED_FORMATS.fetch(format_name.to_sym)
135
+ end
136
+ private_class_method :handler_class_for_format
137
+
138
+ def self.guess_possible_file_format_from_file_path(file_path)
139
+ extension = extension_from_file_path(file_path)
140
+ possible_format = SUPPORTED_FORMATS.keys.find do |format|
141
+ SUPPORTED_FORMATS[format].send(:supports_extension?, extension)
142
+ end
143
+ end
144
+ private_class_method :guess_possible_file_format_from_file_path
145
+
146
+ def self.extension_from_file_path(file_path)
147
+ file_path.split('.').last.downcase
148
+ end
149
+ private_class_method :extension_from_file_path
150
+ end
151
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Csv < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.csv"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ false
12
+ end
13
+
14
+ def self.extensions
15
+ [:csv]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,4 +1,6 @@
1
- class Phrase::Tool::Formats::Custom < Phrase::Tool::Formats::Base
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ class Phrase::Formats::Custom < Phrase::Formats::Base
2
4
  def self.directory_for_locale(locale, format)
3
5
  setting = config.locale_directory
4
6
  return unless setting
@@ -0,0 +1,27 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Gettext < Phrase::Formats::Base
6
+ def self.directory_for_locale(locale)
7
+ "./#{locale.name}/"
8
+ end
9
+
10
+ def self.filename_for_locale(locale)
11
+ "#{config.domain}.po"
12
+ end
13
+
14
+ def self.target_directory
15
+ "locales/"
16
+ end
17
+
18
+ def self.locale_aware?
19
+ true
20
+ end
21
+
22
+ def self.extensions
23
+ [:po]
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class GettextTemplate < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.pot"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ false
12
+ end
13
+
14
+ def self.extensions
15
+ [:pot]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Ini < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.ini"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ true
12
+ end
13
+
14
+ def self.extensions
15
+ [:ini]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Json < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.json"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ false
12
+ end
13
+
14
+ def self.extensions
15
+ [:json]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Plist < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.plist"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ true
12
+ end
13
+
14
+ def self.extensions
15
+ [:plist]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class Properties < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.properties"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ true
12
+ end
13
+
14
+ def self.extensions
15
+ [:properties]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class PropertiesXml < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.xml"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ false
12
+ end
13
+
14
+ def self.extensions
15
+ [:xml]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class QtPhraseBook < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.qph"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ true
12
+ end
13
+
14
+ def self.extensions
15
+ [:qph]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class QtTranslationSource < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "phrase.#{locale.name}.ts"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ true
12
+ end
13
+
14
+ def self.extensions
15
+ [:ts]
16
+ end
17
+ end
18
+ end
19
+ end