phrase 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -16,5 +16,6 @@ test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
18
  .phrase
19
+ .rvmrc
19
20
  .DS_Store
20
21
  /phrase
@@ -75,11 +75,12 @@ class Phrase::Api::Client
75
75
  true
76
76
  end
77
77
 
78
- def download_translations_for_locale(name)
78
+ def download_translations_for_locale(name, format=Phrase::Tool::DEFAULT_DOWNLOAD_FORMAT)
79
79
  raise "You must specify a name" if name.nil? or name.blank?
80
+ raise "You must specify a format" if format.nil? or format.blank?
80
81
 
81
82
  begin
82
- content = perform_api_request("/translations/download", :get, {'locale' => name})
83
+ content = perform_api_request("/translations/download.#{format}", :get, {'locale' => name})
83
84
  return content
84
85
  rescue Phrase::Api::Exceptions::ServerError => e
85
86
  raise "Translations #{name} could not be downloaded"
data/lib/phrase/tool.rb CHANGED
@@ -9,6 +9,10 @@ class Phrase::Tool
9
9
  autoload :Options, 'phrase/tool/options'
10
10
  autoload :TagValidator, 'phrase/tool/tag_validator'
11
11
 
12
+ ALLOWED_FILE_TYPES = %w(yml pot po)
13
+ ALLOWED_DOWNLOAD_FORMATS = %w(yml po)
14
+ DEFAULT_DOWNLOAD_FORMAT = "yml"
15
+
12
16
  attr_accessor :config, :options
13
17
 
14
18
  def initialize(argv)
@@ -42,13 +46,13 @@ protected
42
46
  def init
43
47
  secret = @options.get(:secret)
44
48
  unless secret.present?
45
- $stderr.puts "Need a secret to init, but found none."
46
- $stderr.puts "Please provide the --secret=YOUR_SECRET parameter."
49
+ print_error "Need a secret to init, but found none."
50
+ print_error "Please provide the --secret=YOUR_SECRET parameter."
47
51
  exit(41)
48
52
  end
49
53
 
50
54
  @config.secret = secret
51
- puts "Wrote secret to config file .phrase"
55
+ print_message "Wrote secret to config file .phrase"
52
56
 
53
57
  default_locale_name = @options.get(:default_locale)
54
58
  create_locale(default_locale_name)
@@ -59,13 +63,13 @@ protected
59
63
  check_config_available
60
64
  tags = @options.get(:tags)
61
65
  unless tags.empty? or valid_tags_are_given?(tags)
62
- $stderr.puts "Invalid tags: Only letters, numbers, underscores and dashes are allowed"
66
+ print_error "Invalid tags: Only letters, numbers, underscores and dashes are allowed"
63
67
  exit(43)
64
68
  end
65
69
 
66
70
  files = choose_files_to_upload
67
71
  if files.empty?
68
- puts "Could not find any files to upload :("
72
+ print_message "Could not find any files to upload :("
69
73
  exit(43)
70
74
  end
71
75
 
@@ -85,9 +89,15 @@ protected
85
89
  locales = fetch_locales
86
90
  end
87
91
 
92
+ format = @options.get(:format) || DEFAULT_DOWNLOAD_FORMAT
93
+ unless ALLOWED_DOWNLOAD_FORMATS.include?(format)
94
+ print_error "Invalid format: #{format}"
95
+ exit(43)
96
+ end
97
+
88
98
  locales.each do |locale_name|
89
- print "Downloading phrase.#{locale_name}.yml..."
90
- fetch_translations_for_locale(locale_name)
99
+ print "Downloading phrase.#{locale_name}.#{format}..."
100
+ fetch_translations_for_locale(locale_name, format)
91
101
  end
92
102
  end
93
103
 
@@ -107,32 +117,34 @@ USAGE
107
117
  end
108
118
 
109
119
  def print_version
110
- puts "phrase version #{Phrase::VERSION}"
120
+ print_message "phrase version #{Phrase::VERSION}"
111
121
  end
112
122
 
113
123
  private
114
124
  def choose_files_to_upload
115
125
  file_name = args[1]
116
-
126
+ recursive = @options.get(:recursive)
127
+
117
128
  unless file_name
118
129
  if self.class.rails_default_locale_folder_is_available
119
130
  file_name = self.class.rails_default_locale_folder
120
- puts "No file or directory specified, using #{self.class.rails_default_locale_folder}"
131
+ print_message "No file or directory specified, using #{self.class.rails_default_locale_folder}"
121
132
  else
122
- $stderr.puts "Need either a file or directory:"
123
- $stderr.puts "phrase push FILE"
124
- $stderr.puts "phrase push DIRECTORY"
133
+ print_error "Need either a file or directory:"
134
+ print_error "phrase push FILE"
135
+ print_error "phrase push DIRECTORY"
125
136
  exit(46)
126
137
  end
127
138
  end
128
139
 
129
140
  unless File.exist?(file_name)
130
- $stderr.puts "The file #{file_name} could not be found."
141
+ print_error "The file #{file_name} could not be found."
131
142
  exit(42)
132
143
  end
133
144
 
134
145
  if File.directory?(file_name)
135
- files = Dir.glob("#{File.expand_path(file_name)}/**")
146
+ pattern = recursive ? "#{File.expand_path(file_name)}/**/*" : "#{File.expand_path(file_name)}/**"
147
+ files = Dir.glob(pattern)
136
148
  else
137
149
  files = [file_name]
138
150
  end
@@ -140,44 +152,48 @@ private
140
152
 
141
153
  def upload_files(files, tags=[])
142
154
  files.each do |file|
143
- proceed_with_upload = true
155
+ upload_file(file, tags)
156
+ end
157
+ end
158
+
159
+ def upload_file(file, tags=[])
160
+ valid = true
144
161
 
145
- if File.directory?(file)
146
- proceed_with_upload = false
147
- end
162
+ if File.directory?(file)
163
+ valid = false
164
+ end
148
165
 
149
- if is_yaml_file(file)
150
- proceed_with_upload = false
151
- $stderr.puts "Notice: Could not upload #{file} (extension not supported)"
152
- end
166
+ unless file_valid?(file)
167
+ valid = false
168
+ print_error "Notice: Could not upload #{file} (type not supported)"
169
+ end
153
170
 
154
- if proceed_with_upload
155
- begin
156
- tagged = " (tagged: #{tags.join(", ")})" if tags.size > 0
157
- puts "Uploading #{file}#{tagged}..."
158
- api_client.upload(file, File.read(file), tags)
159
- puts "OK"
160
- rescue Exception => e
161
- puts "Failed"
162
- print_server_error(e.message, file)
163
- end
171
+ if valid
172
+ begin
173
+ tagged = " (tagged: #{tags.join(", ")})" if tags.size > 0
174
+ print_message "Uploading #{file}#{tagged}..."
175
+ api_client.upload(file, File.read(file), tags)
176
+ print_message "OK"
177
+ rescue Exception => e
178
+ print_message "Failed"
179
+ print_server_error(e.message, file)
164
180
  end
165
181
  end
166
182
  end
167
183
 
168
- def fetch_translations_for_locale(name)
184
+ def fetch_translations_for_locale(name, format=DEFAULT_DOWNLOAD_FORMAT)
169
185
  begin
170
- content = api_client.download_translations_for_locale(name)
171
- puts "OK"
172
- store_translations_file(name, content)
186
+ content = api_client.download_translations_for_locale(name, format)
187
+ print_message "OK"
188
+ store_translations_file(name, content, format)
173
189
  rescue Exception => e
174
- puts "Failed"
190
+ print_error "Failed"
175
191
  print_server_error(e.message)
176
192
  end
177
193
  end
178
194
 
179
- def store_translations_file(name, content)
180
- File.open("phrase/locales/phrase.#{name}.yml", "w") do |file|
195
+ def store_translations_file(name, content, format=DEFAULT_DOWNLOAD_FORMAT)
196
+ File.open("phrase/locales/phrase.#{name}.#{format}", "w") do |file|
181
197
  file.write(content)
182
198
  end
183
199
  end
@@ -185,10 +201,10 @@ private
185
201
  def fetch_locales
186
202
  begin
187
203
  locales = api_client.fetch_locales
188
- puts "Fetched all locales"
204
+ print_message "Fetched all locales"
189
205
  return locales
190
206
  rescue Exception => e
191
- puts "Failed"
207
+ print_message "Failed"
192
208
  print_server_error(e.message)
193
209
  exit(47)
194
210
  end
@@ -197,18 +213,18 @@ private
197
213
  def create_locale(name)
198
214
  begin
199
215
  api_client.create_locale(name)
200
- puts "Created locale \"#{name}\""
216
+ print_message "Created locale \"#{name}\""
201
217
  rescue Exception => e
202
- puts "Notice: Locale \"#{name}\" could not be created (maybe it already exists)"
218
+ print_message "Notice: Locale \"#{name}\" could not be created (maybe it already exists)"
203
219
  end
204
220
  end
205
221
 
206
222
  def make_locale_default(name)
207
223
  begin
208
224
  api_client.make_locale_default(name)
209
- puts "Locale \"#{name}\" is now the default locale"
225
+ print_message "Locale \"#{name}\" is now the default locale"
210
226
  rescue Exception => e
211
- puts "Notice: Locale \"#{name}\" could not be made the default locale"
227
+ print_message "Notice: Locale \"#{name}\" could not be made the default locale"
212
228
  print_server_error(e.message)
213
229
  end
214
230
  end
@@ -218,15 +234,24 @@ private
218
234
  end
219
235
 
220
236
  def print_server_error(message, filename=nil)
221
- $stderr.puts "#{message} (#{filename})"
237
+ print_error "#{message} (#{filename})"
238
+ end
239
+
240
+ def print_message(message)
241
+ puts message
242
+ end
243
+
244
+ def print_error(message)
245
+ $stderr.puts message
222
246
  end
223
247
 
224
248
  def args
225
249
  @args
226
250
  end
227
251
 
228
- def is_yaml_file(filepath)
229
- !File.directory?(filepath) && filepath.split('.').last != 'yml'
252
+ def file_valid?(filepath)
253
+ extension = filepath.split('.').last
254
+ ALLOWED_FILE_TYPES.include?(extension)
230
255
  end
231
256
 
232
257
  def create_locales_folder!
@@ -235,7 +260,7 @@ private
235
260
 
236
261
  def check_config_available
237
262
  if !@config.secret || @config.secret.empty?
238
- $stderr.puts "No config present. You need to initialize phrase first."
263
+ print_error "No config present. You need to initialize phrase first."
239
264
  exit(43)
240
265
  end
241
266
  end
@@ -16,9 +16,11 @@ class Phrase::Tool::Options
16
16
  default_locale: "en"
17
17
  },
18
18
  push: {
19
- tags: []
19
+ tags: [],
20
+ recursive: false
20
21
  },
21
22
  pull: {
23
+ format: "yml"
22
24
  }
23
25
  }
24
26
  options.parse!(args)
@@ -49,6 +51,16 @@ private
49
51
  opts.on("--tags=foo,bar", Array, "List of tags for phrase push (separated by comma)") do |tags|
50
52
  @data[command_name][:tags] = tags
51
53
  end
54
+
55
+ opts.on("-R", "--recursive", "Push files in subfolders as well (recursively)") do |recursive|
56
+ @data[command_name][:recursive] = true
57
+ end
58
+ end
59
+ when :pull
60
+ OptionParser.new do |opts|
61
+ opts.on("--format=yml", String, "Allowed formats: #{Phrase::Tool::ALLOWED_DOWNLOAD_FORMATS.join(", ")}") do |format|
62
+ @data[command_name][:format] = format
63
+ end
52
64
  end
53
65
  else
54
66
  OptionParser.new do |opts|
@@ -1,3 +1,3 @@
1
1
  module Phrase
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
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.2.2
4
+ version: 0.2.3
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-08-09 00:00:00.000000000 Z
12
+ date: 2012-08-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &70280207261720 !ruby/object:Gem::Requirement
16
+ requirement: &70265216292960 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70280207261720
24
+ version_requirements: *70265216292960
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: addressable
27
- requirement: &70280207277380 !ruby/object:Gem::Requirement
27
+ requirement: &70265216292500 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 2.2.8
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70280207277380
35
+ version_requirements: *70265216292500
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: json
38
- requirement: &70280207276840 !ruby/object:Gem::Requirement
38
+ requirement: &70265216292120 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70280207276840
46
+ version_requirements: *70265216292120
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &70280207276380 !ruby/object:Gem::Requirement
49
+ requirement: &70265216291660 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *70280207276380
57
+ version_requirements: *70265216291660
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: i18n
60
- requirement: &70280207275960 !ruby/object:Gem::Requirement
60
+ requirement: &70265216291240 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *70280207275960
68
+ version_requirements: *70265216291240
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: webmock
71
- requirement: &70280207275520 !ruby/object:Gem::Requirement
71
+ requirement: &70265216290820 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *70280207275520
79
+ version_requirements: *70265216290820
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: vcr
82
- requirement: &70280207275080 !ruby/object:Gem::Requirement
82
+ requirement: &70265216290400 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,7 +87,7 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70280207275080
90
+ version_requirements: *70265216290400
91
91
  description: phrase allows you to edit translations in-place on the page itself. More
92
92
  information at phraseapp.com
93
93
  email: