nitro 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. data/AUTHORS +3 -0
  2. data/ChangeLog +83 -0
  3. data/LICENCE +8 -8
  4. data/README +5 -1
  5. data/RELEASES +9 -0
  6. data/Rakefile +43 -23
  7. data/bin/cluster.rb +15 -12
  8. data/examples/ndb/README +5 -0
  9. data/examples/ndb/run.rb +271 -0
  10. data/examples/simple/README +27 -0
  11. data/examples/simple/app.rb +2 -2
  12. data/examples/simple/conf/config.rb +3 -8
  13. data/examples/simple/conf/debug-config.rb +6 -7
  14. data/examples/simple/conf/live-config.rb +2 -4
  15. data/examples/simple/conf/requires.rb +2 -10
  16. data/examples/simple/ctl +1 -1
  17. data/examples/simple/env.rb +2 -2
  18. data/examples/simple/root/article-form.ss +1 -1
  19. data/examples/simple/root/comments-form.ss +1 -1
  20. data/examples/tiny/README +15 -0
  21. data/examples/tiny/app.rb +2 -2
  22. data/examples/tiny/conf/config.rb +8 -13
  23. data/examples/tiny/conf/requires.rb +2 -8
  24. data/examples/tiny/ctl +2 -17
  25. data/examples/tiny/root/index.sx +1 -1
  26. data/lib/n/app/cluster.rb +15 -12
  27. data/lib/n/app/cookie.rb +10 -9
  28. data/lib/n/app/filters/autologin.rb +5 -4
  29. data/lib/n/app/fragment.rb +13 -10
  30. data/lib/n/app/handlers.rb +29 -22
  31. data/lib/n/app/handlers/code-handler.rb +2 -4
  32. data/lib/n/app/handlers/page-handler.rb +3 -5
  33. data/lib/n/app/request-part.rb +2 -7
  34. data/lib/n/app/request.rb +27 -22
  35. data/lib/n/app/script.rb +4 -15
  36. data/lib/n/app/server.rb +11 -7
  37. data/lib/n/app/session.rb +7 -11
  38. data/lib/n/app/user.rb +10 -11
  39. data/lib/n/app/webrick-servlet.rb +23 -10
  40. data/lib/n/app/webrick.rb +13 -10
  41. data/lib/n/application.rb +13 -6
  42. data/lib/n/config.rb +18 -7
  43. data/lib/n/db.rb +56 -40
  44. data/lib/n/db/connection.rb +18 -22
  45. data/lib/n/db/managed.rb +6 -8
  46. data/lib/n/db/mixins.rb +4 -7
  47. data/lib/n/db/mysql.rb +6 -3
  48. data/lib/n/db/psql.rb +15 -10
  49. data/lib/n/db/tools.rb +5 -9
  50. data/lib/n/db/utils.rb +11 -8
  51. data/lib/n/events.rb +14 -10
  52. data/lib/n/logger.rb +8 -2
  53. data/lib/n/macros.rb +5 -2
  54. data/lib/n/parts.rb +13 -10
  55. data/lib/n/properties.rb +17 -12
  56. data/lib/n/server.rb +3 -2
  57. data/lib/n/server/filter.rb +2 -4
  58. data/lib/n/shaders.rb +11 -13
  59. data/lib/n/sitemap.rb +23 -20
  60. data/lib/n/std.rb +15 -4
  61. data/lib/n/sync/clc.rb +4 -2
  62. data/lib/n/sync/handler.rb +20 -12
  63. data/lib/n/sync/server.rb +24 -18
  64. data/lib/n/ui/date-select.rb +2 -4
  65. data/lib/n/ui/pager.rb +10 -8
  66. data/lib/n/ui/popup.rb +5 -4
  67. data/lib/n/ui/select.rb +3 -4
  68. data/lib/n/ui/tabs.rb +3 -4
  69. data/lib/n/utils/array.rb +6 -14
  70. data/lib/n/utils/cache.rb +3 -7
  71. data/lib/n/utils/gfx.rb +5 -6
  72. data/lib/n/utils/hash.rb +7 -12
  73. data/lib/n/utils/html.rb +8 -4
  74. data/lib/n/utils/http.rb +10 -6
  75. data/lib/n/utils/mail.rb +6 -6
  76. data/lib/n/utils/number.rb +3 -4
  77. data/lib/n/utils/pool.rb +5 -8
  78. data/lib/n/utils/string.rb +12 -10
  79. data/lib/n/utils/template.rb +3 -5
  80. data/lib/n/utils/time.rb +7 -5
  81. data/lib/n/utils/uri.rb +5 -4
  82. data/lib/p/README +1 -0
  83. data/lib/xsl/xforms.xsl +2 -0
  84. data/test/n/app/tc_cookie.rb +34 -0
  85. data/test/n/app/tc_request.rb +70 -0
  86. data/test/n/app/tc_requestpart.rb +28 -0
  87. data/test/n/app/tc_session.rb +34 -0
  88. data/test/n/tc_db.rb +223 -0
  89. data/test/n/tc_db_mysql.rb +241 -0
  90. data/test/n/tc_events.rb +44 -0
  91. data/test/n/tc_properties.rb +68 -0
  92. data/test/n/tc_sitemap.rb +37 -0
  93. data/test/n/ui/tc_pager.rb +52 -0
  94. data/test/n/utils/tc_cache.rb +47 -0
  95. data/test/n/utils/tc_hash.rb +39 -0
  96. data/test/n/utils/tc_html.rb +79 -0
  97. data/test/n/utils/tc_http.rb +18 -0
  98. data/test/n/utils/tc_number.rb +21 -0
  99. data/test/n/utils/tc_strings.rb +149 -0
  100. data/test/n/utils/tc_uri.rb +100 -0
  101. metadata +49 -22
  102. data/doc/css.txt +0 -20
  103. data/doc/ideas.txt +0 -120
  104. data/doc/pg.txt +0 -47
  105. data/doc/svn.txt +0 -82
  106. data/doc/todo.txt +0 -30
  107. data/examples/simple/conf/overrides.rb +0 -9
  108. data/examples/simple/logs/access_log +0 -2
  109. data/examples/simple/logs/apache.log +0 -3
  110. data/examples/simple/logs/app.log +0 -1
  111. data/examples/simple/logs/events.log +0 -1
  112. data/examples/tiny/conf/apache.conf +0 -100
  113. data/examples/tiny/logs/access_log +0 -9
  114. data/examples/tiny/logs/apache.log +0 -9
  115. data/lib/n/db/make-release.sh +0 -26
  116. data/lib/n/tools/README +0 -11
  117. data/lib/xsl/ce.xsl +0 -30
  118. data/lib/xsl/localization.xsl +0 -23
  119. data/test/run.rb +0 -95
@@ -1,15 +1,8 @@
1
- # = User
2
- #
3
- # A user of the Web Application. This is a base object, typically
4
- # extended by the users part.
5
- #
6
- #--
7
1
  # code:
8
- # George Moschovitis <gm@navel.gr>
2
+ # * George Moschovitis <gm@navel.gr>
9
3
  #
10
- # (c) 2002-2003 Navel, all rights reserved.
11
- # $Id: user.rb 86 2004-10-19 13:58:40Z gmosx $
12
- #++
4
+ # (c) 2004 Navel, all rights reserved.
5
+ # $Id: user.rb 99 2004-10-22 09:50:28Z gmosx $
13
6
 
14
7
  require "singleton"
15
8
 
@@ -17,6 +10,9 @@ module N
17
10
 
18
11
  # = Anonymous User
19
12
  #
13
+ # An anonymous user of the Web Application. This is a base
14
+ # object, typically extended by the users part.
15
+ #
20
16
  # Implemented as singleton.
21
17
  #
22
18
  class AnonymousUser
@@ -38,10 +34,13 @@ class AnonymousUser
38
34
  end
39
35
 
40
36
  def login
37
+ # nop
41
38
  end
42
39
 
43
40
  def logout
44
- end
41
+ # nop
42
+ end
43
+
45
44
  end
46
45
 
47
46
  end # module
@@ -1,10 +1,8 @@
1
- # = Webrick Servlet.
2
- #
3
1
  # code:
4
- # George Moschovitis <gm@navel.gr>
2
+ # * George Moschovitis <gm@navel.gr>
5
3
  #
6
4
  # (c) 2004 Navel, all rights reserved.
7
- # $Id: webrick-servlet.rb 87 2004-10-19 17:27:45Z gmosx $
5
+ # $Id: webrick-servlet.rb 106 2004-10-25 11:31:11Z gmosx $
8
6
 
9
7
  require "drb"
10
8
  require "singleton"
@@ -18,7 +16,7 @@ require "n/app/handlers"
18
16
  require "n/app/session"
19
17
 
20
18
  # Override WEBrick to suit our needs.
21
-
19
+ #
22
20
  module WEBrick
23
21
  class HTTPRequest
24
22
  alias_method :old_parse_uri, :parse_uri
@@ -43,6 +41,8 @@ module WEBrick
43
41
  end
44
42
  end
45
43
 
44
+ # Expose some response variables.
45
+ #
46
46
  class HTTPResponse
47
47
  attr_writer :header
48
48
  attr_writer :cookies
@@ -53,15 +53,26 @@ module N; module App
53
53
 
54
54
  # = WebrickServlet
55
55
  #
56
+ # A webrick servlet that implements the Nitro Engine.
57
+ #
58
+ # TODO: Lots of stuff should be factored out!
59
+ #
56
60
  class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet
57
61
  include WEBrick
58
62
 
63
+ # Handle a HTTP GET request.
64
+ #
59
65
  def do_GET(wreq, wres)
60
66
  request = create_request(wreq)
61
67
  request.session = create_session(request)
62
68
 
63
69
  extension = N::StringUtils.extension_from_path(request.path)
64
- handler = $srv_extension_map[extension][1]
70
+ if handler = $srv_extension_map[extension]
71
+ handler = handler[1]
72
+ else
73
+ $log.error "Cannot handle '#{request.path}'"
74
+ return nil
75
+ end
65
76
 
66
77
  begin
67
78
  fragment, script = handler.process(request)
@@ -117,6 +128,8 @@ class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet
117
128
  wres.body = request.out_buffer
118
129
  end
119
130
 
131
+ # Just reuse the GET code.
132
+ #
120
133
  def do_POST(wreq, wres)
121
134
  do_GET(wreq, wres)
122
135
  end
@@ -135,12 +148,13 @@ class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet
135
148
  request.uri = wreq.unparsed_uri
136
149
  request.translated_uri = wreq.path_info
137
150
  request.path = wreq.path
151
+ # enforce filename if missing, FIXME: improve this.
152
+ request.path << $index_filename if request.path[-1] == ?/
138
153
  # request.path_info = wreq.path_info
139
154
  request.query_string = wreq.query_string
140
155
  request.method = wreq.request_method
141
- # request.remote_addr = wreq["REMOTE_ADDR"]
142
- # gmosx: we use an apache proxy for the moment.
143
- request.remote_addr = wreq["X-FORWARDED-FOR"]
156
+ # gmosx: X-FORWARDED-FOR is used in a proxy configuration.
157
+ request.remote_addr = wreq["X-FORWARDED-FOR"] || wreq["REMOTE_ADDR"]
144
158
 
145
159
  # gmosx: remove this ??
146
160
  request.in = {}
@@ -170,7 +184,6 @@ class WebrickServlet < WEBrick::HTTPServlet::AbstractServlet
170
184
  # INVESTIGATE, FIXME: this is a hack!
171
185
  # apache prepends $srv_url and fucks up msie.
172
186
  # FIXME: add unit test for this!
173
-
174
187
  if ref = request.in["REFERER"]
175
188
  split_re = Regexp.new($srv_url) unless split_re
176
189
  xref = ref.split(split_re).last
@@ -1,11 +1,9 @@
1
- # = Webrick AppServer
2
- #
3
- # Used temporarily unitl we build our own app server.
4
- #
5
- # code:: gmosx, elathan
1
+ # code:
2
+ # * George Moschovitis <gm@navel.gr>
3
+ # * Elias Athanasopoulos <elathan@navel.gr>
6
4
  #
7
5
  # (c) 2004 Navel, all rights reserved.
8
- # $Id: webrick.rb 71 2004-10-18 10:50:22Z gmosx $
6
+ # $Id: webrick.rb 106 2004-10-25 11:31:11Z gmosx $
9
7
 
10
8
  require "drb"
11
9
  require "cgi"
@@ -24,17 +22,20 @@ module N; module App
24
22
  # Dont keepalive (or use a VERY SMALL keepalive). Typically this server
25
23
  # is used along with a standard http server that handles other resources.
26
24
  #
27
- class Webrick < N::Server
28
- include N::App::ServerMixin
25
+ # Used temporarily unitl we build our own app server.
26
+ #
27
+ class Webrick < N::App::Server
29
28
  include WEBrick
30
29
 
30
+ # the integrated webrock server.
31
31
  attr_accessor :webrick
32
32
 
33
33
  def initialize(name = "WebrickServer")
34
34
  super
35
- initialize_app()
36
35
  end
37
36
 
37
+ # Start the application server.
38
+ #
38
39
  def start
39
40
  accesslog = WEBrick::BasicLog::new("/dev/null")
40
41
  referer = WEBrick::BasicLog::new("/dev/null")
@@ -42,7 +43,7 @@ class Webrick < N::Server
42
43
  @webrick = HTTPServer.new(
43
44
  :BindAddress => $appsrv_address,
44
45
  :Port => $appsrv_port,
45
- :DirectoryIndex => ["index.sx"],
46
+ :DocumentRoot => $root_dir,
46
47
  # gmosx, FIXME: this shit still logs!!
47
48
  :Logger => Log.new(nil, WEBrick::Log::WARN),
48
49
  # elathan: amateur...
@@ -61,6 +62,8 @@ class Webrick < N::Server
61
62
  @webrick.start()
62
63
  end
63
64
 
65
+ # Stop the application server.
66
+ #
64
67
  def stop
65
68
  @webrick.stop
66
69
  end
@@ -1,9 +1,15 @@
1
1
  # = Application
2
2
  #
3
- # code: gmosx, ekarak, drak, elathan
3
+ # The default Application object of the Framework.
4
+ #
5
+ # code:
6
+ # George Moschovitis <gm@navel.gr>
7
+ # Anastasios Koutoumanos <ak@navel.gr>
8
+ # Elias Athanasopoulos <elathan@navel.gr>
9
+ # Elias Karakoulakis <ekarak@ktismata.com>
4
10
  #
5
11
  # (c) 2004 Navel, all rights reserved.
6
- # $Id: application.rb 71 2004-10-18 10:50:22Z gmosx $
12
+ # $Id: application.rb 98 2004-10-22 07:36:20Z gmosx $
7
13
 
8
14
  require 'optparse'
9
15
  require 'ostruct'
@@ -15,7 +21,7 @@ module N
15
21
 
16
22
  # == Application
17
23
  #
18
- # the default Application object of the Framework.
24
+ # The default Application object of the Framework.
19
25
  #
20
26
  class Application
21
27
  # credentials of the application
@@ -31,12 +37,13 @@ class Application
31
37
  # startup time of the application
32
38
  attr_accessor :create_time
33
39
 
40
+ # is the application daemonized?
34
41
  attr_reader :daemonized
35
42
 
36
43
  # the pid of the application
37
44
  attr_reader :pid, :pidfile
38
45
 
39
- #
46
+ # Intialize method
40
47
  #
41
48
  def initialize(name = "Unknown")
42
49
  @name = name
@@ -45,8 +52,8 @@ class Application
45
52
  @status = :stop
46
53
  end
47
54
 
48
- # FIXME: deleting of arguments is wrong, recode
49
- # this using GETOPT.
55
+ # Parse the arguments passed to the application.
56
+ # Some standard arguments are handled by default.
50
57
  #
51
58
  def parse_arguments(args = ARGV)
52
59
 
@@ -1,18 +1,29 @@
1
- # = Config
2
- #
3
- # Configuration
1
+ # = Configuration
2
+ #
3
+ # Configuration parameters.
4
4
  #
5
5
  # code:
6
- # George Moschovitis <gm@navel.gr>
6
+ # * George Moschovitis <gm@navel.gr>
7
7
  #
8
8
  # (c) 2004 Navel, all rights reserved.
9
- # $Id: config.rb 89 2004-10-20 12:55:58Z gmosx $
9
+ # $Id: config.rb 106 2004-10-25 11:31:11Z gmosx $
10
10
 
11
+ # the name of the server
11
12
  $srv_name = "Nitro"
12
- $srv_version = "0.1.2"
13
13
 
14
+ # the version of the server
15
+ $srv_version = "0.2.0"
16
+
17
+ # monitor scripts for changes
18
+ #--
19
+ # gmosx, FIXME: replace this with reload_scripts ??
20
+ #++
14
21
  $srv_monitor_scripts = true
15
- $srv_default_file = "index.sx"
22
+
23
+ # the default file to view in a direcotry
24
+ $index_filename = "index.sx"
25
+
26
+ # seconds till the autologin cookie expires
16
27
  $srv_autologin_expires = 60*60*24*30
17
28
 
18
29
  # session timeout (in seconds)
@@ -1,45 +1,8 @@
1
- # = Database
2
- #
3
- # An efficient, yet simple Object-Relational Mapper.
4
- #
5
- # === Design
6
- #
7
- # Keep this class backend agnostic. Put backend specific code in
8
- # the Connection / Managed class.
9
- #
10
- # Try to make the methods work with oids. We do keep
11
- # a unified id space. Include the N::Sequenced Marker to
12
- # denote custom id space.
13
- # Do NOT implement descendants use a root id (rid).
14
- #
15
- # For class ids we use the name instead of a hash. Class ids are
16
- # typically not used in querys, they are stored for completeness.
17
- # If we store a hash we cannot reclaim the class thus invalidating
18
- # the point. Instead of .name(), to_s() is used so the methods
19
- # are more flexible (they accept class names too!!)
20
- #
21
- # === WARNING:
22
- #
23
- # When creating a new db exec the following:
24
- # CREATE SEQUENCE oids_seq;
25
- #
26
- # or
27
- #
28
- # DbTools.create_oids_seq
29
- #
30
- #
31
- # === Todo
32
- #
33
- # - support caching
34
- # - support prepared statements
35
- # - foreign keys (delete cascade)
36
- # - keep attribudes as marshaled!!
37
- #
38
1
  # code:
39
- # George Moschovitis <gm@navel.gr>
2
+ # * George Moschovitis <gm@navel.gr>
40
3
  #
41
4
  # (c) 2004 Navel, all rights reserved.
42
- # $Id: db.rb 79 2004-10-18 16:38:19Z gmosx $
5
+ # $Id: db.rb 106 2004-10-25 11:31:11Z gmosx $
43
6
 
44
7
  module N;
45
8
 
@@ -58,7 +21,59 @@ require "n/db/mixins"
58
21
  # if true, enables the read only mode
59
22
  $db_read_only_mode = false
60
23
 
61
- # = Database
24
+ # = Db
25
+ #
26
+ # An efficient, yet simple Object-Relational Mapper.
27
+ #
28
+ # == Features
29
+ #
30
+ # The library provides the following features:
31
+ #
32
+ # + Object-Relational mapping
33
+ # + Deserialize to Ruby Objects or ResultSets
34
+ # + Deserialize sql join queries to Ruby Objects
35
+ # + Serialize arbitrary ruby object graphs through Marshal
36
+ # + Connection pooling
37
+ # + Thread safety
38
+ # + SQL transactions
39
+ # + Callbacks
40
+ # + Simple support for cascading deletes
41
+ # + Hierarchical structures (preorder traversal, materialized paths)
42
+ # + Works safely as part of distributed application.
43
+ # + Simple implementation < 10k lines of code.
44
+ #
45
+ # === Design
46
+ #
47
+ # Keep this class backend agnostic. Put backend specific code in
48
+ # the Connection / Managed class.
49
+ #
50
+ # Try to make the methods work with oids. We do keep
51
+ # a unified id space. Include the N::Sequenced Marker to
52
+ # denote custom id space.
53
+ # Do NOT implement descendants use a root id (rid).
54
+ #
55
+ # For class ids we use the name instead of a hash. Class ids are
56
+ # typically not used in querys, they are stored for completeness.
57
+ # If we store a hash we cannot reclaim the class thus invalidating
58
+ # the point. Instead of .name(), to_s() is used so the methods
59
+ # are more flexible (they accept class names too!!)
60
+ #
61
+ # Db allows the serialization of arbitrary Ruby objects. Just
62
+ # mark them as Object (or Array or Hash) in the prop_accessor
63
+ # and the engine will serialize a Marshal.dump of the object.
64
+ # Arbitrary object graphs are supported too.
65
+ #
66
+ # === Future
67
+ #
68
+ # * Support multiple DataBase backends (Postgres, MySQL, ...)
69
+ # * Support prepared statements (pgsql)
70
+ # * Support stored procedures (pgsql)
71
+ # * Support caching
72
+ # * Deserialize to OpenStruct
73
+ # * Better documentation
74
+ # * Code cleanup, refactoring
75
+ # * Release as Gem, RPAbase
76
+ # * Foreign keys (cascading delete)
62
77
  #
63
78
  # === Design:
64
79
  #
@@ -211,6 +226,7 @@ class Db
211
226
  wrap_method :exec, "sql"
212
227
  wrap_method :exec_and_clear, "sql"
213
228
  wrap_method :exec_clear, "sql"
229
+ wrap_method :drop_table, "klass"
214
230
  end
215
231
 
216
232
  end # module
@@ -1,28 +1,8 @@
1
- # = Database Connection
2
- #
3
- # Encapsulates a database connection.
4
- #
5
- # === Design
6
- #
7
- # Try to make the methods to work with oids.
8
- # Do NOT implement descendants, use a root id (rid).
9
- #
10
- # === Todo
11
- #
12
- # - support caching
13
- # - support prepared statements
14
- # - foreign keys (delete cascade)
15
- # - keep attribudes as marshaled!!
16
- #
17
- # === Investigate
18
- #
19
- # - should we use retry_query ?
20
- #
21
1
  # code:
22
- # George Moschovitis <gm@navel.gr>
2
+ # * George Moschovitis <gm@navel.gr>
23
3
  #
24
4
  # (c) 2004 Navel, all rights reserved.
25
- # $Id: connection.rb 79 2004-10-18 16:38:19Z gmosx $
5
+ # $Id: connection.rb 99 2004-10-22 09:50:28Z gmosx $
26
6
 
27
7
  module N;
28
8
 
@@ -34,6 +14,22 @@ require "n/utils/time"
34
14
  #
35
15
  # A Connection to the Database.
36
16
  #
17
+ # === design
18
+ #
19
+ # try to make the methods to work with oids.
20
+ # do not implement descendants, use a root id (rid).
21
+ #
22
+ # === todo
23
+ #
24
+ # - support caching
25
+ # - support prepared statements
26
+ # - foreign keys (delete cascade)
27
+ # - keep attribudes as marshaled!!
28
+ #
29
+ # === investigate
30
+ #
31
+ # - should we use retry_query ?
32
+ #
37
33
  class DbConnection
38
34
  include N::DbUtils
39
35