xat 1.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +176 -0
  3. data/README.md +38 -0
  4. data/app_template/README.md +14 -0
  5. data/app_template/app.css +0 -0
  6. data/app_template/app.js +12 -0
  7. data/app_template/assets/banner.png +0 -0
  8. data/app_template/assets/logo-promotion.png +0 -0
  9. data/app_template/assets/logo-small.png +0 -0
  10. data/app_template/assets/logo.png +0 -0
  11. data/app_template/manifest.json.tt +13 -0
  12. data/app_template/templates/layout.hdbs +10 -0
  13. data/app_template/translations/en.json +16 -0
  14. data/app_template_iframe/README.md +14 -0
  15. data/app_template_iframe/assets/banner.png +0 -0
  16. data/app_template_iframe/assets/iframe.html +13 -0
  17. data/app_template_iframe/assets/logo-promotion.png +0 -0
  18. data/app_template_iframe/assets/logo-small.png +0 -0
  19. data/app_template_iframe/assets/logo.png +0 -0
  20. data/app_template_iframe/manifest.json.tt +15 -0
  21. data/app_template_iframe/translations/en.json +16 -0
  22. data/bin/xat +5 -0
  23. data/features/clean.feature +9 -0
  24. data/features/fixtures/quote_character_translation.json +6 -0
  25. data/features/new.feature +117 -0
  26. data/features/package.feature +22 -0
  27. data/features/step_definitions/app_steps.rb +103 -0
  28. data/features/support/env.rb +5 -0
  29. data/features/validate.feature +15 -0
  30. data/lib/xat.rb +5 -0
  31. data/lib/zendesk_apps_tools/api_connection.rb +33 -0
  32. data/lib/zendesk_apps_tools/array_patch.rb +22 -0
  33. data/lib/zendesk_apps_tools/bump.rb +60 -0
  34. data/lib/zendesk_apps_tools/cache.rb +25 -0
  35. data/lib/zendesk_apps_tools/command.rb +183 -0
  36. data/lib/zendesk_apps_tools/command_helpers.rb +20 -0
  37. data/lib/zendesk_apps_tools/common.rb +40 -0
  38. data/lib/zendesk_apps_tools/deploy.rb +94 -0
  39. data/lib/zendesk_apps_tools/directory.rb +28 -0
  40. data/lib/zendesk_apps_tools/locale_identifier.rb +10 -0
  41. data/lib/zendesk_apps_tools/manifest_handler.rb +72 -0
  42. data/lib/zendesk_apps_tools/package_helper.rb +30 -0
  43. data/lib/zendesk_apps_tools/server.rb +65 -0
  44. data/lib/zendesk_apps_tools/settings.rb +82 -0
  45. data/lib/zendesk_apps_tools/translate.rb +168 -0
  46. data/templates/translation.erb.tt +13 -0
  47. metadata +238 -0
@@ -0,0 +1,168 @@
1
+ require 'thor'
2
+ require 'json'
3
+ require 'zendesk_apps_tools/common'
4
+ require 'zendesk_apps_tools/locale_identifier'
5
+ require 'zendesk_apps_support'
6
+ require 'yaml'
7
+
8
+ module ZendeskAppsTools
9
+ class Translate < Thor
10
+ include Thor::Shell
11
+ include Thor::Actions
12
+ include ZendeskAppsTools::Common
13
+ include ZendeskAppsSupport::BuildTranslation
14
+
15
+ LOCALE_ENDPOINT = 'https://support.zendesk.com/api/v2/locales/agent.json'
16
+
17
+ desc 'to_yml', 'Create Zendesk translation file from en.json'
18
+ method_option :path, default: './', required: false
19
+ def to_yml
20
+ setup_path(options[:path]) if options[:path]
21
+ manifest = JSON.parse(File.open("#{destination_root}/manifest.json").read)
22
+ app_name = manifest['name']
23
+
24
+ unless app_name
25
+ app_name = get_value_from_stdin('What is the name of this app?', error_msg: 'Invalid name, try again:')
26
+ end
27
+
28
+ en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)
29
+
30
+ package = en_json['app']['package']
31
+ say('No package defined inside en.json! Abort.', :red) and exit 1 unless package
32
+ en_json['app'].delete('package')
33
+
34
+ write_yml(en_json, app_name, package)
35
+ end
36
+
37
+ desc 'to_json', 'Convert Zendesk translation yml to I18n formatted json'
38
+ method_option :path, default: './', required: false
39
+ def to_json
40
+ setup_path(options[:path]) if options[:path]
41
+ en_yml = YAML.load_file("#{destination_root}/translations/en.yml")
42
+ package = /^txt.apps.([^\.]+)/.match(en_yml['parts'][0]['translation']['key'])[1]
43
+ translations = en_yml['parts'].map { |part| part['translation'] }
44
+ en_json = array_to_nested_hash(translations)['txt']['apps'][package]
45
+ en_json['app']['package'] = package
46
+
47
+ write_json('translations/en.json', en_json)
48
+ end
49
+
50
+ desc 'update', 'Update translation files from Zendesk'
51
+ method_option :path, default: './', required: false
52
+ def update()
53
+ setup_path(options[:path]) if options[:path]
54
+ app_package = get_value_from_stdin('What is the package name for this app? (without app_)', valid_regex: /^[a-z_]+$/, error_msg: 'Invalid package name, try again:')
55
+
56
+ key_prefix = "txt.apps.#{app_package}."
57
+
58
+ say('Fetching translations...')
59
+ locale_response = Faraday.get(LOCALE_ENDPOINT)
60
+
61
+ if locale_response.status == 200
62
+ locales = JSON.parse(locale_response.body)['locales']
63
+
64
+ locales = locales.map { |locale| fetch_locale_async locale, app_package}.map(&:value)
65
+
66
+ locales.each do |locale|
67
+ translations = locale['translations']
68
+
69
+ locale_name = ZendeskAppsTools::LocaleIdentifier.new(locale['locale']).locale_id
70
+ write_json("#{destination_root}/translations/#{locale_name}.json", nest_translations_hash(translations, key_prefix))
71
+ end
72
+ say('Translations updated', :green)
73
+
74
+ elsif locale_response.status == 401
75
+ say('Authentication failed', :red)
76
+ end
77
+ end
78
+
79
+ desc 'pseudotranslate', 'Generate a Pseudo-translation to use for testing. This will pretend to be French.'
80
+ method_option :path, default: './', required: false
81
+ def pseudotranslate
82
+ setup_path(options[:path]) if options[:path]
83
+
84
+ en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)
85
+
86
+ package = en_json['app']['package']
87
+ say('No package defined inside en.json! Abort.', :red) and exit 1 unless package
88
+
89
+ pseudo = build_pseudotranslation(en_json, package)
90
+ write_json("translations/fr.json", pseudo)
91
+ end
92
+
93
+ def self.source_root
94
+ File.expand_path(File.join(File.dirname(__FILE__), '../..'))
95
+ end
96
+
97
+ no_commands do
98
+ def fetch_locale_async(locale, app_package)
99
+ Thread.new do
100
+ say("Fetching #{locale['locale']}")
101
+ json = Faraday.get("#{locale['url']}?include=translations&packages=app_#{app_package}").body
102
+ JSON.parse(json)['locale']
103
+ end
104
+ end
105
+
106
+ def setup_path(path)
107
+ @destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
108
+ end
109
+
110
+ def write_json(filename, translations_hash)
111
+ create_file(filename, JSON.pretty_generate(translations_hash) + "\n")
112
+ end
113
+
114
+ def nest_translations_hash(translations_hash, key_prefix)
115
+ result = {}
116
+
117
+ translations_hash.each do |full_key, value|
118
+ parts = full_key.gsub(key_prefix, '').split('.')
119
+ parts_count = parts.size - 1
120
+ context = result
121
+
122
+ parts.each_with_index do |part, i|
123
+ if parts_count == i
124
+ context[part] = value
125
+ else
126
+ context = context[part] ||= {}
127
+ end
128
+ end
129
+ end
130
+
131
+ result
132
+ end
133
+
134
+ def write_yml(en_json, app_name, package_name)
135
+ titles = to_flattened_namespaced_hash(en_json, I18N_TITLE_KEY)
136
+ values = to_flattened_namespaced_hash(en_json, I18N_VALUE_KEY)
137
+ @translations = titles.each { |k, v| titles[k] = { 'title' => v, 'value' => escape_special_characters(values[k]) } }
138
+ @app_name = app_name
139
+ @package_name = package_name
140
+ template(File.join(Translate.source_root, 'templates/translation.erb.tt'), 'translations/en.yml')
141
+ end
142
+
143
+ def escape_special_characters(v)
144
+ v.gsub('"', '\"')
145
+ end
146
+
147
+ def array_to_nested_hash(array)
148
+ array.inject({}) do |result, item|
149
+ keys = item['key'].split('.')
150
+ current = result
151
+ keys[0..-2].each do |key|
152
+ current = (current[key] ||= {})
153
+ end
154
+ current[keys[-1]] = { 'title' => item['title'], 'value' => item['value'] }
155
+ result
156
+ end
157
+ end
158
+
159
+ def build_pseudotranslation(translations_hash, package_name)
160
+ titles = to_flattened_namespaced_hash(translations_hash, I18N_TITLE_KEY)
161
+ values = to_flattened_namespaced_hash(translations_hash, I18N_VALUE_KEY)
162
+ translations = titles.each { |k, v| titles[k] = { 'title' => v, 'value' => "[日本#{values[k]}éñđ]" } }
163
+ translations['app.package'] = package_name # don't pseudo translate the package name
164
+ nest_translations_hash(translations, '')
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,13 @@
1
+ ---
2
+ title: "<%= @app_name %>"
3
+ packages:
4
+ - default
5
+ - app_<%= @package_name %>
6
+
7
+ parts:
8
+ <% @translations.each do |key, title_value| -%>
9
+ - translation:
10
+ key: "txt.apps.<%= @package_name %>.<%= key %>"
11
+ title: "<%= title_value["title"] %>"
12
+ value: "<%= title_value["value"] %>"
13
+ <% end %>
metadata ADDED
@@ -0,0 +1,238 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xat
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.32.0
5
+ platform: ruby
6
+ authors:
7
+ - Olaf Kwant
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.18.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.18.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubyzip
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.1
41
+ - !ruby/object:Gem::Dependency
42
+ name: sinatra
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.4.6
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.4.6
55
+ - !ruby/object:Gem::Dependency
56
+ name: faraday
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.2
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.2
69
+ - !ruby/object:Gem::Dependency
70
+ name: zendesk_apps_support
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.28'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.28'
83
+ - !ruby/object:Gem::Dependency
84
+ name: cucumber
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: aruba
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: bump
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Tools to help you develop Zendesk Apps.
154
+ email:
155
+ - okwant@zendesk.com
156
+ executables:
157
+ - xat
158
+ extensions: []
159
+ extra_rdoc_files: []
160
+ files:
161
+ - LICENSE
162
+ - README.md
163
+ - app_template/README.md
164
+ - app_template/app.css
165
+ - app_template/app.js
166
+ - app_template/assets/banner.png
167
+ - app_template/assets/logo-promotion.png
168
+ - app_template/assets/logo-small.png
169
+ - app_template/assets/logo.png
170
+ - app_template/manifest.json.tt
171
+ - app_template/templates/layout.hdbs
172
+ - app_template/translations/en.json
173
+ - app_template_iframe/README.md
174
+ - app_template_iframe/assets/banner.png
175
+ - app_template_iframe/assets/iframe.html
176
+ - app_template_iframe/assets/logo-promotion.png
177
+ - app_template_iframe/assets/logo-small.png
178
+ - app_template_iframe/assets/logo.png
179
+ - app_template_iframe/manifest.json.tt
180
+ - app_template_iframe/translations/en.json
181
+ - bin/xat
182
+ - features/clean.feature
183
+ - features/fixtures/quote_character_translation.json
184
+ - features/new.feature
185
+ - features/package.feature
186
+ - features/step_definitions/app_steps.rb
187
+ - features/support/env.rb
188
+ - features/validate.feature
189
+ - lib/xat.rb
190
+ - lib/zendesk_apps_tools/api_connection.rb
191
+ - lib/zendesk_apps_tools/array_patch.rb
192
+ - lib/zendesk_apps_tools/bump.rb
193
+ - lib/zendesk_apps_tools/cache.rb
194
+ - lib/zendesk_apps_tools/command.rb
195
+ - lib/zendesk_apps_tools/command_helpers.rb
196
+ - lib/zendesk_apps_tools/common.rb
197
+ - lib/zendesk_apps_tools/deploy.rb
198
+ - lib/zendesk_apps_tools/directory.rb
199
+ - lib/zendesk_apps_tools/locale_identifier.rb
200
+ - lib/zendesk_apps_tools/manifest_handler.rb
201
+ - lib/zendesk_apps_tools/package_helper.rb
202
+ - lib/zendesk_apps_tools/server.rb
203
+ - lib/zendesk_apps_tools/settings.rb
204
+ - lib/zendesk_apps_tools/translate.rb
205
+ - templates/translation.erb.tt
206
+ homepage: https://github.com/ocke/xat
207
+ licenses:
208
+ - Apache License Version 2.0
209
+ metadata: {}
210
+ post_install_message:
211
+ rdoc_options: []
212
+ require_paths:
213
+ - lib
214
+ required_ruby_version: !ruby/object:Gem::Requirement
215
+ requirements:
216
+ - - ">="
217
+ - !ruby/object:Gem::Version
218
+ version: '2.0'
219
+ required_rubygems_version: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: 1.3.6
224
+ requirements: []
225
+ rubyforge_project:
226
+ rubygems_version: 2.4.5.1
227
+ signing_key:
228
+ specification_version: 4
229
+ summary: Tools to help you develop Zendesk Apps.
230
+ test_files:
231
+ - features/clean.feature
232
+ - features/fixtures/quote_character_translation.json
233
+ - features/new.feature
234
+ - features/package.feature
235
+ - features/step_definitions/app_steps.rb
236
+ - features/support/env.rb
237
+ - features/validate.feature
238
+ has_rdoc: