phrase 0.4.14 → 0.4.15

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 (54) hide show
  1. checksums.yaml +15 -0
  2. data/lib/ext/hash.rb +1 -1
  3. data/lib/generators/phrase/install_generator.rb +1 -1
  4. data/lib/generators/templates/phrase.rb +4 -4
  5. data/lib/phrase/adapters/fast_gettext.rb +3 -3
  6. data/lib/phrase/api/client.rb +27 -27
  7. data/lib/phrase/api/config.rb +3 -3
  8. data/lib/phrase/api/exceptions.rb +1 -1
  9. data/lib/phrase/api/query_params.rb +2 -2
  10. data/lib/phrase/backend/phrase_service.rb +12 -12
  11. data/lib/phrase/cache.rb +7 -7
  12. data/lib/phrase/config.rb +18 -18
  13. data/lib/phrase/delegate.rb +2 -2
  14. data/lib/phrase/delegate/fast_gettext.rb +1 -1
  15. data/lib/phrase/delegate/i18n.rb +26 -26
  16. data/lib/phrase/formats.rb +15 -13
  17. data/lib/phrase/formats/csv.rb +1 -1
  18. data/lib/phrase/formats/custom.rb +2 -2
  19. data/lib/phrase/formats/gettext.rb +1 -1
  20. data/lib/phrase/formats/ini.rb +1 -1
  21. data/lib/phrase/formats/json.rb +1 -1
  22. data/lib/phrase/formats/node_json.rb +23 -0
  23. data/lib/phrase/formats/php_array.rb +1 -1
  24. data/lib/phrase/formats/plist.rb +1 -1
  25. data/lib/phrase/formats/properties.rb +1 -1
  26. data/lib/phrase/formats/properties_xml.rb +1 -1
  27. data/lib/phrase/formats/qt_phrase_book.rb +1 -1
  28. data/lib/phrase/formats/qt_translation_source.rb +2 -2
  29. data/lib/phrase/formats/resx.rb +1 -1
  30. data/lib/phrase/formats/resx_windowsphone.rb +1 -1
  31. data/lib/phrase/formats/simple_json.rb +2 -2
  32. data/lib/phrase/formats/strings.rb +4 -4
  33. data/lib/phrase/formats/tmx.rb +2 -2
  34. data/lib/phrase/formats/xliff.rb +2 -2
  35. data/lib/phrase/formats/xml.rb +6 -6
  36. data/lib/phrase/formats/yaml.rb +2 -2
  37. data/lib/phrase/formats/yaml_symfony.rb +2 -2
  38. data/lib/phrase/tool.rb +2 -2
  39. data/lib/phrase/tool/commands.rb +1 -1
  40. data/lib/phrase/tool/commands/base.rb +14 -14
  41. data/lib/phrase/tool/commands/init.rb +4 -4
  42. data/lib/phrase/tool/commands/pull.rb +13 -13
  43. data/lib/phrase/tool/commands/show_help.rb +1 -1
  44. data/lib/phrase/tool/commands/show_version.rb +3 -3
  45. data/lib/phrase/tool/commands/tags.rb +1 -1
  46. data/lib/phrase/tool/config.rb +3 -3
  47. data/lib/phrase/tool/encoding_detector.rb +3 -3
  48. data/lib/phrase/tool/locale.rb +8 -8
  49. data/lib/phrase/tool/options.rb +3 -3
  50. data/lib/phrase/tool/options_factory.rb +11 -11
  51. data/lib/phrase/tool/tag_validator.rb +2 -2
  52. data/lib/phrase/version.rb +1 -1
  53. data/lib/phrase/view_helpers.rb +2 -2
  54. metadata +66 -37
@@ -5,7 +5,7 @@ module Phrase::Delegate
5
5
  def to_s
6
6
  "#{decorated_key_name}"
7
7
  end
8
-
8
+
9
9
  def self.log(message)
10
10
  message = "phrase: #{message}"
11
11
  if defined?(Rails) and Rails.respond_to?(:logger)
@@ -14,7 +14,7 @@ module Phrase::Delegate
14
14
  $stderr.puts message
15
15
  end
16
16
  end
17
-
17
+
18
18
  protected
19
19
  def decorated_key_name
20
20
  "#{Phrase.prefix}phrase_#{normalized_display_key}#{Phrase.suffix}"
@@ -8,7 +8,7 @@ class Phrase::Delegate::FastGettext < Phrase::Delegate::Base
8
8
  params = params_from_args(args)
9
9
  @display_key = params[:msgid]
10
10
  end
11
-
11
+
12
12
  private
13
13
  def params_from_args(args)
14
14
  params = case @method
@@ -8,19 +8,19 @@ require 'set'
8
8
 
9
9
  class Phrase::Delegate::I18n < Phrase::Delegate::Base
10
10
  attr_accessor :key, :display_key, :options, :api_client, :fallback_keys, :original_args
11
-
11
+
12
12
  def initialize(key, options={}, original_args=nil)
13
13
  @display_key = @key = key
14
14
  @options = options
15
15
  @original_args = original_args
16
-
16
+
17
17
  @fallback_keys = []
18
-
18
+
19
19
  extract_fallback_keys
20
20
  identify_key_to_display if @fallback_keys.any?
21
21
  super(decorated_key_name)
22
22
  end
23
-
23
+
24
24
  def method_missing(*args, &block)
25
25
  self.class.log "Trying to execute missing method ##{args.first} on key #{@key}"
26
26
 
@@ -38,7 +38,7 @@ class Phrase::Delegate::I18n < Phrase::Delegate::Base
38
38
  end
39
39
  end
40
40
  end
41
-
41
+
42
42
  private
43
43
  def identify_key_to_display
44
44
  key_names = [@key] | @fallback_keys
@@ -51,28 +51,28 @@ private
51
51
  end
52
52
  end
53
53
  end
54
-
54
+
55
55
  def find_keys_within_phrase(key_names)
56
56
  key_names_to_check_against_api = key_names - pre_fetched(key_names)
57
57
  pre_cached(key_names) | key_names_returned_from_api_for(key_names_to_check_against_api)
58
58
  end
59
-
59
+
60
60
  def pre_cached(key_names)
61
61
  warm_translation_key_names_cache unless cache.cached?(:translation_key_names)
62
62
  pre_cached_key_names = key_names.select { |key_name| key_name_precached?(key_name) }
63
63
  pre_cached_key_names
64
64
  end
65
-
65
+
66
66
  def pre_fetched(key_names)
67
67
  key_names.select { |key_name| covered_by_initial_caching?(key_name) }
68
68
  end
69
-
69
+
70
70
  def key_name_precached?(key_name)
71
71
  covered = covered_by_initial_caching?(key_name)
72
- in_cache = key_name_is_in_cache?(key_name)
73
- covered && in_cache
72
+ in_cache = key_name_is_in_cache?(key_name)
73
+ covered && in_cache
74
74
  end
75
-
75
+
76
76
  def key_names_returned_from_api_for(key_names)
77
77
  if key_names.size > 0
78
78
  api_client.find_keys_by_name(key_names).map { |key| key["name"] }
@@ -80,15 +80,15 @@ private
80
80
  []
81
81
  end
82
82
  end
83
-
83
+
84
84
  def key_name_is_in_cache?(key_name)
85
85
  cache.get(:translation_key_names).include?(key_name)
86
86
  end
87
-
87
+
88
88
  def covered_by_initial_caching?(key_name)
89
89
  key_name.start_with?(*Phrase.cache_key_segments_initial)
90
90
  end
91
-
91
+
92
92
  def extract_fallback_keys
93
93
  fallback_items = []
94
94
  if @options.has_key?(:default)
@@ -98,16 +98,16 @@ private
98
98
  fallback_items << @options[:default]
99
99
  end
100
100
  end
101
-
101
+
102
102
  fallback_items.each do |item|
103
103
  process_fallback_item(item)
104
104
  end
105
105
  end
106
-
106
+
107
107
  def scoped(item)
108
108
  @options.has_key?(:scope) ? "#{@options[:scope]}.#{item}" : item
109
109
  end
110
-
110
+
111
111
  def process_fallback_item(item)
112
112
  if item.kind_of?(Symbol)
113
113
  entry = scoped(item.to_s)
@@ -121,7 +121,7 @@ private
121
121
  end
122
122
  end
123
123
  end
124
-
124
+
125
125
  def translation_or_subkeys
126
126
  begin
127
127
  api_client.translate(@key)
@@ -129,33 +129,33 @@ private
129
129
  self.class.log "Server Error: #{e.message}"
130
130
  end
131
131
  end
132
-
132
+
133
133
  def api_client
134
134
  @api_client ||= Phrase::Api::Client.new(Phrase.auth_token)
135
135
  end
136
-
136
+
137
137
  def cache
138
138
  Thread.current[:phrase_cache] ||= build_cache
139
139
  end
140
-
140
+
141
141
  def build_cache
142
142
  cache = Phrase::Cache.new
143
143
  end
144
-
144
+
145
145
  def warm_translation_key_names_cache
146
146
  cache.set(:translation_key_names, prefetched_key_names)
147
147
  end
148
-
148
+
149
149
  def prefetched_key_names
150
150
  prefetched = Set.new
151
- Phrase.cache_key_segments_initial.each do |segment|
151
+ Phrase.cache_key_segments_initial.each do |segment|
152
152
  result = api_client.translate(segment)
153
153
  prefetched.add(segment) if result.is_a?(String)
154
154
  prefetched = prefetched.merge(key_names_from_nested(segment, result))
155
155
  end
156
156
  prefetched
157
157
  end
158
-
158
+
159
159
  def key_names_from_nested(segment, data)
160
160
  key_names = Set.new
161
161
  Phrase::HashFlattener.flatten(data, nil) do |key, value|
@@ -16,6 +16,7 @@ module Phrase
16
16
  autoload :Resx, 'phrase/formats/resx'
17
17
  autoload :ResxWindowsphone, 'phrase/formats/resx_windowsphone'
18
18
  autoload :SimpleJson, 'phrase/formats/simple_json'
19
+ autoload :NodeJson, 'phrase/formats/node_json'
19
20
  autoload :Strings, 'phrase/formats/strings'
20
21
  autoload :Xml, 'phrase/formats/xml'
21
22
  autoload :Tmx, 'phrase/formats/tmx'
@@ -23,7 +24,7 @@ module Phrase
23
24
  autoload :Yaml, 'phrase/formats/yaml'
24
25
  autoload :YamlSymfony, 'phrase/formats/yaml_symfony'
25
26
  autoload :PhpArray, 'phrase/formats/php_array'
26
-
27
+
27
28
  class Base
28
29
  def self.supports_extension?(extension)
29
30
  self.extensions.map(&:to_s).include?(extension.to_s)
@@ -36,19 +37,19 @@ module Phrase
36
37
  def self.directory_for_locale(locale)
37
38
  "./"
38
39
  end
39
-
40
+
40
41
  def self.filename_for_locale(locale)
41
42
  raise "not implemented"
42
43
  end
43
-
44
+
44
45
  def self.extract_locale_name_from_file_path(file_path)
45
46
  nil
46
47
  end
47
-
48
+
48
49
  def self.default_locale_name
49
50
  Phrase::Tool::Locale.find_default_locale.try(:name)
50
51
  end
51
-
52
+
52
53
  def self.locale_aware?
53
54
  false
54
55
  end
@@ -56,7 +57,7 @@ module Phrase
56
57
  def self.target_directory
57
58
  "phrase/locales/"
58
59
  end
59
-
60
+
60
61
  def self.config
61
62
  @config ||= get_config
62
63
  end
@@ -67,7 +68,7 @@ module Phrase
67
68
  end
68
69
  private_class_method :config
69
70
  end
70
-
71
+
71
72
  SUPPORTED_FORMATS = {
72
73
  custom: Phrase::Formats::Custom,
73
74
  json: Phrase::Formats::Json,
@@ -83,6 +84,7 @@ module Phrase
83
84
  resx: Phrase::Formats::Resx,
84
85
  resx_windowsphone: Phrase::Formats::ResxWindowsphone,
85
86
  simple_json: Phrase::Formats::SimpleJson,
87
+ node_json: Phrase::Formats::NodeJson,
86
88
  strings: Phrase::Formats::Strings,
87
89
  xml: Phrase::Formats::Xml,
88
90
  tmx: Phrase::Formats::Tmx,
@@ -109,34 +111,34 @@ module Phrase
109
111
  handler = handler_class_for_format(format_name)
110
112
  custom_handler.target_directory || handler.target_directory
111
113
  end
112
-
114
+
113
115
  def self.directory_for_locale_in_format(locale, format_name)
114
116
  handler = handler_class_for_format(format_name)
115
117
  custom_directory = custom_handler.directory_for_locale(locale, format_name)
116
118
  custom_directory || handler.directory_for_locale(locale)
117
119
  end
118
-
120
+
119
121
  def self.filename_for_locale_in_format(locale, format_name)
120
122
  handler = handler_class_for_format(format_name)
121
123
  custom_filename = custom_handler.filename_for_locale(locale, format_name)
122
124
  custom_filename || handler.filename_for_locale(locale)
123
125
  end
124
-
126
+
125
127
  def self.file_format_exposes_locale?(file_path)
126
128
  format = guess_possible_file_format_from_file_path(file_path)
127
129
  format.nil? ? false : handler_class_for_format(format).locale_aware?
128
130
  end
129
-
131
+
130
132
  def self.detect_locale_name_from_file_path(file_path)
131
133
  format = guess_possible_file_format_from_file_path(file_path)
132
134
  format.nil? ? nil : handler_class_for_format(format).extract_locale_name_from_file_path(file_path)
133
135
  end
134
-
136
+
135
137
  def self.handler_class_for_format(format_name)
136
138
  SUPPORTED_FORMATS.fetch(format_name.to_sym)
137
139
  end
138
140
  private_class_method :handler_class_for_format
139
-
141
+
140
142
  def self.guess_possible_file_format_from_file_path(file_path)
141
143
  extension = extension_from_file_path(file_path)
142
144
  possible_format = SUPPORTED_FORMATS.keys.find do |format|
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.csv"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -9,10 +9,10 @@ class Phrase::Formats::Custom < Phrase::Formats::Base
9
9
 
10
10
  def self.filename_for_locale(locale, format)
11
11
  setting = config.locale_filename
12
- return unless setting
12
+ return unless setting
13
13
  parse(setting, locale, format)
14
14
  end
15
-
15
+
16
16
  def self.target_directory
17
17
  config.target_directory
18
18
  end
@@ -14,7 +14,7 @@ module Phrase
14
14
  def self.target_directory
15
15
  "locales/"
16
16
  end
17
-
17
+
18
18
  def self.locale_aware?
19
19
  true
20
20
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.ini"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.json"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -0,0 +1,23 @@
1
+ # -*- encoding : utf-8 -*-
2
+
3
+ module Phrase
4
+ module Formats
5
+ class NodeJson < Phrase::Formats::Base
6
+ def self.filename_for_locale(locale)
7
+ "#{locale.name}.js"
8
+ end
9
+
10
+ def self.locale_aware?
11
+ false
12
+ end
13
+
14
+ def self.extensions
15
+ [:js]
16
+ end
17
+
18
+ def self.target_directory
19
+ 'locales/'
20
+ end
21
+ end
22
+ end
23
+ end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.php"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.plist"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  true
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.properties"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  true
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.xml"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.qph"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  true
12
12
  end
@@ -1,12 +1,12 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module Phrase
4
- module Formats
4
+ module Formats
5
5
  class QtTranslationSource < Phrase::Formats::Base
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.ts"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  true
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.resx"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end
@@ -6,7 +6,7 @@ module Phrase
6
6
  def self.filename_for_locale(locale)
7
7
  "phrase.#{locale.name}.resx"
8
8
  end
9
-
9
+
10
10
  def self.locale_aware?
11
11
  false
12
12
  end