nimbu 0.2.14 → 0.3

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/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: