rango 0.2.5.1 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/lib/rango/mixins/conventional_rendering.rb +1 -1
  2. data/lib/rango/orm/tasks/datamapper.nake +6 -3
  3. data/lib/rango/router/adapters/http_router.rb +48 -0
  4. data/lib/rango/tasks/spec.nake +1 -2
  5. data/lib/rango/template.rb +10 -0
  6. data/lib/rango/version.rb +1 -1
  7. data/spec/rango/mixins/render_spec.rb +2 -2
  8. data/stubs/stack/content/Gemfile.rbt +1 -2
  9. data/stubs/stack/content/lib/%name%/views.rb.rbt +1 -1
  10. data/stubs/stack/content/spec/spec_helper.rb +4 -0
  11. metadata +11 -50
  12. data/lib/rango/templates/exts/haml.rb +0 -33
  13. data/lib/rango/templates/exts/tilt.rb +0 -29
  14. data/lib/rango/templates/helpers.rb +0 -147
  15. data/lib/rango/templates/template.rb +0 -87
  16. data/spec/rango/templates/exts/haml_spec.rb +0 -0
  17. data/spec/rango/templates/exts/tilt_spec.rb +0 -0
  18. data/spec/rango/templates/helpers_spec.rb +0 -139
  19. data/spec/rango/templates/template_spec.rb +0 -61
  20. data/spec/stubs/templates/block/block.html.haml +0 -2
  21. data/spec/stubs/templates/block/blocks.html.haml +0 -5
  22. data/spec/stubs/templates/block/error.html.haml +0 -2
  23. data/spec/stubs/templates/block/getter.html.haml +0 -3
  24. data/spec/stubs/templates/block/value.html.haml +0 -1
  25. data/spec/stubs/templates/context_id.html.haml +0 -1
  26. data/spec/stubs/templates/enhance_block/basic.html.haml +0 -5
  27. data/spec/stubs/templates/enhance_block/error.html.haml +0 -3
  28. data/spec/stubs/templates/enhance_block/name_error.html.haml +0 -1
  29. data/spec/stubs/templates/enhance_block/nil.html.haml +0 -3
  30. data/spec/stubs/templates/enhance_block/standalone.html.haml +0 -2
  31. data/spec/stubs/templates/extend_block/basic.html.haml +0 -5
  32. data/spec/stubs/templates/extend_block/error.html.haml +0 -5
  33. data/spec/stubs/templates/extend_block/error2.html.haml +0 -1
  34. data/spec/stubs/templates/extend_block/name_error.html.haml +0 -1
  35. data/spec/stubs/templates/extend_block/nil.html.haml +0 -4
  36. data/spec/stubs/templates/includes/base.html.haml +0 -1
  37. data/spec/stubs/templates/includes/basic.html.haml +0 -1
  38. data/spec/stubs/templates/includes/includes.html.haml +0 -7
  39. data/spec/stubs/templates/includes/integration.html.haml +0 -4
  40. data/spec/stubs/templates/includes/integration2.html.haml +0 -4
  41. data/spec/stubs/templates/index.html.haml +0 -1
  42. data/spec/stubs/templates/inheritance/basic/base.html.haml +0 -2
  43. data/spec/stubs/templates/inheritance/basic/index.html.haml +0 -2
  44. data/spec/stubs/templates/inheritance/capture/haml/base.html.haml +0 -2
  45. data/spec/stubs/templates/inheritance/capture/haml/index.html.haml +0 -3
  46. data/spec/stubs/templates/library.html.haml +0 -3
  47. data/spec/stubs/templates/test.html.haml +0 -1
  48. data/spec/stubs/templates/variables.html.haml +0 -1
@@ -57,7 +57,7 @@ module Rango
57
57
 
58
58
  def display(object)
59
59
  autorender
60
- rescue TemplateNotFound
60
+ rescue TemplateInheritance::TemplateNotFound
61
61
  callback = self.formats[request.action]
62
62
  callback.call
63
63
  end
@@ -1,5 +1,8 @@
1
1
  # encoding: utf-8
2
2
 
3
+ # lazy-loading for datamapper
4
+ autoload "DataMapper", "dm-core/migrations"
5
+
3
6
  # @since 0.0.2.1
4
7
  # ./tasks.rb db:automigrate test
5
8
  Task.new("db:automigrate") do |task|
@@ -7,7 +10,7 @@ Task.new("db:automigrate") do |task|
7
10
  task.define do |environment = "development", options|
8
11
  Task[:environment].call(environment)
9
12
  Rango.logger.info("[#{Rango.environment}] Migrating databases ...")
10
- result = DataMapper.auto_migrate!
13
+ result = ::DataMapper.auto_migrate!
11
14
  Rango.logger.debug("Result: #{result.inspect}")
12
15
  end
13
16
  end
@@ -19,7 +22,7 @@ Task.new("db:autoupgrade") do |task|
19
22
  task.define do |environment = "development", options|
20
23
  Task[:environment].call(environment)
21
24
  Rango.logger.info("[#{Rango.environment}] Upgrading databases ...")
22
- result = DataMapper.auto_upgrade!
25
+ result = ::DataMapper.auto_upgrade!
23
26
  Rango.logger.debug("Result: #{result.inspect}")
24
27
  end
25
28
  end
@@ -31,7 +34,7 @@ Task.new("db:report") do |task|
31
34
  task.define do |environment = "development", options|
32
35
  Task[:environment].call(environment)
33
36
  ObjectSpace.classes.each do |klass|
34
- if klass.included(DataMapper::Resource)
37
+ if klass.included(::DataMapper::Resource)
35
38
  puts "#{model_class}: #{model_class.count}"
36
39
  end
37
40
  end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require "http_router"
5
+ rescue LoadError
6
+ raise LoadError, "You have to install http_router gem!"
7
+ end
8
+
9
+ Rango::Router.implement(:http_router) do |env|
10
+ env["rango.router.params"] = env["router.params"] || Hash.new # TODO: nil
11
+ end
12
+
13
+ module Rango
14
+ module UrlHelper
15
+ # url(:login)
16
+ def url(*args)
17
+ generator = Rango::Router.app.router.generator
18
+ route_name = args.shift
19
+ route = generator.usher.named_routes[route_name]
20
+ raise "No route found" if route.nil? # TODO: add RouteNotFound to usher and use it here as well
21
+ if args.empty?
22
+ generator.generate(route_name) # TODO: usher should probably have path.to_url
23
+ else
24
+ alts = route.paths.map(&:dynamic_keys) # one route can have multiple paths as /:id or /:id.:format
25
+ keys = alts.first
26
+ # FIXME: take a look at other alts as well !!!!
27
+ # keys = alts.find.with_index { |item, index| }
28
+
29
+ # TODO: optional args
30
+ keys_generator = keys.each
31
+ args_generator = args.each
32
+ opts = Hash.new
33
+
34
+ keys.length.times do |index|
35
+ key = keys_generator.next
36
+ arg = args_generator.next
37
+ if arg.respond_to?(key) # post instance
38
+ opts[key] = arg.send(key)
39
+ else # it's already a slug
40
+ opts[key] = arg
41
+ end
42
+ end
43
+
44
+ generator.generate(route_name, opts)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -3,7 +3,6 @@
3
3
  Task.new(:spec) do |task|
4
4
  task.description = "Run specs"
5
5
  task.define do |path = "spec", options|
6
- path = args.path ? "spec" : args.path
7
- sh "./bin/spec --options spec/spec.opts #{path}"
6
+ sh "spec --options spec/spec.opts #{path || "spec"}"
8
7
  end
9
8
  end
@@ -0,0 +1,10 @@
1
+ # encoding: utf-8
2
+
3
+ begin
4
+ require "template-inheritance"
5
+ rescue LoadError
6
+ raise LoadError, "You have to install the template-inheritance gem if you want to use templates!"
7
+ end
8
+
9
+ TemplateInheritance::Template.paths << Rango.root.join("templates").to_s
10
+ TemplateInheritance.logger = Rango.logger
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Rango
4
- VERSION = "0.2.5.1"
4
+ VERSION = "0.2.6"
5
5
  end
@@ -41,8 +41,8 @@ describe Rango::RenderMixin do
41
41
  body.should match(/Hi\!/)
42
42
  end
43
43
 
44
- it "should raise TemplateNotFound if template wasn't found" do
45
- -> { render "idonotexist.html" }.should raise_error(Rango::Exceptions::TemplateNotFound)
44
+ it "should raise TemplateInheritance::TemplateNotFound if template wasn't found" do
45
+ -> { render "idonotexist.html" }.should raise_error(TemplateInheritance::TemplateNotFound)
46
46
  end
47
47
  end
48
48
  end
@@ -40,8 +40,7 @@ gem "rack-mount"#, git: "git://github.com/josh/rack-mount.git"
40
40
  gem "rack-router"#, git: "git://github.com/carllerche/rack-router.git"
41
41
  <% end %>
42
42
 
43
- gem "tilt"#, git: "git://github.com/rtomayko/tilt.git"
44
- gem "haml"#, git: "git://github.com/nex3/haml.git"
43
+ gem "template-inheritance"#, git: "git://github.com/botanicus/template-inheritance.git"
45
44
  gem "helpers"#, git: "git://github.com/botanicus/helpers.git"
46
45
  gem "formidable"#, git: "git://github.com/botanicus/formidable.git"
47
46
  gem "pupu"#, git: "git://github.com/botanicus/pupu.git"
@@ -24,7 +24,7 @@ module <%= @name.camel_case %>
24
24
 
25
25
  def render_http_error_template(exception)
26
26
  render "errors/#{exception.status}.html"
27
- rescue TemplateNotFound
27
+ rescue TemplateInheritance::TemplateNotFound
28
28
  render "errors/500.html"
29
29
  end
30
30
  end
@@ -7,6 +7,10 @@
7
7
  RACK_ENV = "test"
8
8
  require_relative "../init.rb"
9
9
 
10
+ require "spec"
11
+ require "webrat"
12
+ require "rack/test"
13
+
10
14
  # load config.ru
11
15
  require "rango/utils"
12
16
  Rango::Utils.load_rackup
metadata CHANGED
@@ -5,22 +5,22 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 2
8
- - 5
9
- - 1
10
- version: 0.2.5.1
8
+ - 6
9
+ version: 0.2.6
11
10
  platform: ruby
12
11
  authors:
13
12
  - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"
14
13
  autorequire:
15
14
  bindir: bin
16
15
  cert_chain:
17
- date: 2010-05-08 00:00:00 +01:00
16
+ date: 2010-10-04 00:00:00 +01:00
18
17
  default_executable: rango
19
18
  dependencies:
20
19
  - !ruby/object:Gem::Dependency
21
20
  name: simple-templater
22
21
  prerelease: false
23
22
  requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
@@ -36,6 +36,7 @@ dependencies:
36
36
  name: bundler
37
37
  prerelease: false
38
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
39
40
  requirements:
40
41
  - - ">="
41
42
  - !ruby/object:Gem::Version
@@ -119,6 +120,7 @@ files:
119
120
  - lib/rango/rest_controller.rb
120
121
  - lib/rango/router.rb
121
122
  - lib/rango/router/adapters/crudtree.rb
123
+ - lib/rango/router/adapters/http_router.rb
122
124
  - lib/rango/router/adapters/rack_mount.rb
123
125
  - lib/rango/router/adapters/urlmap.rb
124
126
  - lib/rango/router/adapters/usher.rb
@@ -129,10 +131,7 @@ files:
129
131
  - lib/rango/support/cucumber/steps/when_steps.rb
130
132
  - lib/rango/tasks/spec.nake
131
133
  - lib/rango/tasks/spec.rake
132
- - lib/rango/templates/exts/haml.rb
133
- - lib/rango/templates/exts/tilt.rb
134
- - lib/rango/templates/helpers.rb
135
- - lib/rango/templates/template.rb
134
+ - lib/rango/template.rb
136
135
  - lib/rango/utils.rb
137
136
  - lib/rango/version.rb
138
137
  - rango.gemspec
@@ -184,10 +183,6 @@ files:
184
183
  - spec/rango/support/cucumber/steps/given_steps_spec.rb
185
184
  - spec/rango/support/cucumber/steps/then_steps_spec.rb
186
185
  - spec/rango/support/cucumber/steps/when_steps_spec.rb
187
- - spec/rango/templates/exts/haml_spec.rb
188
- - spec/rango/templates/exts/tilt_spec.rb
189
- - spec/rango/templates/helpers_spec.rb
190
- - spec/rango/templates/template_spec.rb
191
186
  - spec/rango/utils_spec.rb
192
187
  - spec/rango/version_spec.rb
193
188
  - spec/rango_spec.rb
@@ -195,35 +190,6 @@ files:
195
190
  - spec/spec_helper.rb
196
191
  - spec/stubs/config.ru
197
192
  - spec/stubs/flat.rb
198
- - spec/stubs/templates/block/block.html.haml
199
- - spec/stubs/templates/block/blocks.html.haml
200
- - spec/stubs/templates/block/error.html.haml
201
- - spec/stubs/templates/block/getter.html.haml
202
- - spec/stubs/templates/block/value.html.haml
203
- - spec/stubs/templates/context_id.html.haml
204
- - spec/stubs/templates/enhance_block/basic.html.haml
205
- - spec/stubs/templates/enhance_block/error.html.haml
206
- - spec/stubs/templates/enhance_block/name_error.html.haml
207
- - spec/stubs/templates/enhance_block/nil.html.haml
208
- - spec/stubs/templates/enhance_block/standalone.html.haml
209
- - spec/stubs/templates/extend_block/basic.html.haml
210
- - spec/stubs/templates/extend_block/error.html.haml
211
- - spec/stubs/templates/extend_block/error2.html.haml
212
- - spec/stubs/templates/extend_block/name_error.html.haml
213
- - spec/stubs/templates/extend_block/nil.html.haml
214
- - spec/stubs/templates/includes/base.html.haml
215
- - spec/stubs/templates/includes/basic.html.haml
216
- - spec/stubs/templates/includes/includes.html.haml
217
- - spec/stubs/templates/includes/integration.html.haml
218
- - spec/stubs/templates/includes/integration2.html.haml
219
- - spec/stubs/templates/index.html.haml
220
- - spec/stubs/templates/inheritance/basic/base.html.haml
221
- - spec/stubs/templates/inheritance/basic/index.html.haml
222
- - spec/stubs/templates/inheritance/capture/haml/base.html.haml
223
- - spec/stubs/templates/inheritance/capture/haml/index.html.haml
224
- - spec/stubs/templates/library.html.haml
225
- - spec/stubs/templates/test.html.haml
226
- - spec/stubs/templates/variables.html.haml
227
193
  - stubs/features/content/env.rb
228
194
  - stubs/features/content/shared/.gitignore
229
195
  - stubs/features/metadata.yml
@@ -281,19 +247,13 @@ has_rdoc: true
281
247
  homepage: http://github.com/botanicus/rango
282
248
  licenses: []
283
249
 
284
- post_install_message: "[\e[32mVersion 0.2.5\e[0m] Conventional rendering mixin for high-level rendering methods like autorender\n\
285
- [\e[32mVersion 0.2.5\e[0m] Added RESTController class as a base class for REST controllers\n\
286
- [\e[32mVersion 0.2.5\e[0m] Added CRUDMixin with controller CRUD methods\n\
287
- [\e[32mVersion 0.2.5\e[0m] UrlHelper#url can work not just as url(:post, @post.id) but also as url(:post, @post)\n\
288
- [\e[32mVersion 0.2.5\e[0m] Action args mixin doesn't raise argument error if there are some splat or block arguments\n\
289
- [\e[32mVersion 0.2.5\e[0m] Template caching\n\
290
- [\e[32mVersion 0.2.5\e[0m] Fixed gemspec to find executables\n\
291
- [\e[32mVersion 0.2.5\e[0m] First simple MIME support\n"
250
+ post_install_message:
292
251
  rdoc_options: []
293
252
 
294
253
  require_paths:
295
254
  - lib
296
255
  required_ruby_version: !ruby/object:Gem::Requirement
256
+ none: false
297
257
  requirements:
298
258
  - - ~>
299
259
  - !ruby/object:Gem::Version
@@ -302,6 +262,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
302
262
  - 9
303
263
  version: "1.9"
304
264
  required_rubygems_version: !ruby/object:Gem::Requirement
265
+ none: false
305
266
  requirements:
306
267
  - - ">="
307
268
  - !ruby/object:Gem::Version
@@ -311,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
311
272
  requirements: []
312
273
 
313
274
  rubyforge_project: rango
314
- rubygems_version: 1.3.6
275
+ rubygems_version: 1.3.7
315
276
  signing_key:
316
277
  specification_version: 3
317
278
  summary: Rango is ultralightweight, ultracustomizable, ultracool web framework deeply inspired by Django.
@@ -1,33 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # Option default_attributes
4
- #
5
- # A hash of default attributes for tags (`{tag => {attribute => default_value}}`).
6
- # Attributes of each tag will reverse merged with his default attributes, so you
7
- # don't have to write over and over that script tag has attribute `type` with value
8
- # `text/javascript`. For example, `%script` compiles to `<script type="text/javascript"></script>`.
9
- # Defaults to `{script: {type: "text/javascript"}, form: {method: "POST"}}`
10
-
11
- module Haml
12
- module Precompiler
13
- alias_method :__prerender_tag__, :prerender_tag
14
- def prerender_tag(name, self_close, attributes)
15
- # merge given attributes with default attributes from options
16
- defaults = Tilt::HamlTemplate.options[:default_attributes][name.to_sym]
17
- attributes = defaults.merge(attributes) if defaults
18
- __prerender_tag__(name, self_close, attributes)
19
- end
20
- end
21
-
22
- class Buffer
23
- alias_method :__open_tag__, :open_tag
24
- def open_tag(name, self_closing, try_one_line, preserve_tag, escape_html, class_id,
25
- nuke_outer_whitespace, nuke_inner_whitespace, obj_ref, content, *attributes_hashes)
26
- defaults = Tilt::HamlTemplate.options[:default_attributes][name.to_sym]
27
- attributes_hashes.unshift(defaults) if defaults
28
-
29
- __open_tag__(name, self_closing, try_one_line, preserve_tag, escape_html, class_id,
30
- nuke_outer_whitespace, nuke_inner_whitespace, obj_ref, content, *attributes_hashes)
31
- end
32
- end
33
- end
@@ -1,29 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "tilt"
4
-
5
- module Rango
6
- module TiltExtensions
7
- # Tilt::HamlTemplate.options[:default_attributes] = {script: {type: "text/javascript"}, form: {method: "POST"}}
8
- module Haml
9
- def self.included(klass)
10
- klass.send(:remove_method, :initialize_engine)
11
- def klass.options
12
- @options ||= Hash.new
13
- end
14
- end
15
-
16
- def initialize_engine
17
- require_template_library 'haml' unless defined? ::Haml::Engine
18
- require "rango/templates/exts/haml" if self.class.options[:default_attributes]
19
- end
20
-
21
- def initialize(*args)
22
- super
23
- self.options.merge!(self.class.options)
24
- end
25
- end
26
- end
27
- end
28
-
29
- Tilt::HamlTemplate.send(:include, Rango::TiltExtensions::Haml)
@@ -1,147 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "rango"
4
- require "rango/templates/template"
5
-
6
- module Rango
7
- SubtemplateNotFound = Class.new(StandardError)
8
-
9
- module TemplateHelpers
10
- def self.extended(scope)
11
- class << scope
12
- attr_accessor :template
13
- attr_accessor :context
14
- # @example Capture being used in a .html.erb page:
15
- # <% @foo = capture do %>
16
- # <p>Some Foo content!</p>
17
- # <% end %>
18
- #
19
- # @params [*args] Arguments to pass to the block.
20
- # @params [&block] The template block to call.
21
- # @return [String] The output of the block.
22
- # @api private
23
- def capture(*args, &block)
24
- capture_method = "capture_#{self.template.adapter}"
25
- if self.respond_to?(capture_method) # tilt doesn't support @_out_buf for haml
26
- self.send("capture_#{self.template.adapter}", *args, &block)
27
- else
28
- # @_out_buf comes from tilt
29
- unless self.instance_variable_defined?("@_out_buf")
30
- raise "Adapter #{self.template.adapter} doesn't support capturing"
31
- end
32
- _old_buf, @_out_buf = @_out_buf, ""
33
- block.call(*args)
34
- @_out_buf = _old_buf.chomp.strip
35
- end
36
- end
37
-
38
- def concat(string)
39
- concat_method = "concat_#{self.template.adapter}"
40
- if self.respond_to?(concat_method) # tilt doesn't support @_out_buf for haml
41
- self.send("concat_#{self.template.adapter}", string)
42
- else
43
- # @_out_buf comes from tilt
44
- unless self.instance_variable_defined?("@_out_buf")
45
- raise "Adapter #{self.template.adapter} doesn't support concating"
46
- end
47
- @_out_buf << string
48
- end
49
- end
50
- end
51
- end
52
-
53
- def self.included(scope_class)
54
- scope_class.class_eval { attr_accessor :template }
55
- end
56
-
57
- # post/show.html: it's block is the block we like to see in output
58
- # post/base.html
59
- # base.html: here it will be rendered, so we need block to returns the correct block code
60
- # @since 0.0.2
61
- # @version 0.2
62
- def block(name, value = nil, &block)
63
- raise ArgumentError, "Block has to have a name!" if name.nil?
64
- raise ArgumentError, "You have to provide value or block, not both of them!" if value && block
65
- self.template.blocks[name] ||= block ? self.template.scope.capture(&block) : value
66
- return self.template.blocks[name]
67
- end
68
-
69
- # - extend_block(:head) do
70
- # = pupu :lighter, syntax: "html", theme: "standard"
71
- # = block(:head)
72
- def extend_block(name, value = nil, &block)
73
- unless self.template.blocks[name]
74
- raise NameError, "Block #{name.inspect} wasn't defined yet, you can't extend it!"
75
- end
76
- self.enhance_block(name, value, &block)
77
- end
78
-
79
- def enhance_block(name, value = nil, &block)
80
- raise ArgumentError, "Block has to have a name!" if name.nil?
81
- raise ArgumentError, "You have to provide value or block, not both of them!" if value && block
82
- value = self.template.scope.capture(&block) if value.nil? && block
83
- self.template.blocks[name] = value if value
84
- return self.template.blocks[name]
85
- end
86
-
87
- # Clears default content of given block.
88
- #
89
- # @example
90
- # clear_block(:flyout)
91
- def clear_block(name)
92
- raise ArgumentError, "You need to specify name of block to clear." if name.nil?
93
- self.template.blocks[name] = String.new
94
- end
95
-
96
- # Low-level rendering method for templates.
97
- #
98
- # @since 0.2
99
- # @example
100
- # render "base.html"
101
- # render "./base.html"
102
- # render "../base.html"
103
- def render(path, context = Hash.new)
104
- full_path = normalize_template_path(path)
105
- original_template = self.template
106
- template = Rango::Template.new(full_path, self) # self is scope
107
- self.template = original_template
108
- return template.render(context)
109
- rescue Exceptions::TemplateNotFound # FIXME: this doesn't work
110
- raise SubtemplateNotFound, "Template #{path} doesn't exist in #{full_path}"
111
- end
112
-
113
- # partial "products/list"
114
- # @since 0.0.2
115
- # @version 0.2.1
116
- def partial(template, extra_context = Hash.new)
117
- # NOTE: we can't use File.split because it normalize the path,
118
- # so "./base.html" will be the same as "base.html", but it shouldn't be
119
- *path, basename = template.split("/")
120
- render File.join(path.join("/"), "_#{basename}"), self.template.context.merge(extra_context)
121
- end
122
-
123
- # @since 0.2
124
- def includes(template, context = Hash.new)
125
- render normalize_template_path(template), context
126
- return true
127
- end
128
-
129
- # extends "base.html"
130
- # @since 0.0.2
131
- def extends(path)
132
- # we can't just create a new template, because it has to do it after it reads the whole file
133
- self.template.supertemplate = normalize_template_path(path)
134
- end
135
-
136
- # @since 0.2
137
- def normalize_template_path(template)
138
- if template.start_with?("./")
139
- File.expand_path(File.join(File.dirname(self.template.fullpath), template))
140
- elsif template.start_with?("../")
141
- File.expand_path(File.join(File.dirname(self.template.fullpath), "..", template))
142
- else
143
- template
144
- end
145
- end
146
- end
147
- end
@@ -1,87 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "rango/templates/exts/tilt"
4
- require "rango/core_ext" # String#snake_case
5
- require "rango/templates/helpers"
6
- require "rango/exceptions"
7
-
8
- module Rango
9
- module Exceptions # so we can catch it with other HTTP errors
10
- TemplateNotFound = Class.new(NotFound) { self.name = "Template Not Found" }
11
- end
12
-
13
- class Template
14
- def self.template_paths
15
- @@template_paths ||= [Rango.root.join("templates").to_s]
16
- end
17
-
18
- # template -> supertemplate is the same relationship as class -> superclass
19
- # @since 0.0.2
20
- attr_accessor :path, :scope, :supertemplate, :context
21
-
22
- # @since 0.0.2
23
- attr_writer :blocks
24
- def blocks
25
- @blocks ||= Hash.new
26
- end
27
-
28
- # @since 0.0.2
29
- def initialize(path, scope = Object.new)
30
- self.path = path#[scope.class.template_prefix.chomp("/"), template].join("/")
31
- self.scope = scope
32
- self.scope.extend(TemplateHelpers)
33
- # this enables template caching
34
- unless Rango.development?
35
- self.scope.extend(Tilt::CompileSite)
36
- end
37
- self.scope.template = self
38
- end
39
-
40
- # @since 0.0.2
41
- def fullpath
42
- @fullpath ||= begin
43
- if self.path.match(/^(\/|\.)/) # /foo or ./foo
44
- Dir[self.path, "#{self.path}.*"].find {|file| !File.directory?(file)}
45
- else
46
- self.find_in_template_paths
47
- end
48
- end
49
- end
50
-
51
- def adapter
52
- self.template.class.name.split("::").last.snake_case.sub("_template", "")
53
- end
54
-
55
- def extension # haml, erb ...
56
- File.extname(path)[1..-1]
57
- end
58
-
59
- def template(options = Hash.new)
60
- @template ||= Tilt.new(self.fullpath, nil, options)
61
- end
62
-
63
- # @since 0.0.2
64
- def render(context = Hash.new)
65
- raise Exceptions::TemplateNotFound.new("Template #{self.path} wasn't found in these template_paths: #{self.class.template_paths.inspect}") if self.fullpath.nil?
66
- Rango.logger.info("Rendering template #{self.path} with context keys #{context.keys.inspect}")
67
- self.scope.context = self.context = context # so we can access context in the scope object as well
68
- value = self.template.render(self.scope, context)
69
- Rango.logger.debug("Available blocks: #{self.blocks.keys.inspect}")
70
- if self.supertemplate
71
- Rango.logger.debug("Extends call: #{self.supertemplate}")
72
- supertemplate = self.class.new(self.supertemplate, self.scope)
73
- supertemplate.blocks = self.blocks
74
- return supertemplate.render(context)
75
- end
76
- value
77
- end
78
-
79
- protected
80
- def find_in_template_paths
81
- self.class.template_paths.each do |directory|
82
- path = File.join(directory, self.path)
83
- return Dir[path, "#{path}.*"].find {|file| !File.directory?(file)}
84
- end
85
- end
86
- end
87
- end
File without changes
File without changes
@@ -1,139 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative "../../spec_helper"
4
- require "rango/templates/helpers"
5
-
6
- Rango::Template.template_paths.clear.push(File.join(STUBS_ROOT, "templates"))
7
-
8
- describe Rango::TemplateHelpers do
9
- include Rango::TemplateHelpers
10
- describe "#partial" do
11
- it "should work" do
12
- pending "This can't work because self.template doesn't exist, we have to use render mixin"
13
- partial "basic.html"
14
- end
15
-
16
- it "should share context with the parent template" do
17
- pending
18
- end
19
-
20
- it "should be able to specify additional context which isn't propagated to the parent template" do
21
- pending
22
- end
23
- end
24
-
25
- describe "#render" do
26
- it "should consider 'path.html' as a path relative to Template.template_paths" do
27
- pending
28
- end
29
-
30
- it "should consider './path.html' as a path relative to the current template" do
31
- pending
32
- end
33
-
34
- it "should look for '../path.html' in the parent directory of directory with current template" do
35
- pending
36
- end
37
- end
38
-
39
- describe "#includes" do
40
- require "rango/mixins/render"
41
- it "should return true" do
42
- Rango::RenderMixin.render("includes/basic.html").strip.should eql("true")
43
- end
44
-
45
- it "should work with blocks" do
46
- Rango::RenderMixin.render("includes/includes.html")
47
- end
48
-
49
- it "should work with extends" do
50
- output = Rango::RenderMixin.render("includes/integration.html")
51
- output.strip.should eql("Greeting by Jakub Stastny")
52
- end
53
-
54
- it "should work with extends" do
55
- output = Rango::RenderMixin.render("includes/integration2.html")
56
- output.strip.should eql("Greeting by Jakub Stastny")
57
- end
58
- end
59
-
60
- describe "extends" do
61
- end
62
-
63
- describe "block" do
64
- it "should raise argument error if name isn't specified" do
65
- -> { block(nil) }.should raise_error(ArgumentError)
66
- end
67
-
68
- it "should work as a setter if a value is provided" do
69
- output = Rango::RenderMixin.render("block/value.html")
70
- output.strip.should eql("a value")
71
- end
72
-
73
- it "should work as a setter if a block is provided" do
74
- output = Rango::RenderMixin.render("block/block.html")
75
- output.strip.should eql("a block")
76
- end
77
-
78
- it "should work as a getter" do
79
- output = Rango::RenderMixin.render("block/getter.html")
80
- output.strip.should eql("Hello World!")
81
- end
82
-
83
- it "should raise argument error if both value and block is provided" do
84
- -> { Rango::RenderMixin.render("block/error.html") }.should raise_error(ArgumentError)
85
- end
86
-
87
- it "should store the first non-nil value" do
88
- output = Rango::RenderMixin.render("block/blocks.html")
89
- output.strip.should eql("first")
90
- end
91
- end
92
-
93
- describe "extend_block" do
94
- it "should raise argument error if name isn't specified" do
95
- -> { Rango::RenderMixin.render("extend_block/name_error.html") }.should raise_error(NameError)
96
- end
97
-
98
- it "should raise argument error if both value and block is provided" do
99
- -> { Rango::RenderMixin.render("extend_block/error.html") }.should raise_error(ArgumentError)
100
- end
101
-
102
- it "should raise argument error if block of given name doesn't exist so far" do
103
- -> { Rango::RenderMixin.render("extend_block/error2.html") }.should raise_error
104
- end
105
-
106
- it "should work with super()-like inheritance" do
107
- Rango::RenderMixin.render("extend_block/basic.html")
108
- end
109
-
110
- it "should do nothing if the value or block is nil" do
111
- output = Rango::RenderMixin.render("extend_block/nil.html")
112
- output.strip.should eql("Original")
113
- end
114
- end
115
-
116
- describe "enhance_block" do
117
- it "should work even if the block isn't defined so far" do
118
- output = Rango::RenderMixin.render("enhance_block/standalone.html")
119
- output.strip.should eql("Hello World!")
120
- end
121
-
122
- it "should not raise argument error if name isn't specified" do
123
- -> { Rango::RenderMixin.render("enhance_block/name_error.html") }.should_not raise_error(NameError)
124
- end
125
-
126
- it "should raise argument error if both value and block is provided" do
127
- -> { Rango::RenderMixin.render("enhance_block/error.html") }.should raise_error(ArgumentError)
128
- end
129
-
130
- it "should work with super()-like inheritance" do
131
- Rango::RenderMixin.render("enhance_block/basic.html")
132
- end
133
-
134
- it "should do nothing if the value or block is nil" do
135
- output = Rango::RenderMixin.render("enhance_block/nil.html")
136
- output.strip.should eql("Original")
137
- end
138
- end
139
- end
@@ -1,61 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require_relative "../../spec_helper"
4
- require "rango/templates/template"
5
-
6
- Rango::Template.template_paths.clear.push(File.join(STUBS_ROOT, "templates"))
7
-
8
- describe Rango::Template do
9
- describe "#initialize" do
10
- it "should take path as a first argument" do
11
- template = Rango::Template.new("test.html")
12
- template.path.should eql("test.html")
13
- end
14
-
15
- it "should take scope as an optional second argument" do
16
- scope = Object.new
17
- template = Rango::Template.new("test.html", scope)
18
- template.scope.should eql(scope)
19
- end
20
- end
21
-
22
- describe "#fullpath" do
23
- it "should find" do
24
- template = Rango::Template.new("test.html")
25
- fullpath = File.join(STUBS_ROOT, "templates", "test.html.haml")
26
- template.fullpath.should eql(fullpath)
27
- end
28
- end
29
-
30
- describe "#render" do
31
- it "should raise TemplateNotFound if template can't be found" do
32
- template = Rango::Template.new("idonotexist.html")
33
- -> { template.render }.should raise_error(Rango::Exceptions::TemplateNotFound)
34
- end
35
-
36
- it "should render" do
37
- template = Rango::Template.new("test.html")
38
- template.render.should eql("<html></html>\n")
39
- end
40
-
41
- it "should have template inheritance" do
42
- template = Rango::Template.new("inheritance/basic/index.html")
43
- end
44
-
45
- it "should capture haml" do
46
- template = Rango::Template.new("inheritance/capture/haml/index.html")
47
- template.render
48
- template.blocks[:content].should match("Hello!")
49
- end
50
- end
51
-
52
- describe "variables" do
53
- before(:each) do
54
- @template = Rango::Template.new("variables.html")
55
- end
56
-
57
- it "should capture erb" do
58
- # @template.render(title: "Hi!").should match("Hi!")
59
- end
60
- end
61
- end
@@ -1,2 +0,0 @@
1
- = block(:second) do
2
- a block
@@ -1,5 +0,0 @@
1
- - block(:head, nil)
2
- - block(:head, "first")
3
- - block(:head, "second")
4
-
5
- = block(:head)
@@ -1,2 +0,0 @@
1
- = block(:content, "value") do
2
- Content from block
@@ -1,3 +0,0 @@
1
- - block(:content, "Hello World!")
2
-
3
- = block(:content)
@@ -1 +0,0 @@
1
- = block(:one, "a value")
@@ -1 +0,0 @@
1
- = self.object_id
@@ -1,5 +0,0 @@
1
- - block(:content) do
2
- Original
3
-
4
- = enhance_block(:content) do
5
- I own the only #{block(:content)}!
@@ -1,3 +0,0 @@
1
- = enhance_block(:content, "another value") do
2
- Content from block
3
-
@@ -1 +0,0 @@
1
- - enhance_block(nil)
@@ -1,3 +0,0 @@
1
- - block(:content, "Original")
2
-
3
- = enhance_block(:content, nil)
@@ -1,2 +0,0 @@
1
- = enhance_block(:content) do
2
- Hello World!
@@ -1,5 +0,0 @@
1
- - block(:content) do
2
- Original
3
-
4
- = extend_block(:content) do
5
- I own the only #{block(:content)}!
@@ -1,5 +0,0 @@
1
- - block(:content, "value")
2
-
3
- = extend_block(:content, "another value") do
4
- Content from block
5
-
@@ -1 +0,0 @@
1
- = extend_block(:content, "foo")
@@ -1 +0,0 @@
1
- - extend_block(nil)
@@ -1,4 +0,0 @@
1
- - block(:content) do
2
- Original
3
-
4
- = extend_block(:content, nil)
@@ -1 +0,0 @@
1
- == #{block(:title)} by #{block(:author)}
@@ -1 +0,0 @@
1
- = includes "library.html"
@@ -1,7 +0,0 @@
1
- - includes "library.html"
2
-
3
- %html
4
- %head
5
- %title= block(:title)
6
-
7
- %body= block(:content)
@@ -1,4 +0,0 @@
1
- - includes "library.html"
2
- - extends "includes/base.html"
3
-
4
- = block(:author, "Jakub Stastny")
@@ -1,4 +0,0 @@
1
- - extends "includes/base.html"
2
- - includes "library.html"
3
-
4
- = block(:author, "Jakub Stastny")
@@ -1 +0,0 @@
1
- = title
@@ -1,2 +0,0 @@
1
- %html
2
- %body= block(:content)
@@ -1,2 +0,0 @@
1
- - extends "inheritance/basic/base.html"
2
- - block(:content, "Hello!")
@@ -1,2 +0,0 @@
1
- %html
2
- %body= block(:content)
@@ -1,3 +0,0 @@
1
- - extends "inheritance/capture/haml/base.html"
2
- - block(:content) do
3
- Hello!
@@ -1,3 +0,0 @@
1
- - block(:title, "Greeting") # we don't want to show this in the partial
2
- - block(:content) do
3
- Hello World!
@@ -1 +0,0 @@
1
- %html
@@ -1 +0,0 @@
1
- = title