wunderbar 1.3.3 → 1.4.5

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
  SHA256:
3
- metadata.gz: 8b4521b8d035a91e55ea1d662c92e728a0a26b40491a04eb4d0e6948b9792477
4
- data.tar.gz: b5675b88f029f2372633fb57a8f9da6e4084a9b5d9a224b9bea39af4bdb77b84
3
+ metadata.gz: 1753c6f65653020143af9ed4f73f15e11c7443e8fec1d26a3ae645be0f785191
4
+ data.tar.gz: 3257c0840a2d8d9aaf5f7368623dc8f487e449d6e8d8046632c1a264bb373e18
5
5
  SHA512:
6
- metadata.gz: 91d502a3a2059028dd9104d8b4d5ba3f4d8bcd085ba0b850c42e3be9fd67e4ba4c27d366981ef3112afd40f87c870957b6532b26fcd611b76a76561be9e9a5b5
7
- data.tar.gz: b8304831865b948f9de3efe1ae81ab51c5de4c6318de95c857fa9ea73a411f78438965dd3b1daaad0b68f51dfe1003cc1cdd05b31e226d98e4b793227b5c89eb
6
+ metadata.gz: 364ab25aeab2b20e7b98d98ac0dbf537b68fb11c82046b6206039661b2d0694521d09229cc4c5832aff48eab5fbb8b4fad34cabe65d9c534921b6f015b2c6fab
7
+ data.tar.gz: '0885f9681bd7955e81de1a2920a77c736b1283c152eab4f20425ec7cebbd75c956da6efd348c388541229822c65644ad20f78f8a6911066fdfcf59616e133840'
data/README.md CHANGED
@@ -226,7 +226,12 @@ convenience methods are defined:
226
226
  * `_.submit` -- runs command (or block) as a deamon process
227
227
  * `_.xhtml?` -- output as XHTML?
228
228
 
229
- Access to all of the builder _defined_ methods (typically these end in an esclamation mark) and all of the Wunderbar module methods can be accessed in this way. Examples:
229
+ The `_.system` method takes an optional hash as its last parameter. This can be used to provide settings for the underlying
230
+ [Process.spawn](https://www.rubydoc.info/stdlib/core/Process.spawn) method.
231
+ For example: `._system('pwd',{ system_opts: { chdir: dir } , system_env: { 'FOO' => 'BAR' } })`
232
+ Note that environment variable names must be provided as strings, not symbols.
233
+
234
+ Access to all of the builder _defined_ methods (typically these end in an exclamation mark) and all of the Wunderbar module methods can be accessed in this way. Examples:
230
235
 
231
236
  * `_.tag! :foo`: insert elements where the name can be dynamic
232
237
  * `_.comment! "text"`: add a comment
@@ -368,24 +373,7 @@ Wunderbar will properly escape all HTML and JSON output, eliminating problems
368
373
  of HTML or JavaScript injection. This includes calls to `_` to insert text
369
374
  directly. Unless `nokogiri` was previously required (see [optional
370
375
  dependencies](#optional-dependencies) below), calls to insert markup
371
- (`_{...}`) will escape the markup if the input is `tainted` and not explicitly
372
- marked as `html-safe?` (when using Rails).
373
-
374
- For Ruby version < 2.6.0:
375
-
376
- > For all environments other than Rails, unless you call `Wunderbar.unsafe!` at
377
- > the top of your script, Wunderbar will also set
378
- > [`$SAFE=1`](http://www.ruby-doc.org/docs/ProgrammingRuby/html/taint.html)
379
- > before processing requests. This means that you will need to
380
- > [`untaint`](ruby-doc.org/core/Object.html#method-i-untaint) all inputs
381
- > received from external sources before you make system calls or access the file
382
- > system.
383
-
384
- A special feature that effectively is only available in the Rails environment:
385
- if the first argument to call that creates an element is `html_safe?`, then
386
- that argument will be treated as a markup instead of as text. This allows one
387
- to make calls like `_td link_to...` without placing the call to `link_to` in a
388
- block.
376
+ (`_{...}`) will escape the markup.
389
377
 
390
378
  Globals provided
391
379
  ---
@@ -445,7 +433,6 @@ The following gems are required by extensions of the same name:
445
433
  * `coderay` - syntax highlighting
446
434
  * `opal` - ruby to javascript compiler
447
435
  * `rack` - webserver interface
448
- * `rails` - web application framework
449
436
  * `sinatra` - DSL for creating web applications
450
437
 
451
438
  The following gems, if installed, will produce cleaner and prettier output:
@@ -454,7 +441,6 @@ The following gems, if installed, will produce cleaner and prettier output:
454
441
  * `nokogumbo` also cleans up HTML fragments inserted via `<<` and `_{}`. If
455
442
  this gem is available, it will be preferred over direct usage of `nokogiri`.
456
443
  * `escape` prettier quoting of `system` commands
457
- * `sanitize` will remove unsafe markup from tainted input
458
444
 
459
445
  Related efforts
460
446
  ---
@@ -30,14 +30,14 @@ module Wunderbar
30
30
  return @path if @path or @contents
31
31
 
32
32
  if @options[:name]
33
- source = (@options[:file] || __FILE__).untaint
33
+ source = @options[:file] || __FILE__
34
34
  @mtime = File.mtime(source)
35
35
  @path = @options[:name]
36
36
 
37
37
  # look for asset in site
38
38
  if ENV['DOCUMENT_ROOT']
39
- root = File.join(ENV['DOCUMENT_ROOT'], 'assets').untaint
40
- dest = File.expand_path(@path, root).untaint
39
+ root = File.join(ENV['DOCUMENT_ROOT'], 'assets')
40
+ dest = File.expand_path(@path, root)
41
41
  if File.exist?(dest) and File.size(dest) == File.size(source)
42
42
  @path = "/assets/#{@path}"
43
43
  return @path
@@ -45,7 +45,7 @@ module Wunderbar
45
45
  end
46
46
 
47
47
  # look for asset in app
48
- dest = File.expand_path(@path, Asset.root).untaint
48
+ dest = File.expand_path(@path, Asset.root)
49
49
  if File.exist?(dest) and File.size(dest) == File.size(source)
50
50
  return @path
51
51
  end
@@ -103,7 +103,7 @@ module Wunderbar
103
103
  @path = '../' * env['PATH_INFO'].to_s.count('/') + 'assets'
104
104
  @root ||= nil
105
105
  @root = File.dirname(env['SCRIPT_FILENAME']) if env['SCRIPT_FILENAME']
106
- @root = File.expand_path((@root || Dir.pwd) + "/assets").untaint
106
+ @root = File.expand_path((@root || Dir.pwd) + "/assets")
107
107
 
108
108
  # Options: typically :name plus either :file or :contents
109
109
  # :name => name to be used for the asset
@@ -1,6 +1,5 @@
1
1
  require 'shellwords'
2
2
  require 'open3'
3
- require 'thread'
4
3
 
5
4
  module Wunderbar
6
5
  @@options = {indent: 2}
@@ -51,14 +50,14 @@ module Wunderbar
51
50
  secret = command - flat
52
51
  begin
53
52
  # if available, use escape as it does prettier quoting
54
- raise LoadError if $SAFE > 0 and not defined? Escape
53
+ raise LoadError if not defined? Escape
55
54
  require 'escape'
56
55
  echo = Escape.shell_command(command.compact - secret)
57
56
  rescue LoadError
58
57
  # std-lib function that gets the job done
59
58
  echo = Shellwords.join(command.compact - secret)
60
59
  end
61
- command = flat.compact.map(&:dup).map(&:untaint)
60
+ command = flat.compact
62
61
  else
63
62
  echo = command
64
63
  command = [command]
@@ -74,7 +73,10 @@ module Wunderbar
74
73
 
75
74
  semaphore = Mutex.new
76
75
  env = {'LC_CTYPE' => 'en_US.UTF-8'}
77
- Open3.popen3(env, *command) do |pin, pout, perr, wait|
76
+ sys_env = opts[:system_env] || {}
77
+ env.merge! sys_env unless sys_env.empty?
78
+ sys_opts = opts[:system_opts] || {}
79
+ Open3.popen3(env, *command, sys_opts) do |pin, pout, perr, wait|
78
80
  [
79
81
  Thread.new do
80
82
  until pout.eof?
@@ -357,8 +359,8 @@ module Wunderbar
357
359
  end
358
360
 
359
361
  # remove leading and trailing space
360
- if children.first.text? and children.first.text.strip.empty?
361
- children.shift
362
+ if not children.empty?
363
+ children.shift if children.first.text? and children.first.text.strip.empty?
362
364
  end
363
365
 
364
366
  if not children.empty?
@@ -461,8 +463,14 @@ module Wunderbar
461
463
  output_prefix = opts[:prefix] || {}
462
464
  output_prefix[:stdin] ||= '$ '
463
465
 
464
- super do |kind, line|
465
- @_target.puts "#{output_prefix[kind]}#{line}"
466
+ if Hash === args.last # support original code which needed two hashes
467
+ super do |kind, line|
468
+ @_target.puts "#{output_prefix[kind]}#{line}"
469
+ end
470
+ else
471
+ super(*args, opts) do |kind, line|
472
+ @_target.puts "#{output_prefix[kind]}#{line}"
473
+ end
466
474
  end
467
475
  end
468
476
 
@@ -587,8 +595,14 @@ module Wunderbar
587
595
  @_target[transcript] = []
588
596
  end
589
597
 
590
- super do |kind, line|
591
- @_target[transcript] << "#{output_prefix[kind]}#{line}"
598
+ if Hash === args.last # support original code which needed two hashes
599
+ super do |kind, line|
600
+ @_target[transcript] << "#{output_prefix[kind]}#{line}"
601
+ end
602
+ else
603
+ super(*args, opts) do |kind, line|
604
+ @_target[transcript] << "#{output_prefix[kind]}#{line}"
605
+ end
592
606
  end
593
607
  end
594
608
 
@@ -120,7 +120,7 @@ module Wunderbar
120
120
  # asset support for Rack
121
121
  request = (scope.respond_to? :request) ? scope.request : nil
122
122
  if request and request.path =~ %r{/assets/\w[-.\w]+}
123
- path = ('.' + scope.request.path).untaint
123
+ path = '.' + scope.request.path
124
124
  headers = {'type' => 'text/plain'}
125
125
  headers['type'] = 'application/javascript' if path =~ /\.js$/
126
126
  out?(scope, headers) { File.read path if File.exist? path }
@@ -2,15 +2,6 @@ require 'wunderbar'
2
2
  require 'coderay'
3
3
  require 'nokogiri'
4
4
 
5
- # workaround for https://github.com/rubychan/coderay/pull/159
6
- module CodeRay::PluginHost
7
- alias_method :old_plugin_path, :plugin_path
8
- def plugin_path *args
9
- args.first.untaint if args.first == CodeRay::CODERAY_PATH
10
- old_plugin_path(*args)
11
- end
12
- end
13
-
14
5
  module Wunderbar
15
6
  class HtmlMarkup
16
7
  def _coderay(*args)
@@ -5,40 +5,6 @@ module Wunderbar
5
5
  TEXT = ARGV.delete('--text')
6
6
  end
7
7
 
8
- # Ruby 2.6.0 gets rid of $SAFE > 1; unfortunately in the process it
9
- # treats $SAFE = 1 as a higher level; @FAFE = 1 no longer is limited
10
- # to taintness checks, it not treats all File operations as unsafe
11
- @@unsafe = (RUBY_VERSION.split('.').map(&:to_i) <=> [2, 6, 0]) == 1
12
-
13
- def self.unsafe!(mode=true)
14
- @@unsafe=mode
15
- end
16
-
17
- def self.safe?
18
- if $SAFE == 0 and not @@unsafe
19
- # some gems (e.g. em-websocket-0.3.6) insert unsafe entries into the
20
- # path, and that prevents requires from succeeding. If it looks like
21
- # we are about to make a transition to $SAFE=1, clean up that mess
22
- # before proceeding.
23
- #
24
- # the goal of $SAFE is not to protect us against software which was
25
- # installed by the owner of the site, but from injection attacks
26
- # contained within data provided by users of the site.
27
- $:.each_with_index do |path, index|
28
- if path.tainted?
29
- $:[index] = File.expand_path(path.dup.untaint).untaint
30
- end
31
- end
32
-
33
- # avoid: "Insecure PATH - (SecurityError)" when using Bundler
34
- if defined? Bundler
35
- ENV['PATH'] = ENV['PATH'].dup.untaint
36
- end
37
- end
38
-
39
- not @@unsafe
40
- end
41
-
42
8
  class Scope
43
9
  attr_accessor :env
44
10
  def initialize(env)
@@ -133,7 +133,7 @@ module Wunderbar
133
133
  # * Proxied Rack server. Document base may be relate to the
134
134
  # HTTP_X_WUNDERBAR_BASE
135
135
  #
136
- cwd = File.realpath(Dir.pwd.untaint)
136
+ cwd = File.realpath(Dir.pwd)
137
137
  base = @_scope.env['DOCUMENT_ROOT'] if @_scope.env.respond_to? :[]
138
138
  base ||= cwd
139
139
  href = (head.children[1].attrs[:href] || '')
@@ -188,15 +188,6 @@ module Wunderbar
188
188
 
189
189
  name = name.to_s.gsub('_', '-')
190
190
 
191
- if flag != '!'
192
- if String === args.first and args.first.respond_to? :html_safe?
193
- if args.first.html_safe? and not block and args.first =~ /[>&]/
194
- markup = args.shift
195
- block = Proc.new {_ {markup}}
196
- end
197
- end
198
- end
199
-
200
191
  if flag == '!'
201
192
  @_x.compact! { tag! name, *args, &block }
202
193
  elsif flag == '?'
@@ -362,11 +353,7 @@ module Wunderbar
362
353
  def _(text=nil, &block)
363
354
  unless block
364
355
  if text
365
- if text.respond_to? :html_safe? and text.html_safe?
366
- _ {text}
367
- else
368
- @_x.indented_text! text.to_s
369
- end
356
+ @_x.indented_text! text.to_s
370
357
  end
371
358
  return @_x
372
359
  end
@@ -374,11 +361,7 @@ module Wunderbar
374
361
  children = instance_eval(&block)
375
362
 
376
363
  if String === children
377
- safe = !children.tainted?
378
- safe ||= children.html_safe? if children.respond_to? :html_safe?
379
- safe &&= defined? Nokogiri
380
- ok = safe || defined? Sanitize
381
- safe = true
364
+ ok = defined? Nokogiri
382
365
 
383
366
  if ok and (children.include? '<' or children.include? '&')
384
367
  if defined? Nokogiri::HTML5.fragment
@@ -387,7 +370,6 @@ module Wunderbar
387
370
  doc = Nokogiri::HTML.fragment(children.to_s)
388
371
  end
389
372
 
390
- Sanitize.new.clean_node! doc.dup.untaint if not safe
391
373
  children = doc.children.to_a
392
374
 
393
375
  # ignore leading whitespace
@@ -25,7 +25,7 @@ module Wunderbar
25
25
  # clear environment of cgi cruft
26
26
  require 'cgi'
27
27
  ENV.keys.select {|key| key =~ /^HTTP_/}.each do |key|
28
- ENV.delete key.dup.untaint
28
+ ENV.delete key
29
29
  end
30
30
  ::CGI::QueryExtension.public_instance_methods.each do |method|
31
31
  ENV.delete method.to_s.upcase
@@ -1,7 +1,6 @@
1
1
  require 'wunderbar'
2
2
  require 'kramdown'
3
3
  require 'nokogiri'
4
- require 'sanitize'
5
4
 
6
5
  module Wunderbar
7
6
  class HtmlMarkup
@@ -1,5 +1,6 @@
1
1
  require 'wunderbar'
2
2
  require 'rack'
3
+ require 'rack/media_type'
3
4
 
4
5
  module Wunderbar
5
6
  class RackApp
@@ -16,8 +17,6 @@ module Wunderbar
16
17
  Rack::Mime::MIME_TYPES[File.extname(env['PATH_INFO'])]
17
18
  @_response.set_header('Content-Type', mime) if mime
18
19
  @_response.write(file[:content] || file[:source].call)
19
- elsif Wunderbar.safe? and $SAFE==0
20
- Proc.new { $SAFE=1; Wunderbar::CGI.call(self) }.call
21
20
  else
22
21
  Wunderbar::CGI.call(self)
23
22
  end
@@ -35,17 +35,3 @@ class Wunderbar::Render
35
35
  "</pre>"
36
36
  end
37
37
  end
38
-
39
- # Monkeypatch to address https://github.com/sstephenson/execjs/pull/180
40
- require 'execjs'
41
- class ExecJS::ExternalRuntime::Context
42
- alias_method :w_write_to_tempfile, :write_to_tempfile
43
- def write_to_tempfile(*args)
44
- tmpfile = w_write_to_tempfile(*args).path.untaint
45
- tmpfile = Struct.new(:path, :to_str).new(tmpfile, tmpfile)
46
- def tmpfile.unlink
47
- File.unlink path
48
- end
49
- tmpfile
50
- end
51
- end
@@ -82,14 +82,12 @@ class Wunderbar::XmlMarkup
82
82
 
83
83
  src = File.join(base, src) if not base.empty?
84
84
  src = src.sub(/\?.*$/, '') # strip queries (typically mtimes)
85
- src.untaint
86
85
 
87
- name = File.expand_path(src, @_scope.settings.public_folder.untaint)
88
- name.untaint unless src.tainted?
86
+ name = File.expand_path(src, @_scope.settings.public_folder)
89
87
  if File.exist? name
90
88
  result = File.read(name)
91
89
  else
92
- file = File.expand_path(src+'.rb', @_scope.settings.views.untaint)
90
+ file = File.expand_path(src+'.rb', @_scope.settings.views)
93
91
  result = Wunderbar::Asset.convert(file)
94
92
  end
95
93
  else
@@ -113,11 +111,11 @@ class Wunderbar::XmlMarkup
113
111
  scripts.unshift script.contents
114
112
  elsif script.path
115
113
  if script.path.start_with? '/'
116
- path = (ENV['DOCUMENT_ROOT'] + script.path).untaint
114
+ path = ENV['DOCUMENT_ROOT'] + script.path
117
115
  else
118
- path = File.expand_path(script.path, Wunderbar::Asset.root).untaint
116
+ path = File.expand_path(script.path, Wunderbar::Asset.root)
119
117
  end
120
- setup << File.read(script.options[:server].untaint || path)
118
+ setup << File.read(script.options[:server] || path)
121
119
  end
122
120
  end
123
121
 
@@ -60,10 +60,6 @@ elsif defined? Sinatra
60
60
 
61
61
  require 'wunderbar/sinatra'
62
62
 
63
- elsif defined? ActionView::Template
64
-
65
- require 'wunderbar/rails'
66
-
67
63
  elsif defined? Rack
68
64
 
69
65
  require 'wunderbar/rack'
@@ -157,11 +153,7 @@ else
157
153
  ENV['REQUEST_METHOD'] ||= 'GET' if ARGV.delete('--get')
158
154
 
159
155
  # CGI or command line
160
- if Wunderbar.safe? and $SAFE==0
161
- Proc.new { $SAFE=1; Wunderbar::CGI.call(cgi) }.call
162
- else
163
- Wunderbar::CGI.call(cgi)
164
- end
156
+ Wunderbar::CGI.call(cgi)
165
157
  end
166
158
  end
167
159
  end
@@ -82,22 +82,14 @@ module Wunderbar
82
82
  builder.set_variables_from_params(locals)
83
83
 
84
84
  if not block
85
- builder.instance_eval(data.untaint, eval_file)
85
+ builder.instance_eval(data, eval_file)
86
86
  elsif not data
87
87
  builder.instance_eval(&block)
88
88
  else
89
89
  context = builder.get_binding do
90
90
  builder.instance_eval {_(&block)}
91
91
  end
92
- context.eval(data.untaint, eval_file)
93
- end
94
- end
95
-
96
- def _evaluate_safely(*args, &block)
97
- if Wunderbar.safe? and $SAFE==0
98
- Proc.new { $SAFE=1; _evaluate(*args, &block) }.call
99
- else
100
- _evaluate(*args, &block)
92
+ context.eval(data, eval_file)
101
93
  end
102
94
  end
103
95
  end
@@ -108,7 +100,7 @@ module Wunderbar
108
100
  def evaluate(scope, locals, &block)
109
101
  builder = HtmlMarkup.new(scope)
110
102
  begin
111
- _evaluate_safely(builder, scope, locals, &block)
103
+ _evaluate(builder, scope, locals, &block)
112
104
  rescue Exception => exception
113
105
  scope.response.status = Wunderbar::ServerError.status
114
106
  builder.clear!
@@ -132,7 +124,7 @@ module Wunderbar
132
124
  def evaluate(scope, locals, &block)
133
125
  builder = JsonBuilder.new(scope)
134
126
  begin
135
- result = _evaluate_safely(builder, scope, locals, &block)
127
+ result = _evaluate(builder, scope, locals, &block)
136
128
 
137
129
  # if no output was produced, use the result
138
130
  builder._! result if builder.target? == {} and result
@@ -154,7 +146,7 @@ module Wunderbar
154
146
  def evaluate(scope, locals, &block)
155
147
  builder = TextBuilder.new(scope)
156
148
  begin
157
- result = _evaluate_safely(builder, scope, locals, &block)
149
+ result = _evaluate(builder, scope, locals, &block)
158
150
 
159
151
  # if no output was produced, use the result
160
152
  builder._ result.to_s if builder.target!.empty? and result
@@ -240,13 +232,12 @@ Tilt.register 'xhtml.rb', Wunderbar::Template::Xhtml
240
232
  helpers Wunderbar::SinatraHelpers
241
233
 
242
234
  if Dir.exist? settings.public_folder
243
- Wunderbar::Asset.root = File.join(settings.public_folder, 'assets').untaint
235
+ Wunderbar::Asset.root = File.join(settings.public_folder, 'assets')
244
236
  end
245
237
 
246
238
  Wunderbar::Asset.virtual = true
247
239
 
248
240
  get "/#{Wunderbar::Asset.path}/:name" do |name|
249
- name.untaint if name =~ /^([-\w]\.?)+$/
250
241
  file = "#{Wunderbar::Asset.root}/#{name}"
251
242
  _text do
252
243
  if File.exist? file
@@ -695,7 +695,7 @@ else
695
695
 
696
696
  function attributeEncode(text) {
697
697
  // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title)
698
- // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it)
698
+ // never makes sense to have verbatim HTML in it
699
699
  return text.replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;");
700
700
  }
701
701
 
@@ -1,8 +1,8 @@
1
1
  module Wunderbar
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 1
4
- MINOR = 3
5
- TINY = 3
4
+ MINOR = 4
5
+ TINY = 5
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -14,7 +14,7 @@ class Wunderbar::Render
14
14
  path = `which nodejs`.chomp
15
15
  path = `which node`.chomp if path.empty?
16
16
  raise RuntimeError.new('Unable to locate nodejs') if path.empty?
17
- @nodejs = path.untaint
17
+ @nodejs = path
18
18
  end
19
19
 
20
20
  def self.server(common)
@@ -50,7 +50,7 @@ class Wunderbar::Render
50
50
  stdout += "\n<pre>#{CGI.escapeHTML(stderr)}</pre>"
51
51
  end
52
52
 
53
- stdout.untaint
53
+ stdout
54
54
  rescue => e
55
55
  Wunderbar.error e
56
56
  "<pre>#{CGI.escapeHTML(e.message)}</pre>"
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.date = "2019-06-07"
14
14
  s.description = " Wunderbar makes it easy to produce valid HTML5, wellformed XHTML, Unicode\n (utf-8), consistently indented, readable applications.'\n".freeze
15
15
  s.email = "rubys@intertwingly.net".freeze
16
- s.files = ["COPYING".freeze, "README.md".freeze, "lib/wunderbar".freeze, "lib/wunderbar.rb".freeze, "lib/wunderbar/asset.rb".freeze, "lib/wunderbar/backtick.rb".freeze, "lib/wunderbar/bootstrap".freeze, "lib/wunderbar/bootstrap.rb".freeze, "lib/wunderbar/bootstrap/theme.rb".freeze, "lib/wunderbar/builder.rb".freeze, "lib/wunderbar/cgi-methods.rb".freeze, "lib/wunderbar/coderay.rb".freeze, "lib/wunderbar/coffeescript.rb".freeze, "lib/wunderbar/cssproxy.rb".freeze, "lib/wunderbar/environment.rb".freeze, "lib/wunderbar/eventsource.rb".freeze, "lib/wunderbar/html-methods.rb".freeze, "lib/wunderbar/installation.rb".freeze, "lib/wunderbar/job-control.rb".freeze, "lib/wunderbar/jquery".freeze, "lib/wunderbar/jquery.rb".freeze, "lib/wunderbar/jquery/filter.rb".freeze, "lib/wunderbar/jquery/stupidtable.rb".freeze, "lib/wunderbar/listen.rb".freeze, "lib/wunderbar/logger.rb".freeze, "lib/wunderbar/markdown.rb".freeze, "lib/wunderbar/marked.rb".freeze, "lib/wunderbar/node.rb".freeze, "lib/wunderbar/pagedown.rb".freeze, "lib/wunderbar/polymer.rb".freeze, "lib/wunderbar/rack.rb".freeze, "lib/wunderbar/rails.rb".freeze, "lib/wunderbar/react.rb".freeze, "lib/wunderbar/render.rb".freeze, "lib/wunderbar/script.rb".freeze, "lib/wunderbar/server.rb".freeze, "lib/wunderbar/sinatra.rb".freeze, "lib/wunderbar/underscore.rb".freeze, "lib/wunderbar/vendor".freeze, "lib/wunderbar/vendor/Markdown.Converter.js".freeze, "lib/wunderbar/vendor/bootstrap-theme.min.css".freeze, "lib/wunderbar/vendor/bootstrap.min.css".freeze, "lib/wunderbar/vendor/bootstrap.min.js".freeze, "lib/wunderbar/vendor/eventsource.min.js".freeze, "lib/wunderbar/vendor/jquery-3.2.1.min.js".freeze, "lib/wunderbar/vendor/marked.min.js".freeze, "lib/wunderbar/vendor/polymer-v0.0.20131003.min.js".freeze, "lib/wunderbar/vendor/react-dom-server.min.js".freeze, "lib/wunderbar/vendor/react-dom.min.js".freeze, "lib/wunderbar/vendor/react-with-addons.min.js".freeze, "lib/wunderbar/vendor/stupidtable.min.js".freeze, "lib/wunderbar/vendor/underscore-min.js".freeze, "lib/wunderbar/vendor/vue-server.min.js".freeze, "lib/wunderbar/vendor/vue.min.js".freeze, "lib/wunderbar/version.rb".freeze, "lib/wunderbar/vue.rb".freeze, "lib/wunderbar/websocket.rb".freeze, "wunderbar.gemspec".freeze]
16
+ s.files = ["COPYING".freeze, "README.md".freeze, "lib/wunderbar".freeze, "lib/wunderbar.rb".freeze, "lib/wunderbar/asset.rb".freeze, "lib/wunderbar/backtick.rb".freeze, "lib/wunderbar/bootstrap".freeze, "lib/wunderbar/bootstrap.rb".freeze, "lib/wunderbar/bootstrap/theme.rb".freeze, "lib/wunderbar/builder.rb".freeze, "lib/wunderbar/cgi-methods.rb".freeze, "lib/wunderbar/coderay.rb".freeze, "lib/wunderbar/coffeescript.rb".freeze, "lib/wunderbar/cssproxy.rb".freeze, "lib/wunderbar/environment.rb".freeze, "lib/wunderbar/eventsource.rb".freeze, "lib/wunderbar/html-methods.rb".freeze, "lib/wunderbar/installation.rb".freeze, "lib/wunderbar/job-control.rb".freeze, "lib/wunderbar/jquery".freeze, "lib/wunderbar/jquery.rb".freeze, "lib/wunderbar/jquery/filter.rb".freeze, "lib/wunderbar/jquery/stupidtable.rb".freeze, "lib/wunderbar/listen.rb".freeze, "lib/wunderbar/logger.rb".freeze, "lib/wunderbar/markdown.rb".freeze, "lib/wunderbar/marked.rb".freeze, "lib/wunderbar/node.rb".freeze, "lib/wunderbar/pagedown.rb".freeze, "lib/wunderbar/polymer.rb".freeze, "lib/wunderbar/rack.rb".freeze, "lib/wunderbar/react.rb".freeze, "lib/wunderbar/render.rb".freeze, "lib/wunderbar/script.rb".freeze, "lib/wunderbar/server.rb".freeze, "lib/wunderbar/sinatra.rb".freeze, "lib/wunderbar/underscore.rb".freeze, "lib/wunderbar/vendor".freeze, "lib/wunderbar/vendor/Markdown.Converter.js".freeze, "lib/wunderbar/vendor/bootstrap-theme.min.css".freeze, "lib/wunderbar/vendor/bootstrap.min.css".freeze, "lib/wunderbar/vendor/bootstrap.min.js".freeze, "lib/wunderbar/vendor/eventsource.min.js".freeze, "lib/wunderbar/vendor/jquery-3.2.1.min.js".freeze, "lib/wunderbar/vendor/marked.min.js".freeze, "lib/wunderbar/vendor/polymer-v0.0.20131003.min.js".freeze, "lib/wunderbar/vendor/react-dom-server.min.js".freeze, "lib/wunderbar/vendor/react-dom.min.js".freeze, "lib/wunderbar/vendor/react-with-addons.min.js".freeze, "lib/wunderbar/vendor/stupidtable.min.js".freeze, "lib/wunderbar/vendor/underscore-min.js".freeze, "lib/wunderbar/vendor/vue-server.min.js".freeze, "lib/wunderbar/vendor/vue.min.js".freeze, "lib/wunderbar/version.rb".freeze, "lib/wunderbar/vue.rb".freeze, "lib/wunderbar/websocket.rb".freeze, "wunderbar.gemspec".freeze]
17
17
  s.homepage = "http://github.com/rubys/wunderbar".freeze
18
18
  s.licenses = ["MIT".freeze]
19
19
  s.required_ruby_version = Gem::Requirement.new(">= 1.9.3".freeze)
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wunderbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Ruby
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
  date: 2019-06-07 00:00:00.000000000 Z
@@ -60,7 +60,6 @@ files:
60
60
  - lib/wunderbar/pagedown.rb
61
61
  - lib/wunderbar/polymer.rb
62
62
  - lib/wunderbar/rack.rb
63
- - lib/wunderbar/rails.rb
64
63
  - lib/wunderbar/react.rb
65
64
  - lib/wunderbar/render.rb
66
65
  - lib/wunderbar/script.rb
@@ -90,7 +89,7 @@ homepage: http://github.com/rubys/wunderbar
90
89
  licenses:
91
90
  - MIT
92
91
  metadata: {}
93
- post_install_message:
92
+ post_install_message:
94
93
  rdoc_options: []
95
94
  require_paths:
96
95
  - lib
@@ -105,8 +104,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
104
  - !ruby/object:Gem::Version
106
105
  version: '0'
107
106
  requirements: []
108
- rubygems_version: 3.0.6
109
- signing_key:
107
+ rubygems_version: 3.1.2
108
+ signing_key:
110
109
  specification_version: 4
111
110
  summary: HTML Generator and CGI application support
112
111
  test_files: []
@@ -1,43 +0,0 @@
1
- require 'active_support/core_ext'
2
- require 'action_view'
3
-
4
- module Wunderbar
5
- module Rails
6
- class HtmlHandler
7
- cattr_accessor :default_format
8
- self.default_format = Mime[:html]
9
-
10
- def self.call(template, source=nil)
11
- %{
12
- compiled = Proc.new {#{template.source}}
13
- x = Wunderbar::HtmlMarkup.new(self);
14
- instance_variables.each do |var|
15
- x.instance_variable_set var, instance_variable_get(var)
16
- end
17
- x.instance_eval(&compiled)
18
- x._.target!
19
- }.strip # take care to preserve line numbers in original source
20
- end
21
- end
22
-
23
- class JsonHandler
24
- cattr_accessor :default_format
25
- self.default_format = Mime[:json]
26
-
27
- def self.call(template, source=nil)
28
- %{
29
- compiled = Proc.new {#{template.source}}
30
- x = Wunderbar::JsonBuilder.new(self);
31
- instance_variables.each do |var|
32
- x.instance_variable_set var, instance_variable_get(var)
33
- end
34
- x.instance_eval(&compiled)
35
- x.target!
36
- }.strip # take care to preserve line numbers in original source
37
- end
38
- end
39
-
40
- ActionView::Template.register_template_handler :_html, HtmlHandler
41
- ActionView::Template.register_template_handler :_json, JsonHandler
42
- end
43
- end