zendesk_apps_support 4.29.4

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 (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