nimbu 0.6.4 → 0.7
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.
- checksums.yaml +4 -4
- data/lib/nimbu/auth.rb +7 -0
- data/lib/nimbu/command/server.rb +1 -2
- data/lib/nimbu/server/base.rb +72 -205
- data/lib/nimbu/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2849d39ff894ad5145ff30a8c440214496519b81
|
4
|
+
data.tar.gz: c46c6fe8fc3ee24688b0877a34907adfca08a365
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65d192f03292576b9014adc87b1da3b0e832e9e90874181be424f3ce547d633b0451e3b833c8de760bac7a66818cc6805b9e39d73cce02d3c70e908742305724
|
7
|
+
data.tar.gz: 4e8edae2409f1dee25cedcec5a1b3f7cc44d9c77e69b25e520f16e4b93ed1390a810fe09b0418588c24b4e5a00060ed3f47c48315b16209cf87887d5f2e5873f
|
data/lib/nimbu/auth.rb
CHANGED
@@ -10,6 +10,13 @@ class Nimbu::Auth
|
|
10
10
|
attr_accessor :credentials
|
11
11
|
attr_accessor :configuration
|
12
12
|
|
13
|
+
def simulator_id
|
14
|
+
return @simulator_id if defined? @simulator_id
|
15
|
+
|
16
|
+
ranges = [('a'..'z'),('A'..'Z'),(0..9)].map{|i| i.to_a}.flatten
|
17
|
+
@simulator_id ||= (1..40).map{ ranges[rand(ranges.length)] }.join
|
18
|
+
end
|
19
|
+
|
13
20
|
def client
|
14
21
|
@client ||= begin
|
15
22
|
Nimbu::Client.new(:oauth_token => token, :endpoint => host, :user_agent => self.user_agent)
|
data/lib/nimbu/command/server.rb
CHANGED
@@ -78,8 +78,7 @@ class Nimbu::Command::Server < Nimbu::Command::Base
|
|
78
78
|
[:INT, :TERM].each do |sig|
|
79
79
|
Signal.trap(sig) do
|
80
80
|
puts green("== Stopping HAML watcher\n")
|
81
|
-
haml_listener.stop
|
82
|
-
puts haml_listener
|
81
|
+
Thread.new { haml_listener.stop }
|
83
82
|
end
|
84
83
|
end
|
85
84
|
Process.waitall
|
data/lib/nimbu/server/base.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
require 'sinatra'
|
3
3
|
require "sinatra/reloader"
|
4
4
|
require "sinatra/multi_route"
|
5
|
+
require "sinatra/cookies"
|
5
6
|
require "vendor/nimbu/okjson"
|
6
7
|
require 'term/ansicolor'
|
7
8
|
require "base64"
|
@@ -12,209 +13,69 @@ require 'rack/streaming_proxy'
|
|
12
13
|
module Nimbu
|
13
14
|
module Server
|
14
15
|
class Base < Sinatra::Base
|
15
|
-
helpers Sinatra::JSON
|
16
16
|
include Term::ANSIColor
|
17
|
-
register Sinatra::MultiRoute
|
18
17
|
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
helpers Sinatra::JSON
|
19
|
+
helpers Sinatra::Cookies
|
20
|
+
register Sinatra::MultiRoute
|
22
21
|
|
23
22
|
set :method_override, true
|
24
23
|
set :static, true # set up static file routing
|
25
24
|
set :public_folder, Dir.pwd # set up the static dir (with images/js/css inside)
|
26
25
|
|
27
26
|
set :views, File.expand_path('../views', __FILE__) # set up the views dir
|
28
|
-
set :haml, { :
|
27
|
+
set :haml, { format: :html5 } # if you use haml
|
29
28
|
|
30
29
|
# Your "actions" go here…
|
31
30
|
#
|
32
31
|
|
33
|
-
get '/media/*' do
|
34
|
-
proxy = Rack::StreamingProxy::ProxyRequest.new(request,"http://#{nimbu.host}/media/#{params[:splat].first}")
|
35
|
-
return [proxy.status, proxy.headers, proxy]
|
36
|
-
end
|
37
|
-
|
38
32
|
get '/__sinatra__/*' do
|
39
33
|
return ""
|
40
34
|
end
|
41
35
|
|
42
36
|
get '/favicon.ico' do
|
43
|
-
|
37
|
+
proxy = Rack::StreamingProxy::ProxyRequest.new(request,"http://#{Nimbu::Auth.site}.#{Nimbu::Auth.admin_host}/favicon.ico")
|
38
|
+
return [proxy.status, proxy.headers, proxy]
|
44
39
|
end
|
45
40
|
|
46
|
-
|
47
|
-
|
48
|
-
# result = json_decode(nimbu.post_request({:path => path, :extra => params, :session => session}))
|
41
|
+
route :get, :post, :put, :delete, :patch, '*' do
|
42
|
+
# clear the session after a restart of the browser
|
49
43
|
|
50
|
-
|
51
|
-
|
52
|
-
# redirect result["redirect_to"] and return if result["redirect_to"]
|
53
|
-
# end
|
44
|
+
method = detect_http_method(request)
|
45
|
+
@templates = {}
|
54
46
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
elsif request.put? then "put"
|
61
|
-
elsif request.delete? then "delete"
|
62
|
-
end
|
63
|
-
)
|
64
|
-
puts green("#{method.upcase} #{request.fullpath}")
|
65
|
-
|
66
|
-
# if request.post? || request.put? || request.delete?
|
67
|
-
# ##### POST / PUT / DELET #####
|
68
|
-
# path = request.path == "/" ? request.path : request.path.gsub(/\/$/,'')
|
69
|
-
# begin
|
70
|
-
# response = nimbu.post_request({:path => path, :extra => params, :method => method, :client_session => session, :ajax => request.xhr? })
|
71
|
-
# puts "RESPONSE: #{response}" if Nimbu.debug
|
72
|
-
# result = json_decode(response)
|
73
|
-
# parse_session(result)
|
74
|
-
# rescue Exception => e
|
75
|
-
# if e.respond_to?(:http_body)
|
76
|
-
# return e.http_body
|
77
|
-
# else
|
78
|
-
# raise e
|
79
|
-
# end
|
80
|
-
# end
|
81
|
-
|
82
|
-
# session[:flash] = result["flash"] if result["flash"]
|
83
|
-
# if request.xhr?
|
84
|
-
# if !result["json"].nil?
|
85
|
-
# puts "JSON: #{result["json"]["data"]}" if Nimbu.debug
|
86
|
-
# status result["json"]["status"].to_i
|
87
|
-
# return json(result["json"]["data"], :encoder => :to_json, :content_type => :js)
|
88
|
-
# end
|
89
|
-
# else
|
90
|
-
# redirect result["redirect_to"] and return if result["redirect_to"]
|
91
|
-
# end
|
92
|
-
# else
|
93
|
-
# # First get the template name and necessary subtemplates
|
94
|
-
# ##### GET #####
|
95
|
-
# path = request.path == "/" ? request.path : request.path.gsub(/\/$/,'')
|
96
|
-
# begin
|
97
|
-
# result = json_decode(nimbu.get_template({:path => path, :extra => params, :method => "get", :extra => params, :client_session => session, :ajax => request.xhr? }))
|
98
|
-
# puts result if Nimbu.debug
|
99
|
-
# parse_session(result)
|
100
|
-
# rescue Exception => e
|
101
|
-
# return e.http_body
|
102
|
-
# end
|
103
|
-
|
104
|
-
# redirect result["redirect_to"] and return if result["redirect_to"]
|
105
|
-
# end
|
106
|
-
### GET THE TEMPLATES ###
|
107
|
-
path = request.path == "/" ? request.path : request.path.gsub(/\/$/,'')
|
108
|
-
|
109
|
-
begin
|
110
|
-
params = ({} || params).merge({:simulator => {
|
111
|
-
:host => request.host,
|
112
|
-
:port => request.port,
|
113
|
-
:path => path,
|
114
|
-
:method => method,
|
115
|
-
:session => session,
|
116
|
-
:headers => request.env.to_json,
|
117
|
-
}})
|
118
|
-
result = nimbu.simulator(:subdomain => Nimbu::Auth.site).recipe(params)
|
119
|
-
puts result if Nimbu.debug
|
120
|
-
rescue Exception => e
|
121
|
-
if e.respond_to?(:http_body)
|
122
|
-
return e.http_body
|
123
|
-
else
|
124
|
-
raise e
|
125
|
-
end
|
47
|
+
if cookies["nimbu_simulator_id"] != Nimbu::Auth.simulator_id
|
48
|
+
puts yellow("Refreshing session for simulation...")
|
49
|
+
cookies.each {|k,v| cookies.delete(k)}
|
50
|
+
response.set_cookie "nimbu_simulator_id", { :value => Nimbu::Auth.simulator_id, :http_only => false, :path => "/" }
|
51
|
+
redirect to(request.path) and return
|
126
52
|
end
|
127
53
|
|
128
|
-
|
129
|
-
raise Sinatra::NotFound
|
130
|
-
end
|
131
|
-
|
132
|
-
unless result["template"] == "<<<< REDIRECT >>>>"
|
133
|
-
template = result["template"].gsub(/buddha$/,'liquid')
|
134
|
-
# Then render everything
|
135
|
-
puts green(" => using template '#{template}'")
|
136
|
-
# Read the template file
|
137
|
-
template_file = File.join(Dir.pwd,'templates',template)
|
138
|
-
template_file_haml = File.join(Dir.pwd,'templates',"#{template}.haml")
|
139
|
-
|
140
|
-
if File.exists?(template_file)
|
141
|
-
template_code = IO.read(template_file).force_encoding('UTF-8')
|
142
|
-
elsif File.exists?(template_file_haml)
|
143
|
-
template_code = IO.read(template_file_haml).force_encoding('UTF-8')
|
144
|
-
template = "#{template}.haml"
|
145
|
-
else
|
146
|
-
puts red("Layout file '#{template_file}' is missing...")
|
147
|
-
return render_missing(File.join('templates',template),'template')
|
148
|
-
end
|
149
|
-
|
150
|
-
if template_code=~ /You have an Error in your HAML code/
|
151
|
-
return template_code
|
152
|
-
end
|
153
|
-
|
154
|
-
# Parse template file for a special layout
|
155
|
-
search = Regexp.new("\{\% layout (.*) \%\}")
|
156
|
-
if search =~ template_code
|
157
|
-
# There seems to be a special layout?
|
158
|
-
layout = $1.strip.gsub(/,$/, '').gsub(/^'/, '').gsub(/'$/, '').gsub(/^"/, '').gsub(/"$/, '')
|
159
|
-
if !(layout =~ /\.liquid$/)
|
160
|
-
layout = "#{layout}.liquid"
|
161
|
-
end
|
162
|
-
else
|
163
|
-
layout = 'default.liquid'
|
164
|
-
end
|
165
|
-
|
166
|
-
# Read the layout file
|
167
|
-
layout_file = File.join(Dir.pwd,'layouts',layout)
|
168
|
-
layout_file_haml = File.join(Dir.pwd,'layouts',"#{layout}.haml")
|
169
|
-
|
170
|
-
if File.exists?(layout_file)
|
171
|
-
layout_code = IO.read(layout_file).force_encoding('UTF-8')
|
172
|
-
elsif File.exists?(layout_file_haml)
|
173
|
-
layout = "#{layout}.haml"
|
174
|
-
layout_code = IO.read(layout_file_haml).force_encoding('UTF-8')
|
175
|
-
else
|
176
|
-
puts red("Layout file '#{layout_file}' is missing...")
|
177
|
-
return render_missing(File.join('layouts',layout),'layout')
|
178
|
-
end
|
179
|
-
|
180
|
-
puts green(" using layout '#{layout}'")
|
54
|
+
puts green("#{method.upcase} #{request.fullpath}")
|
181
55
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
56
|
+
### GET THE RECIPE FOR RENDERING THIS PAGE ###
|
57
|
+
path = extract_path(request)
|
58
|
+
templates = pack_templates!
|
59
|
+
|
60
|
+
params = request.params || {}
|
61
|
+
params.merge!({
|
62
|
+
simulator: {
|
63
|
+
version: "v2",
|
64
|
+
path: path,
|
65
|
+
code: templates,
|
66
|
+
request: {
|
67
|
+
host: request.host,
|
68
|
+
port: request.port,
|
69
|
+
method: method,
|
70
|
+
session: session,
|
71
|
+
headers: request.env.to_json
|
72
|
+
}
|
73
|
+
}
|
74
|
+
})
|
197
75
|
|
198
76
|
# Send the templates to the browser
|
199
77
|
begin
|
200
|
-
|
201
|
-
:path => path,
|
202
|
-
:code => {
|
203
|
-
:template_name => template,
|
204
|
-
:template => template_code,
|
205
|
-
:layout_name => layout,
|
206
|
-
:layout => layout_code,
|
207
|
-
:snippets => snippets,
|
208
|
-
},
|
209
|
-
:request => {
|
210
|
-
:host => request.host,
|
211
|
-
:port => request.port,
|
212
|
-
:method => method,
|
213
|
-
:session => session,
|
214
|
-
:headers => request.env.to_json
|
215
|
-
}
|
216
|
-
}})
|
217
|
-
results = nimbu.simulator(:subdomain => Nimbu::Auth.site).render(params)
|
78
|
+
results = nimbu.simulator(subdomain: Nimbu::Auth.site).render(params)
|
218
79
|
puts results["status"] if Nimbu.debug
|
219
80
|
puts results["headers"] if Nimbu.debug
|
220
81
|
puts Base64.decode64(results["body"]).gsub(/\n/,'') if Nimbu.debug
|
@@ -223,9 +84,8 @@ module Nimbu
|
|
223
84
|
headers results["headers"] unless results["headers"] == ""
|
224
85
|
body Base64.decode64(results["body"])
|
225
86
|
rescue Exception => error
|
226
|
-
puts "Error!"
|
227
87
|
puts "Error! #{error.http_body}"
|
228
|
-
|
88
|
+
error.http_body
|
229
89
|
end
|
230
90
|
end
|
231
91
|
|
@@ -235,6 +95,23 @@ module Nimbu
|
|
235
95
|
|
236
96
|
protected
|
237
97
|
|
98
|
+
def detect_http_method(request)
|
99
|
+
if request.get? then "get"
|
100
|
+
elsif request.post? then "post"
|
101
|
+
elsif request.patch? then "patch"
|
102
|
+
elsif request.put? then "put"
|
103
|
+
elsif request.delete? then "delete"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def extract_path(request)
|
108
|
+
if request.path == "/"
|
109
|
+
request.path
|
110
|
+
else
|
111
|
+
request.path.gsub(/\/$/,'')
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
238
115
|
def render_missing_template(template)
|
239
116
|
@messag = ""
|
240
117
|
@messag += "<h1>A template file is missing!</h1>"
|
@@ -287,35 +164,25 @@ module Nimbu
|
|
287
164
|
Nimbu::Auth.client
|
288
165
|
end
|
289
166
|
|
290
|
-
def
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
end
|
301
|
-
# Read the snippet file
|
302
|
-
snippet_file = File.join(Dir.pwd,'snippets',snippet_name)
|
303
|
-
snippet_file_haml = File.join(Dir.pwd,'snippets',"#{snippet_name}.haml")
|
167
|
+
def debug(message)
|
168
|
+
puts message if Nimbu.debug
|
169
|
+
end
|
170
|
+
|
171
|
+
def pack_templates!
|
172
|
+
["layouts","templates","snippets"].each do |type|
|
173
|
+
load_files(type)
|
174
|
+
end
|
175
|
+
Base64.encode64(Zlib::Deflate.deflate(json_encode(@templates), Zlib::DEFAULT_COMPRESSION))
|
176
|
+
end
|
304
177
|
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
self.parse_snippets(snippet_code, snippets)
|
313
|
-
else
|
314
|
-
raise "#{snippet_file}"
|
315
|
-
end
|
316
|
-
end
|
178
|
+
def load_files(directory)
|
179
|
+
glob = Dir["#{Dir.pwd}/#{directory}/**/*.liquid","#{Dir.pwd}/#{directory}/**/*.liquid.haml"]
|
180
|
+
glob.each do |file|
|
181
|
+
name = file.gsub("#{Dir.pwd}/#{directory}/","")
|
182
|
+
code = IO.read(file).force_encoding('UTF-8')
|
183
|
+
@templates[directory] ||= {}
|
184
|
+
@templates[directory][name.to_s] = code
|
317
185
|
end
|
318
|
-
return snippets
|
319
186
|
end
|
320
187
|
|
321
188
|
end
|
data/lib/nimbu/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nimbu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.7'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zenjoy BVBA
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: term-ansicolor
|