hmote 1.2.0 → 1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 944f108a4471141ffe3b7265b6d7f2895443259c
4
- data.tar.gz: 92d6d888dadad1e50ac3f471bb020c20e24937c8
3
+ metadata.gz: 62b364d0904c64b47d40549e99b1b074f3b34830
4
+ data.tar.gz: 4f636c64838e7abfd047a963e37ce5d2de5392b8
5
5
  SHA512:
6
- metadata.gz: 8b7d2b3e3b1dabc260e22c1214da5f45499e45f05674ace3ca4c29d156293733a78f12399527eb1046966b1999e3001cc5c2ece01410246cb5c531cb9480a233
7
- data.tar.gz: ae500aa801dfd837eee00e82c8a1ffee987b1977081255aafcf1113e69d52e7f96452d480f97c88fe82939632b00252533eb86eb97b957d5d66356696abee8b0
6
+ metadata.gz: cecb32632d690a9e5fccf139cf298c9d462633aa1438f2e935ddabc2b344e93d29249a9670ea2ee94dcd408c0b837deafdb1d1acb3aa979369411cc3d9827a56
7
+ data.tar.gz: 2df94a7b9b45bcf51978cb6bd326c3f86de5929777fc50ea91663f0abced820afc7aee35fceeb9c29c25ecf782189ad4735ab4886cffe6cc6edd6a45c0896976
data/.gems CHANGED
@@ -1,4 +1,4 @@
1
1
  cutest -v 1.2.2
2
2
  hache -v 1.1.0
3
- cuba -v 3.3.0
4
- rack-test -v 0.6.2
3
+ cuba -v 3.4.0
4
+ rack-test -v 0.6.3
data/LICENSE CHANGED
@@ -1,4 +1,6 @@
1
- Copyright (c) 2014-Present Francesco Rodríguez, Mayn Kjær
1
+ Copyright (c) 2011-2014 Michel Martens
2
+ Copyright (c) 2014-2015 Francesco Rodríguez
3
+ Copyright (c) 2014-2015 Mayn Ektvedt Kjær
2
4
 
3
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -6,7 +6,7 @@ Minimal template engine with default escaping.
6
6
  Description
7
7
  -----------
8
8
 
9
- HMote is based on [Mote][mote] and uses [Hache][hache]
9
+ HMote is a fork of [Mote][mote] that uses [Hache][hache]
10
10
  to auto-escape HTML special characters.
11
11
 
12
12
  Basic Usage
@@ -22,18 +22,23 @@ template.call
22
22
  # => "your template goes here!"
23
23
  ```
24
24
 
25
- HMote recognizes two tags to evaluate Ruby code: `%` and `{{}}`.
26
- The difference between them is that while the `%` tag only evaluates
27
- the code, the `{{}}` tag also prints the result to the template.
25
+ HMote recognizes three tags to evaluate Ruby code: `%`, `{{}}` and `<? ?>`.
26
+ The difference between them is that while the `%` and `<? ?>` tags only
27
+ evaluate the code, the `{{}}` tag also prints the result to the template.
28
28
 
29
29
  Imagine that your template looks like this:
30
30
 
31
31
  ```ruby
32
+ % # single-line code
32
33
  % gems = ["rack", "cuba", "hmote"]
33
34
 
35
+ <?
36
+ # multi-line code
37
+ sorted = gems.sort
38
+ ?>
39
+
34
40
  <ul>
35
- % # this is a comment.
36
- % gems.sort.each do |gem|
41
+ % sorted.each do |gem|
37
42
  <li>{{ gem }}</li>
38
43
  % end
39
44
  </ul>
@@ -213,5 +218,5 @@ $ gem install hmote
213
218
 
214
219
  [cuba]: http://cuba.is
215
220
  [mote]: https://github.com/soveran/mote
216
- [hache]: https://github.com/frodsan/hache
221
+ [hache]: https://github.com/harmoni/hache
217
222
  [xss]: http://en.wikipedia.org/wiki/Cross-Site_Scripting
data/benchmarks/.gems CHANGED
@@ -1,2 +1,3 @@
1
- actionview -v 4.1.8
2
- benchmark-ips -v 2.1.0
1
+ actionview -v 4.2.3
2
+ allocation_stats -v 0.1.5
3
+ benchmark-ips -v 2.3.0
@@ -1,17 +1,11 @@
1
- require_relative "helper"
2
- require_relative "hmote_helper"
3
- require_relative "rails_helper"
1
+ require_relative "helpers/helper"
2
+ require_relative "helpers/hmote_helper"
3
+ require_relative "helpers/rails_helper"
4
4
 
5
5
  text = %q(some < text > inside & these " escapable' characters/1234)
6
6
 
7
7
  Benchmark.ips do |x|
8
8
  x.report("hmote") { hmote(text: text) }
9
9
  x.report("rails") { rails(text: text) }
10
+ x.compare!
10
11
  end
11
-
12
- # Calculating -------------------------------------
13
- # hmote 13.122k i/100ms
14
- # rails 7.907k i/100ms
15
- # -------------------------------------------------
16
- # hmote 148.020k (± 3.6%) i/s - 747.954k
17
- # rails 88.623k (± 2.7%) i/s - 442.792k
@@ -1,7 +1,7 @@
1
1
  require "benchmark/ips"
2
2
 
3
3
  def template_path(template)
4
- File.join(File.expand_path("templates", __dir__), template)
4
+ File.join(File.expand_path("../templates", __dir__), template)
5
5
  end
6
6
 
7
7
  MOTE_TEMPLATE = template_path("mote")
@@ -1,4 +1,4 @@
1
- require_relative "../lib/hmote"
1
+ require_relative "../../lib/hmote"
2
2
 
3
3
  include HMote::Helpers
4
4
 
@@ -0,0 +1,24 @@
1
+ require_relative "helpers/helper"
2
+ require_relative "helpers/hmote_helper"
3
+ require "allocation_stats"
4
+
5
+ def benchmark(text)
6
+ stats = AllocationStats.new(burn: 5).trace do
7
+ hmote(text: text)
8
+ end
9
+
10
+ allocations = stats.allocations.all.size
11
+ memsize = stats.allocations.bytes.to_a.inject(&:+)
12
+
13
+ puts "total allocations: #{ allocations }"
14
+ puts "total memsize: #{ memsize }"
15
+ puts stats.allocations(alias_paths: true).to_text
16
+ end
17
+
18
+ puts "== Unsafe mode\n"
19
+
20
+ benchmark(%q(some < text > inside & these " escapable' characters/1234))
21
+
22
+ puts "\n== Safe mode\n"
23
+
24
+ benchmark(%q(some text without escapable characters))
data/benchmarks/safe.rb CHANGED
@@ -1,17 +1,11 @@
1
- require_relative "helper"
2
- require_relative "hmote_helper"
3
- require_relative "rails_helper"
1
+ require_relative "helpers/helper"
2
+ require_relative "helpers/hmote_helper"
3
+ require_relative "helpers/rails_helper"
4
4
 
5
5
  text = %q(some text without escapable characters).html_safe
6
6
 
7
7
  Benchmark.ips do |x|
8
8
  x.report("hmote") { hmote(text: text) }
9
9
  x.report("rails") { rails(text: text) }
10
+ x.compare!
10
11
  end
11
-
12
- # Calculating -------------------------------------
13
- # hmote 29.035k i/100ms
14
- # rails 14.607k i/100ms
15
- # -------------------------------------------------
16
- # hmote 367.044k (± 5.9%) i/s - 1.829M
17
- # rails 157.936k (± 5.9%) i/s - 788.778k
data/hmote.gemspec CHANGED
@@ -1,15 +1,17 @@
1
+ require_relative "lib/hmote/version"
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = "hmote"
3
- s.version = "1.2.0"
5
+ s.version = HMote::VERSION
4
6
  s.summary = "A minimum operational template that escapes HTML tags by default."
5
- s.description = s.summary
6
- s.authors = ["Francesco Rodríguez", "Mayn Kjær"]
7
- s.email = ["frodsan@me.com", "mayn.kjaer@gmail.com"]
7
+ s.description = s.summary + " Inspired by mote."
8
+ s.authors = ["Francesco Rodríguez", "Mayn Kjær"]
9
+ s.email = ["frodsan@protonmail.ch", "mayn.kjaer@gmail.com"]
8
10
  s.homepage = "https://github.com/harmoni/hmote"
9
11
  s.license = "MIT"
10
12
 
11
13
  s.files = `git ls-files`.split("\n")
12
14
 
13
- s.add_dependency "hache"
14
- s.add_development_dependency "cutest"
15
+ s.add_dependency "hache", "~> 1.1"
16
+ s.add_development_dependency "cutest", "~> 1.2"
15
17
  end
data/lib/hmote/render.rb CHANGED
@@ -3,15 +3,22 @@ require_relative "../hmote"
3
3
  module HMote::Render
4
4
  include HMote::Helpers
5
5
 
6
+ CONTENT_TYPE = "Content-Type".freeze
7
+ DEFAULT_CONTENT_TYPE = "text/html; charset=utf-8".freeze
8
+
6
9
  def self.setup(app)
7
10
  app.settings[:hmote] ||= {}
8
- app.settings[:hmote][:views] ||= File.expand_path("views", Dir.pwd)
9
- app.settings[:hmote][:layout] ||= "layout"
11
+
12
+ app.layout("layout")
13
+ app.view_path("views")
10
14
  end
11
15
 
12
16
  def render(template, params = {}, layout = settings[:hmote][:layout])
13
- res.headers["Content-Type"] ||= "text/html; charset=utf-8"
17
+ res.status ||= 200
18
+ res.headers[CONTENT_TYPE] ||= DEFAULT_CONTENT_TYPE
14
19
  res.write(view(template, params, layout))
20
+
21
+ halt(res.finish)
15
22
  end
16
23
 
17
24
  def view(template, params = {}, layout = settings[:hmote][:layout])
@@ -23,10 +30,16 @@ module HMote::Render
23
30
  end
24
31
 
25
32
  def template_path(template)
26
- if template.end_with?(".mote")
27
- return template
28
- else
29
- return File.join(settings[:hmote][:views], "#{template}.mote")
33
+ return File.join(settings[:hmote][:views], "#{template}.mote")
34
+ end
35
+
36
+ module ClassMethods
37
+ def layout(name)
38
+ settings[:hmote][:layout] = name
39
+ end
40
+
41
+ def view_path(path)
42
+ settings[:hmote][:views] = File.expand_path(path, Dir.pwd)
30
43
  end
31
44
  end
32
45
  end
@@ -0,0 +1,3 @@
1
+ class HMote
2
+ VERSION = "1.3.0"
3
+ end
data/lib/hmote.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  require "hache"
2
2
 
3
3
  class HMote
4
- PATTERN = /^(\n)| # newlines.
5
- ^\s*(%)\s*(.*?)(?:\n|\Z)| # % single-line code
6
- (<\?)\s+(.*?)\s+\?>| # <? multi-line code ?>
7
- (\{\{!?)(.*?)\}\} # {{ escape }} or {{! unescape }}
4
+ PATTERN = /
5
+ ^[^\S\n]*(%)[^\S\n]*(.*?)(?:\n|\z) | # % single-line code
6
+ (<\?)\s+(.*?)\s+\?> | # <? multi-line code ?>
7
+ (\{\{!?)(.*?)\}\} # {{ escape }} or {{! unescape }}
8
8
  /mx
9
9
 
10
10
  def self.parse(template, context = self, vars = [])
@@ -12,10 +12,10 @@ class HMote
12
12
  parts = "Proc.new do |params, __o|\n params ||= {}; __o ||= ''\n"
13
13
 
14
14
  vars.each do |var|
15
- parts << "%s = params[%s]\n" % [var, var.inspect]
15
+ parts << sprintf("%s = params[%p]\n", var, var)
16
16
  end
17
17
 
18
- while term = terms.shift
18
+ while (term = terms.shift)
19
19
  case term
20
20
  when "<?" then parts << "#{terms.shift}\n"
21
21
  when "%" then parts << "#{terms.shift}\n"
data/makefile CHANGED
@@ -1,7 +1,8 @@
1
+ .DEFAULT_GOAL := test
1
2
  .PHONY: test
2
3
 
3
4
  gem:
4
- gem build hmote.gemspec
5
+ gem build *.gemspec
5
6
 
6
7
  test:
7
8
  cutest test/*.rb
data/test/parsing.rb CHANGED
@@ -36,7 +36,7 @@ scope("parsing") do
36
36
 
37
37
  test "multiline" do
38
38
  example = HMote.parse("The\nMan\nAnd\n{{\"The\"}}\nSea")
39
- assert_equal("The\nMan\nAnd\nThe\nSea", example[n: 3])
39
+ assert_equal("The\nMan\nAnd\nThe\nSea", example.call)
40
40
  end
41
41
 
42
42
  test "quotes" do
@@ -67,17 +67,17 @@ scope("parsing") do
67
67
 
68
68
  test "multi-line XML-style directives" do
69
69
  template = (<<-EOT).gsub(/^ /, "")
70
- <? res = ""
71
- [1, 2, 3].each_with_index do |item, idx|
72
- res << "%d. %d\n" % [idx + 1, item * item]
73
- end
70
+ <?
71
+ # Multiline code evaluation
72
+ lucky = [1, 3, 7, 9, 13, 15]
73
+ prime = [2, 3, 5, 7, 11, 13]
74
74
  ?>
75
- {{ res }}
75
+
76
+ {{ lucky & prime }}
76
77
  EOT
77
78
 
78
79
  example = HMote.parse(template)
79
-
80
- assert_equal("\n1. 1\n2. 4\n3. 9\n\n", example.call)
80
+ assert_equal "\n\n[3, 7, 13]\n", example.call
81
81
  end
82
82
 
83
83
  test "preserve XML directives" do
data/test/render.rb CHANGED
@@ -26,12 +26,9 @@ Cuba.define do
26
26
  res.write partial("context")
27
27
  end
28
28
 
29
- on "absolute" do
30
- render("./test/custom_views/custom.mote", title: "Custom")
31
- end
32
-
33
- on "absolute_layout" do
34
- render("./test/custom_views/custom.mote", title: "Custom Layout")
29
+ on "halt" do
30
+ render("home", title: "Halt before error")
31
+ raise "This is invalid"
35
32
  end
36
33
  end
37
34
 
@@ -62,17 +59,9 @@ scope do
62
59
  assert last_response.body["App"]
63
60
  end
64
61
 
65
- test "use of absolute path for template" do
66
- get "/absolute"
67
-
68
- assert last_response.body["<title>Custom</title>\n<h1>Custom</h1>"]
69
- end
70
-
71
- test "use of absolute path for layout" do
72
- Cuba.settings[:hmote][:layout] = "./test/custom_views/layout.mote"
73
-
74
- get "/absolute_layout"
62
+ test "render halts request" do
63
+ get "/halt"
75
64
 
76
- assert last_response.body["<title>Custom Layout</title>\n<h1>Custom</h1>"]
65
+ assert true
77
66
  end
78
67
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hmote
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Francesco Rodríguez
@@ -9,39 +9,40 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-01-14 00:00:00.000000000 Z
12
+ date: 2015-08-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hache
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
- - - ">="
18
+ - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '0'
20
+ version: '1.1'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
- - - ">="
25
+ - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '0'
27
+ version: '1.1'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: cutest
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - ">="
32
+ - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '0'
34
+ version: '1.2'
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
- - - ">="
39
+ - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '0'
42
- description: A minimum operational template that escapes HTML tags by default.
41
+ version: '1.2'
42
+ description: A minimum operational template that escapes HTML tags by default. Inspired
43
+ by mote.
43
44
  email:
44
- - frodsan@me.com
45
+ - frodsan@protonmail.ch
45
46
  - mayn.kjaer@gmail.com
46
47
  executables: []
47
48
  extensions: []
@@ -52,18 +53,18 @@ files:
52
53
  - README.md
53
54
  - benchmarks/.gems
54
55
  - benchmarks/escaping.rb
55
- - benchmarks/helper.rb
56
- - benchmarks/hmote_helper.rb
57
- - benchmarks/rails_helper.rb
56
+ - benchmarks/helpers/helper.rb
57
+ - benchmarks/helpers/hmote_helper.rb
58
+ - benchmarks/helpers/rails_helper.rb
59
+ - benchmarks/memory.rb
58
60
  - benchmarks/safe.rb
59
61
  - benchmarks/templates/erb
60
62
  - benchmarks/templates/mote
61
63
  - hmote.gemspec
62
64
  - lib/hmote.rb
63
65
  - lib/hmote/render.rb
66
+ - lib/hmote/version.rb
64
67
  - makefile
65
- - test/custom_views/custom.mote
66
- - test/custom_views/layout.mote
67
68
  - test/foo.mote
68
69
  - test/helper.rb
69
70
  - test/helpers.rb
@@ -1 +0,0 @@
1
- <h1>Custom</h1>
@@ -1,2 +0,0 @@
1
- <title>{{ title }}</title>
2
- {{! content }}