h2o 0.2 → 0.3.0

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.
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe H2o::Tags::For do
4
+ describe "Iterations" do
5
+ it "should iteration through array" do
6
+ t = parse("{% for a in list %}{{ a }}{% endfor %}")
7
+ t.render(:list => [1,2,3]).should == '123'
8
+ end
9
+
10
+ it "should iterate through array subclass" do
11
+ t = parse("{% for i, user in users %}{{ i }}.{{ user }}{% endfor %}")
12
+ t.render(:users =>%w(PeterIT ManHoodHero)).should == '0.PeterIT1.ManHoodHero'
13
+ end
14
+
15
+ it "should iterate through a hash object" do
16
+ person = {:name => 'taylor', :age => 19 }
17
+
18
+ t = parse("{% for a in person %}{{ a }}{% endfor %}")
19
+ t.render(:person => person).should == 'taylor19'
20
+
21
+ t = parse("{%for a, b in person %}{{ a }}{{ b }}{% endfor %}")
22
+ t.render(:person => person).should == 'nametaylorage19'
23
+ end
24
+ end
25
+
26
+ describe "Magic loop variable" do
27
+ before do
28
+ @context = {:words=> %w(something else about this person) }
29
+ end
30
+
31
+ it "should correct iteration counters" do
32
+ fortag('{{ loop.counter }}').render(@context).should == '12345'
33
+ fortag('{{ loop.counter0 }}').render(@context).should == '01234'
34
+
35
+ fortag('{{ loop.revcounter }}').render(@context).should == '54321'
36
+ fortag('{{ loop.revcounter0 }}').render(@context).should == '43210'
37
+ end
38
+
39
+ it "should have .even and .odd iteration flag" do
40
+ fortag('{% if loop.even %}{{ item }}{% endif %}').render(@context).should == 'elsethis'
41
+ fortag('{% if loop.odd %}{{ item}}{% endif %}').render(@context).should == 'somethingaboutperson'
42
+ end
43
+
44
+ it "should have .first and .last flag to indicate if it's first/last iteration" do
45
+ fortag('{%if loop.first %}{{ item }}{% endif }').render(@context).should == 'something'
46
+ fortag('{%if loop.last %}{{ item }}{% endif }').render(@context).should == 'person'
47
+ end
48
+
49
+ it "should have parent property pointer to parent loop" do
50
+ template = fortag '{% for num in numbers %}{{ loop.parent.counter }}-{{ item }}{% endfor %}'
51
+ expect = '1-something1-something2-else2-else3-about3-about4-this4-this5-person5-person'
52
+
53
+ template.render(@context.merge(:numbers=> [6,8])).should == expect
54
+
55
+ template = fortag '{% for num in numbers %}{% if loop.parent.first %}{{ num }}-{{ item }}{% endif %}{% endfor %}'
56
+ expect = '88-something99-something66-something'
57
+
58
+ template.render(@context.merge(:numbers=> [88,99,66])).should == expect
59
+ end
60
+
61
+ def fortag(body)
62
+ parse("{% for item in words %}#{body}{% endfor %}")
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,58 @@
1
+ require 'spec_helper'
2
+
3
+ describe H2o::Tags::If do
4
+ it "should render if body when expression evaluated as true" do
5
+ parse('{% if true %}if body{% endif %}').render.should == 'if body'
6
+ end
7
+
8
+ it "should render else body when expression yields false" do
9
+ parse('{% if !true %}{% else %}else body{% endif %}').render.should == 'else body'
10
+ end
11
+
12
+ describe "Basic type comparisons" do
13
+ it "should compare numbers" do
14
+ parse('{% if 3 > 2 %}Yes{% endif %}').render.should == 'Yes'
15
+ end
16
+
17
+ it "should compare string" do
18
+ parse('{% if "z" > "a" %}Y{% endif %}').render.should == 'Y'
19
+ end
20
+
21
+ it "should compare variables" do
22
+ parse('{% if a >= b %}Y{% endif %}').render(:a=>2, :b=>1).should == 'Y'
23
+ end
24
+ end
25
+
26
+ describe "logical comparisons" do
27
+ it "should perform left > right comparison" do
28
+ parse('{% if 3 > 2 %}Yes{% endif %}').render.should == 'Yes'
29
+
30
+ end
31
+
32
+ it "should perform left >= right comparison" do
33
+ parse('{% if 3 >= 2 %}Y{% endif %}').render.should == 'Y'
34
+
35
+ end
36
+
37
+ it "should perform left >= right comparison" do
38
+ parse('{% if 3 >= 2 %}Y{% endif %}').render.should == 'Y'
39
+ end
40
+ end
41
+
42
+ describe "Binary logics" do
43
+ it "should evaluate a true expression" do
44
+ parse('{% if true %}truth{% endif %}').render.should == 'truth'
45
+ end
46
+
47
+
48
+ it "should negate a expression with not or !" do
49
+ parse('{% if not false %}truth{% endif %}').render.should == 'truth'
50
+
51
+ parse('{% if !false %}truth{% endif %}').render.should == 'truth'
52
+
53
+ parse('{% if !page.editable %}Locked{% else %}Editable{% endif %}').render(:page=>{:editable => true}).should == 'Editable'
54
+
55
+ parse('{% if ! 2 > 3 %}Y{% endif %}').render.should == 'Y'
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,4 @@
1
+ --colour
2
+ --format progress
3
+ --loadby mtime
4
+ --reverse
@@ -0,0 +1,24 @@
1
+
2
+ $: << File.join(File.dirname(__FILE__), "../lib")
3
+
4
+ require 'h2o'
5
+ require 'pp'
6
+
7
+ def parse(source)
8
+ H2o::Template.parse(source)
9
+ end
10
+
11
+ class H2o::HashLoader
12
+ def initialize(stack)
13
+ @stack = stack
14
+ end
15
+
16
+ def read(file)
17
+ raise "Template not find" unless exist?(file)
18
+ @stack[file]
19
+ end
20
+
21
+ def exist?(file)
22
+ @stack.has_key?(file)
23
+ end
24
+ end
metadata CHANGED
@@ -1,20 +1,37 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: h2o
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.2"
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 3
8
+ - 0
9
+ version: 0.3.0
5
10
  platform: ruby
6
11
  authors:
7
- - Taylor Luk
12
+ - Taylor luk
8
13
  autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2008-09-05 00:00:00 -07:00
17
+ date: 2010-08-30 00:00:00 +10:00
13
18
  default_executable:
14
- dependencies: []
15
-
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: schacon-git
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
16
33
  description: h2o is a django inspired template that offers natural template syntax and easy to integrate.
17
- email: taylor.luk@idealian.net
34
+ email: subjective@gmail.com
18
35
  executables: []
19
36
 
20
37
  extensions: []
@@ -22,61 +39,98 @@ extensions: []
22
39
  extra_rdoc_files:
23
40
  - README.md
24
41
  files:
42
+ - .autotest
43
+ - .gitignore
44
+ - .project
25
45
  - README.md
46
+ - Rakefile
47
+ - TODO.md
48
+ - VERSION
49
+ - benchmark/parser.rb
50
+ - benchmark/source.html
51
+ - example/erb/base.html
52
+ - example/h2o/base.html
53
+ - example/h2o/index.html
54
+ - example/h2o/inherit.html
55
+ - example/h2o/layout.html
56
+ - example/liquid/base.html
57
+ - example/request.html
58
+ - example/run.rb
59
+ - example/server
60
+ - example/server.bat
61
+ - example/server.rb
26
62
  - h2o.gemspec
63
+ - init.rb
64
+ - lib/.DS_Store
65
+ - lib/core_ext/object.rb
27
66
  - lib/h2o.rb
28
67
  - lib/h2o/constants.rb
29
68
  - lib/h2o/context.rb
30
69
  - lib/h2o/datatype.rb
31
- - lib/h2o/errors.rb
70
+ - lib/h2o/error.rb
32
71
  - lib/h2o/filters.rb
33
72
  - lib/h2o/filters/default.rb
34
73
  - lib/h2o/nodes.rb
35
74
  - lib/h2o/parser.rb
36
75
  - lib/h2o/tags.rb
37
76
  - lib/h2o/tags/block.rb
77
+ - lib/h2o/tags/extends.rb
38
78
  - lib/h2o/tags/for.rb
39
79
  - lib/h2o/tags/if.rb
40
80
  - lib/h2o/tags/with.rb
41
- - lib/h2o/tags/recurse.rb
42
- - lib/core_ext/object.rb
43
- - example/server.rb
44
- - example/run.rb
45
- - example/server
46
- - example/server.bat
47
- - example/request.html
48
- - example/erb/base.html
49
- - example/h2o/base.html
50
- - example/h2o/inherit.html
51
- - example/liquid/base.html
81
+ - lib/h2o/template.rb
82
+ - spec/fixtures/_partial.html
83
+ - spec/fixtures/a.html
84
+ - spec/fixtures/b.html
85
+ - spec/fixtures/deep/folder/c.html
86
+ - spec/h2o/context_spec.rb
87
+ - spec/h2o/default.html
88
+ - spec/h2o/file_loader_spec.rb
89
+ - spec/h2o/filters_spec.rb
90
+ - spec/h2o/parser_spec.rb
91
+ - spec/h2o/tags/block_spec.rb
92
+ - spec/h2o/tags/for_spec.rb
93
+ - spec/h2o/tags/if_spec.rb
94
+ - spec/spec.opts
95
+ - spec/spec_helper.rb
52
96
  has_rdoc: true
53
- homepage: http://github.com/speedmax/h2o
97
+ homepage: http://www.h2o-template.org
54
98
  licenses: []
55
99
 
56
100
  post_install_message:
57
101
  rdoc_options:
58
- - --main
59
- - README.md
102
+ - --charset=UTF-8
60
103
  require_paths:
61
104
  - lib
62
105
  required_ruby_version: !ruby/object:Gem::Requirement
106
+ none: false
63
107
  requirements:
64
108
  - - ">="
65
109
  - !ruby/object:Gem::Version
110
+ segments:
111
+ - 0
66
112
  version: "0"
67
- version:
68
113
  required_rubygems_version: !ruby/object:Gem::Requirement
114
+ none: false
69
115
  requirements:
70
116
  - - ">="
71
117
  - !ruby/object:Gem::Version
118
+ segments:
119
+ - 0
72
120
  version: "0"
73
- version:
74
121
  requirements: []
75
122
 
76
123
  rubyforge_project:
77
- rubygems_version: 1.3.5
124
+ rubygems_version: 1.3.7
78
125
  signing_key:
79
126
  specification_version: 3
80
- summary: Django inspired template markup
81
- test_files: []
82
-
127
+ summary: h2o is a django inspired template
128
+ test_files:
129
+ - spec/h2o/context_spec.rb
130
+ - spec/h2o/file_loader_spec.rb
131
+ - spec/h2o/filters_spec.rb
132
+ - spec/h2o/parser_spec.rb
133
+ - spec/h2o/tags/block_spec.rb
134
+ - spec/h2o/tags/for_spec.rb
135
+ - spec/h2o/tags/if_spec.rb
136
+ - spec/spec_helper.rb
@@ -1,7 +0,0 @@
1
- module H2o
2
- class RuntimeError < Exception ;end
3
- class SyntaxError < Exception ;end
4
- class TemplateNotFound < Exception ;end
5
- class ParserError < Exception ;end
6
- class FilterError < Exception ;end
7
- end
@@ -1,55 +0,0 @@
1
- module H2o
2
- module Tags
3
- # Recurse tag allows rendering of tree structures. The template should look something like this:
4
- # {% recurse all_categories with children as category %}
5
- # <ul>
6
- # {% loop %}
7
- # <li>
8
- # <h{{ level }}>{{ category.title }}</h{{ level }}>
9
- # {% children %}
10
- # </li>
11
- # {% endloop %}
12
- # </ul>
13
- # {% endrecurse %}
14
- class Recurse < Tag
15
-
16
- Syntax = /(#{H2o::NAME_RE})\s+with\s+(#{H2o::IDENTIFIER_RE})\s+as\s+(#{H2o::IDENTIFIER_RE})/
17
-
18
- def initialize(parser, argstring)
19
- @body = parser.parse(:loop, :children, :endloop, :endrecurse)
20
- @child = parser.parse(:children, :endloop, :endrecurse) if parser.token && parser.token.include?('loop')
21
- @enditem = parser.parse(:endloop, :endrecurse) if parser.token && parser.token.include?('children')
22
- @end = parser.parse(:endrecurse) if parser.token && parser.token.include?('endloop')
23
- if argstring =~ Syntax
24
- @collection_id = $1.to_sym
25
- @children_method = $2.to_sym
26
- @item_id = $3.to_sym
27
- else
28
- raise SyntaxError, "Invalid recurse syntax "
29
- end
30
- end
31
-
32
- def render(context, stream)
33
- collection = context.resolve(@collection_id)
34
- @body.render(context, stream)
35
- context.stack do
36
- level = context[:level] || 1
37
- collection.each do |item|
38
- context[@item_id] = item
39
- context[:level] = level
40
- @child.render(context, stream)
41
- children = item.respond_to?(@children_method) ? item.send(@children_method) : item[@children_method]
42
- unless children.empty?
43
- stream << self.render(Context.new({@collection_id => children, :level => (level + 1)}), [])
44
- end
45
- @enditem.render(context, stream)
46
- end
47
- end
48
- @end.render(context, stream)
49
- end
50
-
51
- Tags.register(self, :recurse)
52
-
53
- end
54
- end
55
- end