jiveapps 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/History.txt +18 -4
- data/app_generators/create/create_generator.rb +14 -0
- data/app_generators/create/templates/app.xml +7 -6
- data/lib/jiveapps/client.rb +10 -0
- data/lib/jiveapps/commands/app.rb +37 -11
- data/lib/jiveapps/commands/keys.rb +13 -1
- data/lib/jiveapps/helpers.rb +59 -0
- data/lib/jiveapps/version.rb +1 -1
- metadata +7 -5
data/.gitignore
CHANGED
data/History.txt
CHANGED
@@ -1,8 +1,22 @@
|
|
1
|
-
=== 1.0.
|
1
|
+
=== 1.0.4
|
2
|
+
* Enhancements
|
3
|
+
* after app has been pushed to git remote, check for existence of web copy. if it does not exist, halt and delete app
|
4
|
+
* validate SSH key format before uploading. halt if its invalid, show user why and how to fix it
|
5
|
+
* Set git user name and email properties if not set
|
6
|
+
* Add git affiliation property for company name
|
7
|
+
* Prompt for app title and description
|
8
|
+
* Include jquery-1.6 feature in app template features
|
9
|
+
* Change boolean user preference example to something that makes sense - subscribe_to_newsletter
|
10
|
+
* Check that git exists before creating an app
|
11
|
+
* Check that git version is 1.7 or higher
|
12
|
+
* Bug Fixes
|
13
|
+
* Re-add hack to double escape URL parameters in production to work around nginx/passenger bug. it was behaving correctly but seems to have regressed upstream somewhere in Passenger/Nginx/Rack
|
14
|
+
|
15
|
+
=== 1.0.3 2011-05-20
|
2
16
|
* Enhancements
|
3
17
|
* change icon and screenshot hrefs to be relative urls
|
4
18
|
* change screenshot rel attributes to be numbered 1-5
|
5
|
-
* Bug
|
19
|
+
* Bug Fixes
|
6
20
|
* fix issue where new app is deleted if using older version of Git (<1.7) that doesn't support "git branch --set-upstream"
|
7
21
|
* fix invalid reference to "images/j-icon-jaf-48.png", changed to "images/icon48.png"
|
8
22
|
* remove hack to double escape URL parameters in production to work around old nginx/passenger bug
|
@@ -11,12 +25,12 @@
|
|
11
25
|
|
12
26
|
=== 1.0.2 2011-04-29
|
13
27
|
* Minor Enhancement
|
14
|
-
* update app template with new syntax for
|
28
|
+
* update app template with new syntax for screenshots in <Link> tags. remove 'screenshot' and 'thumbnail' attributes from <ModulePrefs>
|
15
29
|
|
16
30
|
=== 1.0.1 2011-04-18
|
17
31
|
* Minor Enhancement
|
18
32
|
* app template - add type="html" to <Content> elements
|
19
|
-
* Bug
|
33
|
+
* Bug Fixes
|
20
34
|
* app template - move example UserPrefs outside of ModulePrefs in gadget xml
|
21
35
|
|
22
36
|
=== 1.0.0 2011-04-06
|
@@ -1,5 +1,7 @@
|
|
1
1
|
class CreateGenerator < RubiGen::Base
|
2
2
|
|
3
|
+
include Jiveapps::Helpers
|
4
|
+
|
3
5
|
DEFAULT_SHEBANG = File.join(Config::CONFIG['bindir'],
|
4
6
|
Config::CONFIG['ruby_install_name'])
|
5
7
|
|
@@ -7,6 +9,12 @@ class CreateGenerator < RubiGen::Base
|
|
7
9
|
|
8
10
|
attr_reader :name
|
9
11
|
|
12
|
+
attr_reader :title,
|
13
|
+
:description,
|
14
|
+
:author_name,
|
15
|
+
:author_affiliation,
|
16
|
+
:author_email
|
17
|
+
|
10
18
|
def initialize(runtime_args, runtime_options = {})
|
11
19
|
super
|
12
20
|
usage if args.empty?
|
@@ -67,6 +75,12 @@ EOS
|
|
67
75
|
# Templates can access these value via the attr_reader-generated methods, but not the
|
68
76
|
# raw instance variable value.
|
69
77
|
# @author = options[:author]
|
78
|
+
|
79
|
+
@title = get_app_prop_with_default('App Title', name)
|
80
|
+
@description = get_app_prop_with_default('App Description', 'Description of ' + name)
|
81
|
+
@author_name = get_or_set_git_prop('--global user.name', 'Author Name')
|
82
|
+
@author_affiliation = get_or_set_git_prop('--global user.affiliation', 'Author Affiliation / Company Name')
|
83
|
+
@author_email = get_or_set_git_prop('--global user.email', 'Author Email')
|
70
84
|
end
|
71
85
|
|
72
86
|
# Installation skeleton. Intermediate directories are automatically
|
@@ -1,15 +1,16 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<Module specificationVersion="1">
|
3
|
-
<ModulePrefs title="<%=
|
4
|
-
description="
|
5
|
-
author="<%= author_name
|
6
|
-
author_affiliation="
|
7
|
-
author_email="<%= author_email
|
3
|
+
<ModulePrefs title="<%= title %>"
|
4
|
+
description="<%= description %>"
|
5
|
+
author="<%= author_name %>"
|
6
|
+
author_affiliation="<%= author_affiliation %>"
|
7
|
+
author_email="<%= author_email %>"
|
8
8
|
height="300">
|
9
9
|
|
10
10
|
<!-- Commonly used features -->
|
11
11
|
<Require feature="dynamic-height" />
|
12
12
|
<Require feature="jive-core-v2" />
|
13
|
+
<Require feature="jquery-1.6" />
|
13
14
|
<Require feature="osapi"/>
|
14
15
|
<Require feature="settitle"/>
|
15
16
|
<Require feature="views" />
|
@@ -55,7 +56,7 @@
|
|
55
56
|
<!-- User Preferences: http://code.google.com/apis/gadgets/docs/reference.html#Userprefs_Ref -->
|
56
57
|
<!--
|
57
58
|
<UserPref name="where_i_live" display_name="Where I Live" datatype="string" default_value="" required="false" />
|
58
|
-
<UserPref name="
|
59
|
+
<UserPref name="subscribe_to_newsletter" display_name="Subscribe to Newsletter" datatype="bool" default_value="" required="false" />
|
59
60
|
<UserPref name="difficulty"
|
60
61
|
display_name="Difficulty"
|
61
62
|
datatype="enum"
|
data/lib/jiveapps/client.rb
CHANGED
@@ -207,6 +207,16 @@ class Jiveapps::Client
|
|
207
207
|
end
|
208
208
|
|
209
209
|
def escape(value) # :nodoc:
|
210
|
+
### Ugly hack - nginx/passenger unescapes the name before it gets
|
211
|
+
### to rails, causing routes to fail. double encode in production
|
212
|
+
if Jiveapps::MODE == 'production'
|
213
|
+
_escape(_escape(value))
|
214
|
+
else
|
215
|
+
_escape(value)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def _escape(value) # :nodoc:
|
210
220
|
escaped = URI.escape(value.to_s, Regexp.new("[^#{URI::PATTERN::UNRESERVED}]"))
|
211
221
|
escaped.gsub('.', '%2E') # not covered by the previous URI.escape
|
212
222
|
end
|
@@ -57,13 +57,15 @@ module Jiveapps::Command
|
|
57
57
|
catch_args :appname
|
58
58
|
|
59
59
|
debug "Running in debug mode."
|
60
|
+
check_git_version
|
60
61
|
app_list = Jiveapps::Command.run_internal('auth:check', []) # check auth credentials and ssh key before generating app
|
61
62
|
return unless app_list.class == Array
|
62
|
-
Jiveapps::Command.run_internal('keys:add', [])
|
63
|
+
Jiveapps::Command.run_internal('keys:add', ["--silent"])
|
63
64
|
display "=== Creating new Jive App \"#{@appname}\"..."
|
64
65
|
create_remote_app
|
65
66
|
generate_app
|
66
67
|
create_local_git_repo_and_push_to_remote
|
68
|
+
check_app_push
|
67
69
|
register_app
|
68
70
|
create_notify_user
|
69
71
|
end
|
@@ -84,14 +86,14 @@ module Jiveapps::Command
|
|
84
86
|
private
|
85
87
|
|
86
88
|
def create_remote_app
|
87
|
-
display "Step 1 of 4.
|
89
|
+
display "Step 1 of 4. Checking availability and creating remote repository... ", false
|
88
90
|
@current_app = jiveapps.create(@appname)
|
89
91
|
handle_response_errors
|
90
92
|
end
|
91
93
|
|
92
94
|
def generate_app
|
93
95
|
return unless current_app
|
94
|
-
display "Step 2 of 4.
|
96
|
+
display "Step 2 of 4. Generating app scaffolding..."
|
95
97
|
|
96
98
|
require 'rubygems'
|
97
99
|
require 'rubigen'
|
@@ -102,7 +104,7 @@ module Jiveapps::Command
|
|
102
104
|
|
103
105
|
def create_local_git_repo_and_push_to_remote
|
104
106
|
return unless current_app
|
105
|
-
display "Step 3 of 4. Creating local Git repository and
|
107
|
+
display "Step 3 of 4. Creating local Git repository and pushing to remote... ", false
|
106
108
|
|
107
109
|
Dir.chdir(File.join(Dir.pwd, @appname)) do
|
108
110
|
|
@@ -124,18 +126,22 @@ module Jiveapps::Command
|
|
124
126
|
display "SUCCESS"
|
125
127
|
else
|
126
128
|
display "FAILURE"
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
129
|
+
display_git_push_fail_info
|
130
|
+
delete_app
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def check_app_push
|
135
|
+
response_code = get_response_code(current_app['app_url'])
|
136
|
+
if response_code != 200
|
137
|
+
display_git_push_fail_info
|
132
138
|
delete_app
|
133
139
|
end
|
134
140
|
end
|
135
141
|
|
136
142
|
def register_app
|
137
143
|
return unless current_app
|
138
|
-
display "Step 4 of 4. Registering app on the Jive Apps Dev Center and installing on sandbox
|
144
|
+
display "Step 4 of 4. Registering app on the Jive Apps Dev Center and installing on sandbox... ", false
|
139
145
|
|
140
146
|
@current_app = jiveapps.register(@appname)
|
141
147
|
handle_response_errors
|
@@ -172,11 +178,23 @@ module Jiveapps::Command
|
|
172
178
|
end
|
173
179
|
end
|
174
180
|
|
181
|
+
def display_git_push_fail_info
|
182
|
+
display "Git Push failed. Deleting app and cleaning up. Check SSH key and try again:\n\n" +
|
183
|
+
"$ jiveapps keys:list\n" +
|
184
|
+
"$ jiveapps keys:remove <user@machine>\n" +
|
185
|
+
"$ jiveapps keys:add\n" +
|
186
|
+
"$ jiveapps create #{@appname}"
|
187
|
+
end
|
188
|
+
|
175
189
|
def handle_response_errors
|
176
190
|
if @current_app.class == Hash && @current_app["errors"]
|
177
191
|
display "FAILURE"
|
178
192
|
@current_app["errors"].each do |key, value|
|
179
|
-
|
193
|
+
if key == 'base'
|
194
|
+
display "Error: #{value}"
|
195
|
+
else
|
196
|
+
display "Error on \"#{key}\": #{value}"
|
197
|
+
end
|
180
198
|
end
|
181
199
|
@current_app = nil
|
182
200
|
else
|
@@ -184,5 +202,13 @@ module Jiveapps::Command
|
|
184
202
|
end
|
185
203
|
end
|
186
204
|
|
205
|
+
def get_response_code(url)
|
206
|
+
begin
|
207
|
+
RestClient.get(url).code
|
208
|
+
rescue => e
|
209
|
+
e.respond_to?(:response) ? e.response.code : -1
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
187
213
|
end
|
188
214
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
module Jiveapps::Command
|
2
2
|
class Keys < Base
|
3
3
|
|
4
|
+
KEY_REGEX = /^((?:[A-Za-z0-9-]+(?:="[^"]+")?,?)+ *)?(ssh-(?:dss|rsa)) *([^ ]*) *(.*)/
|
5
|
+
|
4
6
|
# Lists uploaded SSH keys
|
5
7
|
def list
|
6
8
|
long = args.any? { |a| a == '--long' }
|
@@ -19,10 +21,12 @@ module Jiveapps::Command
|
|
19
21
|
# Uploads an SSH Key
|
20
22
|
# - args.first can either be a path to a key file or be nil. if nil, looks in default paths
|
21
23
|
def add
|
24
|
+
silent = extract_option("--silent").present?
|
22
25
|
keyfile = find_key(args.first)
|
23
26
|
key = File.read(keyfile)
|
27
|
+
validate_key(key, keyfile)
|
24
28
|
|
25
|
-
display "Uploading ssh public key #{keyfile}"
|
29
|
+
display "Uploading ssh public key #{keyfile}" unless silent
|
26
30
|
jiveapps.add_key(key)
|
27
31
|
end
|
28
32
|
|
@@ -71,6 +75,14 @@ module Jiveapps::Command
|
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
78
|
+
def validate_key(key, keyfile)
|
79
|
+
if KEY_REGEX.match(key.strip).nil?
|
80
|
+
fake_key = "ssh-rsa NAyG4kbVIZyokH/hMDkLbrFBktxPgsQKBgQDshif7w5RgOTK0eaNC6AJbjX0NTOgoTtbjQIX0s9fAUiakcxU3Qqna9ONXlL1mgf+WZ3KgOyUyNcgz2JPWinZseoTDNukRixqcLS9HO8qOWoLUHJZID1q1xf/btESt4UylEMiykEn712YGqCpVdFxX+q7z7b6Z5G/9n49hKWN22wKBgQCBDM1DUeqOX5Li2Hnj/EF/PfhGypAlhz/Klh40foNq7TziwFtkTZz06HpRNIhK2VcoLhU49f2v6CrcaEmll9Zs5Hw2VMrSeTNReO5gRfxlrId1imhfBkYUaZImEKSWAe3HgdyihCmXqf5SCQOtVmm5lxbgaSBjz== your.name@machine.name"
|
81
|
+
|
82
|
+
raise CommandFailed, "Invalid SSH public key format found at \"#{keyfile}\":\n\n#{key}\n\nExample of correct format:\n\n#{fake_key}\n\nCheck and fix, or regenerate key with this command:\n$ ssh-keygen -t rsa"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
74
86
|
# Formats an SSH key for display by trimming out the middle
|
75
87
|
# Example Output:
|
76
88
|
# ssh-rsa AAAAB3NzaC...Fyoke4MQ== pablo@jive
|
data/lib/jiveapps/helpers.rb
CHANGED
@@ -102,6 +102,31 @@ module Jiveapps
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
+
def has_program?(program)
|
106
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).any? do |directory|
|
107
|
+
path = File.join(directory, program.to_s)
|
108
|
+
if running_on_windows?
|
109
|
+
File.exists?("#{path}.cmd") || File.exists?("#{path}.exe")
|
110
|
+
else
|
111
|
+
File.executable?(path)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def user_git_version
|
117
|
+
return @git_version if @git_version
|
118
|
+
error("Git not found. Please install Git 1.7 or higher. http://git-scm.com/download") unless has_program?("git")
|
119
|
+
version_string = `git --version`.split(/\s+/).last
|
120
|
+
@git_version = Gem::Version.new(version_string)
|
121
|
+
end
|
122
|
+
|
123
|
+
def check_git_version
|
124
|
+
minimum_git_version = Gem::Version.new("1.7")
|
125
|
+
if user_git_version < minimum_git_version
|
126
|
+
error("Running Git version #{user_git_version}. Please install Git #{minimum_git_version} or higher. http://git-scm.com/download")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
105
130
|
# Display Oauth Service list
|
106
131
|
# Example Output:
|
107
132
|
# === 2 OAuth services for app-name
|
@@ -122,5 +147,39 @@ module Jiveapps
|
|
122
147
|
end
|
123
148
|
end
|
124
149
|
|
150
|
+
# Checks for existance of a git property. If it exists, return it.
|
151
|
+
# If it doesn't, prompt for it, set it, and return it.
|
152
|
+
#
|
153
|
+
# Example:
|
154
|
+
# get_or_set_git_prop("--global user.name", "Author Name")
|
155
|
+
#
|
156
|
+
def get_or_set_git_prop(prop, title)
|
157
|
+
val = `git config #{prop}`.to_s.strip
|
158
|
+
while val.blank?
|
159
|
+
display "Enter #{title}: ", false
|
160
|
+
val = gets.strip
|
161
|
+
if val.blank?
|
162
|
+
display "#{title} cannot be blank."
|
163
|
+
else
|
164
|
+
`git config #{prop} "#{val}"`
|
165
|
+
end
|
166
|
+
end
|
167
|
+
val
|
168
|
+
end
|
169
|
+
|
170
|
+
# Prompt for an app property. If user enters a value, return it, otherwise return the default
|
171
|
+
#
|
172
|
+
# Example:
|
173
|
+
# get_app_prop_with_default("App Name", "foobarbaz")
|
174
|
+
#
|
175
|
+
# Example Output:
|
176
|
+
# Enter App Name or hit enter for default [foobarbaz]:
|
177
|
+
#
|
178
|
+
def get_app_prop_with_default(title, default="")
|
179
|
+
display " Enter #{title} or hit enter for default [#{default}]: ", false
|
180
|
+
val = gets.strip
|
181
|
+
val.blank? ? default : val
|
182
|
+
end
|
183
|
+
|
125
184
|
end
|
126
185
|
end
|
data/lib/jiveapps/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jiveapps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 4
|
10
|
+
version: 1.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Scott Becker
|
@@ -15,7 +15,8 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-14 00:00:00 -07:00
|
19
|
+
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
22
|
name: activesupport
|
@@ -206,6 +207,7 @@ files:
|
|
206
207
|
- spec/commands/oauth_spec.rb
|
207
208
|
- spec/commands/sharing_spec.rb
|
208
209
|
- spec/spec_helper.rb
|
210
|
+
has_rdoc: true
|
209
211
|
homepage: https://github.com/jivesoftware/jiveapps-gem
|
210
212
|
licenses: []
|
211
213
|
|
@@ -235,7 +237,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
237
|
requirements: []
|
236
238
|
|
237
239
|
rubyforge_project:
|
238
|
-
rubygems_version: 1.
|
240
|
+
rubygems_version: 1.3.9.1
|
239
241
|
signing_key:
|
240
242
|
specification_version: 3
|
241
243
|
summary: The "jiveapps" gem is a set of command line tools for building and hosting Jive App front-ends.
|