zendesk_apps_tools 1.21.1 → 1.21.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/features/step_definitions/app_steps.rb +13 -13
- data/lib/zendesk_apps_tools/api_connection.rb +15 -13
- data/lib/zendesk_apps_tools/cache.rb +5 -5
- data/lib/zendesk_apps_tools/command.rb +23 -26
- data/lib/zendesk_apps_tools/common.rb +6 -6
- data/lib/zendesk_apps_tools/deploy.rb +6 -9
- data/lib/zendesk_apps_tools/directory.rb +5 -7
- data/lib/zendesk_apps_tools/locale_identifier.rb +1 -5
- data/lib/zendesk_apps_tools/package_helper.rb +2 -5
- data/lib/zendesk_apps_tools/server.rb +2 -3
- data/lib/zendesk_apps_tools/settings.rb +6 -6
- data/lib/zendesk_apps_tools/translate.rb +16 -20
- data/lib/zendesk_apps_tools.rb +0 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f8e6b79aced2f157e01d6a0d133fbee07f1f82a
|
4
|
+
data.tar.gz: a003cfef2eb60656a75289b8086925ac9e6dbe98
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bb36b96d341ed0a0e58cb0654f8842607d213a8d418bc53a3c10e24407b29939488a5772a888f4f57062869e189cb1614b79d2539aae2a07b6717691977849b
|
7
|
+
data.tar.gz: 4d848d14c6c2f16e2c139d76eaa7a0751fc8269f80f998a617e3ecdcf88a2f1044307b3bc0ceb8460a6045c8ef3c4baed89b021543dfe7bd5a6b1ad1fe18eb89
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'fileutils'
|
2
2
|
require 'zip/zip'
|
3
|
+
require 'English'
|
3
4
|
|
4
5
|
When /^I move to the app directory$/ do
|
5
6
|
@previous_dir = Dir.pwd
|
@@ -17,7 +18,7 @@ Given /^an app directory "(.*?)" exists$/ do |app_dir|
|
|
17
18
|
end
|
18
19
|
|
19
20
|
Given /^an app is created in directory "(.*?)"$/ do |app_dir|
|
20
|
-
steps %
|
21
|
+
steps %(
|
21
22
|
Given an app directory "#{app_dir}" exists
|
22
23
|
And I run "zat new" command with the following details:
|
23
24
|
| author name | John Citizen |
|
@@ -25,33 +26,33 @@ Given /^an app is created in directory "(.*?)"$/ do |app_dir|
|
|
25
26
|
| author url | http://myapp.com |
|
26
27
|
| app name | John Test App |
|
27
28
|
| app dir | #{app_dir} |
|
28
|
-
|
29
|
+
)
|
29
30
|
end
|
30
31
|
|
31
32
|
When /^I run "(.*?)" command with the following details:$/ do |cmd, table|
|
32
|
-
IO.popen(cmd,
|
33
|
+
IO.popen(cmd, 'w+') do |pipe|
|
33
34
|
# [ ['parameter name', 'value'] ]
|
34
35
|
table.raw.each do |row|
|
35
36
|
pipe.puts row.last
|
36
37
|
end
|
37
38
|
pipe.close_write
|
38
39
|
@output = pipe.readlines
|
39
|
-
@output.each {|line| puts line}
|
40
|
+
@output.each { |line| puts line }
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
|
-
When
|
44
|
+
When /^I create a symlink from "(.*?)" to "(.*?)"$/ do |src, dest|
|
44
45
|
@link_destname = File.basename(dest)
|
45
46
|
# create a symlink
|
46
47
|
FileUtils.ln_s(src, dest)
|
47
48
|
end
|
48
49
|
|
49
|
-
When /^I run the command "(.*?)" to (validate|package|clean) the app$/ do |cmd,
|
50
|
-
IO.popen(cmd,
|
50
|
+
When /^I run the command "(.*?)" to (validate|package|clean) the app$/ do |cmd, _action|
|
51
|
+
IO.popen(cmd, 'w+') do |pipe|
|
51
52
|
pipe.puts "\n"
|
52
53
|
pipe.close_write
|
53
54
|
@output = pipe.readlines
|
54
|
-
@output.each {|line| puts line}
|
55
|
+
@output.each { |line| puts line }
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
@@ -60,7 +61,7 @@ Then /^the app file "(.*?)" is created with:$/ do |file, content|
|
|
60
61
|
end
|
61
62
|
|
62
63
|
Then /^the app file "(.*?)" is created$/ do |filename|
|
63
|
-
File.
|
64
|
+
File.exist?(filename).should be_truthy
|
64
65
|
end
|
65
66
|
|
66
67
|
Then /^the fixture "(.*?)" is used for "(.*?)"$/ do |fixture, app_file|
|
@@ -70,7 +71,6 @@ Then /^the fixture "(.*?)" is used for "(.*?)"$/ do |fixture, app_file|
|
|
70
71
|
FileUtils.cp(fixture_file, app_file_path)
|
71
72
|
end
|
72
73
|
|
73
|
-
|
74
74
|
Then /^the zip file should exist in directory "(.*?)"$/ do |path|
|
75
75
|
Dir[path + '/app-*.zip'].size.should == 1
|
76
76
|
end
|
@@ -85,7 +85,7 @@ end
|
|
85
85
|
|
86
86
|
Then /^it should pass the validation$/ do
|
87
87
|
@output.last.should =~ /OK/
|
88
|
-
|
88
|
+
$CHILD_STATUS.should == 0
|
89
89
|
end
|
90
90
|
|
91
91
|
Then /^the command output should contain "(.*?)"$/ do |output|
|
@@ -97,7 +97,7 @@ Then /^"(.*?)" should be a symlink$/ do |path|
|
|
97
97
|
end
|
98
98
|
|
99
99
|
Then /^the zip file in "(.*?)" should not contain any symlinks$/ do |path|
|
100
|
-
Zip::ZipFile.foreach Dir[path+'/app-*.zip'][0] do |p|
|
101
|
-
|
100
|
+
Zip::ZipFile.foreach Dir[path + '/app-*.zip'][0] do |p|
|
101
|
+
p.symlink?.should be_falsy
|
102
102
|
end
|
103
103
|
end
|
@@ -4,28 +4,30 @@ module ZendeskAppsTools
|
|
4
4
|
URL_TEMPLATE = 'https://%s.zendesk.com/'
|
5
5
|
|
6
6
|
def prepare_api_auth
|
7
|
-
@subdomain ||=
|
8
|
-
@username ||=
|
9
|
-
@password ||=
|
7
|
+
@subdomain ||= fetch_cache('subdomain') || get_value_from_stdin('Enter your Zendesk subdomain or full Zendesk URL:')
|
8
|
+
@username ||= fetch_cache('username') || get_value_from_stdin('Enter your username:')
|
9
|
+
@password ||= fetch_cache('password') || get_password_from_stdin('Enter your password:')
|
10
10
|
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
def get_full_url
|
15
|
-
if FULL_URL =~ @subdomain
|
16
|
-
@subdomain
|
17
|
-
else
|
18
|
-
URL_TEMPLATE % @subdomain
|
19
|
-
end
|
11
|
+
save_cache 'subdomain' => @subdomain, 'username' => @username
|
20
12
|
end
|
21
13
|
|
22
14
|
def get_connection(encoding = :url_encoded)
|
23
15
|
prepare_api_auth
|
24
|
-
Faraday.new
|
16
|
+
Faraday.new full_url do |f|
|
25
17
|
f.request encoding
|
26
18
|
f.adapter :net_http
|
27
19
|
f.basic_auth @username, @password
|
28
20
|
end
|
29
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def full_url
|
26
|
+
if FULL_URL =~ @subdomain
|
27
|
+
@subdomain
|
28
|
+
else
|
29
|
+
URL_TEMPLATE % @subdomain
|
30
|
+
end
|
31
|
+
end
|
30
32
|
end
|
31
33
|
end
|
@@ -2,20 +2,20 @@ module ZendeskAppsTools
|
|
2
2
|
module Cache
|
3
3
|
CACHE_FILE_NAME = '.zat'
|
4
4
|
|
5
|
-
def
|
5
|
+
def save_cache(hash)
|
6
6
|
return if options[:zipfile]
|
7
7
|
|
8
|
-
@cache = File.
|
8
|
+
@cache = File.exist?(cache_path) ? JSON.parse(File.read(@cache_path)).update(hash) : hash
|
9
9
|
File.open(@cache_path, 'w') { |f| f.write JSON.pretty_generate(@cache) }
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
@cache ||= File.
|
12
|
+
def fetch_cache(key)
|
13
|
+
@cache ||= File.exist?(cache_path) ? JSON.parse(File.read(@cache_path)) : {}
|
14
14
|
@cache[key] if @cache
|
15
15
|
end
|
16
16
|
|
17
17
|
def clear_cache
|
18
|
-
File.delete cache_path if options[:clean] && File.
|
18
|
+
File.delete cache_path if options[:clean] && File.exist?(cache_path)
|
19
19
|
end
|
20
20
|
|
21
21
|
def cache_path
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'thor'
|
2
2
|
require 'zip/zip'
|
3
3
|
require 'pathname'
|
4
4
|
require 'net/http'
|
@@ -9,11 +9,9 @@ require 'io/console'
|
|
9
9
|
require 'zendesk_apps_tools/command_helpers'
|
10
10
|
|
11
11
|
module ZendeskAppsTools
|
12
|
-
|
13
12
|
require 'zendesk_apps_support'
|
14
13
|
|
15
14
|
class Command < Thor
|
16
|
-
|
17
15
|
SHARED_OPTIONS = {
|
18
16
|
['path', '-p'] => './',
|
19
17
|
clean: false
|
@@ -23,24 +21,24 @@ module ZendeskAppsTools
|
|
23
21
|
include ZendeskAppsSupport
|
24
22
|
include ZendeskAppsTools::CommandHelpers
|
25
23
|
|
26
|
-
source_root File.expand_path(File.join(File.dirname(__FILE__),
|
24
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), '../..'))
|
27
25
|
|
28
26
|
desc 'translate SUBCOMMAND', 'Manage translation files', hide: true
|
29
27
|
subcommand 'translate', Translate
|
30
28
|
|
31
|
-
desc
|
29
|
+
desc 'new', 'Generate a new app'
|
32
30
|
def new
|
33
|
-
@author_name = get_value_from_stdin("Enter this app author's name:\n", error_msg:
|
34
|
-
@author_email = get_value_from_stdin("Enter this app author's email:\n", valid_regex: /^.+@.+\..+$/, error_msg:
|
35
|
-
@author_url = get_value_from_stdin("Enter this app author's url:\n", valid_regex: /^https?:\/\/.+$/, error_msg:
|
36
|
-
@app_name = get_value_from_stdin("Enter a name for this new app:\n", error_msg:
|
31
|
+
@author_name = get_value_from_stdin("Enter this app author's name:\n", error_msg: 'Invalid name, try again:')
|
32
|
+
@author_email = get_value_from_stdin("Enter this app author's email:\n", valid_regex: /^.+@.+\..+$/, error_msg: 'Invalid email, try again:')
|
33
|
+
@author_url = get_value_from_stdin("Enter this app author's url:\n", valid_regex: /^https?:\/\/.+$/, error_msg: 'Invalid url, try again:', allow_empty: true)
|
34
|
+
@app_name = get_value_from_stdin("Enter a name for this new app:\n", error_msg: 'Invalid app name, try again:')
|
37
35
|
|
38
|
-
|
36
|
+
prompt_new_app_dir
|
39
37
|
|
40
38
|
directory('app_template', @app_dir)
|
41
39
|
end
|
42
40
|
|
43
|
-
desc
|
41
|
+
desc 'validate', 'Validate your app'
|
44
42
|
method_options SHARED_OPTIONS
|
45
43
|
def validate
|
46
44
|
setup_path(options[:path])
|
@@ -61,7 +59,7 @@ module ZendeskAppsTools
|
|
61
59
|
true
|
62
60
|
end
|
63
61
|
|
64
|
-
desc
|
62
|
+
desc 'package', 'Package your app'
|
65
63
|
method_options SHARED_OPTIONS
|
66
64
|
def package
|
67
65
|
return false unless invoke(:validate, [])
|
@@ -73,27 +71,27 @@ module ZendeskAppsTools
|
|
73
71
|
|
74
72
|
zip archive_path
|
75
73
|
|
76
|
-
say_status
|
74
|
+
say_status 'package', "created at #{archive_rel_path}"
|
77
75
|
true
|
78
76
|
end
|
79
77
|
|
80
|
-
desc
|
81
|
-
method_option :path, default: './', required: false, aliases:
|
78
|
+
desc 'clean', 'Remove app packages in temp folder'
|
79
|
+
method_option :path, default: './', required: false, aliases: '-p'
|
82
80
|
def clean
|
83
81
|
setup_path(options[:path])
|
84
82
|
|
85
|
-
return unless File.
|
83
|
+
return unless File.exist?(Pathname.new(File.join(app_dir, 'tmp')).to_s)
|
86
84
|
|
87
85
|
FileUtils.rm(Dir["#{tmp_dir}/app-*.zip"])
|
88
86
|
end
|
89
87
|
|
90
|
-
DEFAULT_SERVER_PATH =
|
91
|
-
DEFAULT_CONFIG_PATH =
|
88
|
+
DEFAULT_SERVER_PATH = './'
|
89
|
+
DEFAULT_CONFIG_PATH = './settings.yml'
|
92
90
|
DEFAULT_SERVER_PORT = 4567
|
93
91
|
|
94
|
-
desc
|
95
|
-
method_option :path, default: DEFAULT_SERVER_PATH, required: false, aliases:
|
96
|
-
method_option :config, default: DEFAULT_CONFIG_PATH, required: false, aliases:
|
92
|
+
desc 'server', 'Run a http server to serve the local app'
|
93
|
+
method_option :path, default: DEFAULT_SERVER_PATH, required: false, aliases: '-p'
|
94
|
+
method_option :config, default: DEFAULT_CONFIG_PATH, required: false, aliases: '-c'
|
97
95
|
method_option :port, default: DEFAULT_SERVER_PORT, required: false
|
98
96
|
def server
|
99
97
|
setup_path(options[:path])
|
@@ -116,7 +114,7 @@ module ZendeskAppsTools
|
|
116
114
|
end
|
117
115
|
end
|
118
116
|
|
119
|
-
desc
|
117
|
+
desc 'create', 'Create app on your account'
|
120
118
|
method_options SHARED_OPTIONS
|
121
119
|
method_option :zipfile, default: nil, required: false, type: :string
|
122
120
|
def create
|
@@ -127,17 +125,17 @@ module ZendeskAppsTools
|
|
127
125
|
app_name = JSON.parse(File.read(File.join options[:path], 'manifest.json'))['name']
|
128
126
|
end
|
129
127
|
app_name ||= get_value_from_stdin('Enter app name:')
|
130
|
-
deploy_app(:post, '/api/v2/apps.json',
|
128
|
+
deploy_app(:post, '/api/v2/apps.json', name: app_name)
|
131
129
|
end
|
132
130
|
|
133
|
-
desc
|
131
|
+
desc 'update', 'Update app on the server'
|
134
132
|
method_options SHARED_OPTIONS
|
135
133
|
method_option :zipfile, default: nil, required: false, type: :string
|
136
134
|
def update
|
137
135
|
clear_cache
|
138
136
|
@command = 'Update'
|
139
137
|
|
140
|
-
app_id =
|
138
|
+
app_id = fetch_cache('app_id') || find_app_id
|
141
139
|
unless /\d+/ =~ app_id.to_s
|
142
140
|
say_error_and_exit "App id not found\nPlease try running command with --clean or check your internet connection"
|
143
141
|
end
|
@@ -149,6 +147,5 @@ module ZendeskAppsTools
|
|
149
147
|
def setup_path(path)
|
150
148
|
@destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
|
151
149
|
end
|
152
|
-
|
153
150
|
end
|
154
151
|
end
|
@@ -19,18 +19,18 @@ module ZendeskAppsTools
|
|
19
19
|
}.merge(opts)
|
20
20
|
|
21
21
|
while input = ask(prompt)
|
22
|
-
return
|
23
|
-
|
24
|
-
say(options[:error_msg], :red)
|
25
|
-
else
|
22
|
+
return '' if input.empty? && options[:allow_empty]
|
23
|
+
if input =~ options[:valid_regex]
|
26
24
|
break
|
25
|
+
else
|
26
|
+
say(options[:error_msg], :red)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
|
30
|
+
input
|
31
31
|
end
|
32
32
|
|
33
|
-
def get_password_from_stdin(prompt
|
33
|
+
def get_password_from_stdin(prompt)
|
34
34
|
print "#{prompt} "
|
35
35
|
password = STDIN.noecho(&:gets).chomp
|
36
36
|
puts
|
@@ -48,10 +48,10 @@ module ZendeskAppsTools
|
|
48
48
|
|
49
49
|
all_apps = connection.get('/api/v2/apps.json').body
|
50
50
|
|
51
|
-
|
51
|
+
app_id = JSON.parse(all_apps)['apps'].find { |app| app['name'] == name }['id']
|
52
52
|
|
53
|
-
|
54
|
-
|
53
|
+
save_cache 'app_id' => app_id
|
54
|
+
app_id
|
55
55
|
rescue Faraday::Error::ClientError => e
|
56
56
|
say_error_and_exit e.message
|
57
57
|
end
|
@@ -59,9 +59,7 @@ module ZendeskAppsTools
|
|
59
59
|
def check_status(response)
|
60
60
|
job = response.body
|
61
61
|
job_response = JSON.parse(job)
|
62
|
-
if job_response['error']
|
63
|
-
say_error_and_exit job_response['error']
|
64
|
-
end
|
62
|
+
say_error_and_exit job_response['error'] if job_response['error']
|
65
63
|
|
66
64
|
job_id = job_response['job_id']
|
67
65
|
check_job job_id
|
@@ -77,10 +75,10 @@ module ZendeskAppsTools
|
|
77
75
|
message = info['message']
|
78
76
|
app_id = info['app_id']
|
79
77
|
|
80
|
-
if
|
78
|
+
if %w(completed failed).include? status
|
81
79
|
case status
|
82
80
|
when 'completed'
|
83
|
-
|
81
|
+
save_cache 'app_id' => app_id
|
84
82
|
say_status @command, 'OK'
|
85
83
|
when 'failed'
|
86
84
|
say_status @command, message
|
@@ -94,6 +92,5 @@ module ZendeskAppsTools
|
|
94
92
|
rescue Faraday::Error::ClientError => e
|
95
93
|
say_error_and_exit e.message
|
96
94
|
end
|
97
|
-
|
98
95
|
end
|
99
96
|
end
|
@@ -1,30 +1,28 @@
|
|
1
1
|
module ZendeskAppsTools
|
2
2
|
module Directory
|
3
|
-
|
4
3
|
def app_dir
|
5
4
|
@app_dir ||= Pathname.new(destination_root)
|
6
5
|
end
|
7
6
|
|
8
7
|
def tmp_dir
|
9
|
-
@tmp_dir ||= Pathname.new(File.join(app_dir,
|
8
|
+
@tmp_dir ||= Pathname.new(File.join(app_dir, 'tmp')).tap do |dir|
|
10
9
|
FileUtils.mkdir_p(dir)
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
14
|
-
def
|
13
|
+
def prompt_new_app_dir
|
15
14
|
prompt = "Enter a directory name to save the new app (will create the dir if it does not exist, default to current dir):\n"
|
16
15
|
opts = { valid_regex: /^(\w|\/|\\)*$/, allow_empty: true }
|
17
|
-
while @app_dir = get_value_from_stdin(prompt, opts)
|
16
|
+
while @app_dir = get_value_from_stdin(prompt, opts)
|
18
17
|
@app_dir = './' and break if @app_dir.empty?
|
19
|
-
if !File.
|
18
|
+
if !File.exist?(@app_dir)
|
20
19
|
break
|
21
20
|
elsif !File.directory?(@app_dir)
|
22
|
-
puts
|
21
|
+
puts 'Invalid dir, try again:'
|
23
22
|
else
|
24
23
|
break
|
25
24
|
end
|
26
25
|
end
|
27
26
|
end
|
28
|
-
|
29
27
|
end
|
30
28
|
end
|
@@ -4,11 +4,7 @@ module ZendeskAppsTools
|
|
4
4
|
|
5
5
|
# Convert :"en-US-x-12" to 'en-US'
|
6
6
|
def initialize(code)
|
7
|
-
@locale_id =
|
8
|
-
'en-US'
|
9
|
-
else
|
10
|
-
code.sub(/-x-.*/, '').downcase
|
11
|
-
end
|
7
|
+
@locale_id = code.start_with?('en-US') ? 'en-US' : code.sub(/-x-.*/, '').downcase
|
12
8
|
end
|
13
9
|
end
|
14
10
|
end
|
@@ -1,20 +1,18 @@
|
|
1
1
|
module ZendeskAppsTools
|
2
|
-
|
3
2
|
require 'zendesk_apps_support'
|
4
3
|
|
5
4
|
module PackageHelper
|
6
|
-
|
7
5
|
include ZendeskAppsSupport
|
8
6
|
|
9
7
|
def app_package
|
10
|
-
@app_package ||= Package.new(
|
8
|
+
@app_package ||= Package.new(app_dir.to_s)
|
11
9
|
end
|
12
10
|
|
13
11
|
def zip(archive_path)
|
14
12
|
Zip::ZipFile.open(archive_path, 'w') do |zipfile|
|
15
13
|
app_package.files.each do |file|
|
16
14
|
path = file.relative_path
|
17
|
-
say_status
|
15
|
+
say_status 'package', "adding #{path}"
|
18
16
|
|
19
17
|
# resolve symlink to source path
|
20
18
|
if File.symlink? file.absolute_path
|
@@ -24,6 +22,5 @@ module ZendeskAppsTools
|
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
27
|
-
|
28
25
|
end
|
29
26
|
end
|
@@ -3,12 +3,11 @@ require 'zendesk_apps_support/package'
|
|
3
3
|
|
4
4
|
module ZendeskAppsTools
|
5
5
|
class Server < Sinatra::Base
|
6
|
-
set :public_folder,
|
6
|
+
set :public_folder, proc { "#{settings.root}/assets" }
|
7
7
|
|
8
8
|
get '/app.js' do
|
9
9
|
content_type 'text/javascript'
|
10
10
|
ZendeskAppsSupport::Package.new(settings.root).readified_js(nil, 0, "http://localhost:#{settings.port}/", settings.parameters)
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
14
|
-
end
|
13
|
+
end
|
@@ -3,7 +3,6 @@ require 'yaml'
|
|
3
3
|
|
4
4
|
module ZendeskAppsTools
|
5
5
|
class Settings
|
6
|
-
|
7
6
|
def get_settings_from_user_input(user_input, parameters)
|
8
7
|
return {} if parameters.nil?
|
9
8
|
|
@@ -28,7 +27,7 @@ module ZendeskAppsTools
|
|
28
27
|
|
29
28
|
def get_settings_from_file(filepath, parameters)
|
30
29
|
return {} if parameters.nil?
|
31
|
-
return nil unless File.
|
30
|
+
return nil unless File.exist? filepath
|
32
31
|
|
33
32
|
begin
|
34
33
|
settings_file = File.read(filepath)
|
@@ -36,15 +35,17 @@ module ZendeskAppsTools
|
|
36
35
|
if filepath =~ /\.json$/ || settings_file =~ /\A\s*{/
|
37
36
|
settings_data = JSON.load(settings_file)
|
38
37
|
else
|
39
|
-
settings_data = YAML
|
38
|
+
settings_data = YAML.load(settings_file)
|
40
39
|
end
|
41
40
|
|
42
41
|
settings_data.each do |index, setting|
|
43
|
-
if
|
42
|
+
if setting.is_a?(Hash) || setting.is_a?(Array)
|
44
43
|
settings_data[index] = JSON.dump(setting)
|
45
44
|
end
|
46
45
|
end
|
47
46
|
rescue => err
|
47
|
+
puts "Failed to load #{filepath}"
|
48
|
+
puts err.message
|
48
49
|
return nil
|
49
50
|
end
|
50
51
|
|
@@ -72,11 +73,10 @@ module ZendeskAppsTools
|
|
72
73
|
private
|
73
74
|
|
74
75
|
def convert_to_boolean_for_checkbox(input)
|
75
|
-
|
76
|
+
unless [TrueClass, FalseClass].include?(input.class)
|
76
77
|
return (input =~ /^(true|t|yes|y|1)$/i) ? true : false
|
77
78
|
end
|
78
79
|
input
|
79
80
|
end
|
80
|
-
|
81
81
|
end
|
82
82
|
end
|
@@ -12,7 +12,7 @@ module ZendeskAppsTools
|
|
12
12
|
include ZendeskAppsTools::Common
|
13
13
|
include ZendeskAppsSupport::BuildTranslation
|
14
14
|
|
15
|
-
LOCALE_ENDPOINT =
|
15
|
+
LOCALE_ENDPOINT = 'https://support.zendesk.com/api/v2/locales/agent.json'
|
16
16
|
|
17
17
|
desc 'to_yml', 'Create Zendesk translation file from en.json'
|
18
18
|
method_option :path, default: './', required: false
|
@@ -22,14 +22,14 @@ module ZendeskAppsTools
|
|
22
22
|
app_name = manifest['name']
|
23
23
|
|
24
24
|
unless app_name
|
25
|
-
app_name = get_value_from_stdin('What is the name of this app?', error_msg:
|
25
|
+
app_name = get_value_from_stdin('What is the name of this app?', error_msg: 'Invalid name, try again:')
|
26
26
|
end
|
27
27
|
|
28
28
|
en_json = JSON.parse(File.open("#{destination_root}/translations/en.json").read)
|
29
29
|
|
30
|
-
package = en_json[
|
30
|
+
package = en_json['app']['package']
|
31
31
|
say('No package defined inside en.json! Abort.', :red) and exit 1 unless package
|
32
|
-
en_json[
|
32
|
+
en_json['app'].delete('package')
|
33
33
|
|
34
34
|
write_yml(en_json, app_name, package)
|
35
35
|
end
|
@@ -39,50 +39,48 @@ module ZendeskAppsTools
|
|
39
39
|
def to_json
|
40
40
|
setup_path(options[:path]) if options[:path]
|
41
41
|
en_yml = YAML.load_file("#{destination_root}/translations/en.yml")
|
42
|
-
en_yml['parts'][0]['translation']['key']
|
43
|
-
package = $1
|
42
|
+
package = /^txt.apps.([^\.]+)/.match(en_yml['parts'][0]['translation']['key'])[1]
|
44
43
|
translations = en_yml['parts'].map { |part| part['translation'] }
|
45
44
|
en_json = array_to_nested_hash(translations)['txt']['apps'][package]
|
46
45
|
en_json['app']['package'] = package
|
47
46
|
|
48
|
-
write_json(
|
47
|
+
write_json('translations/en.json', en_json)
|
49
48
|
end
|
50
49
|
|
51
50
|
desc 'update', 'Update translation files from Zendesk'
|
52
51
|
method_option :path, default: './', required: false
|
53
52
|
def update(request_builder = Faraday.new)
|
54
53
|
setup_path(options[:path]) if options[:path]
|
55
|
-
app_package = get_value_from_stdin(
|
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:')
|
56
55
|
|
57
56
|
key_prefix = "txt.apps.#{app_package}."
|
58
57
|
|
59
|
-
say(
|
58
|
+
say('Fetching translations...')
|
60
59
|
locale_response = api_request(LOCALE_ENDPOINT, request_builder)
|
61
60
|
|
62
61
|
if locale_response.status == 200
|
63
|
-
locales = JSON.parse(locale_response.body)[
|
62
|
+
locales = JSON.parse(locale_response.body)['locales']
|
64
63
|
|
65
64
|
locales.each do |locale|
|
66
|
-
locale_url = "#{locale[
|
65
|
+
locale_url = "#{locale['url']}?include=translations&packages=app_#{app_package}"
|
67
66
|
locale_response = api_request(locale_url, request_builder).body
|
68
67
|
translations = JSON.parse(locale_response)['locale']['translations']
|
69
68
|
|
70
69
|
locale_name = ZendeskAppsTools::LocaleIdentifier.new(locale['locale']).locale_id
|
71
70
|
write_json("#{destination_root}/translations/#{locale_name}.json", nest_translations_hash(translations, key_prefix))
|
72
71
|
end
|
73
|
-
say(
|
72
|
+
say('Translations updated', :green)
|
74
73
|
|
75
74
|
elsif locale_response.status == 401
|
76
|
-
say(
|
75
|
+
say('Authentication failed', :red)
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
80
79
|
def self.source_root
|
81
|
-
File.expand_path(File.join(File.dirname(__FILE__),
|
80
|
+
File.expand_path(File.join(File.dirname(__FILE__), '../..'))
|
82
81
|
end
|
83
82
|
|
84
83
|
no_commands do
|
85
|
-
|
86
84
|
def setup_path(path)
|
87
85
|
@destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
|
88
86
|
end
|
@@ -100,13 +98,11 @@ module ZendeskAppsTools
|
|
100
98
|
context = result
|
101
99
|
|
102
100
|
parts.each_with_index do |part, i|
|
103
|
-
|
104
101
|
if parts_count == i
|
105
102
|
context[part] = value
|
106
103
|
else
|
107
104
|
context = context[part] ||= {}
|
108
105
|
end
|
109
|
-
|
110
106
|
end
|
111
107
|
end
|
112
108
|
|
@@ -116,10 +112,10 @@ module ZendeskAppsTools
|
|
116
112
|
def write_yml(en_json, app_name, package_name)
|
117
113
|
titles = to_flattened_namespaced_hash(en_json, I18N_TITLE_KEY)
|
118
114
|
values = to_flattened_namespaced_hash(en_json, I18N_VALUE_KEY)
|
119
|
-
@translations = titles.each { |k, v| titles[k] = {
|
115
|
+
@translations = titles.each { |k, v| titles[k] = { 'title' => v, 'value' => escape_special_characters(values[k]) } }
|
120
116
|
@app_name = app_name
|
121
117
|
@package_name = package_name
|
122
|
-
template(File.join(Translate.source_root, 'templates/translation.erb.tt'),
|
118
|
+
template(File.join(Translate.source_root, 'templates/translation.erb.tt'), 'translations/en.yml')
|
123
119
|
end
|
124
120
|
|
125
121
|
def escape_special_characters(v)
|
@@ -133,7 +129,7 @@ module ZendeskAppsTools
|
|
133
129
|
keys[0..-2].each do |key|
|
134
130
|
current = (current[key] ||= {})
|
135
131
|
end
|
136
|
-
current[keys[-1]] = {'title' => item['title'], 'value' => item['value']}
|
132
|
+
current[keys[-1]] = { 'title' => item['title'], 'value' => item['value'] }
|
137
133
|
result
|
138
134
|
end
|
139
135
|
end
|
data/lib/zendesk_apps_tools.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zendesk_apps_tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.21.
|
4
|
+
version: 1.21.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James A. Rosen
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2015-02-02 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: thor
|