infod 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/infod.rb +2 -3
  2. data/infod/Es.rb +31 -67
  3. data/infod/{W/source.rb → Es/code.rb} +6 -10
  4. data/infod/Es/css.rb +21 -0
  5. data/infod/{W → Es}/csv.rb +0 -0
  6. data/infod/Es/du.rb +16 -0
  7. data/infod/{W → Es}/feed.rb +13 -11
  8. data/infod/Es/filter.rb +75 -0
  9. data/infod/Es/find.rb +20 -0
  10. data/infod/Es/fs.rb +145 -136
  11. data/infod/Es/glob.rb +22 -0
  12. data/infod/Es/grep.rb +61 -0
  13. data/infod/Es/groonga.rb +47 -56
  14. data/infod/Es/html.rb +271 -0
  15. data/infod/Es/image.rb +114 -0
  16. data/infod/Es/in.rb +68 -0
  17. data/infod/Es/index.rb +183 -0
  18. data/infod/{W → Es}/json.rb +28 -4
  19. data/infod/Es/kv.rb +60 -0
  20. data/infod/Es/ls.rb +58 -0
  21. data/infod/Es/mail.rb +87 -0
  22. data/infod/Es/man.rb +112 -0
  23. data/infod/Es/mime.rb +59 -0
  24. data/infod/Es/out.rb +52 -0
  25. data/infod/{W/page.rb → Es/pager.rb} +7 -3
  26. data/infod/Es/pdf.rb +19 -0
  27. data/infod/Es/rdf.rb +35 -0
  28. data/infod/Es/schema.rb +99 -0
  29. data/infod/Es/search.rb +24 -0
  30. data/infod/Es/sh.rb +21 -0
  31. data/infod/{W → Es}/text.rb +26 -14
  32. data/infod/H.rb +15 -29
  33. data/infod/H/audio.rb +19 -0
  34. data/infod/H/blog.rb +15 -0
  35. data/infod/{W → H}/cal.rb +2 -31
  36. data/infod/H/edit.rb +88 -0
  37. data/infod/{W/examine/examine.rb → H/facets.rb} +17 -17
  38. data/infod/{W → H}/forum.rb +1 -0
  39. data/infod/{W/examine/sw.rb → H/hf.rb} +12 -12
  40. data/infod/H/histogram.rb +78 -0
  41. data/infod/H/mail.rb +92 -0
  42. data/infod/{W/chat.rb → H/microblog.rb} +21 -16
  43. data/infod/H/threads.rb +77 -0
  44. data/infod/H/time.rb +131 -0
  45. data/infod/H/who.rb +30 -0
  46. data/infod/{W → H}/wiki.rb +0 -0
  47. data/infod/K.rb +28 -60
  48. data/infod/N.rb +151 -74
  49. data/infod/Rb.rb +3 -3
  50. data/infod/Th.rb +27 -101
  51. data/infod/Th/404.rb +29 -36
  52. data/infod/Th/500.rb +36 -5
  53. data/infod/Th/GET.rb +48 -118
  54. data/infod/Th/POST.rb +31 -11
  55. data/infod/Th/perf.rb +37 -0
  56. data/infod/Th/util.rb +89 -0
  57. data/infod/Y.rb +24 -7
  58. data/infod/infod.rb +2 -3
  59. metadata +92 -64
  60. data/infod/Es/redis.rb +0 -3
  61. data/infod/Es/sqlite.rb +0 -3
  62. data/infod/Th/local.rb +0 -22
  63. data/infod/W.rb +0 -34
  64. data/infod/W/audio.rb +0 -56
  65. data/infod/W/blog.rb +0 -3
  66. data/infod/W/color.rb +0 -28
  67. data/infod/W/core.rb +0 -77
  68. data/infod/W/css.rb +0 -24
  69. data/infod/W/du.rb +0 -35
  70. data/infod/W/edit.rb +0 -8
  71. data/infod/W/examine/exhibit.rb +0 -34
  72. data/infod/W/examine/hist.rb +0 -55
  73. data/infod/W/examine/history.rb +0 -19
  74. data/infod/W/examine/normal.rb +0 -31
  75. data/infod/W/examine/protovis.rb +0 -30
  76. data/infod/W/examine/time/graph.rb +0 -86
  77. data/infod/W/examine/time/line.rb +0 -24
  78. data/infod/W/find.rb +0 -24
  79. data/infod/W/grep.rb +0 -27
  80. data/infod/W/html.rb +0 -143
  81. data/infod/W/image.rb +0 -61
  82. data/infod/W/kv.rb +0 -66
  83. data/infod/W/ls.rb +0 -50
  84. data/infod/W/mail.rb +0 -248
  85. data/infod/W/pdf.rb +0 -16
  86. data/infod/W/post.rb +0 -9
  87. data/infod/W/rdf.rb +0 -32
  88. data/infod/W/schema.rb +0 -172
  89. data/infod/W/search.rb +0 -33
  90. data/infod/W/shell.rb +0 -30
  91. data/infod/W/table.rb +0 -87
  92. data/infod/W/tree.rb +0 -26
  93. data/infod/W/vfs.rb +0 -175
data/infod/Th/POST.rb CHANGED
@@ -1,19 +1,39 @@
1
+ watch __FILE__
1
2
  class E
3
+
2
4
  def POST
3
- as('POST').y(self,@r) || basicPOST
4
- rescue Exception => x
5
- Fn 'backtrace',x,@r
6
- end
5
+ r = Rack::Request.new @r
6
+ p = nil
7
+ # each triple
8
+ r.params.map{|k,v|
7
9
 
8
- def basicPOST
9
-
10
- end
10
+ # path-format triple
11
+ sP,pP,oP = (CGI.unescape k).split S
12
+
13
+ # original triple
14
+ s,p,o = [sP,pP,oP].map &:unpath
11
15
 
12
- # mint URI to POSTs here
13
- fn '/post/POST',->e,r{
16
+ p = p.uri[0..-2].E if p.uri[-1] == '/'
14
17
 
15
-
16
- }
18
+ # object-delta URIs
19
+ vU = E.literal v
20
+ oU = oP.E
17
21
 
22
+ # change detected
23
+ unless oU.uri == vU.uri
24
+ # edit triple
25
+ s[p,o,v]
26
+ end
27
+
28
+ # snapshot current resource state
29
+
30
+ }
31
+
32
+ # parameters for editor
33
+ @r.q.update({'view' => 'editPO',
34
+ 'graph' => 'editable',
35
+ 'p' => p.uri})
36
+ self.GET
37
+ end
18
38
 
19
39
  end
data/infod/Th/perf.rb ADDED
@@ -0,0 +1,37 @@
1
+ #watch __FILE__
2
+ require 'benchmark'
3
+
4
+ class E
5
+
6
+ Slow ||= {}
7
+ Errors ||= {}
8
+ F['log']=->c,e,x=nil{ # response code, environment, extra stuff
9
+ uri = ['http://', e['SERVER_NAME'], e['REQUEST_URI']].join
10
+ if 500 == c
11
+ Errors[uri] ||= {}
12
+ Errors[uri][:time] = Time.now
13
+ end
14
+ if x && x.class==Float && x > 1
15
+ s = Slow[uri] ||= {}
16
+ s[:time] ||= 0
17
+ s[:time] += x
18
+ s[:last] = Time.now
19
+ if Slow.size > 10e3
20
+ Slow = {}
21
+ end
22
+ end
23
+ $stdout.puts [e.fn,c,uri,e['HTTP_USER_AGENT'],e['HTTP_REFERER'],x].join ' '}
24
+
25
+ F['/health/GET'] = ->e,r{
26
+ e.pathSegment.uri.match(/^(\/|\/health)$/) &&
27
+ (H [{_: :h1,
28
+ c: {_: :a, href: '/', style: "background-color:"+E.cs, c: '/'}},
29
+ {c: [{_: :b, c: r['SERVER_NAME']},' storage ',`df --output=pcent /|tail -n 1`]},
30
+ {_: :a, href: '/slow', c: 'slow queries'},
31
+ {_: :A, href: '/500', c: 'broken requests'},
32
+ H.css('/css/health')
33
+ ]).hR}
34
+
35
+ F['/slow/GET'] = ->e,r{H([Slow.sort_by{|u,r|r[:time]}.reverse.html,H.css('/css/500')]).hR}
36
+
37
+ end
data/infod/Th/util.rb ADDED
@@ -0,0 +1,89 @@
1
+ class String
2
+ # parse query-string
3
+ def qp
4
+ d={}
5
+ split(/&/).map{|e|
6
+ k,v=e.split(/=/,2).map{|x|
7
+ CGI.unescape x}
8
+ d[k]=v}
9
+ d
10
+ end
11
+ # HTML response of string body
12
+ def hR
13
+ [200,{'Content-Type'=>'text/html; charset=utf-8'},
14
+ [self]]
15
+ end
16
+ end
17
+
18
+ module Th
19
+
20
+ # unparsed query-string
21
+ def qs
22
+ (['GET','HEAD'].member? fn) ? self['QUERY_STRING'] : self['rack.input'].read
23
+ end
24
+
25
+ # memoize query
26
+ def q
27
+ @q ||= (qs||'').qp.do{|q|
28
+ (q['?']).do{|d|
29
+ E::F['?'][d].do{|g| # expand aliases
30
+ g.merge q
31
+ } || q } || q}
32
+ end
33
+
34
+ # Accept header
35
+ def accept_ k=''
36
+ d={}
37
+ self['HTTP_ACCEPT'+k].do{|k|
38
+ k.split(/,/).map{|e|
39
+ f,q=e.split(/;/)
40
+ i=q&&q.split(/=/)[1].to_f||1
41
+ d[i]||=[]
42
+ d[i].push f}}
43
+ d
44
+ end
45
+
46
+ def format
47
+ @format ||= conneg
48
+ end
49
+
50
+ def conneg
51
+ # format in querystring
52
+ return q['format'] if q['format'] && E::F[E::Render+q['format']]
53
+ # format in Accept header
54
+ accept.sort.reverse.map{|p|p[1].map{|mime|
55
+ return mime if E::F[E::Render+mime]}}
56
+ # default
57
+ 'text/html'
58
+ end
59
+
60
+ def accept; @accept ||= accept_ end
61
+
62
+ def fn
63
+ self['REQUEST_METHOD']
64
+ end
65
+
66
+ end
67
+
68
+ class Hash
69
+
70
+ def qs
71
+ '?'+map{|k,v|k.to_s+'='+(v ? (CGI.escape [*v][0].to_s) : '')}.intersperse("&").join('')
72
+ end
73
+
74
+ def env r # attach environment variable
75
+ @r = r
76
+ self
77
+ end
78
+
79
+ end
80
+
81
+ class E
82
+
83
+ # request environment
84
+ def env r=nil
85
+ r ? (@r = r
86
+ self) : @r
87
+ end
88
+
89
+ end
data/infod/Y.rb CHANGED
@@ -1,17 +1,34 @@
1
+
1
2
  def watch f
2
3
  E::Watch[f]=File.mtime f
3
4
  puts 'dev '+f end
4
5
 
5
6
  class E
7
+
6
8
  F={}
7
- Data={}
8
9
  Watch={}
9
- def self.dev; Watch.each{|f,ts|if ts < File.mtime(f); load f end} end
10
- def y *a; F[uri].(*a) end
10
+
11
+ def self.dev
12
+ Watch.each{|f,ts|
13
+ if ts < File.mtime(f)
14
+ load f
15
+ end }
16
+ end
17
+
18
+ # call lambda @id
19
+ def y *a
20
+ F[uri][*a]
21
+ end
22
+
11
23
  end
12
24
 
13
- # URI named functions
14
- def Fn a,*g; E::F[a].(*g) end
25
+ # URI -> function
26
+
15
27
  def fn u,y
16
- # E::F[u.to_s] && puts("#{u} redefined")
17
- E::F[u.to_s] = y end
28
+ E::F[u.to_s] = y
29
+ end
30
+
31
+ def Fn a,*g
32
+ puts "missing #{a} from #{caller[0]}" unless E::F[a]
33
+ E::F[a][*g]
34
+ end
data/infod/infod.rb CHANGED
@@ -1,13 +1,12 @@
1
1
 
2
2
  # the table of elements
3
3
 
4
- # Es search
4
+ # Es infrastructure
5
5
  # H HTML
6
6
  # K constants
7
7
  # N naming
8
8
  # Rb Ruby native-types
9
9
  # Th HTTP
10
- # W forms and formats
11
10
  # Y lambdas
12
11
 
13
- %w{Y K Rb N W Th H Es}.map{|e| require 'infod/' + e}
12
+ %w{Y K Rb N Es H Th}.map{|e| require 'infod/' + e}
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infod
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,8 +9,24 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-01 00:00:00.000000000 Z
12
+ date: 2013-11-22 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
14
30
  - !ruby/object:Gem::Dependency
15
31
  name: thin
16
32
  requirement: !ruby/object:Gem::Requirement
@@ -27,7 +43,23 @@ dependencies:
27
43
  - - ! '>='
28
44
  - !ruby/object:Gem::Version
29
45
  version: '0'
30
- description: a data/filesystem web-server
46
+ - !ruby/object:Gem::Dependency
47
+ name: nokogiri
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: a www-server
31
63
  email: _@whats-your.name
32
64
  executables:
33
65
  - infod
@@ -37,69 +69,66 @@ files:
37
69
  - bin/infod
38
70
  - infod.rb
39
71
  - config.ru
40
- - infod/Y.rb
41
- - infod/H.rb
42
- - infod/W.rb
43
- - infod/K.rb
44
- - infod/Th.rb
45
- - infod/W/css.rb
46
- - infod/W/json.rb
47
- - infod/W/cal.rb
48
- - infod/W/color.rb
49
- - infod/W/rdf.rb
50
- - infod/W/source.rb
51
- - infod/W/mail.rb
52
- - infod/W/table.rb
53
- - infod/W/post.rb
54
- - infod/W/forum.rb
55
- - infod/W/audio.rb
56
- - infod/W/examine/time/graph.rb
57
- - infod/W/examine/time/line.rb
58
- - infod/W/examine/examine.rb
59
- - infod/W/examine/sw.rb
60
- - infod/W/examine/protovis.rb
61
- - infod/W/examine/exhibit.rb
62
- - infod/W/examine/hist.rb
63
- - infod/W/examine/normal.rb
64
- - infod/W/examine/history.rb
65
- - infod/W/pdf.rb
66
- - infod/W/feed.rb
67
- - infod/W/csv.rb
68
- - infod/W/du.rb
69
- - infod/W/core.rb
70
- - infod/W/wiki.rb
71
- - infod/W/image.rb
72
- - infod/W/ls.rb
73
- - infod/W/schema.rb
74
- - infod/W/blog.rb
75
- - infod/W/tree.rb
76
- - infod/W/grep.rb
77
- - infod/W/vfs.rb
78
- - infod/W/html.rb
79
- - infod/W/find.rb
80
- - infod/W/kv.rb
81
- - infod/W/page.rb
82
- - infod/W/search.rb
83
- - infod/W/text.rb
84
- - infod/W/edit.rb
85
- - infod/W/chat.rb
86
- - infod/W/shell.rb
87
- - infod/Es/sqlite.rb
88
- - infod/Es/redis.rb
89
- - infod/Es/fs.rb
90
- - infod/Es/groonga.rb
91
- - infod/Es.rb
92
- - infod/Rb.rb
93
- - infod/Th/POST.rb
94
- - infod/Th/uid.rb
95
- - infod/Th/HEAD.rb
96
- - infod/Th/500.rb
97
- - infod/Th/local.rb
98
- - infod/Th/GET.rb
72
+ - infod/Th/perf.rb
73
+ - infod/Th/util.rb
99
74
  - infod/Th/PATCH.rb
75
+ - infod/Th/POST.rb
100
76
  - infod/Th/404.rb
77
+ - infod/Th/GET.rb
78
+ - infod/Th/500.rb
79
+ - infod/Th/HEAD.rb
80
+ - infod/Th/uid.rb
81
+ - infod/Es.rb
82
+ - infod/H/audio.rb
83
+ - infod/H/microblog.rb
84
+ - infod/H/forum.rb
85
+ - infod/H/hf.rb
86
+ - infod/H/edit.rb
87
+ - infod/H/threads.rb
88
+ - infod/H/mail.rb
89
+ - infod/H/blog.rb
90
+ - infod/H/facets.rb
91
+ - infod/H/cal.rb
92
+ - infod/H/who.rb
93
+ - infod/H/wiki.rb
94
+ - infod/H/histogram.rb
95
+ - infod/H/time.rb
96
+ - infod/K.rb
97
+ - infod/Rb.rb
98
+ - infod/Y.rb
101
99
  - infod/infod.rb
100
+ - infod/Es/fs.rb
101
+ - infod/Es/pdf.rb
102
+ - infod/Es/csv.rb
103
+ - infod/Es/grep.rb
104
+ - infod/Es/filter.rb
105
+ - infod/Es/json.rb
106
+ - infod/Es/sh.rb
107
+ - infod/Es/man.rb
108
+ - infod/Es/glob.rb
109
+ - infod/Es/ls.rb
110
+ - infod/Es/html.rb
111
+ - infod/Es/code.rb
112
+ - infod/Es/text.rb
113
+ - infod/Es/feed.rb
114
+ - infod/Es/du.rb
115
+ - infod/Es/groonga.rb
116
+ - infod/Es/out.rb
117
+ - infod/Es/mail.rb
118
+ - infod/Es/image.rb
119
+ - infod/Es/css.rb
120
+ - infod/Es/kv.rb
121
+ - infod/Es/rdf.rb
122
+ - infod/Es/schema.rb
123
+ - infod/Es/search.rb
124
+ - infod/Es/mime.rb
125
+ - infod/Es/index.rb
126
+ - infod/Es/find.rb
127
+ - infod/Es/pager.rb
128
+ - infod/Es/in.rb
129
+ - infod/H.rb
102
130
  - infod/N.rb
131
+ - infod/Th.rb
103
132
  homepage: http://whats-your.name/www/
104
133
  licenses:
105
134
  - Unlicense
@@ -124,6 +153,5 @@ rubyforge_project:
124
153
  rubygems_version: 1.8.23
125
154
  signing_key:
126
155
  specification_version: 3
127
- summary: a data/filesystem web-server
156
+ summary: a www-server
128
157
  test_files: []
129
- has_rdoc:
data/infod/Es/redis.rb DELETED
@@ -1,3 +0,0 @@
1
- class E
2
-
3
- end
data/infod/Es/sqlite.rb DELETED
@@ -1,3 +0,0 @@
1
- class E
2
-
3
- end
data/infod/Th/local.rb DELETED
@@ -1,22 +0,0 @@
1
- class E
2
- =begin
3
- this code is not loaded by default
4
-
5
- server looks in hostname-root paths for *.rb files, reporting found code:
6
- site config http://data.whats-your.name/data.rb
7
-
8
- =end
9
-
10
- # disallow custom-query crawling on all sites
11
- fn '/robots.txt/GET',->e,r{
12
- [200,{'Content-Type'=>'text/plain'},["User-agent: *\nDisallow: /*?*\n"]]}
13
-
14
- # schema search forward from site root
15
- fn 'http://data.whats-your.name/GET',->e,r{
16
- [302,{'Location'=>'/schema'},[]]}
17
-
18
- # webize PS(1)
19
- fn '/ps/GET',->e,r{
20
- [200,{'Content-Type'=>'text/plain'},[`ps aux`]]}
21
-
22
- end