zendesk_apps_support 4.29.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +176 -0
  3. data/README.md +39 -0
  4. data/config/locales/en.yml +163 -0
  5. data/config/locales/translations/zendesk_apps_support.yml +405 -0
  6. data/lib/zendesk_apps_support.rb +42 -0
  7. data/lib/zendesk_apps_support/app_file.rb +44 -0
  8. data/lib/zendesk_apps_support/app_requirement.rb +11 -0
  9. data/lib/zendesk_apps_support/app_version.rb +78 -0
  10. data/lib/zendesk_apps_support/assets/default_app_logo.svg +10 -0
  11. data/lib/zendesk_apps_support/assets/default_styles.scss +3 -0
  12. data/lib/zendesk_apps_support/assets/default_template.html.erb +10 -0
  13. data/lib/zendesk_apps_support/assets/installed.js.erb +21 -0
  14. data/lib/zendesk_apps_support/assets/src.js.erb +37 -0
  15. data/lib/zendesk_apps_support/build_translation.rb +51 -0
  16. data/lib/zendesk_apps_support/engine.rb +11 -0
  17. data/lib/zendesk_apps_support/finders.rb +36 -0
  18. data/lib/zendesk_apps_support/i18n.rb +31 -0
  19. data/lib/zendesk_apps_support/installation.rb +22 -0
  20. data/lib/zendesk_apps_support/installed.rb +27 -0
  21. data/lib/zendesk_apps_support/location.rb +71 -0
  22. data/lib/zendesk_apps_support/manifest.rb +197 -0
  23. data/lib/zendesk_apps_support/manifest/location_options.rb +35 -0
  24. data/lib/zendesk_apps_support/manifest/no_override_hash.rb +50 -0
  25. data/lib/zendesk_apps_support/manifest/parameter.rb +23 -0
  26. data/lib/zendesk_apps_support/package.rb +402 -0
  27. data/lib/zendesk_apps_support/product.rb +31 -0
  28. data/lib/zendesk_apps_support/sass_functions.rb +43 -0
  29. data/lib/zendesk_apps_support/stylesheet_compiler.rb +38 -0
  30. data/lib/zendesk_apps_support/validations/banner.rb +35 -0
  31. data/lib/zendesk_apps_support/validations/manifest.rb +412 -0
  32. data/lib/zendesk_apps_support/validations/marketplace.rb +31 -0
  33. data/lib/zendesk_apps_support/validations/mime.rb +41 -0
  34. data/lib/zendesk_apps_support/validations/requests.rb +47 -0
  35. data/lib/zendesk_apps_support/validations/requirements.rb +154 -0
  36. data/lib/zendesk_apps_support/validations/secrets.rb +77 -0
  37. data/lib/zendesk_apps_support/validations/secure_settings.rb +37 -0
  38. data/lib/zendesk_apps_support/validations/source.rb +25 -0
  39. data/lib/zendesk_apps_support/validations/stylesheets.rb +28 -0
  40. data/lib/zendesk_apps_support/validations/svg.rb +81 -0
  41. data/lib/zendesk_apps_support/validations/templates.rb +20 -0
  42. data/lib/zendesk_apps_support/validations/translations.rb +160 -0
  43. data/lib/zendesk_apps_support/validations/validation_error.rb +77 -0
  44. metadata +327 -0
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ require 'zendesk_apps_support/engine'
5
+
6
+ autoload :AppFile, 'zendesk_apps_support/app_file'
7
+ autoload :BuildTranslation, 'zendesk_apps_support/build_translation'
8
+ autoload :I18n, 'zendesk_apps_support/i18n'
9
+ autoload :Location, 'zendesk_apps_support/location'
10
+ autoload :Manifest, 'zendesk_apps_support/manifest'
11
+ autoload :Product, 'zendesk_apps_support/product'
12
+ autoload :Package, 'zendesk_apps_support/package'
13
+ autoload :Installed, 'zendesk_apps_support/installed'
14
+ autoload :Installation, 'zendesk_apps_support/installation'
15
+ autoload :Finders, 'zendesk_apps_support/finders'
16
+ autoload :AppRequirement, 'zendesk_apps_support/app_requirement'
17
+ autoload :AppVersion, 'zendesk_apps_support/app_version'
18
+ autoload :StylesheetCompiler, 'zendesk_apps_support/stylesheet_compiler'
19
+
20
+ module Validations
21
+ autoload :ValidationError, 'zendesk_apps_support/validations/validation_error'
22
+ autoload :Manifest, 'zendesk_apps_support/validations/manifest'
23
+ autoload :SecureSettings, 'zendesk_apps_support/validations/secure_settings'
24
+ autoload :Marketplace, 'zendesk_apps_support/validations/marketplace'
25
+ autoload :Mime, 'zendesk_apps_support/validations/mime'
26
+ autoload :Secrets, 'zendesk_apps_support/validations/secrets'
27
+ autoload :Source, 'zendesk_apps_support/validations/source'
28
+ autoload :Templates, 'zendesk_apps_support/validations/templates'
29
+ autoload :Translations, 'zendesk_apps_support/validations/translations'
30
+ autoload :Stylesheets, 'zendesk_apps_support/validations/stylesheets'
31
+ autoload :Requirements, 'zendesk_apps_support/validations/requirements'
32
+ autoload :Requests, 'zendesk_apps_support/validations/requests'
33
+ autoload :Banner, 'zendesk_apps_support/validations/banner'
34
+ autoload :Svg, 'zendesk_apps_support/validations/svg'
35
+ end
36
+
37
+ class Manifest
38
+ autoload :LocationOptions, 'zendesk_apps_support/manifest/location_options'
39
+ autoload :Parameter, 'zendesk_apps_support/manifest/parameter'
40
+ autoload :NoOverrideHash, 'zendesk_apps_support/manifest/no_override_hash'
41
+ end
42
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ class AppFile
5
+ attr_reader :relative_path
6
+ attr_reader :absolute_path
7
+
8
+ def initialize(package, relative_path)
9
+ @relative_path = relative_path
10
+ @file = File.new(package.path_to(relative_path))
11
+ @absolute_path = File.absolute_path @file.path
12
+ end
13
+
14
+ def read
15
+ File.read @file.path
16
+ end
17
+
18
+ def extension
19
+ File.extname relative_path
20
+ end
21
+
22
+ def =~(regex)
23
+ relative_path =~ regex
24
+ end
25
+
26
+ def match(regex)
27
+ self =~ regex
28
+ end
29
+
30
+ alias_method :to_s, :relative_path
31
+
32
+ def method_missing(sym, *args, &block)
33
+ if @file.respond_to?(sym)
34
+ @file.call(sym, *args, &block)
35
+ else
36
+ super
37
+ end
38
+ end
39
+
40
+ def respond_to_missing?(sym, include_private = false)
41
+ @file.send(:respond_to_missing?, sym, include_private) || super
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ class AppRequirement
5
+ CUSTOM_OBJECTS_KEY = 'custom_objects'
6
+ CUSTOM_OBJECTS_TYPE_KEY = 'custom_object_types'
7
+ CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY = 'custom_object_relationship_types'
8
+ TYPES = %w[automations channel_integrations custom_objects macros targets views ticket_fields
9
+ triggers user_fields organization_fields].freeze
10
+ end
11
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ # At any point in time, we support up to four versions:
5
+ # * deprecated -- we will still serve apps targeting the deprecated version,
6
+ # but newly created or updated apps CANNOT target it
7
+ # * sunsetting -- we will soon be removing support for this version;
8
+ # updated apps SHOULD target the current version, no new apps allowed
9
+ # * current -- we will serve apps targeting the current version;
10
+ # newly created or updated apps SHOULD target it
11
+ # * future -- we will serve apps targeting the future version;
12
+ # newly created or updates apps MAY target it, but it
13
+ # may change without notice
14
+ class AppVersion
15
+ DEPRECATED = ['0.5', '1.0'].freeze
16
+ SUNSETTING = nil
17
+ CURRENT = '2.0'
18
+ FUTURE = nil
19
+
20
+ TO_BE_SERVED = [DEPRECATED, SUNSETTING, CURRENT, FUTURE].flatten.compact.freeze
21
+ VALID_FOR_UPDATE = [SUNSETTING, CURRENT, FUTURE].compact.freeze
22
+ VALID_FOR_CREATE = [CURRENT, FUTURE].compact.freeze
23
+
24
+ attr_reader :current
25
+
26
+ def initialize(version)
27
+ @version = version.to_s.freeze
28
+ @current = CURRENT
29
+ freeze
30
+ end
31
+
32
+ def servable?
33
+ TO_BE_SERVED.include?(@version)
34
+ end
35
+
36
+ def valid_for_update?
37
+ VALID_FOR_UPDATE.include?(@version)
38
+ end
39
+
40
+ def valid_for_create?
41
+ VALID_FOR_CREATE.include?(@version)
42
+ end
43
+
44
+ def deprecated?
45
+ DEPRECATED.include?(@version)
46
+ end
47
+
48
+ def sunsetting?
49
+ @version == SUNSETTING
50
+ end
51
+
52
+ def obsolete?
53
+ !servable?
54
+ end
55
+
56
+ def blank?
57
+ @version.nil? || @version == ''
58
+ end
59
+
60
+ def present?
61
+ !blank?
62
+ end
63
+
64
+ def to_s
65
+ @version
66
+ end
67
+
68
+ def to_json(*)
69
+ @version.inspect
70
+ end
71
+
72
+ def ==(other)
73
+ @version == other.to_s
74
+ end
75
+ end
76
+
77
+ AppVersion.freeze
78
+ end
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
3
+ viewBox="0 0 18 18" style="enable-background:new 0 0 18 18;" xml:space="preserve">
4
+ <path id="Fill-3" d="M1.5,6.1C1.3,5.9,1,6,1,6.4l0,7c0,0.3,0.2,0.7,0.5,0.9l6,3.6C7.8,18.1,8,18,8,17.6l0-7.1c0-0.3-0.2-0.7-0.5-0.9
5
+ L1.5,6.1z"/>
6
+ <path id="Fill-5" d="M10.5,17.9c-0.3,0.2-0.5,0-0.5-0.3l0-7c0-0.3,0.2-0.7,0.5-0.9l6-3.6C16.8,5.9,17,6,17,6.4l0,7.1
7
+ c0,0.3-0.2,0.7-0.5,0.9L10.5,17.9z"/>
8
+ <path id="Fill-1" d="M2.2,3.7c-0.3,0.2-0.3,0.4,0,0.6l6.2,3.6C8.7,8,9.2,8,9.4,7.9l6.3-3.6c0.3-0.2,0.3-0.4,0-0.6L9.5,0.1
9
+ C9.2,0,8.8,0,8.5,0.1L2.2,3.7z"/>
10
+ </svg>
@@ -0,0 +1,3 @@
1
+ header .logo {
2
+ background-image: app-asset-url("logo-small.png");
3
+ }
@@ -0,0 +1,10 @@
1
+ <header>
2
+ <span class="logo"></span>
3
+ <h3>{{setting "name"}}</h3>
4
+ </header>
5
+ <section data-main></section>
6
+ <footer>
7
+ <a href="mailto:{{author.email}}">
8
+ {{author.name}}
9
+ </a>
10
+ </footer>
@@ -0,0 +1,21 @@
1
+ (function() {
2
+ <% appsjs.each do |appjs| %>
3
+ <%= appjs %>
4
+ <% end %>
5
+
6
+ <% installations.each do |installation| %>
7
+ if (ZendeskApps[<%= installation.app_name.to_json %>]) {
8
+ ZendeskApps[<%= installation.app_name.to_json %>].install(<%= installation.to_json %>);
9
+ }
10
+ <% end %>
11
+
12
+ <% installation_orders.each do |loc_name, installation_list| %>
13
+ ZendeskApps.sortAppsForSite(<%= loc_name.to_json %>, <%= installation_list.to_json %>);
14
+ <% end %>
15
+ }());
16
+
17
+ <% unless rollbar_zaf_access_token.empty? %>
18
+ ZendeskApps.rollbarAccessToken = "<%= rollbar_zaf_access_token %>";
19
+ <% end %>
20
+
21
+ ZendeskApps.trigger && ZendeskApps.trigger('ready');
@@ -0,0 +1,37 @@
1
+ <% unless iframe_only %>
2
+ with( ZendeskApps.AppScope.create() ) {
3
+ <% unless modules.empty? %>
4
+ require.modules = {
5
+ <% modules.each do |path, content| %>
6
+ <%= path.to_json %>: function(exports, require, module) {
7
+ <%= content %>
8
+ },
9
+ <% end %>
10
+ eom: undefined
11
+ };
12
+ <% end %>
13
+
14
+ var source = <%= source %>;
15
+ }
16
+ <% end %>
17
+ var app = ZendeskApps.defineApp(<%= iframe_only ? 'null' : 'source' %>)
18
+ .reopenClass(<%= app_class_properties.to_json %>)
19
+ .reopen({
20
+ appName: <%= name.to_json %>,
21
+ appVersion: <%= version.to_json %>,
22
+ locationIcons: <%= location_icons.to_json %>,
23
+ assetUrlPrefix: <%= asset_url_prefix.to_json %>,
24
+ logoAssetHash: <%= logo_asset_hash.to_json %>,
25
+ appClassName: <%= app_class_name.to_json %>,
26
+ author: {
27
+ name: <%= author['name'].to_json %>,
28
+ email: <%= author['email'].to_json %>
29
+ },
30
+ <% unless iframe_only %>
31
+ translations: <%= translations.to_json %>,
32
+ templates: <%= templates.to_json %>,
33
+ <% end %>
34
+ frameworkVersion: <%= framework_version.to_json %>
35
+ });
36
+
37
+ ZendeskApps[<%= name.to_json %>] = app;
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ module BuildTranslation
5
+ I18N_TITLE_KEY = 'title'
6
+ I18N_VALUE_KEY = 'value'
7
+ I18N_KEYS = [I18N_TITLE_KEY, I18N_VALUE_KEY].freeze
8
+
9
+ def to_flattened_namespaced_hash(hash, target_key = nil, prefix = nil)
10
+ hash.each_with_object({}) do |(key, value), result|
11
+ key = [prefix, key].compact.join('.')
12
+ if value.is_a?(Hash)
13
+ if target_key && translation_hash?(value)
14
+ result[key] = value[target_key]
15
+ else
16
+ result.update(to_flattened_namespaced_hash(value, target_key, key))
17
+ end
18
+ else
19
+ result[key] = value
20
+ end
21
+ end
22
+ end
23
+
24
+ def remove_zendesk_keys(scope, translations = {})
25
+ scope.each_key do |key|
26
+ context = scope[key]
27
+
28
+ if context.is_a?(Hash)
29
+
30
+ if translation_hash?(context)
31
+ translations[key] = context[I18N_VALUE_KEY]
32
+ else
33
+ translations[key] ||= {}
34
+ translations[key] = remove_zendesk_keys(context, translations[key])
35
+ end
36
+
37
+ else
38
+ translations[key] = context
39
+ end
40
+ end
41
+
42
+ translations
43
+ end
44
+
45
+ private
46
+
47
+ def translation_hash?(hash)
48
+ hash.keys.sort == I18N_KEYS
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ if Object.const_defined?(:Rails) && Rails.const_defined?(:Engine)
4
+
5
+ module ZendeskAppsSupport
6
+ class Engine < Rails::Engine
7
+ engine_name 'zendesk_apps_support'
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ module Finders
5
+ class RecordNotFound < StandardError
6
+ def initialize(msg)
7
+ super(msg)
8
+ end
9
+ end
10
+
11
+ def find_by(arg)
12
+ all.find(&filter_by_arg(arg))
13
+ end
14
+
15
+ def find_by!(arg)
16
+ found = find_by(arg)
17
+ raise(RecordNotFound, "Unable to find #{name} with #{arg.inspect}") if found.nil?
18
+ found
19
+ end
20
+
21
+ def where(arg)
22
+ all.select(&filter_by_arg(arg))
23
+ end
24
+
25
+ private
26
+
27
+ def filter_by_arg(arg)
28
+ lambda do |findable_record|
29
+ arg.all? do |attribute, value|
30
+ value = value.to_s if value.is_a? Symbol
31
+ findable_record.public_send(attribute) == value
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ module I18n
5
+ class << self
6
+ def t(key, *args)
7
+ i18n.t(key, *args)
8
+ end
9
+
10
+ def set_load_path
11
+ i18n
12
+ nil
13
+ end
14
+
15
+ private
16
+
17
+ def i18n
18
+ @i18n ||= begin
19
+ require 'i18n'
20
+ ::I18n.load_path += locale_files
21
+ ::I18n
22
+ end
23
+ end
24
+
25
+ def locale_files
26
+ Dir[File.expand_path('../../../config/locales/*.yml', __FILE__)] -
27
+ Dir[File.expand_path('../../../config/locales/*.zendesk.yml', __FILE__)]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ZendeskAppsSupport
4
+ class Installation
5
+ attr_accessor :id, :app_id, :app_name, :requirements, :settings, :enabled, :collapsible, :updated_at, :created_at
6
+ attr_accessor :plan
7
+
8
+ def initialize(options)
9
+ options.each do |k, v|
10
+ public_send("#{k}=", v)
11
+ end
12
+ end
13
+
14
+ def to_json
15
+ hash = {}
16
+ instance_variables.each do |var|
17
+ hash[var.to_s.sub('@', '')] = instance_variable_get var
18
+ end
19
+ hash.to_json
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'erubis'
4
+
5
+ module ZendeskAppsSupport
6
+ class Installed
7
+ extend Gem::Deprecate
8
+ INSTALLED_TEMPLATE = Erubis::Eruby.new(File.read(File.expand_path('../assets/installed.js.erb', __FILE__)))
9
+
10
+ def initialize(appsjs, installations = [])
11
+ @appsjs = appsjs
12
+ @installations = installations
13
+ end
14
+
15
+ def compile(options = {})
16
+ INSTALLED_TEMPLATE.result(
17
+ appsjs: @appsjs,
18
+ installations: @installations,
19
+ installation_orders: options.fetch(:installation_orders, {}),
20
+ rollbar_zaf_access_token: options.fetch(:rollbar_zaf_access_token, '')
21
+ )
22
+ end
23
+
24
+ alias compile_js compile
25
+ deprecate :compile_js, :compile, 2017, 1
26
+ end
27
+ end