zendesk_apps_tools 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +13 -0
- data/README.md +117 -0
- data/bin/zat +5 -0
- data/features/clean.feature +9 -0
- data/features/new.feature +61 -0
- data/features/package.feature +15 -0
- data/features/step_definitions/app_steps.rb +63 -0
- data/features/support/env.rb +5 -0
- data/features/validate.feature +15 -0
- data/lib/zendesk_apps_tools.rb +4 -0
- data/lib/zendesk_apps_tools/command.rb +182 -0
- data/lib/zendesk_apps_tools/server.rb +14 -0
- data/template/app.css +0 -0
- data/template/app.js +12 -0
- data/template/assets/logo-small.png +0 -0
- data/template/assets/logo.png +0 -0
- data/template/manifest.json.tt +11 -0
- data/template/templates/layout.hdbs +11 -0
- data/template/translations/en.json +6 -0
- metadata +170 -0
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright 2013 Zendesk
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/README.md
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
# Zendesk Apps Tools
|
2
|
+
|
3
|
+
These tools make it easy to develop [Zendesk Apps](http://developer.zendesk.com/documentation/apps/).
|
4
|
+
|
5
|
+
# How to use
|
6
|
+
|
7
|
+
**STEP 1**: Install 'zat' using [RubyGems](http://rubygems.org/gems/zendesk_apps_tools).
|
8
|
+
|
9
|
+
$ gem install zendesk_apps_tools
|
10
|
+
|
11
|
+
**STEP 2**: Create a new app using 'zat'. Here's an example:
|
12
|
+
|
13
|
+
$ zat new
|
14
|
+
Enter this app author's name:
|
15
|
+
John Smith
|
16
|
+
Enter this app author's email:
|
17
|
+
john@example.com
|
18
|
+
Enter a name for this new app:
|
19
|
+
Test App
|
20
|
+
Enter a directory name to save the new app (will create the dir if it dose not exist, default to current dir):
|
21
|
+
/tmp/test-app
|
22
|
+
create /tmp/test-app
|
23
|
+
create /tmp/test-app/app.css
|
24
|
+
create /tmp/test-app/app.js
|
25
|
+
create /tmp/test-app/assets/logo-small.png
|
26
|
+
create /tmp/test-app/assets/logo.png
|
27
|
+
create /tmp/test-app/manifest.json
|
28
|
+
create /tmp/test-app/templates/layout.hdbs
|
29
|
+
create /tmp/test-app/translations/en.json
|
30
|
+
|
31
|
+
**STEP 3**: Work on the new app by editing/adding the files in /tmp/test-app folder.
|
32
|
+
|
33
|
+
**STEP 4**: Validate the app.
|
34
|
+
|
35
|
+
$ zat validate --path /tmp/test-app
|
36
|
+
|
37
|
+
**STEP 5**: Preview the app.
|
38
|
+
|
39
|
+
To preview a local app, follow these steps:
|
40
|
+
|
41
|
+
1) Start zat server
|
42
|
+
|
43
|
+
$ zat server --path /tmp/test-app
|
44
|
+
|
45
|
+
[2013-01-10 16:54:48] INFO WEBrick 1.3.1
|
46
|
+
[2013-01-10 16:54:48] INFO ruby 1.9.3 (2012-04-20) [x86_64-darwin12.0.0]
|
47
|
+
== Sinatra/1.3.3 has taken the stage on 4567 for development with backup from WEBrick
|
48
|
+
[2013-01-10 16:54:48] INFO WEBrick::HTTPServer#start: pid=76568 port=4567
|
49
|
+
|
50
|
+
2) In your favorite browser, navigate to a ticket in New Zendesk. The URL should be something like https://subdomain.zendesk.com/agent/#/tickets/1
|
51
|
+
|
52
|
+
3) Edit the URL in the address bar to include a 'zat' parameter `?zat=http://localhost:4567/app.js`, then reload the page.
|
53
|
+
|
54
|
+
The full url should look something like this: https://subdomain.zendesk.com/agent/?zat=http://localhost:4567/app.js#/tickets/1
|
55
|
+
|
56
|
+
The value of 'zat' is the web address to serve the app locally. The port number should match the 'zat server' port number from previous step.
|
57
|
+
|
58
|
+
4) Reload the apps by clicking the 'Reload Apps' link. The local app will appear in the app panel.
|
59
|
+
(Note: if you are using Chrome, and you see a 'Shield' icon in the address bar, click that icon, and it says 'This page has insecure content', then click 'Load Anyway'. This is because the page is using https, but we are loading the local app using http.)
|
60
|
+
|
61
|
+
**STEP 6**: Package the app.
|
62
|
+
|
63
|
+
$ zat package --path /tmp/test-app
|
64
|
+
Enter a zendesk URL that you'd like to install the app (for example: 'http://abc.zendesk.com', default to 'http://support.zendesk.com'):
|
65
|
+
|
66
|
+
validate OK
|
67
|
+
package adding app.css
|
68
|
+
package adding app.js
|
69
|
+
package adding assets/logo-small.png
|
70
|
+
package adding assets/logo.png
|
71
|
+
package adding manifest.json
|
72
|
+
package adding templates/layout.hdbs
|
73
|
+
package adding translations/en.json
|
74
|
+
package created at /tmp/test-app/tmp/app-20130110164906.zip
|
75
|
+
|
76
|
+
Now you can [upload the created zip](http://developer.zendesk.com/documentation/apps/uploading.html).
|
77
|
+
|
78
|
+
# Features
|
79
|
+
|
80
|
+
### Create a Zendesk App
|
81
|
+
Create a template for a Zendesk App.
|
82
|
+
|
83
|
+
$ zat new
|
84
|
+
|
85
|
+
### Validate an App
|
86
|
+
Run a suite of validations against your App:
|
87
|
+
|
88
|
+
$ zat validate
|
89
|
+
|
90
|
+
This will run the same validations that run when an App is uploaded to the Zendesk App Market.
|
91
|
+
|
92
|
+
### Preview the App
|
93
|
+
Run a http server to serve the App locally.
|
94
|
+
|
95
|
+
$ zat server
|
96
|
+
|
97
|
+
### Package the app
|
98
|
+
Create a zip file that you can [upload](http://developer.zendesk.com/documentation/apps/uploading.html).
|
99
|
+
|
100
|
+
$ zat package
|
101
|
+
|
102
|
+
### Clean tmp folder inside an App
|
103
|
+
Remove zip files in the tmp folder.
|
104
|
+
|
105
|
+
$ zat clean
|
106
|
+
|
107
|
+
# Supported Ruby Versions
|
108
|
+
|
109
|
+
Tested with Ruby 1.8.7 and 1.9.3
|
110
|
+
|
111
|
+
# Contribution
|
112
|
+
|
113
|
+
Improvements are always welcome. To contribute, please submit detailed Pull Requests.
|
114
|
+
|
115
|
+
# Issues
|
116
|
+
|
117
|
+
Please submit bug reports to <a href="https://support.zendesk.com/requests/new">Zendesk</a>.
|
data/bin/zat
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Feature: clean tmp folder inside the zendesk app
|
2
|
+
|
3
|
+
Background: create a new zendesk app package
|
4
|
+
Given an app is created in directory "tmp/aruba"
|
5
|
+
And I run the command "zat package --path tmp/aruba" to package the app
|
6
|
+
|
7
|
+
Scenario: clean tmp folder
|
8
|
+
When I run the command "zat clean --path tmp/aruba" to clean the app
|
9
|
+
Then the zip file in "tmp/aruba/tmp" folder should not exist
|
@@ -0,0 +1,61 @@
|
|
1
|
+
Feature: create a template for a new zendesk app
|
2
|
+
|
3
|
+
Scenario: create a template for a new zendesk app by running 'zat new' command
|
4
|
+
Given an app directory "tmp/aruba" exists
|
5
|
+
When I run "zat new" command with the following details:
|
6
|
+
| author name | John Citizen |
|
7
|
+
| author email | john@example.com |
|
8
|
+
| app name | John Test App |
|
9
|
+
|
10
|
+
Then the app file "tmp/aruba/manifest.json" is created with:
|
11
|
+
"""
|
12
|
+
{
|
13
|
+
"name": "John Test App",
|
14
|
+
"author": {
|
15
|
+
"name": "John Citizen",
|
16
|
+
"email": "john@example.com"
|
17
|
+
},
|
18
|
+
"defaultLocale": "en",
|
19
|
+
"private": true,
|
20
|
+
"location": "ticket_sidebar",
|
21
|
+
"frameworkVersion": "0.5"
|
22
|
+
}
|
23
|
+
"""
|
24
|
+
And the app file "tmp/aruba/app.js" is created with:
|
25
|
+
"""
|
26
|
+
(function() {
|
27
|
+
|
28
|
+
return {
|
29
|
+
events: {
|
30
|
+
'app.activated':'doSomething'
|
31
|
+
},
|
32
|
+
|
33
|
+
doSomething: function() {
|
34
|
+
}
|
35
|
+
};
|
36
|
+
|
37
|
+
}());
|
38
|
+
"""
|
39
|
+
And the app file "tmp/aruba/templates/layout.hdbs" is created with:
|
40
|
+
"""
|
41
|
+
<header>
|
42
|
+
<span class="logo"/>
|
43
|
+
<h3>{{setting "name"}}</h3>
|
44
|
+
</header>
|
45
|
+
<section data-main/>
|
46
|
+
<footer>
|
47
|
+
<a href="mailto:{{author.email}}">
|
48
|
+
{{author.name}}
|
49
|
+
</a>
|
50
|
+
</footer>
|
51
|
+
</div>
|
52
|
+
"""
|
53
|
+
And the app file "tmp/aruba/translations/en.json" is created with:
|
54
|
+
"""
|
55
|
+
{
|
56
|
+
"app": {
|
57
|
+
"description": "Play the famous zen tunes in your help desk.",
|
58
|
+
"name": "Buddha Machine"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
"""
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: package a zendesk app into a zip file
|
2
|
+
|
3
|
+
Background: create a new zendesk app
|
4
|
+
Given an app is created in directory "tmp/aruba"
|
5
|
+
|
6
|
+
Scenario: package a zendesk app by running 'zat package' command
|
7
|
+
When I run the command "zat package --path tmp/aruba" to package the app
|
8
|
+
And the command output should contain "adding app.js"
|
9
|
+
And the command output should contain "adding assets/logo-small.png"
|
10
|
+
And the command output should contain "adding assets/logo.png"
|
11
|
+
And the command output should contain "adding manifest.json"
|
12
|
+
And the command output should contain "adding templates/layout.hdbs"
|
13
|
+
And the command output should contain "adding translations/en.json"
|
14
|
+
And the command output should contain "created"
|
15
|
+
And the zip file should exist in directory "tmp/aruba/tmp"
|
@@ -0,0 +1,63 @@
|
|
1
|
+
Given /^an app directory "(.*?)" exists$/ do |app_dir|
|
2
|
+
@app_dir = app_dir
|
3
|
+
FileUtils.rm_rf(@app_dir)
|
4
|
+
FileUtils.mkdir_p(@app_dir)
|
5
|
+
end
|
6
|
+
|
7
|
+
Given /^an app is created in directory "(.*?)"$/ do |app_dir|
|
8
|
+
steps %Q{
|
9
|
+
Given an app directory "#{app_dir}" exists
|
10
|
+
And I run "zat new" command with the following details:
|
11
|
+
| author name | John Citizen |
|
12
|
+
| author email | john@example.com |
|
13
|
+
| app name | John Test App |
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
When /^I run "(.*?)" command with the following details:$/ do |cmd, table|
|
18
|
+
IO.popen(cmd, "w+") do |pipe|
|
19
|
+
key = table.rows_hash
|
20
|
+
pipe.puts key["author name"]
|
21
|
+
pipe.puts key["author email"]
|
22
|
+
pipe.puts key["app name"]
|
23
|
+
pipe.puts @app_dir
|
24
|
+
pipe.close_write
|
25
|
+
@output = pipe.readlines
|
26
|
+
@output.each {|line| puts line}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
When /^I run the command "(.*?)" to (validate|package|clean) the app$/ do |cmd, action|
|
31
|
+
IO.popen(cmd, "w+") do |pipe|
|
32
|
+
pipe.puts "\n"
|
33
|
+
pipe.close_write
|
34
|
+
@output = pipe.readlines
|
35
|
+
@output.each {|line| puts line}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Then /^the app file "(.*?)" is created with:$/ do |file, content|
|
40
|
+
File.read(file).chomp.gsub(' ', '').should == content.gsub(' ', '')
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
Then /^the zip file should exist in directory "(.*?)"$/ do |path|
|
45
|
+
Dir[path + '/app-*.zip'].size.should == 1
|
46
|
+
end
|
47
|
+
|
48
|
+
Given /^I remove file "(.*?)"$/ do |file|
|
49
|
+
File.delete(file)
|
50
|
+
end
|
51
|
+
|
52
|
+
Then /^the zip file in "(.*?)" folder should not exist$/ do |path|
|
53
|
+
Dir[path + '/app-*.zip'].size.should == 0
|
54
|
+
end
|
55
|
+
|
56
|
+
Then /^it should pass the validation$/ do
|
57
|
+
@output.last.should =~ /OK/
|
58
|
+
$?.should == 0
|
59
|
+
end
|
60
|
+
|
61
|
+
Then /^the command output should contain "(.*?)"$/ do |output|
|
62
|
+
@output.join.should =~ /#{output}/
|
63
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: validate a zendesk app
|
2
|
+
|
3
|
+
Validate a zendesk app by running 'zat package' command
|
4
|
+
|
5
|
+
Background: create a new zendesk app
|
6
|
+
Given an app is created in directory "tmp/aruba"
|
7
|
+
|
8
|
+
Scenario: valid app
|
9
|
+
When I run the command "zat validate --path tmp/aruba" to validate the app
|
10
|
+
Then it should pass the validation
|
11
|
+
|
12
|
+
Scenario: invalid app (missing manifest.json
|
13
|
+
Given I remove file "tmp/aruba/manifest.json"
|
14
|
+
When I run the command "zat validate --path tmp/aruba" to validate the app
|
15
|
+
Then the command output should contain "Could not find manifest.json"
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require "thor"
|
2
|
+
require 'zip/zip'
|
3
|
+
require 'pathname'
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module ZendeskAppsTools
|
8
|
+
require 'zendesk_apps_support'
|
9
|
+
|
10
|
+
class Command < Thor
|
11
|
+
|
12
|
+
DEFAULT_ZENDESK_URL = "http://support.zendesk.com"
|
13
|
+
|
14
|
+
include Thor::Actions
|
15
|
+
include ZendeskAppsSupport
|
16
|
+
|
17
|
+
source_root File.expand_path(File.join(File.dirname(__FILE__), "../.."))
|
18
|
+
|
19
|
+
desc "new", "Generate a new app"
|
20
|
+
def new
|
21
|
+
puts "Enter this app author's name:"
|
22
|
+
@author_name = get_value_from_stdin(/^\w.*$/, "Invalid name, try again:")
|
23
|
+
|
24
|
+
puts "Enter this app author's email:"
|
25
|
+
@author_email = get_value_from_stdin(/^.+@.+\..+$/, "Invalid email, try again:")
|
26
|
+
|
27
|
+
puts "Enter a name for this new app:"
|
28
|
+
@app_name = get_value_from_stdin(/^\w.*$/, "Invalid app name, try again:")
|
29
|
+
|
30
|
+
puts "Enter a directory name to save the new app (will create the dir if it dose not exist, default to current dir):"
|
31
|
+
while @app_dir = $stdin.readline.chomp.strip do
|
32
|
+
@app_dir = './' and break if @app_dir.empty?
|
33
|
+
if !File.exists?(@app_dir)
|
34
|
+
break
|
35
|
+
elsif !File.directory?(@app_dir)
|
36
|
+
puts "Invalid dir, try again:"
|
37
|
+
else
|
38
|
+
break
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
directory('template', @app_dir)
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "validate", "Validate your app"
|
46
|
+
method_option :path, :default => './', :required => false
|
47
|
+
def validate
|
48
|
+
puts "Enter a zendesk URL that you'd like to install the app (for example: 'http://abc.zendesk.com', default to '#{DEFAULT_ZENDESK_URL}'):"
|
49
|
+
zendesk = get_value_from_stdin(/^http:\/\/\w+\.\w+|^$/, 'Invalid url, try again:')
|
50
|
+
zendesk = DEFAULT_ZENDESK_URL if zendesk.empty?
|
51
|
+
url = URI.parse(zendesk)
|
52
|
+
response = Net::HTTP.start(url.host, url.port) { |http| http.get('/api/v2/apps/framework_versions.json') }
|
53
|
+
version = JSON.parse(response.body, :symbolize_names => true)
|
54
|
+
if ZendeskAppsSupport::AppVersion::CURRENT != version[:current]
|
55
|
+
puts 'This tool is using an out of date Zendesk App Framework. Please upgrade!'
|
56
|
+
exit 1
|
57
|
+
end
|
58
|
+
|
59
|
+
setup_path(options[:path])
|
60
|
+
errors = app_package.validate
|
61
|
+
valid = errors.none?
|
62
|
+
|
63
|
+
if valid
|
64
|
+
say_status 'validate', 'OK'
|
65
|
+
else
|
66
|
+
errors.each do |e|
|
67
|
+
say_status 'validate', e.to_s
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
@destination_stack.pop if options[:path]
|
72
|
+
exit 1 unless valid
|
73
|
+
true
|
74
|
+
end
|
75
|
+
|
76
|
+
desc "package", "Package your app"
|
77
|
+
method_option :path, :default => './', :required => false
|
78
|
+
def package
|
79
|
+
setup_path(options[:path])
|
80
|
+
archive_path = File.join(tmp_dir, "app-#{Time.now.strftime('%Y%m%d%H%M%S')}.zip")
|
81
|
+
|
82
|
+
return false unless invoke(:validate, [])
|
83
|
+
|
84
|
+
archive_rel_path = relative_to_original_destination_root(archive_path)
|
85
|
+
|
86
|
+
Zip::ZipFile.open(archive_path, 'w') do |zipfile|
|
87
|
+
app_package.files.each do |file|
|
88
|
+
say_status "package", "adding #{file.relative_path}"
|
89
|
+
zipfile.add(file.relative_path, app_dir.join(file.relative_path).to_s)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
say_status "package", "created at #{archive_rel_path}"
|
94
|
+
true
|
95
|
+
end
|
96
|
+
|
97
|
+
desc "clean", "Remove app packages in temp folder"
|
98
|
+
method_option :path, :default => './', :required => false
|
99
|
+
def clean
|
100
|
+
setup_path(options[:path])
|
101
|
+
|
102
|
+
return unless File.exists?(Pathname.new(File.join(app_dir, "tmp")).to_s)
|
103
|
+
|
104
|
+
FileUtils.rm(Dir["#{tmp_dir}/app-*.zip"])
|
105
|
+
end
|
106
|
+
|
107
|
+
DEFAULT_SERVER_PATH = "./"
|
108
|
+
DEFAULT_SERVER_PORT = 4567
|
109
|
+
|
110
|
+
desc "server", "Run a http server to serve the local app"
|
111
|
+
method_option :path, :default => DEFAULT_SERVER_PATH, :required => false
|
112
|
+
method_option :port, :default => DEFAULT_SERVER_PORT, :required => false
|
113
|
+
def server
|
114
|
+
setup_path(options[:path])
|
115
|
+
manifest = app_package.manifest_json
|
116
|
+
|
117
|
+
settings = settings_for_parameters(manifest[:parameters])
|
118
|
+
|
119
|
+
require 'zendesk_apps_tools/server'
|
120
|
+
ZendeskAppsTools::Server.tap do |server|
|
121
|
+
server.set :port, options[:port]
|
122
|
+
server.set :root, options[:path]
|
123
|
+
server.set :parameters, settings
|
124
|
+
server.run!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
protected
|
129
|
+
|
130
|
+
def get_value_from_stdin(valid_regex, error_msg)
|
131
|
+
while input = $stdin.readline.chomp.strip do
|
132
|
+
unless input =~ valid_regex
|
133
|
+
puts error_msg
|
134
|
+
else
|
135
|
+
break
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
return input
|
140
|
+
end
|
141
|
+
|
142
|
+
def setup_path(path)
|
143
|
+
@destination_stack << relative_to_original_destination_root(path) unless @destination_stack.last == path
|
144
|
+
end
|
145
|
+
|
146
|
+
def app_dir
|
147
|
+
@app_dir ||= Pathname.new(destination_root)
|
148
|
+
end
|
149
|
+
|
150
|
+
def tmp_dir
|
151
|
+
@tmp_dir ||= Pathname.new(File.join(app_dir, "tmp")).tap do |dir|
|
152
|
+
FileUtils.mkdir_p(dir)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def app_package
|
157
|
+
@app_package ||= Package.new(self.app_dir.to_s)
|
158
|
+
end
|
159
|
+
|
160
|
+
def settings_for_parameters(parameters)
|
161
|
+
return {} if parameters.nil?
|
162
|
+
|
163
|
+
parameters.inject({}) do |settings, param|
|
164
|
+
if param[:required]
|
165
|
+
puts "Enter a value for required parameter '#{param[:name]}':"
|
166
|
+
input = get_value_from_stdin(/\S+/, 'Invalid, try again:')
|
167
|
+
else
|
168
|
+
puts "Enter a value for optional parameter '#{param[:name]}': (press 'Return' to skip)"
|
169
|
+
input = $stdin.readline.chomp.strip
|
170
|
+
end
|
171
|
+
|
172
|
+
unless input.empty?
|
173
|
+
input = (input =~ /^(true|t|yes|y|1)$/i) if param[:type] == 'checkbox'
|
174
|
+
settings[param[:name]] = input
|
175
|
+
end
|
176
|
+
|
177
|
+
settings
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'sinatra/base'
|
2
|
+
require 'zendesk_apps_support/package'
|
3
|
+
|
4
|
+
module ZendeskAppsTools
|
5
|
+
class Server < Sinatra::Base
|
6
|
+
set :public_folder, Proc.new {"#{settings.root}/assets"}
|
7
|
+
|
8
|
+
get '/app.js' do
|
9
|
+
content_type 'text/javascript'
|
10
|
+
ZendeskAppsSupport::Package.new(settings.root).readified_js(nil, 0, "http://localhost:#{settings.port}", settings.parameters)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
data/template/app.css
ADDED
File without changes
|
data/template/app.js
ADDED
Binary file
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,170 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: zendesk_apps_tools
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- James A. Rosen
|
9
|
+
- Kenshiro Nakagawa
|
10
|
+
- Shajith Chacko
|
11
|
+
- Likun Liu
|
12
|
+
autorequire:
|
13
|
+
bindir: bin
|
14
|
+
cert_chain: []
|
15
|
+
date: 2013-01-14 00:00:00.000000000 Z
|
16
|
+
dependencies:
|
17
|
+
- !ruby/object:Gem::Dependency
|
18
|
+
name: thor
|
19
|
+
requirement: !ruby/object:Gem::Requirement
|
20
|
+
none: false
|
21
|
+
requirements:
|
22
|
+
- - ~>
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.15.2
|
25
|
+
type: :runtime
|
26
|
+
prerelease: false
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.15.2
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rubyzip
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.9.1
|
41
|
+
type: :runtime
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
none: false
|
45
|
+
requirements:
|
46
|
+
- - ~>
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.9.1
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: sinatra
|
51
|
+
requirement: !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ! '>='
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
type: :runtime
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: zendesk_apps_support
|
67
|
+
requirement: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ~>
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: 0.3.2
|
73
|
+
type: :runtime
|
74
|
+
prerelease: false
|
75
|
+
version_requirements: !ruby/object:Gem::Requirement
|
76
|
+
none: false
|
77
|
+
requirements:
|
78
|
+
- - ~>
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 0.3.2
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: cucumber
|
83
|
+
requirement: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ! '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
type: :development
|
90
|
+
prerelease: false
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
none: false
|
93
|
+
requirements:
|
94
|
+
- - ! '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: aruba
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
101
|
+
requirements:
|
102
|
+
- - ! '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
description: Tools to help you develop Zendesk Apps.
|
114
|
+
email:
|
115
|
+
- dev@zendesk.com
|
116
|
+
executables:
|
117
|
+
- zat
|
118
|
+
extensions: []
|
119
|
+
extra_rdoc_files: []
|
120
|
+
files:
|
121
|
+
- bin/zat
|
122
|
+
- lib/zendesk_apps_tools/command.rb
|
123
|
+
- lib/zendesk_apps_tools/server.rb
|
124
|
+
- lib/zendesk_apps_tools.rb
|
125
|
+
- template/app.css
|
126
|
+
- template/app.js
|
127
|
+
- template/assets/logo-small.png
|
128
|
+
- template/assets/logo.png
|
129
|
+
- template/manifest.json.tt
|
130
|
+
- template/templates/layout.hdbs
|
131
|
+
- template/translations/en.json
|
132
|
+
- README.md
|
133
|
+
- LICENSE
|
134
|
+
- features/clean.feature
|
135
|
+
- features/new.feature
|
136
|
+
- features/package.feature
|
137
|
+
- features/step_definitions/app_steps.rb
|
138
|
+
- features/support/env.rb
|
139
|
+
- features/validate.feature
|
140
|
+
homepage: http://github.com/zendesk/zendesk_apps_tools
|
141
|
+
licenses: []
|
142
|
+
post_install_message:
|
143
|
+
rdoc_options: []
|
144
|
+
require_paths:
|
145
|
+
- lib
|
146
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.3.6
|
158
|
+
requirements: []
|
159
|
+
rubyforge_project:
|
160
|
+
rubygems_version: 1.8.24
|
161
|
+
signing_key:
|
162
|
+
specification_version: 3
|
163
|
+
summary: Tools to help you develop Zendesk Apps.
|
164
|
+
test_files:
|
165
|
+
- features/clean.feature
|
166
|
+
- features/new.feature
|
167
|
+
- features/package.feature
|
168
|
+
- features/step_definitions/app_steps.rb
|
169
|
+
- features/support/env.rb
|
170
|
+
- features/validate.feature
|