tofu 0.2.0 → 0.3.4

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: 21f9b04d012b4d3bb5bfffd94cd49bb634d1f9e6b450437722572e840ded33bb
4
- data.tar.gz: 7cb4a203cc8cb6aad6838b335c31d26433593e353de4cb4d754da3572f0c5182
3
+ metadata.gz: 6c43ebdfd3a81da31a173dad8b6e7f51b78fdf9674cf965f2f01dcfc4c16ce05
4
+ data.tar.gz: f7655329fa596b9bff8efdfbc968cccf10ef116ca96a09548fccfde2f22a67e4
5
5
  SHA512:
6
- metadata.gz: 16e316ac4a6fe4d78394f308dc8391ecfddda3508117b8956258e34f42169541ebaff59e11fd2376f2262ebb9b4aec3f0d0c13f5848022d7346ceed5a8834b8d
7
- data.tar.gz: b25dabe154550c5d145544a0049657d3968155363139e71681737a89b21d280ea2af1756576a6c7ba5f8f28e3d2c0515c3bd7fa7fae5ed2fc5f04f834617dad8
6
+ metadata.gz: 78d2db1a810ce63f71c946c8c65e1be9264c306dad490ecf0b21f0b4d2cc30d89dbb47075cd5a0a13c32ee89019def32163ba4fd88203cb9c3f9a279948977a9
7
+ data.tar.gz: 28b6e8fbb2616e7ee13a5fc15129615511a89e912f1ceeec4e9df73ddd07f24aa7a7aae2b9b21eddf549677cc433fec414314cba97917714b6a296a9b05c4311
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  *~
11
+ .DS_Store
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2009 Masatoshi SEKI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/lib/tofu.rb CHANGED
@@ -3,10 +3,10 @@ require "tofu/version"
3
3
  require 'erb'
4
4
  require 'drb/drb'
5
5
  require 'monitor'
6
- require 'digest/md5'
7
6
  require 'webrick'
8
7
  require 'webrick/cgi'
9
8
  require 'uri'
9
+ require 'securerandom'
10
10
 
11
11
  module Tofu
12
12
  class Session
@@ -14,7 +14,7 @@ module Tofu
14
14
 
15
15
  def initialize(bartender, hint=nil)
16
16
  super()
17
- @session_id = Digest::MD5.hexdigest(Time.now.to_s + __id__.to_s)
17
+ @session_id = SecureRandom.uuid
18
18
  @contents = {}
19
19
  @hint = hint
20
20
  renew
@@ -136,9 +136,9 @@ module Tofu
136
136
 
137
137
  def service(context)
138
138
  begin
139
- session = retrieve_session(context)
140
- catch(:tofu_done) { session.service(context) }
141
- store_session(context, session)
139
+ session = retrieve_session(context)
140
+ catch(:tofu_done) { session.service(context) }
141
+ store_session(context, session)
142
142
  ensure
143
143
  end
144
144
  end
@@ -336,7 +336,7 @@ module Tofu
336
336
  end
337
337
  param = make_param(method_name, add_param)
338
338
  hidden = input_hidden(param)
339
- %Q!<form action="#{action(context)}" method="post">\n! + hidden
339
+ %Q!<form action="#{action(context)}" method="post" enctype="multipart/form-data">\n! + hidden
340
340
  end
341
341
 
342
342
  def href(method_name, add_param, context)
@@ -365,7 +365,7 @@ module Tofu
365
365
 
366
366
  def reload_erb
367
367
  ObjectSpace.each_object(Class) do |o|
368
- if o.ancestors.include?(Tofu::Tofu)
368
+ if o.ancestors.include?(::Tofu::Tofu)
369
369
  o.reload_erb
370
370
  end
371
371
  end
@@ -408,6 +408,7 @@ module Tofu
408
408
  value = WEBrick::HTTPUtils::escape(value)
409
409
  c = WEBrick::Cookie.new(name, value)
410
410
  c.expires = expires if expires
411
+ c.path = req_script_name.to_s
411
412
  @res.cookies.push(c)
412
413
  end
413
414
 
@@ -466,6 +467,16 @@ module Tofu
466
467
  def service(req, res)
467
468
  Context.new(req, res).service(@bartender)
468
469
  end
470
+
471
+ def start(env, stdin, stdout)
472
+ if env["SERVER_SOFTWARE"]
473
+ @config[:ServerSoftware] = env["SERVER_SOFTWARE"]
474
+ end
475
+ if %r{HTTP/(\d+\.\d+)} =~ env["SERVER_PROTOCOL"]
476
+ @config[:HTTPVersion] = $1
477
+ end
478
+ super(env, stdin, stdout)
479
+ end
469
480
  end
470
481
  end
471
482
 
@@ -575,6 +586,45 @@ EOS
575
586
  throw(:tofu_done)
576
587
  end
577
588
  end
589
+
590
+ class ChunkedStream
591
+ def initialize(stream)
592
+ @data = nil
593
+ @cursor = 0
594
+ @stream = stream
595
+ end
596
+
597
+ def next_chunk
598
+ @stream.pop
599
+ rescue
600
+ raise EOFError
601
+ end
602
+
603
+ def close
604
+ @stream.close
605
+ end
606
+
607
+ def readpartial(size, buf='')
608
+ buf.clear
609
+ unless @data
610
+ @cursor = 0
611
+ @data = next_chunk
612
+ @data.force_encoding("ascii-8bit")
613
+ end
614
+ if @data.bytesize <= size
615
+ buf << @data
616
+ @data = nil
617
+ else
618
+ slice = @data.byteslice(@cursor, size)
619
+ @cursor += slice.bytesize
620
+ buf << slice
621
+ if @data.bytesize <= @cursor
622
+ @data = nil
623
+ end
624
+ end
625
+ buf
626
+ end
627
+ end
578
628
  end
579
629
 
580
630
  if __FILE__ == $0
data/lib/tofu/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Tofu
2
- VERSION = "0.2.0"
2
+ VERSION = "0.3.4"
3
3
  end
@@ -0,0 +1,8 @@
1
+ <html>
2
+ <head>
3
+ <title>WikiR</title>
4
+ </head>
5
+ <body>
6
+ <%= @wiki.to_html(context) %>
7
+ </body>
8
+ </html>
@@ -0,0 +1,13 @@
1
+ <script language="JavaScript">
2
+ function open_edit(){
3
+ document.getElementById('edit').style.display = "block";
4
+ }
5
+ </script>
6
+ <%= page(context).html %>
7
+ <a href='javascript:open_edit()'>[edit]</a>
8
+ <div id='edit' style='display:none;'>
9
+ <%=form('edit', {'name' => context.req_path_info}, context) %>
10
+ <textarea name='text' rows="40" cols="50"><%=h page(context).src %></textarea>
11
+ <input type='submit' name='ok' value='ok'/>
12
+ </form>
13
+ </div>
@@ -0,0 +1,143 @@
1
+ require 'tofu'
2
+ require 'kramdown'
3
+ require 'singleton'
4
+
5
+ module WikiR
6
+ class Book
7
+ include Singleton
8
+
9
+ def initialize
10
+ @monitor = Monitor.new
11
+ @pages = {}
12
+ end
13
+
14
+ def [](name)
15
+ @pages[name] || Page.new(name)
16
+ end
17
+
18
+ def []=(name, src)
19
+ @monitor.synchronize do
20
+ page = self[name]
21
+ @pages[name] = page
22
+ page.src = src
23
+ end
24
+ end
25
+ end
26
+
27
+ class Page
28
+ def initialize(name)
29
+ @name = name
30
+ self.src = "# #{name}\n\nan empty page. edit me."
31
+ end
32
+ attr_reader :name, :src, :html, :warnings
33
+
34
+ def src=(text)
35
+ @src = text
36
+ document = Kramdown::Document.new(text)
37
+ @html = document.to_html
38
+ @warnings = document.warnings
39
+ end
40
+ end
41
+ end
42
+
43
+ class WikiRSession < Tofu::Session
44
+ def initialize(bartender, hint=nil)
45
+ super
46
+ @book = WikiR::Book.instance
47
+ @base = BaseTofu.new(self)
48
+ end
49
+ attr_reader :book
50
+
51
+ def lookup_view(context)
52
+ @base
53
+ end
54
+
55
+ def do_GET(context)
56
+ context.res_header('pragma', 'no-cache')
57
+ context.res_header('cache-control', 'no-cache')
58
+ context.res_header('expires', 'Thu, 01 Dec 1994 16:00:00 GMT')
59
+ super(context)
60
+ end
61
+ end
62
+
63
+ class BaseTofu < Tofu::Tofu
64
+ set_erb('base.erb')
65
+
66
+ def initialize(session)
67
+ super(session)
68
+ @wiki = WikiTofu.new(session)
69
+ end
70
+ end
71
+
72
+ class WikiTofu < Tofu::Tofu
73
+ set_erb('wiki.erb')
74
+
75
+ def book
76
+ @session.book
77
+ end
78
+
79
+ def do_edit(context, params)
80
+ text ,= params['text']
81
+ return if text.nil? || text.empty?
82
+ text = text.force_encoding('utf-8')
83
+ name ,= params['name']
84
+ return if name.nil? || name.empty?
85
+ name = name.force_encoding('utf-8')
86
+ book[name] = text
87
+ end
88
+
89
+ def page(context)
90
+ book[context.req_path_info]
91
+ end
92
+ end
93
+
94
+ module Tofu
95
+ def reload_erb
96
+ p 1
97
+ ObjectSpace.each_object(Class) do |o|
98
+ if o.ancestors.include?(::Tofu::Tofu)
99
+ o.reload_erb
100
+ end
101
+ end
102
+ end
103
+ module_function :reload_erb
104
+ end
105
+
106
+ class MyTofulet < Tofu::CGITofulet
107
+ def [](key)
108
+ WikiR::Book.instance if key == 'book'
109
+ end
110
+
111
+ def reload_erb
112
+ Tofu::reload_erb
113
+ end
114
+ end
115
+
116
+ WEBrick::Daemon.start unless $DEBUG
117
+ tofu = Tofu::Bartender.new(WikiRSession, 'wikir_8083')
118
+ uri = ARGV.shift || 'druby://localhost:54322'
119
+ DRb.start_service(uri, MyTofulet.new(tofu))
120
+ s = WEBrick::HTTPServer.new(:Port => 8083)
121
+ s.mount("/", Tofu::Tofulet, tofu)
122
+ s.start
123
+
124
+ =begin
125
+ # dRuby & CGI style
126
+ unless $DEBUG
127
+ exit!(0) if fork
128
+ Process.setsid
129
+ exit!(0) if fork
130
+ end
131
+
132
+ uri = ARGV.shift || 'druby://localhost:54322'
133
+ tofu = Tofu::Bartender.new(WikiRSession, 'wikir_' + uri.split(':').last)
134
+ DRb.start_service(uri, MyTofulet.new(tofu))
135
+
136
+ unless $DEBUG
137
+ STDIN.reopen('/dev/null')
138
+ STDOUT.reopen('/dev/null', 'w')
139
+ STDERR.reopen('/dev/null', 'w')
140
+ end
141
+
142
+ DRb.thread.join
143
+ =end
data/tofu.gemspec CHANGED
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
- spec.add_development_dependency "bundler", "~> 1.11"
23
- spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "bundler", ">= 2.2.10"
23
+ spec.add_development_dependency "rake", "~> 12.3.3"
24
24
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tofu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masatoshi SEKI
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-26 00:00:00.000000000 Z
11
+ date: 2021-05-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: 2.2.10
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: 2.2.10
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: 12.3.3
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: 12.3.3
41
41
  description: tiny web-ui framework for plain WEBrick lovers
42
42
  email:
43
43
  - seki@ruby-lang.org
@@ -47,6 +47,7 @@ extra_rdoc_files: []
47
47
  files:
48
48
  - ".gitignore"
49
49
  - Gemfile
50
+ - LICENSE
50
51
  - README.md
51
52
  - Rakefile
52
53
  - doc/Div.rd
@@ -62,6 +63,9 @@ files:
62
63
  - doc/yfd03.obj
63
64
  - lib/tofu.rb
64
65
  - lib/tofu/version.rb
66
+ - sample/kd/base.erb
67
+ - sample/kd/wiki.erb
68
+ - sample/kd/wikir.rb
65
69
  - sample/koto/base.erb
66
70
  - sample/koto/enter.erb
67
71
  - sample/koto/koto.rb
@@ -86,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
90
  - !ruby/object:Gem::Version
87
91
  version: '0'
88
92
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.7.7
93
+ rubygems_version: 3.2.3
91
94
  signing_key:
92
95
  specification_version: 4
93
96
  summary: tiny web-ui framework for me.