xat 1.32.0

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