crowdin-cli 0.1.3 → 0.1.4

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.
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