tofu 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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.