phrase 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +4 -1
  2. data/Guardfile +29 -0
  3. data/README.md +1 -1
  4. data/lib/phrase.rb +8 -9
  5. data/lib/phrase/adapters/fast_gettext.rb +22 -0
  6. data/lib/phrase/adapters/i18n.rb +11 -0
  7. data/lib/phrase/api/client.rb +1 -1
  8. data/lib/phrase/backend/phrase_service.rb +2 -2
  9. data/lib/phrase/delegate.rb +13 -165
  10. data/lib/phrase/delegate/fast_gettext.rb +27 -0
  11. data/lib/phrase/delegate/i18n.rb +159 -0
  12. data/lib/phrase/tool.rb +1 -1
  13. data/lib/phrase/tool/commands/base.rb +1 -1
  14. data/lib/phrase/tool/commands/init.rb +13 -5
  15. data/lib/phrase/tool/commands/pull.rb +11 -8
  16. data/lib/phrase/tool/commands/push.rb +11 -2
  17. data/lib/phrase/tool/config.rb +55 -1
  18. data/lib/phrase/tool/encoding_detector.rb +4 -2
  19. data/lib/phrase/tool/formats.rb +33 -4
  20. data/lib/phrase/tool/formats/base.rb +23 -1
  21. data/lib/phrase/tool/formats/custom.rb +38 -0
  22. data/lib/phrase/tool/formats/gettext.rb +14 -2
  23. data/lib/phrase/tool/formats/gettext_pot.rb +11 -0
  24. data/lib/phrase/tool/formats/ini.rb +4 -0
  25. data/lib/phrase/tool/formats/json.rb +4 -0
  26. data/lib/phrase/tool/formats/plist.rb +5 -1
  27. data/lib/phrase/tool/formats/properties.rb +4 -0
  28. data/lib/phrase/tool/formats/qt_phrase_book.rb +4 -0
  29. data/lib/phrase/tool/formats/qt_translation_source.rb +4 -0
  30. data/lib/phrase/tool/formats/resx.rb +4 -0
  31. data/lib/phrase/tool/formats/strings.rb +9 -1
  32. data/lib/phrase/tool/formats/xliff.rb +4 -0
  33. data/lib/phrase/tool/formats/xml.rb +7 -4
  34. data/lib/phrase/tool/formats/yaml.rb +4 -0
  35. data/lib/phrase/tool/options.rb +13 -52
  36. data/lib/phrase/tool/options_factory.rb +77 -0
  37. data/lib/phrase/version.rb +1 -1
  38. metadata +74 -21
@@ -4,4 +4,8 @@ class Phrase::Tool::Formats::QtPhraseBook < Phrase::Tool::Formats::Base
4
4
  def self.filename_for_locale(locale)
5
5
  "phrase.#{locale.name}.qph"
6
6
  end
7
+
8
+ def self.locale_aware?
9
+ true
10
+ end
7
11
  end
@@ -4,4 +4,8 @@ class Phrase::Tool::Formats::QtTranslationSource < Phrase::Tool::Formats::Base
4
4
  def self.filename_for_locale(locale)
5
5
  "phrase.#{locale.name}.ts"
6
6
  end
7
+
8
+ def self.locale_aware?
9
+ true
10
+ end
7
11
  end
@@ -4,4 +4,8 @@ class Phrase::Tool::Formats::Resx < Phrase::Tool::Formats::Base
4
4
  def self.filename_for_locale(locale)
5
5
  "phrase.#{locale.name}.resx"
6
6
  end
7
+
8
+ def self.locale_aware?
9
+ true
10
+ end
7
11
  end
@@ -10,14 +10,22 @@ class Phrase::Tool::Formats::Strings < Phrase::Tool::Formats::Base
10
10
  "Localizable.strings"
11
11
  end
12
12
 
13
+ def self.target_directory
14
+ "./"
15
+ end
16
+
13
17
  def self.extract_locale_name_from_file_path(file_path)
14
18
  file_path.scan(/\/([a-zA-Z\-_]*).lproj\//i).first.try(:first)
15
19
  end
16
20
 
21
+ def self.locale_aware?
22
+ true
23
+ end
24
+
17
25
  def self.formatted(name)
18
26
  return name unless name.include?("-")
19
27
  parts = name.split("-")
20
28
  "#{parts.first}_#{parts.last.upcase}"
21
29
  end
22
30
  private_class_method :formatted
23
- end
31
+ end
@@ -4,4 +4,8 @@ class Phrase::Tool::Formats::Xliff < Phrase::Tool::Formats::Base
4
4
  def self.filename_for_locale(locale)
5
5
  "phrase.#{locale.name}.xlf"
6
6
  end
7
+
8
+ def self.locale_aware?
9
+ true
10
+ end
7
11
  end
@@ -13,6 +13,10 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
13
13
  def self.filename_for_locale(locale)
14
14
  "strings.xml"
15
15
  end
16
+
17
+ def self.target_directory
18
+ "res/"
19
+ end
16
20
 
17
21
  def self.extract_locale_name_from_file_path(file_path)
18
22
  return default_locale_name if file_path.scan(/\/values\/strings.xml/i).first
@@ -24,10 +28,9 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
24
28
  end
25
29
  end
26
30
 
27
- def self.default_locale_name
28
- Phrase::Tool::Locale.find_default_locale.try(:name)
31
+ def self.locale_aware?
32
+ true
29
33
  end
30
- private_class_method :default_locale_name
31
34
 
32
35
  def self.formatted(name)
33
36
  return name unless name.include?("-")
@@ -35,4 +38,4 @@ class Phrase::Tool::Formats::Xml < Phrase::Tool::Formats::Base
35
38
  "#{parts.first}-r#{parts.last.upcase}"
36
39
  end
37
40
  private_class_method :formatted
38
- end
41
+ end
@@ -4,4 +4,8 @@ class Phrase::Tool::Formats::Yaml < Phrase::Tool::Formats::Base
4
4
  def self.filename_for_locale(locale)
5
5
  "phrase.#{locale.name}.yml"
6
6
  end
7
+
8
+ def self.locale_aware?
9
+ true
10
+ end
7
11
  end
@@ -1,11 +1,11 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
- require 'optparse'
3
+ require File.expand_path('../options_factory', __FILE__)
4
4
 
5
5
  class Phrase::Tool::Options
6
-
7
6
  def initialize(args, command="")
8
7
  @command = command
8
+ # specify all possible arguments here
9
9
  @data = {
10
10
  default: {
11
11
  version: false,
@@ -13,7 +13,13 @@ class Phrase::Tool::Options
13
13
  },
14
14
  init: {
15
15
  secret: "",
16
- default_locale: "en"
16
+ default_locale: "en",
17
+ domain: "phrase",
18
+ default_target: nil,
19
+ format: nil,
20
+ locale_filename: nil,
21
+ locale_directory: nil,
22
+ target_directory: nil
17
23
  },
18
24
  push: {
19
25
  tags: [],
@@ -21,8 +27,8 @@ class Phrase::Tool::Options
21
27
  locale: nil
22
28
  },
23
29
  pull: {
24
- format: "yml",
25
- target: "./phrase/locales/"
30
+ format: nil,
31
+ target: nil
26
32
  }
27
33
  }
28
34
  options.parse!(args)
@@ -37,55 +43,10 @@ class Phrase::Tool::Options
37
43
  private
38
44
 
39
45
  def options
40
- case command_name
41
- when :init
42
- OptionParser.new do |opts|
43
- opts.on("--secret=YOUR_AUTH_TOKEN", String, "Your auth token") do |secret|
44
- @data[command_name][:secret] = secret
45
- end
46
-
47
- opts.on("--default-locale=en", String, "The default locale for your application") do |default_locale|
48
- @data[command_name][:default_locale] = default_locale
49
- end
50
- end
51
- when :push
52
- OptionParser.new do |opts|
53
- opts.on("--tags=foo,bar", Array, "List of tags for phrase push (separated by comma)") do |tags|
54
- @data[command_name][:tags] = tags
55
- end
56
-
57
- opts.on("-R", "--recursive", "Push files in subfolders as well (recursively)") do |recursive|
58
- @data[command_name][:recursive] = true
59
- end
60
-
61
- opts.on("--locale=en", String, "Locale of the translations your file contain (required for formats that do not include the name of the locale in the file content)") do |locale|
62
- @data[command_name][:locale] = locale
63
- end
64
- end
65
- when :pull
66
- OptionParser.new do |opts|
67
- opts.on("--format=yml", String, "See documentation for list of allowed locales") do |format|
68
- @data[command_name][:format] = format
69
- end
70
-
71
- opts.on("--target=./phrase/locales", String, "Target folder to store locale files") do |target|
72
- @data[command_name][:target] = target
73
- end
74
- end
75
- else
76
- OptionParser.new do |opts|
77
- opts.on_tail("-v", "--version", "Show version number") do |version|
78
- @data[:default][:version] = true
79
- end
80
-
81
- opts.on_tail("-h", "--help", "Show help") do |help|
82
- @data[:default][:help] = true
83
- end
84
- end
85
- end
46
+ OptionsFactory.options_for(command_name, @data)
86
47
  end
87
48
 
88
49
  def command_name
89
50
  @command_name ||= (@command.present? and @data.has_key?(@command.to_sym)) ? @command.to_sym : :default
90
51
  end
91
- end
52
+ end
@@ -0,0 +1,77 @@
1
+ require 'optparse'
2
+
3
+ class OptionsFactory
4
+ def self.options_for(command, options)
5
+ OptionParser.new do |opts|
6
+ self.send(command, opts, options[command])
7
+ end
8
+ end
9
+
10
+ def self.init(opts, set)
11
+ opts.on("--secret=YOUR_AUTH_TOKEN", String, "Your auth token") do |secret|
12
+ set[:secret] = secret
13
+ end
14
+
15
+ opts.on("--default-locale=en", String, "The default locale for your application") do |default_locale|
16
+ set[:default_locale] = default_locale
17
+ end
18
+
19
+ opts.on("--default-format=json", String, "The default format for locale files") do |format|
20
+ set[:format] = format
21
+ end
22
+
23
+ opts.on("--domain=phrase", String, "The default domain or app prefix for locale files") do |domain|
24
+ set[:domain] = domain
25
+ end
26
+
27
+ opts.on("--locale-directory=./", String, "The directory naming for locale files, e.g ./<locale.name>/ for subfolders with 'en' or 'de'") do |locale_directory|
28
+ set[:locale_directory] = locale_directory
29
+ end
30
+
31
+ opts.on("--locale-filename=<domain>.<format>", String, "The filename for locale files") do |locale_filename|
32
+ set[:locale_filename] = locale_filename
33
+ end
34
+
35
+ opts.on("--default-target=phrase/locales/", String, "The default target directory for locale files") do |target_directory|
36
+ set[:target_directory] = target_directory
37
+ end
38
+ end
39
+ private_class_method :init
40
+
41
+ def self.push(opts, set)
42
+ opts.on("--tags=foo,bar", Array, "List of tags for phrase push (separated by comma)") do |tags|
43
+ set[:tags] = tags
44
+ end
45
+
46
+ opts.on("-R", "--recursive", "Push files in subfolders as well (recursively)") do |recursive|
47
+ set[:recursive] = true
48
+ end
49
+
50
+ opts.on("--locale=en", String, "Locale of the translations your file contain (required for formats that do not include the name of the locale in the file content)") do |locale|
51
+ set[:locale] = locale
52
+ end
53
+ end
54
+ private_class_method :push
55
+
56
+ def self.pull(opts, set)
57
+ opts.on("--format=yml", String, "See documentation for list of allowed locales") do |format|
58
+ set[:format] = format
59
+ end
60
+
61
+ opts.on("--target=./phrase/locales", String, "Target folder to store locale files") do |target|
62
+ set[:target] = target
63
+ end
64
+ end
65
+ private_class_method :pull
66
+
67
+ def self.default(opts, set)
68
+ opts.on_tail("-v", "--version", "Show version number") do |version|
69
+ set[:version] = true
70
+ end
71
+
72
+ opts.on_tail("-h", "--help", "Show help") do |help|
73
+ set[:help] = true
74
+ end
75
+ end
76
+ private_class_method :default
77
+ end
@@ -1,3 +1,3 @@
1
1
  module Phrase
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: phrase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-29 00:00:00.000000000 Z
12
+ date: 2012-12-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70346162428660 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70346162428660
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: addressable
27
- requirement: &70346162428200 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ~>
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 2.2.8
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *70346162428200
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.2.8
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: colorize
38
- requirement: &70346162427820 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *70346162427820
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: json
49
- requirement: &70346162427360 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: '0'
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *70346162427360
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: rspec
60
- requirement: &70346162426940 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,10 +85,15 @@ dependencies:
65
85
  version: '0'
66
86
  type: :development
67
87
  prerelease: false
68
- version_requirements: *70346162426940
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
69
94
  - !ruby/object:Gem::Dependency
70
95
  name: i18n
71
- requirement: &70346162426520 !ruby/object:Gem::Requirement
96
+ requirement: !ruby/object:Gem::Requirement
72
97
  none: false
73
98
  requirements:
74
99
  - - ! '>='
@@ -76,10 +101,15 @@ dependencies:
76
101
  version: '0'
77
102
  type: :development
78
103
  prerelease: false
79
- version_requirements: *70346162426520
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
80
110
  - !ruby/object:Gem::Dependency
81
111
  name: webmock
82
- requirement: &70346162426100 !ruby/object:Gem::Requirement
112
+ requirement: !ruby/object:Gem::Requirement
83
113
  none: false
84
114
  requirements:
85
115
  - - ! '>='
@@ -87,10 +117,15 @@ dependencies:
87
117
  version: '0'
88
118
  type: :development
89
119
  prerelease: false
90
- version_requirements: *70346162426100
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
91
126
  - !ruby/object:Gem::Dependency
92
127
  name: vcr
93
- requirement: &70346162425680 !ruby/object:Gem::Requirement
128
+ requirement: !ruby/object:Gem::Requirement
94
129
  none: false
95
130
  requirements:
96
131
  - - ! '>='
@@ -98,10 +133,15 @@ dependencies:
98
133
  version: '0'
99
134
  type: :development
100
135
  prerelease: false
101
- version_requirements: *70346162425680
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
102
142
  - !ruby/object:Gem::Dependency
103
143
  name: timecop
104
- requirement: &70346162425260 !ruby/object:Gem::Requirement
144
+ requirement: !ruby/object:Gem::Requirement
105
145
  none: false
106
146
  requirements:
107
147
  - - ! '>='
@@ -109,7 +149,12 @@ dependencies:
109
149
  version: '0'
110
150
  type: :development
111
151
  prerelease: false
112
- version_requirements: *70346162425260
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
113
158
  description: phrase allows you to edit translations in-place on the page itself. More
114
159
  information at phraseapp.com
115
160
  email:
@@ -122,12 +167,15 @@ files:
122
167
  - .gitignore
123
168
  - Gemfile
124
169
  - Gemfile.lock
170
+ - Guardfile
125
171
  - LICENSE
126
172
  - README.md
127
173
  - Rakefile
128
174
  - bin/phrase
129
175
  - cacert.pem
130
176
  - lib/phrase.rb
177
+ - lib/phrase/adapters/fast_gettext.rb
178
+ - lib/phrase/adapters/i18n.rb
131
179
  - lib/phrase/api.rb
132
180
  - lib/phrase/api/client.rb
133
181
  - lib/phrase/api/config.rb
@@ -138,6 +186,8 @@ files:
138
186
  - lib/phrase/cache.rb
139
187
  - lib/phrase/config.rb
140
188
  - lib/phrase/delegate.rb
189
+ - lib/phrase/delegate/fast_gettext.rb
190
+ - lib/phrase/delegate/i18n.rb
141
191
  - lib/phrase/engine.rb
142
192
  - lib/phrase/hash_flattener.rb
143
193
  - lib/phrase/tool.rb
@@ -152,7 +202,9 @@ files:
152
202
  - lib/phrase/tool/encoding_detector.rb
153
203
  - lib/phrase/tool/formats.rb
154
204
  - lib/phrase/tool/formats/base.rb
205
+ - lib/phrase/tool/formats/custom.rb
155
206
  - lib/phrase/tool/formats/gettext.rb
207
+ - lib/phrase/tool/formats/gettext_pot.rb
156
208
  - lib/phrase/tool/formats/ini.rb
157
209
  - lib/phrase/tool/formats/json.rb
158
210
  - lib/phrase/tool/formats/plist.rb
@@ -166,6 +218,7 @@ files:
166
218
  - lib/phrase/tool/formats/yaml.rb
167
219
  - lib/phrase/tool/locale.rb
168
220
  - lib/phrase/tool/options.rb
221
+ - lib/phrase/tool/options_factory.rb
169
222
  - lib/phrase/tool/tag_validator.rb
170
223
  - lib/phrase/version.rb
171
224
  - lib/phrase/view_helpers.rb
@@ -190,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
243
  version: 1.3.6
191
244
  requirements: []
192
245
  rubyforge_project: phrase
193
- rubygems_version: 1.8.10
246
+ rubygems_version: 1.8.24
194
247
  signing_key:
195
248
  specification_version: 3
196
249
  summary: The best way to manage i18n.