crowdin-cli 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5ec73f4c28abfe7a1ef6f57b3e4d555c9bade3e0
4
- data.tar.gz: 18cbf8100e6d2c8acc39f6246257c599f5947111
3
+ metadata.gz: 0a2b8da800c4eb8b7ac83fae71c4f5a367e2957f
4
+ data.tar.gz: f20547149f0303af7281561df18d4553ee588999
5
5
  SHA512:
6
- metadata.gz: b8f62d0b51d1a2010545ffe5c98908c384a0c1b02150e7d5832f3fbd3719d2d7a4130cc1ccbed96e613c4964ad5cc2accda8217168b3458fc1c8f4bb66b3e8e6
7
- data.tar.gz: 9ac87f661fc3a37617edf2c5520721cd0d7fee29b5c970e6d3ad938f91108b83c30414389940807a2391e2b01bb3c0db942b98ccb51c44155686c4a14911a7b6
6
+ metadata.gz: 65f49b368609972c0f7fd26f92b96fa194ea105eb681fb766f2232f40e178a9e2b190ddbbfa40c121881d58e13c76a6ca52b682665f2396b803a6aafcd50273f
7
+ data.tar.gz: e2ddd67bca8e0786add4e9f23f98bf81299b8dab6cb8bf3cea7e04300c647ff0cb8fcb5bb1cc7c8a4ac0cc849c05fdcc3d11415499696404c16738377df55351
data/README.md CHANGED
@@ -87,13 +87,13 @@ Here's patterns you can use:
87
87
 
88
88
  * `*` (asterisk)
89
89
 
90
- This wildcard represents any character in file or directory name. If you specified a `*.json` it will include all files like `messages.json`, `about_us.json` and anything that ends with `.json`.
90
+ Match zero or more characters in file name. A glob consisting of only the asterisk and no other characters will match all files in the directory. If you specified a `*.json` it will include all files like `messages.json`, `about_us.json` and anything that ends with `.json`.
91
91
 
92
92
  * `**` (doubled asterisk)
93
93
 
94
- Matches any string recursively (including sub-directories). Note that you can use `**` in `source` and in `translation` pattern. When using `**` in `translation` pattern it will always contain sub-path from `source` for certain file.
94
+ Match all directories recursively. Note that you can use `**` in `source` and in `translation` pattern. When using `**` in `translation` pattern it will always contain sub-path from `source` for certain file. The mask `**` can be used only once in the pattern and must be surrounded by backslashes `/`.
95
95
 
96
- Say, you can have source: `/en/**/*.po` to upload all `*.po` files to Crowdin recursively. `translation` pattern will be `/%two_letters_code%/**/%original_file_name%'`.
96
+ Say, you can have source: `/en/**/*.po` to upload all `*.po` files to Crowdin recursively. `translation` pattern will be `/translations/%two_letters_code%/**/%original_file_name%'`.
97
97
 
98
98
  See sample configuration below::
99
99
  ```
data/bin/crowdin-cli CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'pp'
3
4
  require 'crowdin-cli'
4
5
 
5
6
  # GLI_DEBUG=true bundle exec bin/crowdin-cli
@@ -80,6 +81,49 @@ def export_pattern_to_path(path, export_pattern, lang, languages_mapping = nil)
80
81
  export_pattern.gsub(/%(#{placeholders.join('|')})%/, pattern)
81
82
  end
82
83
 
84
+ # @param [String] path relative path to file in Crowdin project
85
+ # @param [String] source basically, is a file['source'] from crowdin.yaml
86
+ # @param [String] translation basically, is a file['translation'] from crowdin.yaml
87
+ #
88
+ def construct_export_pattern(path, source, translation)
89
+ pattern_regexp = translate_pattern_to_regexp(source)
90
+ if path.match(pattern_regexp)
91
+ double_asterisk = path.match(pattern_regexp)['double_asterisk']
92
+ translation = translation.sub('**', double_asterisk)
93
+ end
94
+
95
+ export_pattern = translation.split('/').reject(&:empty?).join('/').insert(0, '/')
96
+
97
+ return export_pattern
98
+ end
99
+
100
+ # Translate a glob pattern to a regular expression
101
+ #
102
+ def translate_pattern_to_regexp(pat)
103
+ i = 0
104
+ n = pat.size
105
+ res = ''
106
+ while i < n
107
+ c = pat[i]
108
+ i = i + 1
109
+ if c == '*'
110
+ j = i
111
+ if j < n and pat[j] == '*'
112
+ res << '(?<double_asterisk>.*)'
113
+ i = j + 1
114
+ else
115
+ res << '(.*)'
116
+ end
117
+ elsif c == '?'
118
+ res << '.'
119
+ else
120
+ res << Regexp.escape(c)
121
+ end
122
+ end
123
+
124
+ return Regexp.new(res)
125
+ end
126
+
83
127
  def android_locale_code(locale_code)
84
128
  locale_code = case locale_code
85
129
  when 'he-IL' then 'iw-IL'
@@ -155,7 +199,7 @@ include GLI::App
155
199
  version Crowdin::CLI::VERSION
156
200
 
157
201
  program_desc 'is a command line tool that allows you to manage and synchronize your localization resources with Crowdin project'
158
- program_long_desc 'This tool requires configuration file to be created. See http://crowdin.net/page/cli-client for more details.'
202
+ program_long_desc 'This tool requires configuration file to be created. See http://crowdin.net/page/cli-tool#configuration-file for more details.'
159
203
  sort_help :manually # help commands are ordered in the order declared
160
204
  wrap_help_text :to_terminal
161
205
 
@@ -199,7 +243,7 @@ EOS
199
243
 
200
244
  @config['files'].each do |file|
201
245
  get_invalid_placeholders(file['translation']).each do |placeholder|
202
- puts "Warning: #{placeholder} is not valid variable supported by Crowdin. See http://crowdin.net/page/cli-client#configuration-file for more details."
246
+ puts "Warning: #{placeholder} is not valid variable supported by Crowdin. See http://crowdin.net/page/cli-tool#configuration-file for more details."
203
247
  end
204
248
 
205
249
  if File.exist?("#{@base_path}#{file['source']}")
@@ -216,10 +260,7 @@ EOS
216
260
  dest = source.sub("#{@base_path}", '') # relative path in Crowdin
217
261
  dest_files << dest
218
262
 
219
- file_pattern = export_pattern_to_path(dest, file['translation'], source_language)
220
-
221
- diff = (dest.split('/') - file_pattern.split('/')).join('/')
222
- export_pattern = file['translation'].sub('**', diff)
263
+ export_pattern = construct_export_pattern(dest, file['source'], file['translation'])
223
264
 
224
265
  local_file = { dest: dest, source: source, export_pattern: export_pattern }
225
266
  local_file.merge!({ sheme: file['scheme'] }) if file.has_key?('scheme')
@@ -231,7 +272,7 @@ EOS
231
272
  end # @config['files']
232
273
 
233
274
  if dest_files.empty?
234
- exit_now!("nothing to upload. See http://crowdin.net/page/cli-client#configuration-file for more details.")
275
+ exit_now!("nothing to upload. See http://crowdin.net/page/cli-tool#configuration-file for more details.")
235
276
  end
236
277
 
237
278
  common_dir = find_common_directory_path(dest_files)
@@ -313,7 +354,6 @@ EOS
313
354
  c.desc 'Automatically approve uploaded translations'
314
355
  c.switch ['auto-approve-imported']
315
356
 
316
-
317
357
  c.action do |global_options, options, args|
318
358
  params = {}
319
359
  params[:import_duplicates] = options['import-dublicates'] ? 1 : 0
@@ -343,7 +383,7 @@ EOS
343
383
 
344
384
  @config['files'].each do |file|
345
385
  get_invalid_placeholders(file['translation']).each do |placeholder|
346
- puts "Warning: #{placeholder} is not valid variable supported by Crowdin. See http://crowdin.net/page/cli-client#configuration-file for more details."
386
+ puts "Warning: #{placeholder} is not valid variable supported by Crowdin. See http://crowdin.net/page/cli-tool#configuration-file for more details."
347
387
  end
348
388
 
349
389
  languages_mapping = file['languages_mapping']
@@ -361,10 +401,7 @@ EOS
361
401
  dest = source.sub("#{@base_path}", '') # relative path in Crowdin
362
402
  dest_files << dest
363
403
 
364
- file_pattern = export_pattern_to_path(dest, file['translation'], source_language)
365
-
366
- diff = (dest.split('/') - file_pattern.split('/')).join('/')
367
- export_pattern = file['translation'].sub('**', diff) # !!!
404
+ export_pattern = construct_export_pattern(dest, file['source'], file['translation'])
368
405
 
369
406
  translation_languages.each do |lang|
370
407
  source = export_pattern_to_path(dest, export_pattern, lang, languages_mapping)
@@ -376,7 +413,7 @@ EOS
376
413
  end # @config['files']
377
414
 
378
415
  if dest_files.empty?
379
- exit_now!("Warning: nothing to upload. See http://crowdin.net/page/cli-client#configuration-file for more details.")
416
+ exit_now!("Warning: nothing to upload. See http://crowdin.net/page/cli-tool#configuration-file for more details.")
380
417
  end
381
418
 
382
419
  common_dir = find_common_directory_path(dest_files)
@@ -462,11 +499,8 @@ command :download do |c|
462
499
  Dir.glob("#{@base_path}#{file['source']}").each do |source|
463
500
  dest = source.sub("#{@base_path}", '') # relative path in Crowdin
464
501
 
465
- file_pattern = export_pattern_to_path(dest, file['translation'], source_language)
466
-
467
- diff = (dest.split('/') - file_pattern.split('/')).join('/')
468
- export_pattern = file['translation'].sub('**', diff)
469
-
502
+ export_pattern = construct_export_pattern(dest, file['source'], file['translation'])
503
+
470
504
  translation_languages.each do |lang|
471
505
  zipped_file = export_pattern_to_path(dest, export_pattern, lang)
472
506
  local_file = export_pattern_to_path(dest, export_pattern, lang, languages_mapping)
@@ -507,7 +541,7 @@ pre do |global ,command, options, args|
507
541
  exit_now! <<EOS
508
542
  Configuration file misses required option `#{key}`
509
543
 
510
- See http://crowdin.net/page/cli-client#configuration-file for more details
544
+ See http://crowdin.net/page/cli-tool#configuration-file for more details
511
545
  EOS
512
546
  end
513
547
  end
@@ -516,7 +550,7 @@ EOS
516
550
  exit_now! <<EOS
517
551
  Configuration file misses required section `files`
518
552
 
519
- See http://crowdin.net/page/cli-client#configuration-file for more details
553
+ See http://crowdin.net/page/cli-tool#configuration-file for more details
520
554
  EOS
521
555
  end
522
556
 
@@ -532,6 +566,17 @@ EOS
532
566
  @config['files'].each do |file|
533
567
  file['source'] = '/' + file['source'] unless file['source'].start_with?('/')
534
568
  file['translation'] = '/' + file['translation'] unless file['translation'].start_with?('/')
569
+
570
+ if file['source'].scan('**').size > 1
571
+ exit_now! <<EOS
572
+ Pattern `#{file['source']}` is not valid. The mask `**` can be used only once in the source pattern.
573
+ EOS
574
+ elsif file['source'].scan('**').size == 1 and !file['source'].match(/\/\*\*\//)
575
+ exit_now! <<EOS
576
+ Pattern `#{file['source']}` is not valid. The mask `**` must be surrounded by backslashes `/` in the source pattern.
577
+ EOS
578
+ end
579
+
535
580
  end
536
581
 
537
582
  if @config['base_path']
@@ -1,5 +1,5 @@
1
1
  module Crowdin
2
2
  module CLI
3
- VERSION = '0.1.3'
3
+ VERSION = '0.1.4'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crowdin-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Crowdin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-01 00:00:00.000000000 Z
11
+ date: 2013-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - '>='
88
88
  - !ruby/object:Gem::Version
89
- version: 0.0.10
89
+ version: 0.0.11
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
- version: 0.0.10
96
+ version: 0.0.11
97
97
  description:
98
98
  email:
99
99
  - support@crowdin.net