pug-ruby 1.0.2 → 2.0.0.rc1

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 (164) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rubocop.yml +81 -0
  4. data/.travis.yml +17 -8
  5. data/.yardopts +4 -0
  6. data/Gemfile +3 -3
  7. data/Gemfile.lock +32 -0
  8. data/LICENSE +21 -0
  9. data/README.md +256 -24
  10. data/Rakefile +74 -8
  11. data/lib/jade-pug/base.rb +178 -0
  12. data/lib/jade-pug/compiler.rb +166 -0
  13. data/lib/jade-pug/config.rb +60 -0
  14. data/lib/jade-pug/errors/compilation-error.rb +14 -0
  15. data/lib/jade-pug/errors/compiler-error.rb +13 -0
  16. data/lib/jade-pug/shipped-compiler.rb +80 -0
  17. data/lib/jade-pug/system-compiler.rb +139 -0
  18. data/lib/jade-ruby/compilation-essentials.rb +24 -0
  19. data/lib/jade-ruby/config.rb +17 -44
  20. data/lib/jade-ruby/errors/compilation-error.rb +14 -0
  21. data/lib/jade-ruby/errors/compiler-error.rb +13 -0
  22. data/lib/jade-ruby/shipped-compiler.rb +15 -0
  23. data/lib/jade-ruby/system-compiler.rb +15 -0
  24. data/lib/pug-ruby.rb +46 -5
  25. data/lib/pug-ruby/compilation-essentials.rb +29 -0
  26. data/lib/pug-ruby/config.rb +11 -37
  27. data/lib/pug-ruby/errors/compilation-error.rb +14 -0
  28. data/lib/pug-ruby/errors/compiler-error.rb +13 -0
  29. data/lib/pug-ruby/shipped-compiler.rb +15 -0
  30. data/lib/pug-ruby/system-compiler.rb +15 -0
  31. data/lib/pug-ruby/version.rb +7 -0
  32. data/package.json +11 -0
  33. data/pug-ruby.gemspec +19 -12
  34. data/support/browserify-jade-runtime.js +19 -0
  35. data/support/browserify-jade.js +17 -0
  36. data/support/browserify-pug-runtime.js +19 -0
  37. data/support/browserify-pug.js +23 -0
  38. data/support/minify-jade.js +11 -0
  39. data/support/minify-pug.js +11 -0
  40. data/test/helper.rb +202 -0
  41. data/test/jade/includes/includes/footer.jade +1 -1
  42. data/test/manual.html +21 -0
  43. data/test/manual.rb +25 -0
  44. data/test/pug/includes/includes/footer.pug +1 -1
  45. data/test/pug/index.pug +3 -3
  46. data/test/test-jade.rb +3 -67
  47. data/test/test-pug.rb +3 -67
  48. data/vendor/jade-1.0.0.min.js +1 -0
  49. data/vendor/jade-1.0.1.min.js +1 -0
  50. data/vendor/jade-1.0.2.min.js +1 -0
  51. data/vendor/jade-1.1.0.min.js +1 -0
  52. data/vendor/jade-1.1.1.min.js +1 -0
  53. data/vendor/jade-1.1.2.min.js +1 -0
  54. data/vendor/jade-1.1.3.min.js +1 -0
  55. data/vendor/jade-1.1.4.min.js +1 -0
  56. data/vendor/jade-1.1.5.min.js +1 -0
  57. data/vendor/jade-1.10.0.min.js +1 -0
  58. data/vendor/jade-1.11.0.min.js +1 -0
  59. data/vendor/jade-1.2.0.min.js +1 -0
  60. data/vendor/jade-1.3.0.min.js +1 -0
  61. data/vendor/jade-1.3.1.min.js +1 -0
  62. data/vendor/jade-1.4.0.min.js +1 -0
  63. data/vendor/jade-1.4.1.min.js +1 -0
  64. data/vendor/jade-1.4.2.min.js +1 -0
  65. data/vendor/jade-1.5.0.min.js +1 -0
  66. data/vendor/jade-1.6.0.min.js +1 -0
  67. data/vendor/jade-1.7.0.min.js +1 -0
  68. data/vendor/jade-1.8.0.min.js +1 -0
  69. data/vendor/jade-1.8.1.min.js +1 -0
  70. data/vendor/jade-1.8.2.min.js +1 -0
  71. data/vendor/jade-1.9.0.min.js +1 -0
  72. data/vendor/jade-1.9.1.min.js +1 -0
  73. data/vendor/jade-1.9.2.min.js +1 -0
  74. data/vendor/jade-runtime-1.0.0-license +22 -0
  75. data/vendor/jade-runtime-1.0.0.js +199 -0
  76. data/vendor/jade-runtime-1.0.1-license +22 -0
  77. data/vendor/jade-runtime-1.0.1.js +199 -0
  78. data/vendor/jade-runtime-1.0.2-license +22 -0
  79. data/vendor/jade-runtime-1.0.2.js +199 -0
  80. data/vendor/jade-runtime-1.1.0-license +22 -0
  81. data/vendor/jade-runtime-1.1.0.js +199 -0
  82. data/vendor/jade-runtime-1.1.1-license +22 -0
  83. data/vendor/jade-runtime-1.1.1.js +199 -0
  84. data/vendor/jade-runtime-1.1.2-license +22 -0
  85. data/vendor/jade-runtime-1.1.2.js +200 -0
  86. data/vendor/jade-runtime-1.1.3-license +22 -0
  87. data/vendor/jade-runtime-1.1.3.js +200 -0
  88. data/vendor/jade-runtime-1.1.4-license +22 -0
  89. data/vendor/jade-runtime-1.1.4.js +200 -0
  90. data/vendor/jade-runtime-1.1.5-license +22 -0
  91. data/vendor/jade-runtime-1.1.5.js +200 -0
  92. data/vendor/jade-runtime-1.10.0-license +22 -0
  93. data/vendor/jade-runtime-1.10.0.js +233 -0
  94. data/vendor/jade-runtime-1.11.0-license +22 -0
  95. data/vendor/jade-runtime-1.11.0.js +246 -0
  96. data/vendor/jade-runtime-1.2.0-license +22 -0
  97. data/vendor/jade-runtime-1.2.0.js +200 -0
  98. data/vendor/jade-runtime-1.3.0-license +22 -0
  99. data/vendor/jade-runtime-1.3.0.js +200 -0
  100. data/vendor/jade-runtime-1.3.1-license +22 -0
  101. data/vendor/jade-runtime-1.3.1.js +200 -0
  102. data/vendor/jade-runtime-1.4.0-license +22 -0
  103. data/vendor/jade-runtime-1.4.0.js +200 -0
  104. data/vendor/jade-runtime-1.4.1-license +22 -0
  105. data/vendor/jade-runtime-1.4.1.js +200 -0
  106. data/vendor/jade-runtime-1.4.2-license +22 -0
  107. data/vendor/jade-runtime-1.4.2.js +200 -0
  108. data/vendor/jade-runtime-1.5.0-license +22 -0
  109. data/vendor/jade-runtime-1.5.0.js +200 -0
  110. data/vendor/jade-runtime-1.6.0-license +22 -0
  111. data/vendor/jade-runtime-1.6.0.js +200 -0
  112. data/vendor/jade-runtime-1.7.0-license +22 -0
  113. data/vendor/jade-runtime-1.7.0.js +200 -0
  114. data/vendor/jade-runtime-1.8.0-license +22 -0
  115. data/vendor/jade-runtime-1.8.0.js +228 -0
  116. data/vendor/jade-runtime-1.8.1-license +22 -0
  117. data/vendor/jade-runtime-1.8.1.js +228 -0
  118. data/vendor/jade-runtime-1.8.2-license +22 -0
  119. data/vendor/jade-runtime-1.8.2.js +228 -0
  120. data/vendor/jade-runtime-1.9.0-license +22 -0
  121. data/vendor/jade-runtime-1.9.0.js +228 -0
  122. data/vendor/jade-runtime-1.9.1-license +22 -0
  123. data/vendor/jade-runtime-1.9.1.js +228 -0
  124. data/vendor/jade-runtime-1.9.2-license +22 -0
  125. data/vendor/jade-runtime-1.9.2.js +228 -0
  126. data/vendor/pug-2.0.0-beta.12-license +22 -0
  127. data/vendor/pug-2.0.0-beta.12.min.js +1 -0
  128. data/vendor/pug-2.0.0-beta1-license +22 -0
  129. data/vendor/pug-2.0.0-beta1.min.js +1 -0
  130. data/vendor/pug-2.0.0-beta10-license +22 -0
  131. data/vendor/pug-2.0.0-beta10.min.js +1 -0
  132. data/vendor/pug-2.0.0-beta11-license +22 -0
  133. data/vendor/pug-2.0.0-beta11.min.js +1 -0
  134. data/vendor/pug-2.0.0-beta2-license +22 -0
  135. data/vendor/pug-2.0.0-beta2.min.js +1 -0
  136. data/vendor/pug-2.0.0-beta3-license +22 -0
  137. data/vendor/pug-2.0.0-beta3.min.js +1 -0
  138. data/vendor/pug-2.0.0-beta4-license +22 -0
  139. data/vendor/pug-2.0.0-beta4.min.js +1 -0
  140. data/vendor/pug-2.0.0-beta5-license +22 -0
  141. data/vendor/pug-2.0.0-beta5.min.js +1 -0
  142. data/vendor/pug-2.0.0-beta6-license +22 -0
  143. data/vendor/pug-2.0.0-beta6.min.js +1 -0
  144. data/vendor/pug-2.0.0-beta7-license +22 -0
  145. data/vendor/pug-2.0.0-beta7.min.js +1 -0
  146. data/vendor/pug-2.0.0-beta8-license +22 -0
  147. data/vendor/pug-2.0.0-beta8.min.js +1 -0
  148. data/vendor/pug-2.0.0-beta9-license +22 -0
  149. data/vendor/pug-2.0.0-beta9.min.js +1 -0
  150. data/vendor/pug-2.0.0-rc.1-license +22 -0
  151. data/vendor/pug-2.0.0-rc.1.min.js +1 -0
  152. data/vendor/pug-2.0.0-rc.2-license +22 -0
  153. data/vendor/pug-2.0.0-rc.2.min.js +1 -0
  154. data/vendor/pug-2.0.0-rc.3-license +22 -0
  155. data/vendor/pug-2.0.0-rc.3.min.js +1 -0
  156. data/vendor/pug-runtime-2.0.0-license +19 -0
  157. data/vendor/pug-runtime-2.0.0.js +266 -0
  158. data/vendor/pug-runtime-2.0.1-license +19 -0
  159. data/vendor/pug-runtime-2.0.1.js +266 -0
  160. data/vendor/pug-runtime-2.0.2-license +19 -0
  161. data/vendor/pug-runtime-2.0.2.js +267 -0
  162. metadata +242 -13
  163. data/lib/jade-ruby/compile.rb +0 -79
  164. data/lib/pug-ruby/compile.rb +0 -88
@@ -0,0 +1,29 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module Pug
5
+ #
6
+ # Used to share common things between compilers.
7
+ #
8
+ module CompilationEssentials
9
+ #
10
+ # Responds for post-processing compilation result.
11
+ #
12
+ # @param source [String] The source code of template.
13
+ # @param result [String] The compiled code of template.
14
+ # @param options [Hash] The compilation options.
15
+ # @return [String]
16
+ def process_result(source, result, options)
17
+ if options[:client]
18
+ if options[:inline_runtime_functions]
19
+ "(function() { #{super}; return #{options[:name]}; }).call(this);"
20
+ else
21
+ pug = "typeof pugRuntime === 'object' && pugRuntime !== null ? pugRuntime : pug"
22
+ "(function(pug) { #{super}; return #{options[:name]}; }).call(this, #{pug});"
23
+ end
24
+ else
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,52 +1,26 @@
1
- # encoding: utf-8
1
+ # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Pug
5
- class Config
6
- # https://pugjs.org/api/reference.html
7
- # https://github.com/pugjs/pug-cli
8
- attr_accessor :filename
9
- attr_accessor :basedir
10
- attr_accessor :doctype
11
- attr_accessor :pretty
12
- attr_accessor :self
13
- attr_accessor :debug
14
- attr_accessor :compile_debug
15
- attr_accessor :globals
16
- attr_accessor :inline_runtime_functions
17
- attr_accessor :name
18
- attr_accessor :name_after_file
19
- attr_accessor :out
20
- attr_accessor :extension
21
- attr_accessor :silent
22
-
5
+ #
6
+ # Defines Pug compiler configuration.
7
+ #
8
+ # The documentation for Pug configuration options can be found here:
9
+ # - {https://pugjs.org/api/reference.html}
10
+ # - {https://github.com/pugjs/pug-cli/blob/master/index.js}
11
+ #
12
+ class Config < JadePug::Config
23
13
  def initialize
14
+ super
24
15
  @filename = nil
25
16
  @basedir = nil
26
17
  @doctype = nil
27
18
  @pretty = false
28
19
  @self = false
29
- @debug = false
30
20
  @compile_debug = false
31
21
  @globals = []
32
22
  @inline_runtime_functions = true
33
- @name = 'template'
34
- @name_after_file = nil
35
- @out = nil
36
- @extension = nil
37
- @silent = true
38
- end
39
-
40
- def to_hash
41
- %i( filename basedir doctype
42
- pretty self debug
43
- compile_debug globals inline_runtime_functions
44
- name name_after_file out
45
- extension silent ).each_with_object({}) { |x, y| y[x] = send(x) }
23
+ @name = "template"
46
24
  end
47
25
  end
48
-
49
- singleton_class.class_exec { attr_accessor :config }
50
- self.config = Config.new
51
26
  end
52
-
@@ -0,0 +1,14 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module Pug
5
+ #
6
+ # Used for template compilation errors, for example:
7
+ # - any template engine errors
8
+ # - syntax errors in template
9
+ # - any JavaScript exceptions (they are caught by ExecJS)
10
+ #
11
+ class CompilationError < JadePug::CompilationError
12
+
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module Pug
5
+ #
6
+ # Used when something is wrong with shipped Pug compiler, for example:
7
+ # - when compiler source couldn't be read (file is missing or permissions problem?)
8
+ # - when compiler couldn't be compiled (when ExecJS fails to compile JavaScript code)
9
+ #
10
+ class CompilerError < JadePug::CompilerError
11
+
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module Pug
5
+ #
6
+ # Abstraction layer for shipped Pug compiler.
7
+ #
8
+ class ShippedCompiler < JadePug::ShippedCompiler
9
+ include CompilationEssentials
10
+
11
+ def initialize(version)
12
+ super Pug, version
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ module Pug
5
+ #
6
+ # Abstraction layer for system Pug compiler.
7
+ #
8
+ class SystemCompiler < JadePug::SystemCompiler
9
+ include CompilationEssentials
10
+
11
+ def initialize
12
+ super Pug
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,7 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # Keeps the "pug-ruby" gem version.
6
+ #
7
+ PUG_RUBY_GEM_VERSION = "2.0.0.rc1"
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "pug-ruby",
3
+ "devDependencies": {
4
+ "babel-plugin-transform-es2015-block-scoping": "^6.24.1",
5
+ "babel-preset-es2015": "^6.24.1",
6
+ "babelify": "^7.3.0",
7
+ "browserify": "^14.4.0",
8
+ "envify": "^4.1.0",
9
+ "uglify-js": "^3.0.26"
10
+ }
11
+ }
@@ -1,20 +1,27 @@
1
- # encoding: utf-8
1
+ # encoding: UTF-8
2
2
  # frozen_string_literal: true
3
3
 
4
+ require File.expand_path("../lib/pug-ruby/version", __FILE__)
5
+
4
6
  Gem::Specification.new do |s|
5
- s.name = 'pug-ruby'
6
- s.version = '1.0.2'
7
- s.author = 'Yaroslav Konoplov'
8
- s.email = 'eahome00@gmail.com'
9
- s.summary = 'Ruby wrapper for the Pug/Jade template engine.'
10
- s.description = 'Ruby wrapper for the Pug/Jade template engine.'
11
- s.homepage = 'https://github.com/yivo/pug-ruby'
12
- s.license = 'MIT'
7
+ s.name = "pug-ruby"
8
+ s.version = PUG_RUBY_GEM_VERSION
9
+ s.author = "Yaroslav Konoplov"
10
+ s.email = "eahome00@gmail.com"
11
+ s.summary = "Ruby wrapper for the Jade / Pug template engine."
12
+ s.description = "Ruby wrapper for the Jade / Pug template engine."
13
+ s.homepage = "https://github.com/yivo/pug-ruby"
14
+ s.license = "MIT"
13
15
 
14
16
  s.files = `git ls-files -z`.split("\x0")
15
17
  s.test_files = `git ls-files -z -- {test,spec,features}/*`.split("\x0")
16
- s.require_paths = ['lib']
18
+ s.require_paths = ["lib"]
17
19
 
18
- s.add_development_dependency 'bundler', '~> 1.7'
19
- s.add_development_dependency 'rake', '~> 10.0'
20
+ s.add_dependency "execjs", "~> 2.0"
21
+ s.add_dependency "memoist", "~> 0.15"
22
+ s.add_dependency "regexp-match-polyfill", "~> 1.0", ">= 1.0.2"
23
+ s.add_dependency "method-not-implemented", "~> 1.0", ">= 1.0.1"
24
+ s.add_development_dependency "rake", "~> 10.0"
25
+ s.add_development_dependency "test-unit", "~> 3.1"
26
+ s.add_development_dependency "bundler", "~> 1.7"
20
27
  end
@@ -0,0 +1,19 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var browserify = require('browserify');
5
+
6
+ var ENGINE_RUNTIME_DIR = process.argv[2];
7
+ var ENGINE_RUNTIME_VER = process.argv[3];
8
+ var OUTPUT_FILE = process.argv[4];
9
+
10
+ var ENGINE_RUNTIME_INDEX = ENGINE_RUNTIME_DIR + '/lib/runtime.js';
11
+
12
+ browserify({entries: [ENGINE_RUNTIME_INDEX], standalone: 'jade'})
13
+ .transform('babelify', {
14
+ presets: ['es2015'],
15
+ plugins: ['transform-es2015-block-scoping']
16
+ })
17
+ .transform('envify')
18
+ .bundle()
19
+ .pipe(fs.createWriteStream(OUTPUT_FILE));
@@ -0,0 +1,17 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var browserify = require('browserify');
5
+
6
+ var ENGINE_DIR = process.argv[2];
7
+ var ENGINE_VERSION = process.argv[3];
8
+ var OUTPUT_FILE = process.argv[4];
9
+
10
+ browserify({entries: [ENGINE_DIR + '/lib/index.js'], standalone: 'jade'})
11
+ .transform('babelify', {
12
+ presets: ['es2015'],
13
+ plugins: ['transform-es2015-block-scoping']
14
+ })
15
+ .transform('envify')
16
+ .bundle()
17
+ .pipe(fs.createWriteStream(OUTPUT_FILE));
@@ -0,0 +1,19 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var browserify = require('browserify');
5
+
6
+ var ENGINE_RUNTIME_DIR = process.argv[2];
7
+ var ENGINE_RUNTIME_VER = process.argv[3];
8
+ var OUTPUT_FILE = process.argv[4];
9
+
10
+ var ENGINE_RUNTIME_INDEX = ENGINE_RUNTIME_DIR + '/index.js';
11
+
12
+ browserify({entries: [ENGINE_RUNTIME_INDEX], standalone: 'pugRuntime'})
13
+ .transform('babelify', {
14
+ presets: ['es2015'],
15
+ plugins: ['transform-es2015-block-scoping']
16
+ })
17
+ .transform('envify')
18
+ .bundle()
19
+ .pipe(fs.createWriteStream(OUTPUT_FILE));
@@ -0,0 +1,23 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var browserify = require('browserify');
5
+
6
+ var ENGINE_DIR = process.argv[2];
7
+ var ENGINE_VERSION = process.argv[3];
8
+ var OUTPUT_FILE = process.argv[4];
9
+
10
+ var ENGINE_INDEX = fs.existsSync(ENGINE_DIR + '/packages/pug/lib/index.js') ?
11
+ ENGINE_DIR + '/packages/pug/lib/index.js' :
12
+ ENGINE_DIR + '/lib/index.js';
13
+
14
+ browserify({entries: [ENGINE_INDEX], standalone: 'pug'})
15
+ .transform('babelify', {
16
+ global: true,
17
+ only: /\/node_modules\/pug-/,
18
+ presets: ['es2015'],
19
+ plugins: ['transform-es2015-block-scoping']
20
+ })
21
+ .transform('envify')
22
+ .bundle()
23
+ .pipe(fs.createWriteStream(OUTPUT_FILE));
@@ -0,0 +1,11 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var uglifyJS = require('uglify-js');
5
+
6
+ var INPUT_FILE = process.argv[2];
7
+ var OUTPUT_FILE = INPUT_FILE;
8
+
9
+ var code = fs.readFileSync(INPUT_FILE, 'UTF-8');
10
+
11
+ fs.writeFileSync(OUTPUT_FILE, uglifyJS.minify(code, {compress: true, mangle: true}).code);
@@ -0,0 +1,11 @@
1
+ process.env['NODE_ENV'] = 'production';
2
+
3
+ var fs = require('fs');
4
+ var uglifyJS = require('uglify-js');
5
+
6
+ var INPUT_FILE = process.argv[2];
7
+ var OUTPUT_FILE = INPUT_FILE;
8
+
9
+ var code = fs.readFileSync(INPUT_FILE, 'UTF-8');
10
+
11
+ fs.writeFileSync(OUTPUT_FILE, uglifyJS.minify(code, {compress: true, mangle: true}).code);
@@ -0,0 +1,202 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
3
+
4
+ Bundler.require :default, :development
5
+ require "stringio"
6
+ require "regexp-match-polyfill"
7
+
8
+ Jade.silence = true
9
+ Pug.silence = true
10
+
11
+ module JadePugTestHelpers
12
+ def engine
13
+ Object.const_get self.class.name.gsub(/Test\z/, "")
14
+ end
15
+
16
+ def each_version
17
+ ([:system] + engine.versions).each { |v| yield(v) }
18
+ end
19
+
20
+ def ext
21
+ ".#{engine.name.downcase}"
22
+ end
23
+
24
+ def expand_path(relative_path)
25
+ File.expand_path(File.join("../#{engine.name.downcase}", relative_path), __FILE__)
26
+ end
27
+
28
+ def assert_match_doctype(string)
29
+ assert_match(doctype_regex, string)
30
+ end
31
+
32
+ def assert_no_match_doctype(string)
33
+ assert_no_match(doctype_regex, string)
34
+ end
35
+
36
+ def assert_match_template_function(string)
37
+ assert_match(template_function_regex, string)
38
+ end
39
+
40
+ def assert_no_match_template_function(string)
41
+ assert_no_match(template_function_regex, string)
42
+ end
43
+
44
+ def doctype_regex
45
+ /[<\\u003C]!DOCTYPE html[>\\u003E]/
46
+ end
47
+
48
+ def template_function_regex
49
+ /function\s+#{engine.config.name}\s*\(locals\)\s*\{.*\}/m
50
+ end
51
+ end
52
+
53
+ module JadePugTest
54
+ def self.included(base)
55
+ base.class_eval do
56
+ include JadePugTestHelpers
57
+
58
+ versions = [:system] + Object.const_get(base.name.gsub(/Test\z/, "")).versions
59
+ versions = [:system] if ENV["QUICK"]
60
+
61
+ versions.each do |version|
62
+ test "compilation_#{version}" do
63
+ engine.use version
64
+ result = engine.compile("div Hello, world!")
65
+ assert_no_match_template_function(result)
66
+ assert_no_match_doctype(result)
67
+ end
68
+
69
+ test "compilation_with_doctype_#{version}" do
70
+ engine.use version
71
+ result = engine.compile(File.read(expand_path("index#{ext}")))
72
+ assert_no_match_template_function(result)
73
+ assert_match_doctype(result)
74
+ end
75
+
76
+ test "compilation_with_io_#{version}" do
77
+ engine.use version
78
+ template = "div\n | Hello, world!"
79
+ io = StringIO.new(template)
80
+ assert_equal(engine.compile(template), engine.compile(io))
81
+ end
82
+
83
+ test "compilation_with_syntax_error_#{version}" do
84
+ engine.use version
85
+ assert_raise(engine::CompilationError) { engine.compile("else\n div") }
86
+ end
87
+
88
+ test "client_compilation_#{version}" do
89
+ engine.use version
90
+ result = engine.compile("div Hello, world!", client: true)
91
+ assert_match_template_function(result)
92
+ assert_no_match_doctype(result)
93
+ end
94
+
95
+ test "client_compilation_with_doctype_#{version}" do
96
+ engine.use version
97
+ result = engine.compile(File.read(expand_path("index#{ext}")), client: true)
98
+ assert_match_template_function(result)
99
+ assert_match_doctype(result)
100
+ end
101
+
102
+ test "compilation_with_locals_#{version}" do
103
+ engine.use version
104
+ template = "div=greeting"
105
+ result = engine.compile(template, locals: { greeting: "Hello, world!" })
106
+ assert_no_match_template_function(result)
107
+ assert_match("Hello, world!", result)
108
+ assert_no_match(/greeting/, result)
109
+ end
110
+
111
+ test "client_compilation_with_locals_#{version}" do
112
+ engine.use version
113
+ template = "div=greeting"
114
+ result = engine.compile(template, locals: { greeting: "Hello, world!" }, client: true)
115
+ assert_match_template_function(result)
116
+ assert_no_match(/Hello, world!/, result)
117
+ assert_match("greeting", result)
118
+ end
119
+
120
+ test "switch_version_permanently_#{version}" do
121
+ engine.use version
122
+ assert_equal(version == :system ? engine.versions.last : version, engine.compiler.version)
123
+ end
124
+
125
+ test "switch_version_temporarily_#{version}" do
126
+ was = engine.compiler.system? ? :system : engine.compiler.version
127
+ @called = false
128
+ engine.use(version) { @called = true }
129
+ assert_equal(engine.compiler.system? ? :system : engine.compiler.version, was)
130
+ assert @called
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ def test_compilation_with_includes
137
+ engine.use :system
138
+ file = expand_path("includes/index#{ext}")
139
+ template = File.read(file)
140
+ result = engine.compile(template, filename: file)
141
+ assert_no_match_template_function(result)
142
+ assert_match_doctype(result)
143
+ end
144
+
145
+ def test_compilation_with_extends
146
+ engine.use :system
147
+ file = expand_path("extends/index#{ext}")
148
+ template = File.read(file)
149
+ result = engine.compile(template, filename: file)
150
+ assert_no_match_template_function(result)
151
+ assert_match_doctype(result)
152
+ end
153
+
154
+ def test_client_compilation_with_includes
155
+ engine.use :system
156
+ file = expand_path("includes/index#{ext}")
157
+ template = File.read(file)
158
+ result = engine.compile(template, filename: file, client: true)
159
+ assert_match_template_function(result)
160
+ assert_match_doctype(result)
161
+ end
162
+
163
+ def test_client_compilation_with_extends
164
+ engine.use :system
165
+ file = expand_path("extends/index#{ext}")
166
+ template = File.read(file)
167
+ result = engine.compile(template, filename: file, client: true)
168
+ assert_match_template_function(result)
169
+ assert_match_doctype(result)
170
+ end
171
+
172
+ def test_version_list
173
+ assert_equal engine == Jade ? "1.0.0" : "2.0.0-beta1", engine.versions.first
174
+ assert_equal engine == Jade ? "1.11.0" : "2.0.0-rc.3", engine.versions.last
175
+ end
176
+
177
+ def test_runtime_version_list
178
+ assert_equal engine == Jade ? "1.0.0" : "2.0.0", engine.runtime_versions.first
179
+ assert_equal engine == Jade ? "1.11.0" : "2.0.2", engine.runtime_versions.last
180
+ end
181
+
182
+ def test_config_serialization
183
+ [:filename, :doctype, :pretty].each do |option|
184
+ assert_include engine.config.to_h.keys, option
185
+ end
186
+ end
187
+
188
+ def test_config_customization
189
+ engine.config.custom_option = "value"
190
+ assert_equal "value", engine.config.custom_option
191
+ assert engine.config.custom_option?
192
+ assert_include engine.config.to_h.keys, :custom_option
193
+ end
194
+
195
+ def test_get_known_compiler
196
+ assert engine::ShippedCompiler === engine.compiler(engine.versions.sample)
197
+ end
198
+
199
+ def test_get_unknown_compiler
200
+ assert_raise(engine::CompilerError) { engine.compiler "0.0.0" }
201
+ end
202
+ end