xat_support 1.29.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +176 -0
  3. data/README.md +33 -0
  4. data/config/locales/en.yml +85 -0
  5. data/config/locales/translations/zendesk_apps_support.yml +210 -0
  6. data/lib/xat_support.rb +30 -0
  7. data/lib/zendesk_apps_support/app_file.rb +38 -0
  8. data/lib/zendesk_apps_support/app_requirement.rb +5 -0
  9. data/lib/zendesk_apps_support/app_version.rb +64 -0
  10. data/lib/zendesk_apps_support/assets/default_styles.scss +3 -0
  11. data/lib/zendesk_apps_support/assets/default_template.html.erb +10 -0
  12. data/lib/zendesk_apps_support/assets/installed.js.erb +17 -0
  13. data/lib/zendesk_apps_support/assets/src.js.erb +39 -0
  14. data/lib/zendesk_apps_support/build_translation.rb +50 -0
  15. data/lib/zendesk_apps_support/engine.rb +9 -0
  16. data/lib/zendesk_apps_support/i18n.rb +28 -0
  17. data/lib/zendesk_apps_support/installation.rb +20 -0
  18. data/lib/zendesk_apps_support/installed.rb +22 -0
  19. data/lib/zendesk_apps_support/location.rb +29 -0
  20. data/lib/zendesk_apps_support/package.rb +339 -0
  21. data/lib/zendesk_apps_support/product.rb +15 -0
  22. data/lib/zendesk_apps_support/sass_functions.rb +20 -0
  23. data/lib/zendesk_apps_support/stylesheet_compiler.rb +23 -0
  24. data/lib/zendesk_apps_support/validations/banner.rb +33 -0
  25. data/lib/zendesk_apps_support/validations/manifest.rb +214 -0
  26. data/lib/zendesk_apps_support/validations/marketplace.rb +20 -0
  27. data/lib/zendesk_apps_support/validations/requirements.rb +105 -0
  28. data/lib/zendesk_apps_support/validations/source.rb +95 -0
  29. data/lib/zendesk_apps_support/validations/stylesheets.rb +29 -0
  30. data/lib/zendesk_apps_support/validations/templates.rb +18 -0
  31. data/lib/zendesk_apps_support/validations/translations.rb +64 -0
  32. data/lib/zendesk_apps_support/validations/validation_error.rb +101 -0
  33. metadata +229 -0
@@ -0,0 +1,29 @@
1
+ require 'zendesk_apps_support/stylesheet_compiler'
2
+
3
+ module ZendeskAppsSupport
4
+ module Validations
5
+ module Stylesheets
6
+ class << self
7
+ def call(package)
8
+ if css_error = validate_styles(package.app_css)
9
+ [css_error]
10
+ else
11
+ []
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def validate_styles(css)
18
+ compiler = ZendeskAppsSupport::StylesheetCompiler.new(css, nil, nil)
19
+ begin
20
+ compiler.compile
21
+ rescue Sass::SyntaxError => e
22
+ return ValidationError.new(:stylesheet_error, sass_error: e.message)
23
+ end
24
+ nil
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ module ZendeskAppsSupport
2
+ module Validations
3
+ module Templates
4
+ class <<self
5
+ def call(package)
6
+ errors = []
7
+ package.template_files.each do |template|
8
+ contents = template.read
9
+ if contents =~ /<\s*style\b/
10
+ errors << ValidationError.new(:style_in_template, template: template.relative_path)
11
+ end
12
+ end
13
+ errors
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,64 @@
1
+ require 'json'
2
+
3
+ module ZendeskAppsSupport
4
+ module Validations
5
+ module Translations
6
+ TRANSLATIONS_PATH = %r{^translations/(.*)\.json$}
7
+ VALID_LOCALE = /^[a-z]{2}(-\w{2,3})?$/
8
+
9
+ class TranslationFormatError < StandardError
10
+ end
11
+
12
+ class << self
13
+ def call(package)
14
+ package.files.inject([]) do |errors, file|
15
+ if path_match = TRANSLATIONS_PATH.match(file.relative_path)
16
+ errors << locale_error(file, path_match[1]) << json_error(file)
17
+ end
18
+ errors
19
+ end.compact
20
+ end
21
+
22
+ private
23
+
24
+ def locale_error(file, locale)
25
+ return nil if VALID_LOCALE =~ locale
26
+ ValidationError.new('translation.invalid_locale', file: file.relative_path)
27
+ end
28
+
29
+ def json_error(file)
30
+ json = JSON.load(file.read)
31
+ if json.is_a?(Hash)
32
+ if json['app'] && json['app']['package']
33
+ json['app'].delete('package')
34
+ begin
35
+ validate_translation_format(json)
36
+ return
37
+ rescue TranslationFormatError => e
38
+ ValidationError.new('translation.invalid_format', field: e.message)
39
+ end
40
+ end
41
+ else
42
+ ValidationError.new('translation.not_json_object', file: file.relative_path)
43
+ end
44
+ rescue JSON::ParserError => e
45
+ ValidationError.new('translation.not_json', file: file.relative_path, errors: e)
46
+ end
47
+
48
+ def validate_translation_format(json)
49
+ json.keys.each do |key|
50
+ fail TranslationFormatError.new("'#{key}': '#{json[key]}'") unless json[key].is_a? Hash
51
+
52
+ if json[key].keys.sort == BuildTranslation::I18N_KEYS &&
53
+ json[key][BuildTranslation::I18N_TITLE_KEY].class == String &&
54
+ json[key][BuildTranslation::I18N_VALUE_KEY].class == String
55
+ next
56
+ else
57
+ validate_translation_format(json[key])
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,101 @@
1
+ require 'json'
2
+
3
+ module ZendeskAppsSupport
4
+ module Validations
5
+ class ValidationError < StandardError
6
+ KEY_PREFIX = 'txt.apps.admin.error.app_build.'.freeze
7
+
8
+ class DeserializationError < StandardError
9
+ def initialize(serialized)
10
+ super "Cannot deserialize ValidationError from #{serialized}"
11
+ end
12
+ end
13
+
14
+ class << self
15
+ # Turn a JSON string into a ValidationError.
16
+ def from_json(json)
17
+ hash = JSON.load(json)
18
+ fail DeserializationError.new(json) unless hash.is_a?(Hash)
19
+ from_hash(hash)
20
+ rescue JSON::ParserError, NameError
21
+ raise DeserializationError.new(json)
22
+ end
23
+
24
+ def from_hash(hash)
25
+ fail DeserializationError.new(hash) unless hash['class']
26
+ klass = constantize(hash['class'])
27
+ fail DeserializationError.new(hash) unless klass <= self
28
+ klass.vivify(hash)
29
+ end
30
+
31
+ # Turn a Hash into a ValidationError. Used within from_json.
32
+ def vivify(hash)
33
+ new(hash['key'], hash['data'])
34
+ end
35
+
36
+ private
37
+
38
+ def constantize(klass)
39
+ klass.to_s.split('::').inject(Object) { |klass, part| klass.const_get(part) }
40
+ end
41
+ end
42
+
43
+ attr_reader :key, :data
44
+
45
+ def initialize(key, data = nil)
46
+ @key, @data = key, symbolize_keys(data || {})
47
+ end
48
+
49
+ def to_s
50
+ ZendeskAppsSupport::I18n.t("#{KEY_PREFIX}#{key}", data)
51
+ end
52
+
53
+ def to_json(*)
54
+ JSON.generate(as_json)
55
+ end
56
+
57
+ def as_json(*)
58
+ {
59
+ 'class' => self.class.to_s,
60
+ 'key' => key,
61
+ 'data' => data
62
+ }
63
+ end
64
+
65
+ private
66
+
67
+ def symbolize_keys(hash)
68
+ hash.inject({}) do |result, (key, value)|
69
+ result[key.to_sym] = value
70
+ result
71
+ end
72
+ end
73
+ end
74
+
75
+ class ESLintValidationError < ValidationError
76
+ attr_reader :filename, :eslint_errors
77
+
78
+ def self.vivify(hash)
79
+ new(hash['filename'], hash['eslint_errors'])
80
+ end
81
+
82
+ def initialize(filename, eslint_errors)
83
+ errors = eslint_errors.compact.map { |err| "\n L#{err['line']}: #{err['message']}" }.join('')
84
+ @filename = filename, @eslint_errors = eslint_errors
85
+ super(:eslint, {
86
+ file: filename,
87
+ errors: errors,
88
+ count: eslint_errors.length
89
+ })
90
+ end
91
+
92
+ def as_json(*)
93
+ {
94
+ 'class' => self.class.to_s,
95
+ 'filename' => filename,
96
+ 'eslint_errors' => eslint_errors
97
+ }
98
+ end
99
+ end
100
+ end
101
+ end
metadata ADDED
@@ -0,0 +1,229 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: xat_support
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.29.3
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: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sass
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: json
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: json-stream
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: image_size
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: erubis
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
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: babel-transpiler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
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: therubyracer
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
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: eslintrb
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 2.0.2
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 2.0.2
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: 3.4.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: 3.4.0
153
+ - !ruby/object:Gem::Dependency
154
+ name: bump
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.5.1
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.5.1
167
+ description: Support to help you develop Zendesk Apps.
168
+ email:
169
+ - okwant@zendesk.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - LICENSE
175
+ - README.md
176
+ - config/locales/en.yml
177
+ - config/locales/translations/zendesk_apps_support.yml
178
+ - lib/xat_support.rb
179
+ - lib/zendesk_apps_support/app_file.rb
180
+ - lib/zendesk_apps_support/app_requirement.rb
181
+ - lib/zendesk_apps_support/app_version.rb
182
+ - lib/zendesk_apps_support/assets/default_styles.scss
183
+ - lib/zendesk_apps_support/assets/default_template.html.erb
184
+ - lib/zendesk_apps_support/assets/installed.js.erb
185
+ - lib/zendesk_apps_support/assets/src.js.erb
186
+ - lib/zendesk_apps_support/build_translation.rb
187
+ - lib/zendesk_apps_support/engine.rb
188
+ - lib/zendesk_apps_support/i18n.rb
189
+ - lib/zendesk_apps_support/installation.rb
190
+ - lib/zendesk_apps_support/installed.rb
191
+ - lib/zendesk_apps_support/location.rb
192
+ - lib/zendesk_apps_support/package.rb
193
+ - lib/zendesk_apps_support/product.rb
194
+ - lib/zendesk_apps_support/sass_functions.rb
195
+ - lib/zendesk_apps_support/stylesheet_compiler.rb
196
+ - lib/zendesk_apps_support/validations/banner.rb
197
+ - lib/zendesk_apps_support/validations/manifest.rb
198
+ - lib/zendesk_apps_support/validations/marketplace.rb
199
+ - lib/zendesk_apps_support/validations/requirements.rb
200
+ - lib/zendesk_apps_support/validations/source.rb
201
+ - lib/zendesk_apps_support/validations/stylesheets.rb
202
+ - lib/zendesk_apps_support/validations/templates.rb
203
+ - lib/zendesk_apps_support/validations/translations.rb
204
+ - lib/zendesk_apps_support/validations/validation_error.rb
205
+ homepage: https://github.com/ocke/xat_support
206
+ licenses:
207
+ - Apache License Version 2.0
208
+ metadata: {}
209
+ post_install_message:
210
+ rdoc_options: []
211
+ require_paths:
212
+ - lib
213
+ required_ruby_version: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ">="
216
+ - !ruby/object:Gem::Version
217
+ version: '0'
218
+ required_rubygems_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 1.3.6
223
+ requirements: []
224
+ rubyforge_project:
225
+ rubygems_version: 2.6.4
226
+ signing_key:
227
+ specification_version: 4
228
+ summary: Support to help you develop Zendesk Apps.
229
+ test_files: []