tofu 0.2.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 21f9b04d012b4d3bb5bfffd94cd49bb634d1f9e6b450437722572e840ded33bb
4
- data.tar.gz: 7cb4a203cc8cb6aad6838b335c31d26433593e353de4cb4d754da3572f0c5182
3
+ metadata.gz: 6d48e9fc0850cb2924f8323bd67fcbf3909a52cdf8f1eaff34ae4bbd59faf1ba
4
+ data.tar.gz: 563baa1c17bd1bb2e1ddd449b45162fc0039e2232c0196ed7997f86758bb123c
5
5
  SHA512:
6
- metadata.gz: 16e316ac4a6fe4d78394f308dc8391ecfddda3508117b8956258e34f42169541ebaff59e11fd2376f2262ebb9b4aec3f0d0c13f5848022d7346ceed5a8834b8d
7
- data.tar.gz: b25dabe154550c5d145544a0049657d3968155363139e71681737a89b21d280ea2af1756576a6c7ba5f8f28e3d2c0515c3bd7fa7fae5ed2fc5f04f834617dad8
6
+ metadata.gz: 12cd6476f3c110a6ddf91befa94ccacf5c7fb07acc65ec5a8d792ce02830a93d4b24c42b9e63343a2dda47428610bbeae0bf14d8fa3dd79e0d495f4ce0959408
7
+ data.tar.gz: 7e8269c55da03135d8af4e9ac49a492cecd7ce904f740419ce7c94f59b149e1f7da3d61fc13165cf2644de5fe7a8ecd6f7c411fb758921fa91b1dcf4f59eb5f7
data/.gitignore CHANGED
@@ -8,3 +8,4 @@
8
8
  /spec/reports/
9
9
  /tmp/
10
10
  *~
11
+ .DS_Store
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
@@ -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
@@ -466,6 +466,16 @@ module Tofu
466
466
  def service(req, res)
467
467
  Context.new(req, res).service(@bartender)
468
468
  end
469
+
470
+ def start(env, stdin, stdout)
471
+ if env["SERVER_SOFTWARE"]
472
+ @config[:ServerSoftware] = env["SERVER_SOFTWARE"]
473
+ end
474
+ if %r{HTTP/(\d+\.\d+)} =~ env["SERVER_PROTOCOL"]
475
+ @config[:HTTPVersion] = $1
476
+ end
477
+ super(env, stdin, stdout)
478
+ end
469
479
  end
470
480
  end
471
481
 
@@ -575,6 +585,45 @@ EOS
575
585
  throw(:tofu_done)
576
586
  end
577
587
  end
588
+
589
+ class ChunkedStream
590
+ def initialize(stream)
591
+ @data = nil
592
+ @cursor = 0
593
+ @stream = stream
594
+ end
595
+
596
+ def next_chunk
597
+ @stream.pop
598
+ rescue
599
+ raise EOFError
600
+ end
601
+
602
+ def close
603
+ @stream.close
604
+ end
605
+
606
+ def readpartial(size, buf='')
607
+ buf.clear
608
+ unless @data
609
+ @cursor = 0
610
+ @data = next_chunk
611
+ @data.force_encoding("ascii-8bit")
612
+ end
613
+ if @data.bytesize <= size
614
+ buf << @data
615
+ @data = nil
616
+ else
617
+ slice = @data.byteslice(@cursor, size)
618
+ @cursor += slice.bytesize
619
+ buf << slice
620
+ if @data.bytesize <= @cursor
621
+ @data = nil
622
+ end
623
+ end
624
+ buf
625
+ end
626
+ end
578
627
  end
579
628
 
580
629
  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.0"
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
metadata CHANGED
@@ -1,14 +1,14 @@
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.0
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: 2019-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -62,6 +62,9 @@ files:
62
62
  - doc/yfd03.obj
63
63
  - lib/tofu.rb
64
64
  - lib/tofu/version.rb
65
+ - sample/kd/base.erb
66
+ - sample/kd/wiki.erb
67
+ - sample/kd/wikir.rb
65
68
  - sample/koto/base.erb
66
69
  - sample/koto/enter.erb
67
70
  - sample/koto/koto.rb
@@ -86,8 +89,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
89
  - !ruby/object:Gem::Version
87
90
  version: '0'
88
91
  requirements: []
89
- rubyforge_project:
90
- rubygems_version: 2.7.7
92
+ rubygems_version: 3.0.4
91
93
  signing_key:
92
94
  specification_version: 4
93
95
  summary: tiny web-ui framework for me.