nimbu 0.2.14 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/nimbu/client.rb CHANGED
@@ -105,6 +105,10 @@ class Nimbu::Client
105
105
  post("/themes/#{theme}/templates", {:name => name, :content => content})
106
106
  end
107
107
 
108
+ def upload_snippet(theme,name,content)
109
+ post("/themes/#{theme}/snippets", {:name => name, :content => content})
110
+ end
111
+
108
112
  def upload_asset(theme,name,file)
109
113
  post("/themes/#{theme}/assets", {:name => name, :file => file})
110
114
  end
@@ -41,6 +41,9 @@ class Nimbu::Command::Themes < Nimbu::Command::Base
41
41
  contents["templates"].each do |t|
42
42
  display " - templates/#{t["name"]}"
43
43
  end unless contents["templates"].nil?
44
+ contents["snippets"].each do |s|
45
+ display " - snippets/#{s["name"]}"
46
+ end unless contents["templates"].nil?
44
47
  contents["assets"].each do |a|
45
48
  display " - #{a["folder"]}/#{a["name"]}"
46
49
  end unless contents["assets"].nil?
@@ -105,6 +108,8 @@ class Nimbu::Command::Themes < Nimbu::Command::Base
105
108
  layouts_files = layouts_glob.map {|dir| dir.gsub("#{Dir.pwd}/layouts/","")}
106
109
  templates_glob = Dir.glob("#{Dir.pwd}/templates/**/*.liquid")
107
110
  templates_files = templates_glob.map {|dir| dir.gsub("#{Dir.pwd}/templates/","")}
111
+ snippets_glob = Dir.glob("#{Dir.pwd}/snippets/**/*.liquid")
112
+ snippets_files = snippets_glob.map {|dir| dir.gsub("#{Dir.pwd}/snippets/","")}
108
113
 
109
114
  if !(css_only || js_only)
110
115
  print "\nLayouts:\n"
@@ -124,6 +129,15 @@ class Nimbu::Command::Themes < Nimbu::Command::Base
124
129
  nimbu.upload_template(theme, template, IO.read(file))
125
130
  print " (ok)\n"
126
131
  end
132
+
133
+ print "\nSnippets:\n"
134
+ snippets_files.each do |snippet|
135
+ file = "#{Dir.pwd}/snippets/#{snippet}"
136
+ next if File.directory?(file)
137
+ print " - snippets/#{snippet}"
138
+ nimbu.upload_snippet(theme, snippet, IO.read(file))
139
+ print " (ok)\n"
140
+ end
127
141
  end
128
142
 
129
143
  if !liquid_only
@@ -4,10 +4,13 @@ require "sinatra/multi_route"
4
4
  require "vendor/nimbu/okjson"
5
5
  require 'term/ansicolor'
6
6
  require "base64"
7
+ require "sinatra/json"
8
+ require 'json'
7
9
 
8
10
  module Nimbu
9
11
  module Server
10
12
  class Base < Sinatra::Base
13
+ helpers Sinatra::JSON
11
14
  include Term::ANSIColor
12
15
  register Sinatra::MultiRoute
13
16
 
@@ -55,12 +58,12 @@ module Nimbu
55
58
  puts green("#{method.upcase} #{request.fullpath}")
56
59
 
57
60
  if request.post? || request.put? || request.delete?
61
+ ##### POST / PUT / DELET #####
58
62
  path = request.path == "/" ? request.path : request.path.gsub(/\/$/,'')
59
63
  begin
60
- response = nimbu.post_request({:path => path, :extra => params, :method => method, :client_session => session })
64
+ response = nimbu.post_request({:path => path, :extra => params, :method => method, :client_session => session, :ajax => request.xhr? })
61
65
  puts "RESPONSE: #{response}" if Nimbu.debug
62
66
  result = json_decode(response)
63
- puts result if Nimbu.debug
64
67
  parse_session(result)
65
68
  rescue Exception => e
66
69
  if e.respond_to?(:http_body)
@@ -71,12 +74,21 @@ module Nimbu
71
74
  end
72
75
 
73
76
  session[:flash] = result["flash"] if result["flash"]
74
- redirect result["redirect_to"] and return if result["redirect_to"]
77
+ if request.xhr?
78
+ if !result["json"].nil?
79
+ puts "JSON: #{result["json"]["data"]}" if Nimbu.debug
80
+ status result["json"]["status"].to_i
81
+ return json(result["json"]["data"], :encoder => :to_json, :content_type => :js)
82
+ end
83
+ else
84
+ redirect result["redirect_to"] and return if result["redirect_to"]
85
+ end
75
86
  else
76
87
  # First get the template name and necessary subtemplates
88
+ ##### GET #####
77
89
  path = request.path == "/" ? request.path : request.path.gsub(/\/$/,'')
78
90
  begin
79
- result = json_decode(nimbu.get_template({:path => path, :extra => params, :method => "get", :extra => params, :client_session => session }))
91
+ result = json_decode(nimbu.get_template({:path => path, :extra => params, :method => "get", :extra => params, :client_session => session, :ajax => request.xhr? }))
80
92
  puts result if Nimbu.debug
81
93
  parse_session(result)
82
94
  rescue Exception => e
@@ -89,6 +101,7 @@ module Nimbu
89
101
  if result["template"].nil?
90
102
  raise Sinatra::NotFound
91
103
  end
104
+
92
105
  template = result["template"].gsub(/buddha$/,'liquid')
93
106
  # Then render everything
94
107
  puts green(" => using template '#{template}'")
@@ -97,7 +110,8 @@ module Nimbu
97
110
  if File.exists?(template_file)
98
111
  template_code = IO.read(template_file)
99
112
  else
100
- return render_missing_template(File.join('templates',template))
113
+ puts red("Layout file '#{template_file}' is missing...")
114
+ return render_missing(File.join('templates',template),'template')
101
115
  end
102
116
 
103
117
  if template_code=~ /You have an Error in your HAML code/
@@ -119,18 +133,39 @@ module Nimbu
119
133
  layout_code = IO.read(layout_file)
120
134
  else
121
135
  puts red("Layout file '#{layout_file}' is missing...")
122
- return "Layout file '#{layout_file}' is missing..."
136
+ return render_missing(File.join('layouts',layout),'layout')
137
+ end
138
+
139
+ puts green(" using layout '#{layout}'")
140
+
141
+ begin
142
+ snippets = parse_snippets(template_code)
143
+ snippets = parse_snippets(layout_code,snippets)
144
+ rescue Exception => e
145
+ # If there is a snippet missing, we raise an error
146
+ puts red("Snippet file '#{e.message}' is missing...")
147
+ return render_missing(e.message,'snippet')
148
+ end
149
+
150
+ if snippets.any?
151
+ puts green(" using snippets '#{snippets.keys.join('\', \'')}'")
123
152
  end
124
153
 
125
154
  # Send the templates to the browser
126
155
  begin
127
- results = json_decode(nimbu.get_request({:path => path, :template => template_code, :layout => layout_code, :extra => params, :method => method, :client_session => session }))
156
+ results = json_decode(nimbu.get_request({:path => path, :template => template_code, :layout => layout_code, :snippets => snippets, :extra => params, :method => method, :client_session => session, :ajax => request.xhr? }))
128
157
  puts result if Nimbu.debug
129
158
  parse_session(results)
130
- return "#{results["result"]}"
159
+ html = results["result"]
131
160
  rescue RestClient::Exception => error
132
- return error.http_body
133
- end
161
+ html = error.http_body
162
+ end
163
+
164
+ if request.xhr?
165
+ return results["json"]
166
+ else
167
+ return "#{html}"
168
+ end
134
169
  end
135
170
 
136
171
  error 404 do
@@ -146,6 +181,13 @@ module Nimbu
146
181
  return render_error(@messag)
147
182
  end
148
183
 
184
+ def render_missing(file, type)
185
+ @messag = ""
186
+ @messag += "<h1>A #{type} file is missing!</h1>"
187
+ @messag += "<p>Expected #{type} location: <strong>#{file}</strong></p>"
188
+ return render_error(@messag)
189
+ end
190
+
149
191
  def render_404(path)
150
192
  @messag = ""
151
193
  @messag += "<h1>This page does not exist!</h1>"
@@ -188,7 +230,7 @@ module Nimbu
188
230
  if !response["client_session"].nil?
189
231
  response["client_session"].each do |key,value|
190
232
  session[key.to_sym] = value
191
- puts "Session: :#{key} => #{value}" if Nimbu.debug
233
+ #puts "Session: :#{key} => #{value}" if Nimbu.debug
192
234
  end
193
235
  session.each do |key,value|
194
236
  if !response["client_session"].has_key?(key.to_s)
@@ -198,6 +240,31 @@ module Nimbu
198
240
  end
199
241
  end
200
242
 
243
+ def parse_snippets(code, snippets = {})
244
+ # Parse template file for snippets
245
+ search = Regexp.new("\{\% include (.*) \%\}")
246
+ matches = code.scan(search)
247
+ if !matches.empty?
248
+ matches.each do |snippet|
249
+ # There seems to be a special layout?
250
+ snippet_name = snippet[0].gsub(/,$/, '').gsub(/^'/, '').gsub(/'$/, '').gsub(/^"/, '').gsub(/"$/, '')
251
+ if !(snippet_name =~ /\.liquid$/)
252
+ snippet_name = "#{snippet_name}.liquid"
253
+ end
254
+ # Read the snippet file
255
+ snippet_file = File.join(Dir.pwd,'snippets',snippet_name)
256
+ if File.exists?(snippet_file)
257
+ snippet_code = IO.read(snippet_file)
258
+ snippets[snippet_name.to_sym] = snippet_code
259
+ self.parse_snippets(snippet_code, snippets)
260
+ else
261
+ raise "#{snippet_file}"
262
+ end
263
+ end
264
+ end
265
+ return snippets
266
+ end
267
+
201
268
  end
202
269
  end
203
270
  end
data/lib/nimbu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Nimbu
2
- VERSION = "0.2.14"
2
+ VERSION = "0.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nimbu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: '0.3'
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-05-14 00:00:00.000000000 Z
12
+ date: 2012-05-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: term-ansicolor
16
- requirement: &70351799835960 !ruby/object:Gem::Requirement
16
+ requirement: &70218127116440 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 1.0.5
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70351799835960
24
+ version_requirements: *70218127116440
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rest-client
27
- requirement: &70351799835460 !ruby/object:Gem::Requirement
27
+ requirement: &70218127130520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: 1.6.1
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70351799835460
35
+ version_requirements: *70218127130520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: launchy
38
- requirement: &70351799835000 !ruby/object:Gem::Requirement
38
+ requirement: &70218127128180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.3.2
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70351799835000
46
+ version_requirements: *70218127128180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rubyzip
49
- requirement: &70351799834620 !ruby/object:Gem::Requirement
49
+ requirement: &70218127126060 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70351799834620
57
+ version_requirements: *70218127126060
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: sinatra
60
- requirement: &70351799834160 !ruby/object:Gem::Requirement
60
+ requirement: &70218127123980 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70351799834160
68
+ version_requirements: *70218127123980
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sinatra-contrib
71
- requirement: &70351799833740 !ruby/object:Gem::Requirement
71
+ requirement: &70218127137420 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70351799833740
79
+ version_requirements: *70218127137420
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: compass
82
- requirement: &70351799833320 !ruby/object:Gem::Requirement
82
+ requirement: &70218127148300 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70351799833320
90
+ version_requirements: *70218127148300
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: haml
93
- requirement: &70351799832900 !ruby/object:Gem::Requirement
93
+ requirement: &70218127147000 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70351799832900
101
+ version_requirements: *70218127147000
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: fssm
104
- requirement: &70351799832480 !ruby/object:Gem::Requirement
104
+ requirement: &70218127146340 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70351799832480
112
+ version_requirements: *70218127146340
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: thin
115
- requirement: &70351799832060 !ruby/object:Gem::Requirement
115
+ requirement: &70218127145540 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,7 +120,7 @@ dependencies:
120
120
  version: '0'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70351799832060
123
+ version_requirements: *70218127145540
124
124
  description: Client library and command-line tool to design and manage websites on
125
125
  the Nimbu platform.
126
126
  email: