rango 0.2.5.1 → 0.2.6

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.
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