zendesk_apps_support 1.19.0 → 1.20.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.
- checksums.yaml +4 -4
- data/config/locales/en.yml +21 -20
- data/config/locales/translations/zendesk_apps_support.yml +19 -3
- data/lib/zendesk_apps_support/assets/installed.js.erb +15 -0
- data/lib/zendesk_apps_support/assets/src.js.erb +22 -28
- data/lib/zendesk_apps_support/installation.rb +20 -0
- data/lib/zendesk_apps_support/installed.rb +22 -0
- data/lib/zendesk_apps_support/package.rb +175 -88
- data/lib/zendesk_apps_support/validations/manifest.rb +0 -2
- data/lib/zendesk_apps_support/validations/marketplace.rb +20 -0
- data/lib/zendesk_apps_support/validations/source.rb +1 -1
- data/lib/zendesk_apps_support/validations/stylesheets.rb +1 -1
- data/lib/zendesk_apps_support/validations/validation_error.rb +1 -1
- data/lib/zendesk_apps_support.rb +3 -0
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 21a2a6da05c4d89d23d1322dfd5f279c3191381b
|
|
4
|
+
data.tar.gz: 3f48e22275d82ea5b2c4ecd444e4a362d81f4943
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7fd547a41b3f5210d912bab54c0564747552fd0d03b787e7482c97257534199fb34367166edfc6e58e7000be07f65bc18b54bcef47c0f8a36b8add12f4916041
|
|
7
|
+
data.tar.gz: ac53d9ddc31416ed8f7381554c1efe5f50e10032c73c0ab7f91f6add6cf982232ac17802be5bac1175c48230e4a3cf7b670794ee2ac3ca3a3508ccb8fc891afe
|
data/config/locales/en.yml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# This is
|
|
1
|
+
# This file is generated by rake i18n:standardize. Do NOT edit it directly.
|
|
2
2
|
---
|
|
3
3
|
en:
|
|
4
4
|
txt:
|
|
@@ -17,6 +17,7 @@ en:
|
|
|
17
17
|
app.js
|
|
18
18
|
manifest_not_json: manifest is not proper JSON. %{errors}
|
|
19
19
|
missing_manifest: Could not find manifest.json
|
|
20
|
+
symlink_in_zip: Symlinks are not allowed in the zip file
|
|
20
21
|
missing_requirements: Could not find requirements.json
|
|
21
22
|
manifest_keys:
|
|
22
23
|
missing:
|
|
@@ -34,41 +35,41 @@ en:
|
|
|
34
35
|
one: 'requirements.json contains an invalid type: %{invalid_types}'
|
|
35
36
|
other: 'requirements.json contains invalid types: %{invalid_types}'
|
|
36
37
|
banner:
|
|
37
|
-
invalid_format:
|
|
38
|
-
invalid_size:
|
|
38
|
+
invalid_format: Banner image must be a PNG file.
|
|
39
|
+
invalid_size: Invalid banner image dimensions. Must be %{required_banner_width}x%{required_banner_height}px.
|
|
39
40
|
oauth_keys:
|
|
40
41
|
missing:
|
|
41
42
|
one: 'Missing required oauth field in manifest: %{missing_keys}'
|
|
42
43
|
other: 'Missing required oauth fields in manifest: %{missing_keys}'
|
|
43
44
|
missing_source: Could not find app.js
|
|
44
|
-
style_in_template: <style> tag in %{template}. Use an app.css file instead.
|
|
45
|
-
invalid_default_locale:
|
|
45
|
+
style_in_template: "<style> tag in %{template}. Use an app.css file instead."
|
|
46
|
+
invalid_default_locale: "%{defaultLocale} is not a valid default locale."
|
|
46
47
|
missing_translation_file: 'Missing translation file for locale ''%{defaultLocale}''.
|
|
47
48
|
Please read: http://developer.zendesk.com/documentation/apps/i18n.html'
|
|
48
|
-
invalid_host:
|
|
49
|
+
invalid_host: "%{host_name} is an invalid host for apps."
|
|
49
50
|
invalid_location:
|
|
50
|
-
one:
|
|
51
|
-
other:
|
|
51
|
+
one: "%{invalid_locations} is an invalid location in %{host_name}."
|
|
52
|
+
other: "%{invalid_locations} are invalid locations in %{host_name}."
|
|
52
53
|
duplicate_location:
|
|
53
|
-
one:
|
|
54
|
-
other:
|
|
54
|
+
one: "%{duplicate_locations} is a duplicate location."
|
|
55
|
+
other: "%{duplicate_locations} are duplicate locations."
|
|
55
56
|
name_as_parameter_name: Can't call a parameter 'name'
|
|
56
57
|
invalid_hidden_parameter:
|
|
57
|
-
one:
|
|
58
|
-
other:
|
|
59
|
-
invalid_version:
|
|
60
|
-
Available versions are: %{available_versions}.
|
|
58
|
+
one: "%{invalid_params} is set to hidden and cannot be required."
|
|
59
|
+
other: "%{invalid_params} are set to hidden and cannot be required."
|
|
60
|
+
invalid_version: "%{target_version} is not a valid framework version.
|
|
61
|
+
Available versions are: %{available_versions}."
|
|
61
62
|
parameters_not_an_array: App parameters must be an array.
|
|
62
63
|
duplicate_parameters: 'Duplicate app parameters defined: %{duplicate_parameters}'
|
|
63
64
|
translation:
|
|
64
|
-
invalid_locale:
|
|
65
|
-
invalid_format:
|
|
66
|
-
not_json:
|
|
67
|
-
not_json_object:
|
|
65
|
+
invalid_locale: "%{file} is not a valid locale."
|
|
66
|
+
invalid_format: "%{field} is invalid for translation."
|
|
67
|
+
not_json: "%{file} is not valid JSON. %{errors}"
|
|
68
|
+
not_json_object: "%{file} is not a JSON object."
|
|
68
69
|
stylesheet_error: 'Sass error: %{sass_error}'
|
|
69
70
|
invalid_type_parameter:
|
|
70
|
-
one:
|
|
71
|
-
other:
|
|
71
|
+
one: "%{invalid_types} is an invalid parameter type."
|
|
72
|
+
other: "%{invalid_types} are invalid parameter types."
|
|
72
73
|
warning:
|
|
73
74
|
app_build:
|
|
74
75
|
deprecated_version: You are targeting a deprecated version of the framework.
|
|
@@ -35,6 +35,10 @@ parts:
|
|
|
35
35
|
key: "txt.apps.admin.error.app_build.missing_manifest"
|
|
36
36
|
title: "App builder job: missing manifest error"
|
|
37
37
|
value: "Could not find manifest.json"
|
|
38
|
+
- translation:
|
|
39
|
+
key: "txt.apps.admin.error.app_build.symlink_in_zip"
|
|
40
|
+
title: "App builder job: symlinks not allowed"
|
|
41
|
+
value: "Symlinks are not allowed in the zip file"
|
|
38
42
|
- translation:
|
|
39
43
|
key: "txt.apps.admin.error.app_build.missing_requirements"
|
|
40
44
|
title: "App builder job: missing requirements error"
|
|
@@ -54,7 +58,7 @@ parts:
|
|
|
54
58
|
- translation:
|
|
55
59
|
key: "txt.apps.admin.error.app_build.excessive_requirements"
|
|
56
60
|
title: "App builder job: requirements file contains too many requirements"
|
|
57
|
-
value: "The requirements.json file contains too many requirements. The current limit is %{max} requirements."
|
|
61
|
+
value: "The requirements.json file contains too many requirements. The current limit is %{max} requirements. This app has %{count} requirements."
|
|
58
62
|
- translation:
|
|
59
63
|
key: "txt.apps.admin.error.app_build.missing_required_fields"
|
|
60
64
|
title: "App builder job: required key missing in requirements, e.g. \"title\" is required in \"my_custom_email_target\""
|
|
@@ -75,6 +79,14 @@ parts:
|
|
|
75
79
|
key: "txt.apps.admin.error.app_build.invalid_requirements_types.other"
|
|
76
80
|
title: "App builder job: requirements file contains invalid types error"
|
|
77
81
|
value: "requirements.json contains invalid types: %{invalid_types}"
|
|
82
|
+
- translation:
|
|
83
|
+
key: "txt.apps.admin.error.app_build.banner.invalid_format"
|
|
84
|
+
title: "App builder job: Banner image invalid format error"
|
|
85
|
+
value: "Banner image must be a PNG file."
|
|
86
|
+
- translation:
|
|
87
|
+
key: "txt.apps.admin.error.app_build.banner.invalid_size"
|
|
88
|
+
title: "App builder job: Banner image invalid size error"
|
|
89
|
+
value: "Invalid banner image dimensions. Must be %{required_banner_width}x%{required_banner_height}px."
|
|
78
90
|
- translation:
|
|
79
91
|
key: "txt.apps.admin.error.app_build.oauth_keys.missing.one"
|
|
80
92
|
title: "App builder job: missing oauth fields error"
|
|
@@ -99,14 +111,18 @@ parts:
|
|
|
99
111
|
key: "txt.apps.admin.error.app_build.missing_translation_file"
|
|
100
112
|
title: "App builder job: missing translation file"
|
|
101
113
|
value: "Missing translation file for locale '%{defaultLocale}'. Please read: http://developer.zendesk.com/documentation/apps/i18n.html"
|
|
114
|
+
- translation:
|
|
115
|
+
key: "txt.apps.admin.error.app_build.invalid_host"
|
|
116
|
+
title: "App builder job: invalid host application for apps"
|
|
117
|
+
value: "%{host_name} is an invalid host for apps."
|
|
102
118
|
- translation:
|
|
103
119
|
key: "txt.apps.admin.error.app_build.invalid_location.one"
|
|
104
120
|
title: "App builder job: invalid locations"
|
|
105
|
-
value: "%{invalid_locations} is an invalid location."
|
|
121
|
+
value: "%{invalid_locations} is an invalid location in %{host_name}."
|
|
106
122
|
- translation:
|
|
107
123
|
key: "txt.apps.admin.error.app_build.invalid_location.other"
|
|
108
124
|
title: "App builder job: invalid locations"
|
|
109
|
-
value: "%{invalid_locations} are invalid locations."
|
|
125
|
+
value: "%{invalid_locations} are invalid locations in %{host_name}."
|
|
110
126
|
- translation:
|
|
111
127
|
key: "txt.apps.admin.error.app_build.duplicate_location.one"
|
|
112
128
|
title: "App builder job: duplicate locations"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
(function() {
|
|
2
|
+
<% appsjs.each do |appjs| %>
|
|
3
|
+
<%= appjs %>
|
|
4
|
+
<% end %>
|
|
5
|
+
|
|
6
|
+
<% installations.each do |installation| %>
|
|
7
|
+
ZendeskApps[<%= installation.app_name.to_json %>].install(<%= installation.to_json %>);
|
|
8
|
+
<% end %>
|
|
9
|
+
|
|
10
|
+
<% installation_orders.each do |loc_name, installation_list| %>
|
|
11
|
+
ZendeskApps.sortAppsForSite(<%= loc_name.to_json %>, <%= installation_list.to_json %>);
|
|
12
|
+
<% end %>
|
|
13
|
+
}());
|
|
14
|
+
|
|
15
|
+
ZendeskApps.trigger && ZendeskApps.trigger('ready');
|
|
@@ -1,38 +1,32 @@
|
|
|
1
|
-
(
|
|
2
|
-
|
|
3
|
-
<% unless modules.nil? %>
|
|
1
|
+
with( ZendeskApps.AppScope.create() ) {
|
|
2
|
+
<% unless modules.empty? %>
|
|
4
3
|
require.modules = {
|
|
5
4
|
<% modules.each do |path, content| %>
|
|
6
|
-
|
|
5
|
+
<%= path.to_json %>: function(exports, require, module) {
|
|
7
6
|
<%= content %>
|
|
8
7
|
},
|
|
9
8
|
<% end %>
|
|
10
9
|
eom: undefined
|
|
11
10
|
};
|
|
12
|
-
|
|
11
|
+
<% end %>
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
var source = <%= source %>;
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
ZendeskApps[<%= name.to_json %>] = app;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
ZendeskApps[<%= name.to_json %>].install({"id": <%= app_id %>, "app_id": <%= app_id %>, "settings": <%= settings.to_json %>});
|
|
36
|
-
}());
|
|
15
|
+
var app = ZendeskApps.defineApp(source)
|
|
16
|
+
.reopenClass(<%= app_settings.to_json %>)
|
|
17
|
+
.reopen({
|
|
18
|
+
appName: <%= name.to_json %>,
|
|
19
|
+
appVersion: <%= version.to_json %>,
|
|
20
|
+
assetUrlPrefix: <%= asset_url_prefix.to_json %>,
|
|
21
|
+
appClassName: <%= app_class_name.to_json %>,
|
|
22
|
+
author: {
|
|
23
|
+
name: <%= author['name'].to_json %>,
|
|
24
|
+
email: <%= author['email'].to_json %>
|
|
25
|
+
},
|
|
26
|
+
translations: <%= translations.to_json %>,
|
|
27
|
+
templates: <%= templates.to_json %>,
|
|
28
|
+
frameworkVersion: <%= framework_version.to_json %>
|
|
29
|
+
});
|
|
37
30
|
|
|
38
|
-
ZendeskApps.
|
|
31
|
+
ZendeskApps[<%= name.to_json %>] = app;
|
|
32
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module ZendeskAppsSupport
|
|
2
|
+
class Installation
|
|
3
|
+
|
|
4
|
+
attr_accessor :id, :app_id, :app_name, :requirements, :settings, :enabled, :updated_at, :created_at
|
|
5
|
+
|
|
6
|
+
def initialize(options)
|
|
7
|
+
options.each do |k, v|
|
|
8
|
+
public_send("#{k}=", v)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_json
|
|
13
|
+
hash = {}
|
|
14
|
+
self.instance_variables.each do |var|
|
|
15
|
+
hash[var.to_s.sub('@', '')] = self.instance_variable_get var
|
|
16
|
+
end
|
|
17
|
+
hash.to_json
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'erubis'
|
|
2
|
+
|
|
3
|
+
module ZendeskAppsSupport
|
|
4
|
+
class Installed
|
|
5
|
+
INSTALLED_TEMPLATE = Erubis::Eruby.new(File.read(File.expand_path('../assets/installed.js.erb', __FILE__)))
|
|
6
|
+
|
|
7
|
+
def initialize(appsjs, installations = [])
|
|
8
|
+
@appsjs = appsjs
|
|
9
|
+
@installations = installations
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def compile_js(options = {})
|
|
13
|
+
installation_order = options.fetch(:installation_orders, {})
|
|
14
|
+
|
|
15
|
+
INSTALLED_TEMPLATE.result(
|
|
16
|
+
appsjs: @appsjs,
|
|
17
|
+
installations: @installations,
|
|
18
|
+
installation_orders: installation_order
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -6,29 +6,33 @@ module ZendeskAppsSupport
|
|
|
6
6
|
class Package
|
|
7
7
|
include ZendeskAppsSupport::BuildTranslation
|
|
8
8
|
|
|
9
|
+
REQUIREMENTS_FILENAME = "requirements.json"
|
|
10
|
+
|
|
9
11
|
DEFAULT_LAYOUT = Erubis::Eruby.new(File.read(File.expand_path('../assets/default_template.html.erb', __FILE__)))
|
|
10
12
|
DEFAULT_SCSS = File.read(File.expand_path('../assets/default_styles.scss', __FILE__))
|
|
11
13
|
SRC_TEMPLATE = Erubis::Eruby.new(File.read(File.expand_path('../assets/src.js.erb', __FILE__)))
|
|
12
14
|
|
|
13
15
|
attr_reader :lib_root, :root, :warnings
|
|
14
|
-
attr_accessor :requirements_only
|
|
15
16
|
|
|
16
|
-
def initialize(dir)
|
|
17
|
-
@root
|
|
17
|
+
def initialize(dir, is_cached = true)
|
|
18
|
+
@root = Pathname.new(File.expand_path(dir))
|
|
18
19
|
@lib_root = Pathname.new(File.join(@root, 'lib'))
|
|
20
|
+
|
|
21
|
+
@is_cached = is_cached #disabled by ZAT for development
|
|
19
22
|
@warnings = []
|
|
20
|
-
@requirements_only = false
|
|
21
23
|
end
|
|
22
24
|
|
|
23
|
-
def validate
|
|
25
|
+
def validate(marketplace: true)
|
|
24
26
|
[].tap do |errors|
|
|
27
|
+
errors << Validations::Marketplace.call(self) if marketplace
|
|
28
|
+
|
|
25
29
|
errors << Validations::Manifest.call(self)
|
|
26
30
|
|
|
27
31
|
if has_manifest?
|
|
28
32
|
errors << Validations::Source.call(self)
|
|
29
33
|
errors << Validations::Translations.call(self)
|
|
30
34
|
|
|
31
|
-
unless
|
|
35
|
+
unless manifest_json['requirementsOnly']
|
|
32
36
|
errors << Validations::Templates.call(self)
|
|
33
37
|
errors << Validations::Stylesheets.call(self)
|
|
34
38
|
end
|
|
@@ -42,84 +46,75 @@ module ZendeskAppsSupport
|
|
|
42
46
|
errors << Validations::Banner.call(self)
|
|
43
47
|
end
|
|
44
48
|
|
|
45
|
-
errors.flatten!
|
|
49
|
+
errors.flatten!.compact!
|
|
46
50
|
end
|
|
47
51
|
end
|
|
48
52
|
|
|
49
|
-
def
|
|
50
|
-
|
|
53
|
+
def validate!(marketplace: true)
|
|
54
|
+
errors = validate(marketplace: marketplace)
|
|
55
|
+
if errors.any?
|
|
56
|
+
raise errors.first
|
|
57
|
+
end
|
|
58
|
+
true
|
|
51
59
|
end
|
|
52
60
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
lib_files.each_with_object({}) do |file, modules|
|
|
57
|
-
name = file.relative_path.gsub!(/^lib\//, '')
|
|
58
|
-
content = file.read
|
|
59
|
-
modules[name] = content
|
|
61
|
+
def assets
|
|
62
|
+
@assets ||= Dir.chdir(@root) do
|
|
63
|
+
Dir["assets/**/*"].select { |f| File.file?(f) }
|
|
60
64
|
end
|
|
61
65
|
end
|
|
62
66
|
|
|
63
|
-
def
|
|
64
|
-
|
|
67
|
+
def path_to(file)
|
|
68
|
+
File.join(@root, file)
|
|
65
69
|
end
|
|
66
70
|
|
|
67
|
-
def
|
|
68
|
-
|
|
71
|
+
def requirements_path
|
|
72
|
+
path_to(REQUIREMENTS_FILENAME)
|
|
69
73
|
end
|
|
70
74
|
|
|
71
|
-
def
|
|
72
|
-
|
|
75
|
+
def locales
|
|
76
|
+
translations.keys
|
|
73
77
|
end
|
|
74
78
|
|
|
75
|
-
def
|
|
76
|
-
|
|
77
|
-
if manifest['noTemplate'].is_a?(Array)
|
|
78
|
-
false
|
|
79
|
-
else
|
|
80
|
-
!!manifest['noTemplate']
|
|
81
|
-
end
|
|
79
|
+
def files
|
|
80
|
+
non_tmp_files
|
|
82
81
|
end
|
|
83
82
|
|
|
84
|
-
def
|
|
85
|
-
|
|
83
|
+
def lib_files
|
|
84
|
+
@lib_files ||= non_tmp_files.select { |f| f =~ /^lib\/.*\.js$/ }
|
|
86
85
|
end
|
|
87
86
|
|
|
88
|
-
def
|
|
89
|
-
|
|
87
|
+
def template_files
|
|
88
|
+
files.select { |f| f =~ /^templates\/.*\.hdbs$/ }
|
|
90
89
|
end
|
|
91
90
|
|
|
92
|
-
def
|
|
93
|
-
|
|
91
|
+
def translation_files
|
|
92
|
+
non_tmp_files.select { |f| f =~ /^translations\// }
|
|
94
93
|
end
|
|
95
94
|
|
|
96
|
-
def
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
95
|
+
def compile_js(options)
|
|
96
|
+
begin
|
|
97
|
+
app_id = options.fetch(:app_id)
|
|
98
|
+
asset_url_prefix = options.fetch(:assets_dir)
|
|
99
|
+
name = options.fetch(:app_name)
|
|
100
|
+
rescue KeyError => e
|
|
101
|
+
raise ArgumentError, e.message
|
|
102
|
+
end
|
|
101
103
|
|
|
102
|
-
|
|
103
|
-
remove_zendesk_keys(translations(locale))
|
|
104
|
-
end
|
|
104
|
+
locale = options.fetch(:locale, 'en')
|
|
105
105
|
|
|
106
|
-
def readified_js(app_name, app_id, asset_url_prefix, settings = {}, locale = 'en')
|
|
107
|
-
manifest = manifest_json
|
|
108
106
|
source = app_js
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
version = manifest[:version]
|
|
107
|
+
location = manifest_json['location']
|
|
108
|
+
version = manifest_json['version']
|
|
112
109
|
app_class_name = "app-#{app_id}"
|
|
113
|
-
author =
|
|
114
|
-
framework_version =
|
|
115
|
-
single_install =
|
|
116
|
-
templates =
|
|
117
|
-
|
|
118
|
-
settings['title'] = name
|
|
110
|
+
author = manifest_json['author']
|
|
111
|
+
framework_version = manifest_json['frameworkVersion']
|
|
112
|
+
single_install = manifest_json['singleInstall'] || false
|
|
113
|
+
templates = is_no_template ? {} : compiled_templates(app_id, asset_url_prefix)
|
|
119
114
|
|
|
120
115
|
app_settings = {
|
|
121
116
|
location: location,
|
|
122
|
-
noTemplate:
|
|
117
|
+
noTemplate: is_no_template,
|
|
123
118
|
singleInstall: single_install
|
|
124
119
|
}.select { |_k, v| !v.nil? }
|
|
125
120
|
|
|
@@ -131,42 +126,64 @@ module ZendeskAppsSupport
|
|
|
131
126
|
asset_url_prefix: asset_url_prefix,
|
|
132
127
|
app_class_name: app_class_name,
|
|
133
128
|
author: author,
|
|
134
|
-
translations:
|
|
129
|
+
translations: translations_for(locale),
|
|
135
130
|
framework_version: framework_version,
|
|
136
131
|
templates: templates,
|
|
137
|
-
settings: settings,
|
|
138
|
-
app_id: app_id,
|
|
139
132
|
modules: commonjs_modules
|
|
140
133
|
)
|
|
141
134
|
end
|
|
142
135
|
|
|
143
|
-
def
|
|
144
|
-
|
|
145
|
-
File.exist?(css_file) ? File.read(css_file) : ''
|
|
136
|
+
def manifest_json
|
|
137
|
+
@manifest ||= read_json('manifest.json')
|
|
146
138
|
end
|
|
147
139
|
|
|
148
|
-
def
|
|
149
|
-
|
|
140
|
+
def requirements_json
|
|
141
|
+
return nil unless has_requirements?
|
|
142
|
+
@requirements ||= read_json('requirements.json')
|
|
150
143
|
end
|
|
151
144
|
|
|
152
|
-
def
|
|
153
|
-
|
|
145
|
+
def is_no_template
|
|
146
|
+
if manifest_json['noTemplate'].is_a?(Array)
|
|
147
|
+
false
|
|
148
|
+
else
|
|
149
|
+
!!manifest_json['noTemplate']
|
|
150
|
+
end
|
|
154
151
|
end
|
|
155
152
|
|
|
156
|
-
def
|
|
157
|
-
|
|
153
|
+
def no_template_locations
|
|
154
|
+
if manifest_json['noTemplate'].is_a?(Array)
|
|
155
|
+
manifest_json['noTemplate']
|
|
156
|
+
else
|
|
157
|
+
!!manifest_json['noTemplate']
|
|
158
|
+
end
|
|
158
159
|
end
|
|
159
160
|
|
|
160
|
-
def
|
|
161
|
-
|
|
161
|
+
def compiled_templates(app_id, asset_url_prefix)
|
|
162
|
+
compiled_css = ZendeskAppsSupport::StylesheetCompiler.new(DEFAULT_SCSS + app_css, app_id, asset_url_prefix).compile
|
|
163
|
+
|
|
164
|
+
layout = templates['layout'] || DEFAULT_LAYOUT.result
|
|
165
|
+
|
|
166
|
+
templates.tap do |templates|
|
|
167
|
+
templates['layout'] = "<style>\n#{compiled_css}</style>\n#{layout}"
|
|
168
|
+
end
|
|
162
169
|
end
|
|
163
170
|
|
|
164
|
-
def
|
|
165
|
-
|
|
171
|
+
def market_translations!(locale)
|
|
172
|
+
result = translations[locale].fetch('app', {})
|
|
173
|
+
result.delete('name')
|
|
174
|
+
result.delete('description')
|
|
175
|
+
result.delete('long_description')
|
|
176
|
+
result.delete('installation_instructions')
|
|
177
|
+
result
|
|
166
178
|
end
|
|
167
179
|
|
|
168
|
-
def
|
|
169
|
-
|
|
180
|
+
def has_location?
|
|
181
|
+
manifest_json['location']
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
def app_css
|
|
185
|
+
css_file = file_path('app.css')
|
|
186
|
+
File.exist?(css_file) ? File.read(css_file) : ''
|
|
170
187
|
end
|
|
171
188
|
|
|
172
189
|
def file_path(path)
|
|
@@ -175,25 +192,73 @@ module ZendeskAppsSupport
|
|
|
175
192
|
|
|
176
193
|
private
|
|
177
194
|
|
|
178
|
-
def
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
h[File.basename(file, File.extname(file))] = str
|
|
186
|
-
h
|
|
187
|
-
end
|
|
195
|
+
def templates
|
|
196
|
+
templates_dir = File.join(@root, 'templates')
|
|
197
|
+
Dir["#{templates_dir}/*.hdbs"].inject({}) do |memo, file|
|
|
198
|
+
str = File.read(file)
|
|
199
|
+
str.chomp!
|
|
200
|
+
memo[File.basename(file, File.extname(file))] = str
|
|
201
|
+
memo
|
|
188
202
|
end
|
|
203
|
+
end
|
|
189
204
|
|
|
190
|
-
|
|
205
|
+
def translations_for(locale)
|
|
206
|
+
trans = translations
|
|
207
|
+
return trans[locale] if trans[locale]
|
|
208
|
+
trans[self.manifest_json['defaultLocale']]
|
|
209
|
+
end
|
|
191
210
|
|
|
192
|
-
|
|
193
|
-
|
|
211
|
+
def translations
|
|
212
|
+
return @translations if @is_cached && @translations
|
|
213
|
+
|
|
214
|
+
@translations = begin
|
|
215
|
+
translation_dir = File.join(@root, 'translations')
|
|
216
|
+
return {} unless File.directory?(translation_dir)
|
|
217
|
+
|
|
218
|
+
locale_path = "#{translation_dir}/#{self.manifest_json['defaultLocale']}.json"
|
|
219
|
+
default_translations = process_translations(locale_path)
|
|
220
|
+
|
|
221
|
+
Dir["#{translation_dir}/*.json"].inject({}) do |memo, path|
|
|
222
|
+
locale = File.basename(path, File.extname(path))
|
|
223
|
+
|
|
224
|
+
locale_translations = if locale == self.manifest_json['defaultLocale']
|
|
225
|
+
default_translations
|
|
226
|
+
else
|
|
227
|
+
deep_merge_hash(default_translations, process_translations(path))
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
memo[locale] = locale_translations
|
|
231
|
+
memo
|
|
232
|
+
end
|
|
194
233
|
end
|
|
195
234
|
end
|
|
196
235
|
|
|
236
|
+
def process_translations(locale_path)
|
|
237
|
+
translations = File.exist?(locale_path) ? JSON.parse(File.read(locale_path)) : {}
|
|
238
|
+
translations['app'].delete('package') if translations.has_key?('app')
|
|
239
|
+
remove_zendesk_keys(translations)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
def has_lib_js?
|
|
243
|
+
lib_files.any?
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def has_manifest?
|
|
247
|
+
file_exists?('manifest.json')
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
def has_requirements?
|
|
251
|
+
file_exists?('requirements.json')
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
def has_banner?
|
|
255
|
+
file_exists?('assets/banner.png')
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
def app_js
|
|
259
|
+
read_file('app.js')
|
|
260
|
+
end
|
|
261
|
+
|
|
197
262
|
def non_tmp_files
|
|
198
263
|
files = []
|
|
199
264
|
Dir[root.join('**/**')].each do |f|
|
|
@@ -205,18 +270,40 @@ module ZendeskAppsSupport
|
|
|
205
270
|
files
|
|
206
271
|
end
|
|
207
272
|
|
|
273
|
+
def commonjs_modules
|
|
274
|
+
return {} unless has_lib_js?
|
|
275
|
+
|
|
276
|
+
lib_files.each_with_object({}) do |file, modules|
|
|
277
|
+
name = file.relative_path.gsub(/^lib\//, '')
|
|
278
|
+
content = file.read
|
|
279
|
+
modules[name] = content
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
|
|
208
283
|
def file_exists?(path)
|
|
209
284
|
File.exist?(file_path(path))
|
|
210
285
|
end
|
|
211
286
|
|
|
287
|
+
def deep_merge_hash(h, another_h)
|
|
288
|
+
result_h = h.dup
|
|
289
|
+
another_h.each do |key, value|
|
|
290
|
+
if h.has_key?(key) && h[key].is_a?(Hash) && value.is_a?(Hash)
|
|
291
|
+
result_h[key] = deep_merge_hash(h[key], value)
|
|
292
|
+
else
|
|
293
|
+
result_h[key] = value
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
result_h
|
|
297
|
+
end
|
|
298
|
+
|
|
212
299
|
def read_file(path)
|
|
213
300
|
File.read(file_path(path))
|
|
214
301
|
end
|
|
215
302
|
|
|
216
|
-
def read_json(path
|
|
303
|
+
def read_json(path)
|
|
217
304
|
file = read_file(path)
|
|
218
305
|
unless file.nil?
|
|
219
|
-
JSON.parse(read_file(path)
|
|
306
|
+
JSON.parse(read_file(path))
|
|
220
307
|
end
|
|
221
308
|
end
|
|
222
309
|
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module ZendeskAppsSupport
|
|
2
|
+
module Validations
|
|
3
|
+
module Marketplace
|
|
4
|
+
class << self
|
|
5
|
+
def call(package)
|
|
6
|
+
[no_symlinks(package.root)].compact
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
def no_symlinks(path)
|
|
12
|
+
if Dir["#{path}/**/{*,.*}"].any? { |f| File.symlink?(f) }
|
|
13
|
+
return ValidationError.new(:symlink_in_zip)
|
|
14
|
+
end
|
|
15
|
+
nil
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -24,7 +24,7 @@ module ZendeskAppsSupport
|
|
|
24
24
|
app = package.files.find { |file| file.relative_path == 'app.js' }
|
|
25
25
|
files = package.lib_files << app
|
|
26
26
|
|
|
27
|
-
if package.
|
|
27
|
+
if package.manifest_json['requirementsOnly']
|
|
28
28
|
return app ? [ValidationError.new(:no_app_js_required)] : []
|
|
29
29
|
end
|
|
30
30
|
|
data/lib/zendesk_apps_support.rb
CHANGED
|
@@ -6,6 +6,8 @@ module ZendeskAppsSupport
|
|
|
6
6
|
autoload :BuildTranslation, 'zendesk_apps_support/build_translation'
|
|
7
7
|
autoload :I18n, 'zendesk_apps_support/i18n'
|
|
8
8
|
autoload :Package, 'zendesk_apps_support/package'
|
|
9
|
+
autoload :Installed, 'zendesk_apps_support/installed'
|
|
10
|
+
autoload :Installation, 'zendesk_apps_support/installation'
|
|
9
11
|
autoload :AppRequirement, 'zendesk_apps_support/app_requirement'
|
|
10
12
|
autoload :AppVersion, 'zendesk_apps_support/app_version'
|
|
11
13
|
autoload :StylesheetCompiler, 'zendesk_apps_support/stylesheet_compiler'
|
|
@@ -13,6 +15,7 @@ module ZendeskAppsSupport
|
|
|
13
15
|
module Validations
|
|
14
16
|
autoload :ValidationError, 'zendesk_apps_support/validations/validation_error'
|
|
15
17
|
autoload :Manifest, 'zendesk_apps_support/validations/manifest'
|
|
18
|
+
autoload :Marketplace, 'zendesk_apps_support/validations/marketplace'
|
|
16
19
|
autoload :Source, 'zendesk_apps_support/validations/source'
|
|
17
20
|
autoload :Templates, 'zendesk_apps_support/validations/templates'
|
|
18
21
|
autoload :Translations, 'zendesk_apps_support/validations/translations'
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: zendesk_apps_support
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.20.0
|
|
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: 2015-11-
|
|
14
|
+
date: 2015-11-27 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: i18n
|
|
@@ -156,15 +156,19 @@ files:
|
|
|
156
156
|
- lib/zendesk_apps_support/app_version.rb
|
|
157
157
|
- lib/zendesk_apps_support/assets/default_styles.scss
|
|
158
158
|
- lib/zendesk_apps_support/assets/default_template.html.erb
|
|
159
|
+
- lib/zendesk_apps_support/assets/installed.js.erb
|
|
159
160
|
- lib/zendesk_apps_support/assets/src.js.erb
|
|
160
161
|
- lib/zendesk_apps_support/build_translation.rb
|
|
161
162
|
- lib/zendesk_apps_support/engine.rb
|
|
162
163
|
- lib/zendesk_apps_support/i18n.rb
|
|
164
|
+
- lib/zendesk_apps_support/installation.rb
|
|
165
|
+
- lib/zendesk_apps_support/installed.rb
|
|
163
166
|
- lib/zendesk_apps_support/package.rb
|
|
164
167
|
- lib/zendesk_apps_support/sass_functions.rb
|
|
165
168
|
- lib/zendesk_apps_support/stylesheet_compiler.rb
|
|
166
169
|
- lib/zendesk_apps_support/validations/banner.rb
|
|
167
170
|
- lib/zendesk_apps_support/validations/manifest.rb
|
|
171
|
+
- lib/zendesk_apps_support/validations/marketplace.rb
|
|
168
172
|
- lib/zendesk_apps_support/validations/requirements.rb
|
|
169
173
|
- lib/zendesk_apps_support/validations/source.rb
|
|
170
174
|
- lib/zendesk_apps_support/validations/stylesheets.rb
|