zing 0.2.2 → 0.3.0
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.
- data/README.rdoc +7 -0
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/bin/zing +46 -442
- data/lib/zing.rb +3 -0
- data/lib/zing/command_parser.rb +72 -0
- data/lib/zing/db_helper.rb +129 -0
- data/lib/zing/file_helper.rb +67 -0
- data/lib/zing/file_templates/base/models/admin_user.rb.erb +2 -0
- data/lib/zing/file_templates/base/routes/cms.rb.erb +41 -0
- data/lib/zing/file_templates/base/views/dashboard.haml.erb +6 -0
- data/lib/zing/file_templates/base/views/layout.haml.erb +45 -0
- data/lib/zing/file_templates/base/views/login.haml.erb +64 -0
- data/lib/zing/file_templates/base/views/sidebar.haml.erb +10 -0
- data/lib/zing/file_templates/push/models/apn_log.rb.erb +2 -0
- data/lib/zing/file_templates/push/models/notification.rb.erb +2 -0
- data/lib/zing/file_templates/push/models/token.rb.erb +2 -0
- data/lib/zing/file_templates/push/push/push.rb.erb +47 -0
- metadata +28 -21
- data/.document +0 -5
- data/images/background-v2.png +0 -0
- data/images/background-white.png +0 -0
- data/images/bg_footer_bottom.png +0 -0
- data/images/bg_footer_top.png +0 -0
- data/zing.gemspec +0 -68
data/README.rdoc
CHANGED
@@ -6,12 +6,19 @@ Is a gem made to eliminate time waste in writing common code in a new or existin
|
|
6
6
|
|
7
7
|
== Usage
|
8
8
|
|
9
|
+
gem install zing
|
10
|
+
zing -b
|
11
|
+
|
9
12
|
It is best to use zing with dindi created project. Take a look at dindi gem.
|
10
13
|
|
14
|
+
== Help
|
15
|
+
|
11
16
|
To view zing options:
|
12
17
|
|
13
18
|
zing -h
|
14
19
|
|
20
|
+
== Example
|
21
|
+
|
15
22
|
Create a base CMS:
|
16
23
|
|
17
24
|
zing -b
|
data/Rakefile
CHANGED
@@ -15,12 +15,13 @@ require 'jeweler'
|
|
15
15
|
Jeweler::Tasks.new do |gem|
|
16
16
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
17
|
gem.name = "zing"
|
18
|
-
gem.homepage = "http://github.com/
|
18
|
+
gem.homepage = "http://github.com/samchandra/zing"
|
19
19
|
gem.license = "MIT"
|
20
20
|
gem.summary = %Q{Zing is Sinatra code generator}
|
21
21
|
gem.description = %Q{This gem will generate common code for a new or existing Sinatra project}
|
22
22
|
gem.email = "samuelchandra@yahoo.com"
|
23
23
|
gem.authors = ["Samuel Chandra"]
|
24
|
+
gem.files = FileList['lib/**/*', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
|
24
25
|
gem.executables = ["zing"]
|
25
26
|
# dependencies defined in Gemfile
|
26
27
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/zing
CHANGED
@@ -2,108 +2,8 @@
|
|
2
2
|
|
3
3
|
# script to automate creation of cms for a new/old Sinatra project
|
4
4
|
require 'ostruct'
|
5
|
-
require 'optparse'
|
6
|
-
require 'fileutils'
|
7
5
|
require 'colorize'
|
8
|
-
|
9
|
-
class OptionParser
|
10
|
-
|
11
|
-
def self.parse(args)
|
12
|
-
# The options specified on the command line will be collected in *options*
|
13
|
-
# We set the default value here
|
14
|
-
options = OpenStruct.new
|
15
|
-
options.project_name = nil
|
16
|
-
|
17
|
-
opts = OptionParser.new do |opts|
|
18
|
-
opts.banner = "Usage: zing [options]"
|
19
|
-
|
20
|
-
opts.separator " "
|
21
|
-
opts.separator "Specific options:"
|
22
|
-
|
23
|
-
opts.on("-b", "--base",
|
24
|
-
"Zing base CMS") do |lib|
|
25
|
-
options.base = true
|
26
|
-
end
|
27
|
-
|
28
|
-
opts.on("-p", "--push",
|
29
|
-
"Zing push module on top of base CMS") do |lib|
|
30
|
-
options.push = true
|
31
|
-
end
|
32
|
-
|
33
|
-
opts.on("-m", "--model MODEL_NAME",
|
34
|
-
"Zing CRUD for individual MODEL_NAME, use commas for multiple models") do |ver|
|
35
|
-
if ver.split(",").class == Array
|
36
|
-
options.model = ver.split(",").map(&:strip)
|
37
|
-
elsif ver.class == String
|
38
|
-
options.model = var
|
39
|
-
else
|
40
|
-
options.model = nil
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# No argument, shows at tail. This will print an options summary.
|
45
|
-
# Try it and see!
|
46
|
-
opts.on_tail("-h", "--help", "Show this message") do
|
47
|
-
puts opts
|
48
|
-
exit!
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
opts.parse!(args)
|
54
|
-
options
|
55
|
-
|
56
|
-
rescue Exception => e
|
57
|
-
if e.message.match(/invalid option/i) or e.message.match(/missing argument/i)
|
58
|
-
puts "ERROR: #{e.message}".red
|
59
|
-
puts ""
|
60
|
-
puts opts
|
61
|
-
end
|
62
|
-
exit!
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
|
67
|
-
class ZingHelper
|
68
|
-
|
69
|
-
def self.create_directory(dir_path)
|
70
|
-
if File.exist?(dir_path)
|
71
|
-
puts "exists #{dir_path}"
|
72
|
-
else
|
73
|
-
FileUtils.mkdir_p(dir_path)
|
74
|
-
puts "create".green + " #{dir_path}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def self.create_file(file_path, file_content)
|
79
|
-
if File.exist?(file_path)
|
80
|
-
puts "exists #{file_path}"
|
81
|
-
else
|
82
|
-
File.open("#{file_path}", "w") do |file|
|
83
|
-
file.puts file_content
|
84
|
-
end
|
85
|
-
puts "create".green + " #{file_path}"
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.connect_db(models_file_path)
|
90
|
-
if File.exist?(models_file_path)
|
91
|
-
# check if db connection can be made
|
92
|
-
require models_file_path
|
93
|
-
if ActiveRecord::Base.connection and ActiveRecord::Base.connected?
|
94
|
-
puts "passed".green + " Database Connection"
|
95
|
-
else
|
96
|
-
puts "errors".red + " Database Connection not exist"
|
97
|
-
exit!
|
98
|
-
end
|
99
|
-
else
|
100
|
-
puts "ERROR: Are you sure DB is properly configured in #{models_file_path}?".red
|
101
|
-
exit!
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
end
|
6
|
+
require 'zing'
|
107
7
|
|
108
8
|
# make sure ARGV has values
|
109
9
|
if ARGV.size == 0
|
@@ -111,11 +11,16 @@ if ARGV.size == 0
|
|
111
11
|
end
|
112
12
|
|
113
13
|
# parse option from command line
|
114
|
-
options =
|
14
|
+
options = OpenStruct.new
|
15
|
+
begin
|
16
|
+
Zing::CommandParser.parse(ARGV, options)
|
17
|
+
rescue Exception => e
|
18
|
+
exit!
|
19
|
+
end
|
115
20
|
|
116
|
-
#
|
117
|
-
project_absolute_dir =
|
118
|
-
app_name =
|
21
|
+
# default directories path setting
|
22
|
+
project_absolute_dir = options.project_absolute_dir
|
23
|
+
app_name = options.app_name
|
119
24
|
|
120
25
|
models_directory = project_absolute_dir + "/models"
|
121
26
|
views_directory = project_absolute_dir + "/views"
|
@@ -124,7 +29,6 @@ push_directory = project_absolute_dir + "/push"
|
|
124
29
|
helpers_directory = project_absolute_dir + "/helpers"
|
125
30
|
|
126
31
|
scss_directory = project_absolute_dir + "/public/sass"
|
127
|
-
|
128
32
|
css_directory = project_absolute_dir + "/public/css"
|
129
33
|
images_directory = project_absolute_dir + "/public/images"
|
130
34
|
|
@@ -140,360 +44,60 @@ end
|
|
140
44
|
# This will be the base CMS, the rest will not function without this
|
141
45
|
if options.base
|
142
46
|
|
143
|
-
|
144
|
-
|
145
|
-
FileUtils.cp zing_images, images_directory
|
146
|
-
|
147
|
-
# check if database config exist and connection successful
|
148
|
-
ZingHelper.connect_db(project_absolute_dir + "/models.rb")
|
149
|
-
|
150
|
-
# create AdminUser table
|
151
|
-
if ActiveRecord::Base.connection.table_exists?(:admin_users)
|
152
|
-
puts "exists AdminUser Table"
|
153
|
-
else
|
154
|
-
ActiveRecord::Base.connection.create_table :admin_users do |t|
|
155
|
-
t.string :username, :limit => 40, :null => false
|
156
|
-
t.string :password, :limit => 40
|
157
|
-
t.integer :utime, :limit => 16
|
158
|
-
t.timestamps
|
159
|
-
end
|
160
|
-
if ActiveRecord::Base.connection.table_exists?(:admin_users)
|
161
|
-
puts "passed".green + " AdminUser Table Creation"
|
162
|
-
else
|
163
|
-
puts "failed".red + " AdminUser Table Creation"
|
164
|
-
exit!
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
# create AdminUser model
|
169
|
-
admin_user_content = <<-admin_user_content
|
170
|
-
class AdminUser < ActiveRecord::Base
|
171
|
-
end
|
172
|
-
admin_user_content
|
173
|
-
ZingHelper.create_file("#{models_directory}/admin_user.rb", admin_user_content)
|
174
|
-
|
175
|
-
# create cms routes
|
176
|
-
cms_content = <<-cms_content
|
177
|
-
class Cms < Sinatra::Base
|
178
|
-
|
179
|
-
get '/cms' do
|
180
|
-
if session[:authorized]
|
181
|
-
redirect '/cms/dashboard'
|
182
|
-
else
|
183
|
-
redirect '/cms/login'
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
get '/cms/login' do
|
188
|
-
image_array = ["http://www.buuuk.com/wp-content/uploads/2011/08/ST_bannerNEW.png",
|
189
|
-
"http://www.buuuk.com/wp-content/uploads/2011/04/weatherlah-banner2d.png",
|
190
|
-
"http://www.buuuk.com/wp-content/uploads/2011/04/buUuk-banner_New2.png"]
|
191
|
-
@main_image = image_array[rand(3)]
|
47
|
+
begin
|
48
|
+
puts "Zinging Base CMS"
|
192
49
|
|
193
|
-
|
194
|
-
|
50
|
+
# copy cms images from gem to the app images directory
|
51
|
+
zing_images = `gem contents zing`.split("\n").select {|e| e.match(/\.png/i)}
|
52
|
+
FileUtils.cp zing_images, images_directory
|
195
53
|
|
196
|
-
|
197
|
-
|
198
|
-
admin_users = AdminUser.find_all_by_username_and_password(params[:username], params[:password])
|
199
|
-
if admin_users.size > 0
|
200
|
-
session[:authorized] = true
|
201
|
-
redirect '/cms/dashboard'
|
202
|
-
end
|
203
|
-
end
|
54
|
+
# check if database config exist and connection successful
|
55
|
+
Zing::DbHelper.connect_db(project_absolute_dir + "/models.rb")
|
204
56
|
|
205
|
-
|
206
|
-
|
57
|
+
# create AdminUser table
|
58
|
+
Zing::DbHelper.create_admin_user_table
|
207
59
|
|
208
|
-
|
209
|
-
|
210
|
-
redirect '/cms/login'
|
211
|
-
end
|
60
|
+
# copy_file_templates
|
61
|
+
Zing::FileHelper.copy_file_templates(options, "options_base")
|
212
62
|
|
213
|
-
|
214
|
-
|
63
|
+
rescue Exception => e
|
64
|
+
puts "ERROR: #{e.message}".red
|
65
|
+
puts ""
|
66
|
+
exit!
|
215
67
|
end
|
216
68
|
|
217
|
-
end
|
218
|
-
cms_content
|
219
|
-
ZingHelper.create_file("#{routes_directory}/cms.rb", cms_content)
|
220
|
-
|
221
|
-
# create login.haml
|
222
|
-
login_haml_content = <<-login_haml_content
|
223
|
-
!!! 5
|
224
|
-
%html
|
225
|
-
%head
|
226
|
-
%title= if @page_title then "CMS " + @page_title.humanize else "CMS" end
|
227
|
-
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
|
228
|
-
%meta{:content => "NONE,NOARCHIVE", :name => "robots"}
|
229
|
-
%link{:href => "http://twitter.github.com/bootstrap/1.4.0/bootstrap.min.css", :rel => "stylesheet", :type => "text/css"}
|
230
|
-
:css
|
231
|
-
body {
|
232
|
-
padding-top: 60px;
|
233
|
-
}
|
234
|
-
.hero-unit {
|
235
|
-
padding: 0;
|
236
|
-
margin-bottom: 10px;
|
237
|
-
}
|
238
|
-
|
239
|
-
%body
|
240
|
-
|
241
|
-
.topbar
|
242
|
-
.fill
|
243
|
-
.container
|
244
|
-
%a.brand{:href=>"#"}
|
245
|
-
= $APP_NAME + " CMS"
|
246
|
-
|
247
|
-
%form.pull-right{:action => "/cms/login", :method => "post"}
|
248
|
-
%input.input-small{:name => "username", :type => "text", :placeholder => "Username"}
|
249
|
-
%input.input-small{:name => "password", :type => "password", :placeholder => "Password"}
|
250
|
-
%button.btn{:type => "submit"}Sign in
|
251
|
-
|
252
|
-
.container
|
253
|
-
.hero-unit
|
254
|
-
%img{:src => @main_image}
|
255
|
-
|
256
|
-
.row
|
257
|
-
.span16
|
258
|
-
%h2 We build custom mobile applications
|
259
|
-
%p
|
260
|
-
We help our clients create mobile applications. Our focus is on building apps that deliver real-time, contextually relevant information to mobile touch screens. We are experts in using location, augmented reality and push notification. We don't out-source.
|
261
|
-
.row
|
262
|
-
.span4{:style => "text-align: center"}
|
263
|
-
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/iPhone4Both1.png", :width => "200px", :height => "376px"}
|
264
|
-
.span4{:style => "text-align: center"}
|
265
|
-
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/Samsung_Nexus_S_FTKAKI.png", :width => "187px", :height => "344px"}
|
266
|
-
.span4{:style => "text-align: center"}
|
267
|
-
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/Blackberry-AMEXmerchantfind3.png", :width => "230px", :height => "363px"}
|
268
|
-
.span4{:style => "text-align: center"}
|
269
|
-
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/windows_buuuk2.png", :width => "200px", :height => "362px"}
|
270
|
-
|
271
|
-
.row
|
272
|
-
.span16
|
273
|
-
%h2 Platforms
|
274
|
-
%p From iPhone/iPad, to Android, to BlackBerry, to Windows 7: our portfolio of products is testament to our expertise across multiple platforms. Our services extend beyond just developing apps. We can provide a complete infrastructure for deployment, content management and hosting.
|
275
|
-
|
276
|
-
%footer
|
277
|
-
%p
|
278
|
-
= "All rights reserved. © BuUuk " + Time.now.year.to_s
|
279
|
-
|
280
|
-
login_haml_content
|
281
|
-
ZingHelper.create_file("#{views_directory}/login.haml", login_haml_content)
|
282
|
-
|
283
|
-
# create layout.haml
|
284
|
-
layout_haml_content = <<-layout_haml_content
|
285
|
-
!!! 5
|
286
|
-
%html
|
287
|
-
%head
|
288
|
-
%title= if @page_title then "CMS " + @page_title.humanize else "CMS" end
|
289
|
-
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
|
290
|
-
%meta{:content => "NONE,NOARCHIVE", :name => "robots"}
|
291
|
-
%link{:href => "http://twitter.github.com/bootstrap/1.4.0/bootstrap.min.css", :rel => "stylesheet", :type => "text/css"}
|
292
|
-
:css
|
293
|
-
body {
|
294
|
-
padding-top: 60px;
|
295
|
-
}
|
296
|
-
|
297
|
-
%body
|
298
|
-
|
299
|
-
.topbar
|
300
|
-
.topbar-inner
|
301
|
-
.container-fluid
|
302
|
-
%a.brand{:href=>"/"}
|
303
|
-
= $APP_NAME + " CMS"
|
304
|
-
%ul.nav
|
305
|
-
%li.active
|
306
|
-
%a{:href => "/cms/dashboard"}Dashboard
|
307
|
-
%p.pull-right
|
308
|
-
%a{:href => "/cms/logout"}Logout
|
309
|
-
|
310
|
-
.container-fluid
|
311
|
-
.sidebar
|
312
|
-
.well
|
313
|
-
= haml :sidebar
|
314
|
-
|
315
|
-
.content
|
316
|
-
= yield
|
317
|
-
|
318
|
-
%footer
|
319
|
-
%p
|
320
|
-
= "All rights reserved. © BuUuk " + Time.now.year.to_s
|
321
|
-
|
322
|
-
layout_haml_content
|
323
|
-
ZingHelper.create_file("#{views_directory}/layout.haml", layout_haml_content)
|
324
|
-
|
325
|
-
sidebar_haml_content = <<-sidebar_haml_content
|
326
|
-
%h5
|
327
|
-
CMS Modules
|
328
|
-
%ul
|
329
|
-
%li
|
330
|
-
%a{:href => "#"}Push Notification
|
331
|
-
%li
|
332
|
-
%a{:href => "#"}Collection Items
|
333
|
-
sidebar_haml_content
|
334
|
-
ZingHelper.create_file("#{views_directory}/sidebar.haml", sidebar_haml_content)
|
335
|
-
|
336
|
-
dashboard_haml_content = <<-dashboard_haml_content
|
337
|
-
%p
|
338
|
-
This is the dashboard
|
339
|
-
dashboard_haml_content
|
340
|
-
ZingHelper.create_file("#{views_directory}/dashboard.haml", dashboard_haml_content)
|
341
|
-
|
342
69
|
end
|
343
70
|
|
344
|
-
#
|
71
|
+
# Push
|
345
72
|
#
|
346
73
|
# create push folder if not exist
|
347
74
|
if options.push
|
348
75
|
|
349
|
-
|
350
|
-
|
76
|
+
begin
|
77
|
+
puts "Zinging push CMS"
|
351
78
|
|
352
|
-
|
353
|
-
ZingHelper.connect_db(project_absolute_dir + "/models.rb")
|
79
|
+
Zing::FileHelper.create_directory(push_directory)
|
354
80
|
|
355
|
-
|
356
|
-
|
357
|
-
puts "exists Token Table"
|
358
|
-
else
|
359
|
-
ActiveRecord::Base.connection.create_table :tokens do |t|
|
360
|
-
t.string :udid, :limit => 40, :null => false
|
361
|
-
t.string :owner, :limit => 40
|
362
|
-
t.string :token, :limit => 128, :null => false
|
363
|
-
t.boolean :buuuk, :default => 0
|
364
|
-
t.boolean :valid_udid, :default => 1
|
365
|
-
t.string :carrier
|
366
|
-
t.integer :utime, :limit => 16
|
367
|
-
t.string :network_code, :limit => 12
|
368
|
-
t.string :country_code, :limit => 12
|
369
|
-
t.string :device, :limit => 32
|
370
|
-
t.string :country
|
371
|
-
t.string :version, :limit => 16
|
372
|
-
t.timestamps
|
373
|
-
end
|
374
|
-
if ActiveRecord::Base.connection.table_exists?(:tokens)
|
375
|
-
puts "passed".green + " Token Table Creation"
|
376
|
-
else
|
377
|
-
puts "failed".red + " Token Table Creation"
|
378
|
-
exit!
|
379
|
-
end
|
380
|
-
end
|
381
|
-
|
382
|
-
# create Notification table
|
383
|
-
if ActiveRecord::Base.connection.table_exists?(:notifications)
|
384
|
-
puts "exists Notification Table"
|
385
|
-
else
|
386
|
-
ActiveRecord::Base.connection.create_table :notifications do |t|
|
387
|
-
t.string :message
|
388
|
-
t.string :btn_name, :limit => 64
|
389
|
-
t.string :sound, :limit => 64
|
390
|
-
t.string :url
|
391
|
-
t.string :category, :limit => 64
|
392
|
-
t.string :carrier, :limit => 64
|
393
|
-
t.string :test_udids, :limit => 512
|
394
|
-
t.integer :utime, :limit => 16
|
395
|
-
t.timestamps
|
396
|
-
end
|
397
|
-
if ActiveRecord::Base.connection.table_exists?(:notifications)
|
398
|
-
puts "passed".green + " Notification Table Creation"
|
399
|
-
else
|
400
|
-
puts "failed".red + " Notification Table Creation"
|
401
|
-
exit!
|
402
|
-
end
|
403
|
-
end
|
404
|
-
|
405
|
-
# create ApnLog table
|
406
|
-
if ActiveRecord::Base.connection.table_exists?(:apn_logs)
|
407
|
-
puts "exists ApnLog Table"
|
408
|
-
else
|
409
|
-
ActiveRecord::Base.connection.create_table :apn_logs do |t|
|
410
|
-
t.integer :notification_id
|
411
|
-
t.integer :notification_size, :limit => 16
|
412
|
-
t.text :log_text
|
413
|
-
t.integer :utime, :limit => 16
|
414
|
-
t.timestamps
|
415
|
-
end
|
416
|
-
if ActiveRecord::Base.connection.table_exists?(:apn_logs)
|
417
|
-
puts "passed".green + " ApnLog Table Creation"
|
418
|
-
else
|
419
|
-
puts "failed".red + " ApnLog Table Creation"
|
420
|
-
exit!
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
# create Token model
|
425
|
-
token_content = <<-token_class
|
426
|
-
class Token < ActiveRecord::Base
|
427
|
-
end
|
428
|
-
token_class
|
429
|
-
ZingHelper.create_file("#{models_directory}/token.rb", token_content)
|
430
|
-
|
431
|
-
# create Notification model
|
432
|
-
notification_content = <<-notification_class
|
433
|
-
class Notification < ActiveRecord::Base
|
434
|
-
end
|
435
|
-
notification_class
|
436
|
-
ZingHelper.create_file("#{models_directory}/notification.rb", notification_content)
|
437
|
-
|
438
|
-
# create ApnLog model
|
439
|
-
apn_log_content = <<-apn_log_class
|
440
|
-
class ApnLog < ActiveRecord::Base
|
441
|
-
end
|
442
|
-
apn_log_class
|
443
|
-
ZingHelper.create_file("#{models_directory}/apn_log.rb", apn_log_content)
|
444
|
-
|
445
|
-
# create the Push class
|
446
|
-
push_class_content = <<-push_class
|
447
|
-
gem "apns", "=0.9.0"
|
448
|
-
require "apns"
|
449
|
-
|
450
|
-
class Push
|
451
|
-
|
452
|
-
def self.push_new_alert(notification, token_array)
|
453
|
-
|
454
|
-
notification_id = notification.id
|
455
|
-
message = notification.message
|
456
|
-
button_name = notification.btn_name
|
457
|
-
sound = notification.sound
|
458
|
-
url = notification.url
|
459
|
-
test_udids = notification.test_udids
|
460
|
-
|
461
|
-
# apn setting
|
462
|
-
APNS.host = "gateway.push.apple.com"
|
463
|
-
APNS.pem = "#{app_name}_push_certificate.pem"
|
81
|
+
# check if database config exist and connection successful
|
82
|
+
Zing::DbHelper.connect_db(project_absolute_dir + "/models.rb")
|
464
83
|
|
465
|
-
#
|
466
|
-
|
467
|
-
|
468
|
-
|
84
|
+
# create Token Table
|
85
|
+
Zing::DbHelper.create_token_table
|
86
|
+
# create Notification Table
|
87
|
+
Zing::DbHelper.create_notification_table
|
88
|
+
# create ApnLog Table
|
89
|
+
Zing::DbHelper.create_apn_log_table
|
469
90
|
|
470
|
-
|
471
|
-
|
472
|
-
token_array.each do |token|
|
473
|
-
apn_notifications << APNS::Notification.new(
|
474
|
-
token,
|
475
|
-
:alert => {:body => message,"action-loc-key" => button_name},
|
476
|
-
:sound => sound,
|
477
|
-
:other => {:url => url}
|
478
|
-
)
|
479
|
-
end
|
91
|
+
# copy file templates
|
92
|
+
Zing::FileHelper.copy_file_templates(options, "options_push")
|
480
93
|
|
481
|
-
|
94
|
+
# completion
|
95
|
+
puts "Dont forget to place your '".yellow + "#{app_name}_push_certificate.pem".red + "' file in '".yellow + "/push".red + "' folder".yellow
|
482
96
|
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
)
|
489
|
-
end
|
490
|
-
|
491
|
-
end
|
492
|
-
|
493
|
-
end
|
494
|
-
push_class
|
495
|
-
ZingHelper.create_file("#{push_directory}/push.rb", push_class_content)
|
97
|
+
rescue Exception => e
|
98
|
+
puts "ERROR: #{e.message}".red
|
99
|
+
puts ""
|
100
|
+
exit!
|
101
|
+
end
|
496
102
|
|
497
|
-
# completion
|
498
|
-
puts "Dont forget to place your '".yellow + "#{app_name}_push_certificate.pem".red + "' file in '".yellow + "/push".red + "' folder".yellow
|
499
103
|
end
|
data/lib/zing.rb
CHANGED
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'fileutils'
|
5
|
+
|
6
|
+
module Zing
|
7
|
+
|
8
|
+
module CommandParser
|
9
|
+
|
10
|
+
def self.parse(args, options)
|
11
|
+
|
12
|
+
# prepare parsing of command line arguments
|
13
|
+
opts = OptionParser.new do |opts|
|
14
|
+
opts.banner = "Usage: zing [options]"
|
15
|
+
|
16
|
+
opts.separator " "
|
17
|
+
opts.separator "Specific options:"
|
18
|
+
|
19
|
+
opts.on("-b", "--base",
|
20
|
+
"Zing base CMS") do |lib|
|
21
|
+
options.base = true
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on("-p", "--push",
|
25
|
+
"Zing push module on top of base CMS") do |lib|
|
26
|
+
options.push = true
|
27
|
+
end
|
28
|
+
|
29
|
+
opts.on("-m", "--model MODEL_NAME",
|
30
|
+
"Zing CRUD for individual MODEL_NAME, use commas for multiple models") do |ver|
|
31
|
+
if ver.split(",").class == Array
|
32
|
+
options.model = ver.split(",").map(&:strip)
|
33
|
+
elsif ver.class == String
|
34
|
+
options.model = var
|
35
|
+
else
|
36
|
+
options.model = nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# No argument, shows at tail. This will print an options summary.
|
41
|
+
# Try it and see!
|
42
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
43
|
+
puts opts
|
44
|
+
raise
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
opts.parse!(args)
|
50
|
+
|
51
|
+
# NOTE:
|
52
|
+
# We assume that zing is run at the root app folder
|
53
|
+
#
|
54
|
+
# set current dir as project absolute dir
|
55
|
+
options.project_absolute_dir = FileUtils.pwd
|
56
|
+
|
57
|
+
# set app name as the project folder
|
58
|
+
options.project_name = FileUtils.pwd.split("/").last
|
59
|
+
options.app_name = options.project_name
|
60
|
+
|
61
|
+
rescue Exception => e
|
62
|
+
if e.message.match(/invalid option/i) or e.message.match(/missing argument/i)
|
63
|
+
puts "ERROR: #{e.message}".red
|
64
|
+
puts ""
|
65
|
+
puts opts
|
66
|
+
end
|
67
|
+
raise
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Zing
|
4
|
+
module DbHelper
|
5
|
+
|
6
|
+
def self.connect_db(models_file_path)
|
7
|
+
begin
|
8
|
+
|
9
|
+
if File.exist?(models_file_path)
|
10
|
+
|
11
|
+
# check if db connection can be made
|
12
|
+
require models_file_path
|
13
|
+
if ActiveRecord::Base.connection and ActiveRecord::Base.connected?
|
14
|
+
puts "passed".green + " Database Connection"
|
15
|
+
else
|
16
|
+
puts "errors".red + " Database Connection not exist"
|
17
|
+
raise
|
18
|
+
end
|
19
|
+
else
|
20
|
+
raise
|
21
|
+
end
|
22
|
+
|
23
|
+
rescue
|
24
|
+
puts "ERROR: Are you sure DB is properly configured in #{models_file_path}?".red
|
25
|
+
raise
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.create_admin_user_table
|
30
|
+
|
31
|
+
if ActiveRecord::Base.connection.table_exists?(:admin_users)
|
32
|
+
puts "exists".yellow + " AdminUser Table"
|
33
|
+
else
|
34
|
+
ActiveRecord::Base.connection.create_table :admin_users do |t|
|
35
|
+
t.string :username, :limit => 40, :null => false
|
36
|
+
t.string :password, :limit => 40
|
37
|
+
t.integer :utime, :limit => 16
|
38
|
+
t.timestamps
|
39
|
+
end
|
40
|
+
if ActiveRecord::Base.connection.table_exists?(:admin_users)
|
41
|
+
puts "passed".green + " AdminUser Table Creation"
|
42
|
+
else
|
43
|
+
puts "failed".red + " AdminUser Table Creation"
|
44
|
+
raise
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.create_token_table
|
51
|
+
|
52
|
+
if ActiveRecord::Base.connection.table_exists?(:tokens)
|
53
|
+
puts "exists".yellow + " Token Table"
|
54
|
+
else
|
55
|
+
ActiveRecord::Base.connection.create_table :tokens do |t|
|
56
|
+
t.string :udid, :limit => 40, :null => false
|
57
|
+
t.string :owner, :limit => 40
|
58
|
+
t.string :token, :limit => 255, :null => false
|
59
|
+
t.boolean :buuuk, :default => 0
|
60
|
+
t.boolean :valid_udid, :default => 1
|
61
|
+
t.string :carrier
|
62
|
+
t.integer :utime, :limit => 16
|
63
|
+
t.string :network_code, :limit => 12
|
64
|
+
t.string :country_code, :limit => 12
|
65
|
+
t.string :device, :limit => 32
|
66
|
+
t.string :country
|
67
|
+
t.string :version, :limit => 16
|
68
|
+
t.timestamps
|
69
|
+
end
|
70
|
+
if ActiveRecord::Base.connection.table_exists?(:tokens)
|
71
|
+
puts "passed".green + " Token Table Creation"
|
72
|
+
else
|
73
|
+
puts "failed".red + " Token Table Creation"
|
74
|
+
raise
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.create_notification_table
|
81
|
+
|
82
|
+
if ActiveRecord::Base.connection.table_exists?(:notifications)
|
83
|
+
puts "exists".yellow + " Notification Table"
|
84
|
+
else
|
85
|
+
ActiveRecord::Base.connection.create_table :notifications do |t|
|
86
|
+
t.string :message
|
87
|
+
t.string :btn_name, :limit => 64
|
88
|
+
t.string :sound, :limit => 64
|
89
|
+
t.string :url
|
90
|
+
t.string :category, :limit => 64
|
91
|
+
t.string :carrier, :limit => 64
|
92
|
+
t.string :test_udids, :limit => 512
|
93
|
+
t.integer :utime, :limit => 16
|
94
|
+
t.timestamps
|
95
|
+
end
|
96
|
+
if ActiveRecord::Base.connection.table_exists?(:notifications)
|
97
|
+
puts "passed".green + " Notification Table Creation"
|
98
|
+
else
|
99
|
+
puts "failed".red + " Notification Table Creation"
|
100
|
+
raise
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.create_apn_log_table
|
107
|
+
|
108
|
+
if ActiveRecord::Base.connection.table_exists?(:apn_logs)
|
109
|
+
puts "exists".yellow + " ApnLog Table"
|
110
|
+
else
|
111
|
+
ActiveRecord::Base.connection.create_table :apn_logs do |t|
|
112
|
+
t.integer :notification_id
|
113
|
+
t.integer :notification_size, :limit => 16
|
114
|
+
t.text :log_text
|
115
|
+
t.integer :utime, :limit => 16
|
116
|
+
t.timestamps
|
117
|
+
end
|
118
|
+
if ActiveRecord::Base.connection.table_exists?(:apn_logs)
|
119
|
+
puts "passed".green + " ApnLog Table Creation"
|
120
|
+
else
|
121
|
+
puts "failed".red + " ApnLog Table Creation"
|
122
|
+
raise
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
|
5
|
+
module Zing
|
6
|
+
module FileHelper
|
7
|
+
|
8
|
+
def self.create_directory(dir_path)
|
9
|
+
if File.exist?(dir_path)
|
10
|
+
puts "exists".yellow + " #{dir_path}"
|
11
|
+
else
|
12
|
+
FileUtils.mkdir_p(dir_path)
|
13
|
+
puts "create".green + " #{dir_path}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.create_file(file_path, file_content)
|
18
|
+
if File.exist?(file_path)
|
19
|
+
puts "exists".yellow + " #{file_path}"
|
20
|
+
else
|
21
|
+
File.open("#{file_path}", "w") do |file|
|
22
|
+
file.puts file_content
|
23
|
+
end
|
24
|
+
puts "create".green + " #{file_path}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.copy_file_templates(options, feature)
|
29
|
+
project_absolute_dir = options.project_absolute_dir
|
30
|
+
|
31
|
+
# get the template directories based on the params used
|
32
|
+
directories = if feature[/options_base/i]
|
33
|
+
Dir.glob(File.dirname(__FILE__) + "/file_templates/base/**")
|
34
|
+
elsif feature[/options_push/i]
|
35
|
+
Dir.glob(File.dirname(__FILE__) + "/file_templates/push/**")
|
36
|
+
else
|
37
|
+
[]
|
38
|
+
end
|
39
|
+
|
40
|
+
# traverse each directory and copy the template files
|
41
|
+
directories.each do |dir_name|
|
42
|
+
|
43
|
+
dir_name_last = dir_name.split("/").last
|
44
|
+
|
45
|
+
Dir.glob("#{dir_name}/*").each do |file|
|
46
|
+
|
47
|
+
filename = file.split("/").last.gsub(".erb", "")
|
48
|
+
|
49
|
+
# read file as ERB templates
|
50
|
+
content = File.open(file, "r").read
|
51
|
+
template = ERB.new content
|
52
|
+
|
53
|
+
# file copy location
|
54
|
+
file_location = "#{project_absolute_dir}/#{dir_name_last}/#{filename}"
|
55
|
+
|
56
|
+
# write the contents of each file to the project directory
|
57
|
+
create_file(file_location, template.result(binding))
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Cms < Sinatra::Base
|
2
|
+
|
3
|
+
get '/cms' do
|
4
|
+
if session[:authorized]
|
5
|
+
redirect '/cms/dashboard'
|
6
|
+
else
|
7
|
+
redirect '/cms/login'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
get '/cms/login' do
|
12
|
+
image_array = ["http://www.buuuk.com/wp-content/uploads/2011/08/ST_bannerNEW.png",
|
13
|
+
"http://www.buuuk.com/wp-content/uploads/2011/04/weatherlah-banner2d.png",
|
14
|
+
"http://www.buuuk.com/wp-content/uploads/2011/04/buUuk-banner_New2.png"]
|
15
|
+
@main_image = image_array[rand(3)]
|
16
|
+
|
17
|
+
haml :login, :layout => false
|
18
|
+
end
|
19
|
+
|
20
|
+
post '/cms/login' do
|
21
|
+
if params[:username] && params[:password]
|
22
|
+
admin_users = AdminUser.find_all_by_username_and_password(params[:username], params[:password])
|
23
|
+
if admin_users.size > 0
|
24
|
+
session[:authorized] = true
|
25
|
+
redirect '/cms/dashboard'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
redirect '/cms/login'
|
30
|
+
end
|
31
|
+
|
32
|
+
get '/cms/logout' do
|
33
|
+
session[:authorized] = false
|
34
|
+
redirect '/cms/login'
|
35
|
+
end
|
36
|
+
|
37
|
+
get '/cms/dashboard' do
|
38
|
+
haml :dashboard
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title= if @page_title then "CMS " + @page_title.humanize else "CMS" end
|
5
|
+
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
|
6
|
+
%meta{:content => "NONE,NOARCHIVE", :name => "robots"}
|
7
|
+
%link{:href => "http://twitter.github.com/bootstrap/assets/css/bootstrap.css", :rel => "stylesheet", :type => "text/css"}
|
8
|
+
:css
|
9
|
+
body {
|
10
|
+
padding-top: 60px;
|
11
|
+
padding-bottom: 40px;
|
12
|
+
}
|
13
|
+
|
14
|
+
.sidebar-nav {
|
15
|
+
padding: 9px 0;
|
16
|
+
}
|
17
|
+
|
18
|
+
|
19
|
+
%body
|
20
|
+
.navbar.navbar-fixed-top
|
21
|
+
.navbar-inner
|
22
|
+
.container-fluid
|
23
|
+
%a.brand{:href=>"/"}
|
24
|
+
= $APP_NAME + " CMS"
|
25
|
+
.nav-collapse
|
26
|
+
%ul.nav
|
27
|
+
%li
|
28
|
+
%a{:href => "/cms/dashboard"}Dashboard
|
29
|
+
%p.navbar-text.pull-right
|
30
|
+
%a{:href => "/cms/logout"}Logout
|
31
|
+
|
32
|
+
.container-fluid
|
33
|
+
.row-fluid
|
34
|
+
.span3
|
35
|
+
.well.sidebar-nav
|
36
|
+
= haml :"sidebar", :layout => false
|
37
|
+
|
38
|
+
.span9
|
39
|
+
= yield
|
40
|
+
|
41
|
+
%hr
|
42
|
+
|
43
|
+
%footer
|
44
|
+
%p
|
45
|
+
= "All rights reserved. © BuUuk " + Time.now.year.to_s
|
@@ -0,0 +1,64 @@
|
|
1
|
+
!!! 5
|
2
|
+
%html
|
3
|
+
%head
|
4
|
+
%title= if @page_title then "CMS " + @page_title.humanize else "CMS" end
|
5
|
+
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
|
6
|
+
%meta{:content => "NONE,NOARCHIVE", :name => "robots"}
|
7
|
+
%link{:href => "http://twitter.github.com/bootstrap/assets/css/bootstrap.css", :rel => "stylesheet", :type => "text/css"}
|
8
|
+
:css
|
9
|
+
body {
|
10
|
+
padding-top: 60px;
|
11
|
+
padding-bottom: 40px;
|
12
|
+
}
|
13
|
+
|
14
|
+
#main_image {
|
15
|
+
margin-bottom: 20px;
|
16
|
+
}
|
17
|
+
|
18
|
+
#platform_image {
|
19
|
+
margin-top: 20px;
|
20
|
+
}
|
21
|
+
|
22
|
+
%body
|
23
|
+
|
24
|
+
.navbar.navbar-fixed-top
|
25
|
+
.navbar-inner
|
26
|
+
.container
|
27
|
+
%a.brand{:href=>"#"}
|
28
|
+
= $APP_NAME + " CMS"
|
29
|
+
|
30
|
+
%form#login_form.navbar-form.pull-right{:action => "/cms/login", :method => "post"}
|
31
|
+
%input#login_username.input-small{:name => "username", :type => "text", :placeholder => "Username"}
|
32
|
+
%input#login_password.input-small{:name => "password", :type => "password", :placeholder => "Password"}
|
33
|
+
%button.btn{:type => "submit"}Sign in
|
34
|
+
|
35
|
+
.container
|
36
|
+
#main_image.row
|
37
|
+
.span12
|
38
|
+
%img{:src => @main_image}
|
39
|
+
|
40
|
+
.row
|
41
|
+
.span12
|
42
|
+
%h2 We build custom mobile applications
|
43
|
+
%p
|
44
|
+
We help our clients create mobile applications. Our focus is on building apps that deliver real-time, contextually relevant information to mobile touch screens. We are experts in using location, augmented reality and push notification. We don't out-source.
|
45
|
+
#platform_image.row
|
46
|
+
.span3{:style => "text-align: center"}
|
47
|
+
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/iPhone4Both1.png", :width => "200px", :height => "376px"}
|
48
|
+
.span3{:style => "text-align: center"}
|
49
|
+
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/Samsung_Nexus_S_FTKAKI.png", :width => "187px", :height => "344px"}
|
50
|
+
.span3{:style => "text-align: center"}
|
51
|
+
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/Blackberry-AMEXmerchantfind3.png", :width => "230px", :height => "363px"}
|
52
|
+
.span3{:style => "text-align: center"}
|
53
|
+
%img{:src => "http://www.buuuk.com/wp-content/uploads/2011/03/windows_buuuk2.png", :width => "200px", :height => "362px"}
|
54
|
+
|
55
|
+
.row
|
56
|
+
.span12
|
57
|
+
%h2 Platforms
|
58
|
+
%p From iPhone/iPad, to Android, to BlackBerry, to Windows 7: our portfolio of products is testament to our expertise across multiple platforms. Our services extend beyond just developing apps. We can provide a complete infrastructure for deployment, content management and hosting.
|
59
|
+
|
60
|
+
%hr
|
61
|
+
|
62
|
+
%footer
|
63
|
+
%p
|
64
|
+
= "All rights reserved. © BuUuk " + Time.now.year.to_s
|
@@ -0,0 +1,47 @@
|
|
1
|
+
gem "apns", "=0.9.0"
|
2
|
+
require "apns"
|
3
|
+
|
4
|
+
class Push
|
5
|
+
|
6
|
+
def self.push_new_alert(notification, token_array)
|
7
|
+
|
8
|
+
notification_id = notification.id
|
9
|
+
message = notification.message
|
10
|
+
button_name = notification.btn_name
|
11
|
+
sound = notification.sound
|
12
|
+
url = notification.url
|
13
|
+
test_udids = notification.test_udids
|
14
|
+
|
15
|
+
# apn setting
|
16
|
+
APNS.host = "gateway.push.apple.com"
|
17
|
+
APNS.pem = "#{app_name}_push_certificate.pem"
|
18
|
+
|
19
|
+
# always overide token_array if test udids exist
|
20
|
+
if token_array.size > 0 and test_udids and test_udids.size > 0
|
21
|
+
token_array = Token.find_all_by_udid(test_udids).map(&:token).compact
|
22
|
+
end
|
23
|
+
|
24
|
+
apn_notifications = []
|
25
|
+
if token_array.size > 0
|
26
|
+
token_array.each do |token|
|
27
|
+
apn_notifications << APNS::Notification.new(
|
28
|
+
token,
|
29
|
+
:alert => {:body => message,"action-loc-key" => button_name},
|
30
|
+
:sound => sound,
|
31
|
+
:other => {:url => url}
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
APNS.send_notifications(apn_notifications)
|
36
|
+
|
37
|
+
# Log the push
|
38
|
+
ApnLog.create(
|
39
|
+
:notification_id => notification_id,
|
40
|
+
:log_text => apn_notifications.inspect,
|
41
|
+
:utime => Time.now.to_i
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-27 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: colorize
|
16
|
-
requirement: &
|
16
|
+
requirement: &70254638713380 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70254638713380
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: shoulda
|
27
|
-
requirement: &
|
27
|
+
requirement: &70254638712040 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70254638712040
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bundler
|
38
|
-
requirement: &
|
38
|
+
requirement: &70254638710260 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 1.0.0
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70254638710260
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: jeweler
|
49
|
-
requirement: &
|
49
|
+
requirement: &70254638708520 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 1.6.4
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70254638708520
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rcov
|
60
|
-
requirement: &
|
60
|
+
requirement: &70254638707480 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70254638707480
|
69
69
|
description: This gem will generate common code for a new or existing Sinatra project
|
70
70
|
email: samuelchandra@yahoo.com
|
71
71
|
executables:
|
@@ -75,7 +75,6 @@ extra_rdoc_files:
|
|
75
75
|
- LICENSE.txt
|
76
76
|
- README.rdoc
|
77
77
|
files:
|
78
|
-
- .document
|
79
78
|
- Gemfile
|
80
79
|
- Gemfile.lock
|
81
80
|
- LICENSE.txt
|
@@ -83,15 +82,23 @@ files:
|
|
83
82
|
- Rakefile
|
84
83
|
- VERSION
|
85
84
|
- bin/zing
|
86
|
-
- images/background-v2.png
|
87
|
-
- images/background-white.png
|
88
|
-
- images/bg_footer_bottom.png
|
89
|
-
- images/bg_footer_top.png
|
90
85
|
- lib/zing.rb
|
86
|
+
- lib/zing/command_parser.rb
|
87
|
+
- lib/zing/db_helper.rb
|
88
|
+
- lib/zing/file_helper.rb
|
89
|
+
- lib/zing/file_templates/base/models/admin_user.rb.erb
|
90
|
+
- lib/zing/file_templates/base/routes/cms.rb.erb
|
91
|
+
- lib/zing/file_templates/base/views/dashboard.haml.erb
|
92
|
+
- lib/zing/file_templates/base/views/layout.haml.erb
|
93
|
+
- lib/zing/file_templates/base/views/login.haml.erb
|
94
|
+
- lib/zing/file_templates/base/views/sidebar.haml.erb
|
95
|
+
- lib/zing/file_templates/push/models/apn_log.rb.erb
|
96
|
+
- lib/zing/file_templates/push/models/notification.rb.erb
|
97
|
+
- lib/zing/file_templates/push/models/token.rb.erb
|
98
|
+
- lib/zing/file_templates/push/push/push.rb.erb
|
91
99
|
- test/helper.rb
|
92
100
|
- test/test_zing.rb
|
93
|
-
|
94
|
-
homepage: http://github.com/schandra/zing
|
101
|
+
homepage: http://github.com/samchandra/zing
|
95
102
|
licenses:
|
96
103
|
- MIT
|
97
104
|
post_install_message:
|
@@ -106,7 +113,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
106
113
|
version: '0'
|
107
114
|
segments:
|
108
115
|
- 0
|
109
|
-
hash: -
|
116
|
+
hash: -2162117329032732296
|
110
117
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
118
|
none: false
|
112
119
|
requirements:
|
@@ -115,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
115
122
|
version: '0'
|
116
123
|
requirements: []
|
117
124
|
rubyforge_project:
|
118
|
-
rubygems_version: 1.8.
|
125
|
+
rubygems_version: 1.8.10
|
119
126
|
signing_key:
|
120
127
|
specification_version: 3
|
121
128
|
summary: Zing is Sinatra code generator
|
data/.document
DELETED
data/images/background-v2.png
DELETED
Binary file
|
data/images/background-white.png
DELETED
Binary file
|
data/images/bg_footer_bottom.png
DELETED
Binary file
|
data/images/bg_footer_top.png
DELETED
Binary file
|
data/zing.gemspec
DELETED
@@ -1,68 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = "zing"
|
8
|
-
s.version = "0.2.2"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Samuel Chandra"]
|
12
|
-
s.date = "2012-02-01"
|
13
|
-
s.description = "This gem will generate common code for a new or existing Sinatra project"
|
14
|
-
s.email = "samuelchandra@yahoo.com"
|
15
|
-
s.executables = ["zing"]
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"LICENSE.txt",
|
18
|
-
"README.rdoc"
|
19
|
-
]
|
20
|
-
s.files = [
|
21
|
-
".document",
|
22
|
-
"Gemfile",
|
23
|
-
"Gemfile.lock",
|
24
|
-
"LICENSE.txt",
|
25
|
-
"README.rdoc",
|
26
|
-
"Rakefile",
|
27
|
-
"VERSION",
|
28
|
-
"bin/zing",
|
29
|
-
"images/background-v2.png",
|
30
|
-
"images/background-white.png",
|
31
|
-
"images/bg_footer_bottom.png",
|
32
|
-
"images/bg_footer_top.png",
|
33
|
-
"lib/zing.rb",
|
34
|
-
"test/helper.rb",
|
35
|
-
"test/test_zing.rb",
|
36
|
-
"zing.gemspec"
|
37
|
-
]
|
38
|
-
s.homepage = "http://github.com/schandra/zing"
|
39
|
-
s.licenses = ["MIT"]
|
40
|
-
s.require_paths = ["lib"]
|
41
|
-
s.rubygems_version = "1.8.15"
|
42
|
-
s.summary = "Zing is Sinatra code generator"
|
43
|
-
|
44
|
-
if s.respond_to? :specification_version then
|
45
|
-
s.specification_version = 3
|
46
|
-
|
47
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
-
s.add_runtime_dependency(%q<colorize>, [">= 0"])
|
49
|
-
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
50
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
51
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
|
52
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
53
|
-
else
|
54
|
-
s.add_dependency(%q<colorize>, [">= 0"])
|
55
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
56
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
57
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
58
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
59
|
-
end
|
60
|
-
else
|
61
|
-
s.add_dependency(%q<colorize>, [">= 0"])
|
62
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
63
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
64
|
-
s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
|
65
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|