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 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,5 @@
1
+ #!/usr/bin/env ruby
2
+ lib_dir = File.expand_path('../../lib', __FILE__)
3
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
4
+ require 'zendesk_apps_tools'
5
+ ZendeskAppsTools::Command.start
@@ -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,5 @@
1
+ require 'aruba/cucumber'
2
+
3
+ Before do
4
+ @aruba_timeout_seconds = 15
5
+ 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,4 @@
1
+ module ZendeskAppsTools
2
+ autoload :Command, 'zendesk_apps_tools/command'
3
+ end
4
+
@@ -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
@@ -0,0 +1,12 @@
1
+ (function() {
2
+
3
+ return {
4
+ events: {
5
+ 'app.activated':'doSomething'
6
+ },
7
+
8
+ doSomething: function() {
9
+ }
10
+ };
11
+
12
+ }());
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "<%= @app_name %>",
3
+ "author": {
4
+ "name": "<%= @author_name %>",
5
+ "email": "<%= @author_email %>"
6
+ },
7
+ "defaultLocale": "en",
8
+ "private": true,
9
+ "location": "ticket_sidebar",
10
+ "frameworkVersion": "0.5"
11
+ }
@@ -0,0 +1,11 @@
1
+ <header>
2
+ <span class="logo"/>
3
+ <h3>{{setting "name"}}</h3>
4
+ </header>
5
+ <section data-main/>
6
+ <footer>
7
+ <a href="mailto:{{author.email}}">
8
+ {{author.name}}
9
+ </a>
10
+ </footer>
11
+ </div>
@@ -0,0 +1,6 @@
1
+ {
2
+ "app": {
3
+ "description": "Play the famous zen tunes in your help desk.",
4
+ "name": "Buddha Machine"
5
+ }
6
+ }
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