nitro 0.7.0 → 0.8.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.
Files changed (102) hide show
  1. data/AUTHORS +14 -4
  2. data/ChangeLog +192 -1
  3. data/README +50 -6
  4. data/RELEASES +60 -0
  5. data/Rakefile +1 -1
  6. data/bin/cluster.rb +2 -2
  7. data/bin/new_form.rb +1 -1
  8. data/examples/blog/config.rb +5 -4
  9. data/examples/blog/lib/blog.rb +56 -36
  10. data/examples/blog/root/comments.xhtml +5 -2
  11. data/examples/blog/root/entry_form.xhtml +7 -2
  12. data/examples/blog/root/login.xhtml +1 -1
  13. data/examples/blog/root/style.xsl +7 -0
  14. data/examples/og/mock_example.rb +6 -9
  15. data/examples/og/mysql_to_psql.rb +100 -0
  16. data/examples/og/run.rb +8 -17
  17. data/lib/glue.rb +7 -8
  18. data/lib/glue/array.rb +1 -1
  19. data/lib/glue/attribute.rb +86 -0
  20. data/lib/glue/cache.rb +1 -1
  21. data/lib/glue/hash.rb +1 -1
  22. data/lib/glue/inflector.rb +1 -1
  23. data/lib/glue/logger.rb +118 -18
  24. data/lib/glue/mixins.rb +1 -1
  25. data/lib/glue/number.rb +1 -1
  26. data/lib/glue/pool.rb +1 -1
  27. data/lib/glue/property.rb +48 -31
  28. data/lib/glue/string.rb +1 -1
  29. data/lib/glue/time.rb +2 -2
  30. data/lib/glue/validation.rb +400 -0
  31. data/lib/nitro/application.rb +6 -6
  32. data/lib/nitro/builders/form.rb +5 -5
  33. data/lib/nitro/builders/rss.rb +1 -1
  34. data/lib/nitro/builders/xhtml.rb +119 -0
  35. data/lib/nitro/builders/xml.rb +111 -0
  36. data/lib/nitro/config.rb +6 -6
  37. data/lib/nitro/events.rb +1 -1
  38. data/lib/nitro/html.rb +1 -1
  39. data/lib/nitro/markup.rb +15 -20
  40. data/lib/nitro/scaffold.rb +2 -2
  41. data/lib/nitro/server/appserver.rb +3 -3
  42. data/lib/nitro/server/cluster.rb +2 -2
  43. data/lib/nitro/server/dispatcher.rb +2 -2
  44. data/lib/nitro/server/filters/autologin.rb +1 -1
  45. data/lib/nitro/server/fragment.rb +2 -2
  46. data/lib/nitro/server/handlers.rb +2 -2
  47. data/lib/nitro/server/render.rb +17 -15
  48. data/lib/nitro/server/request.rb +6 -6
  49. data/lib/nitro/server/script.rb +2 -2
  50. data/lib/nitro/server/server.rb +2 -2
  51. data/lib/nitro/server/session.rb +6 -6
  52. data/lib/nitro/server/shaders.rb +2 -2
  53. data/lib/nitro/server/webrick.rb +1 -1
  54. data/lib/nitro/sitemap.rb +2 -2
  55. data/lib/nitro/uri.rb +1 -1
  56. data/lib/nitro/version.rb +7 -5
  57. data/lib/og.rb +95 -129
  58. data/lib/og/backend.rb +47 -46
  59. data/lib/og/backends/mysql.rb +64 -63
  60. data/lib/og/backends/psql.rb +73 -72
  61. data/lib/og/connection.rb +7 -8
  62. data/lib/og/enchant.rb +80 -0
  63. data/lib/og/meta.rb +21 -21
  64. data/lib/og/mock.rb +31 -88
  65. data/lib/og/version.rb +6 -5
  66. data/lib/parts/README +9 -0
  67. data/lib/parts/content.rb +23 -9
  68. data/test/glue/tc_attribute.rb +22 -0
  69. data/test/glue/tc_cache.rb +4 -6
  70. data/test/glue/tc_hash.rb +2 -2
  71. data/test/glue/tc_logger.rb +36 -0
  72. data/test/glue/tc_numbers.rb +2 -2
  73. data/test/glue/tc_property_mixins.rb +35 -4
  74. data/test/glue/tc_strings.rb +32 -32
  75. data/test/glue/tc_validation.rb +186 -0
  76. data/test/nitro/builders/tc_xhtml.rb +38 -0
  77. data/test/nitro/builders/tc_xml.rb +47 -0
  78. data/test/nitro/server/tc_request.rb +2 -2
  79. data/test/nitro/server/tc_session.rb +1 -1
  80. data/test/nitro/tc_sitemap.rb +1 -1
  81. data/test/nitro/ui/tc_pager.rb +1 -10
  82. data/test/tc_og.rb +3 -3
  83. data/vendor/blankslate.rb +53 -0
  84. data/vendor/extensions/_base.rb +153 -0
  85. data/vendor/extensions/_template.rb +36 -0
  86. data/vendor/extensions/all.rb +21 -0
  87. data/vendor/extensions/array.rb +68 -0
  88. data/vendor/extensions/binding.rb +224 -0
  89. data/vendor/extensions/class.rb +50 -0
  90. data/vendor/extensions/continuation.rb +71 -0
  91. data/vendor/extensions/enumerable.rb +250 -0
  92. data/vendor/extensions/hash.rb +23 -0
  93. data/vendor/extensions/io.rb +58 -0
  94. data/vendor/extensions/kernel.rb +42 -0
  95. data/vendor/extensions/module.rb +114 -0
  96. data/vendor/extensions/numeric.rb +230 -0
  97. data/vendor/extensions/object.rb +164 -0
  98. data/vendor/extensions/ostruct.rb +41 -0
  99. data/vendor/extensions/string.rb +316 -0
  100. data/vendor/extensions/symbol.rb +28 -0
  101. metadata +35 -13
  102. data/lib/glue/property.rb.old +0 -307
@@ -13,7 +13,7 @@ module N
13
13
  #
14
14
  class FormBuilder
15
15
 
16
- @@cache = G::SafeHash.new
16
+ @@cache = N::SafeHash.new
17
17
 
18
18
  # Render a standard form for the given managed object.
19
19
  # If show_all is false then apply field filtering.
@@ -39,7 +39,7 @@ class FormBuilder
39
39
  str << %{
40
40
  <dt><label for="#{p.name}">#{p.name}</label></dt>
41
41
  <dd>
42
- <input type="text" name="#{p.name}" value="#{obj.send(p.symbol)}" />
42
+ <input type="text" id="#{p.name}" name="#{p.name}" value="#{obj.send(p.symbol)}" />
43
43
  </dd>
44
44
  }
45
45
  elsif p.klass.ancestors.include?(String)
@@ -54,11 +54,11 @@ class FormBuilder
54
54
  end
55
55
  if :textarea == p.meta[:ui]
56
56
  str << %{
57
- <textarea name="#{p.name}">#{val}</textarea>
57
+ <textarea id="#{p.name}" name="#{p.name}">#{val}</textarea>
58
58
  }
59
59
  else
60
60
  str << %{
61
- <input type="text" name="#{p.name}" value="#{val}" />
61
+ <input type="text" id="#{p.name}" name="#{p.name}" value="#{val}" />
62
62
  }
63
63
  end
64
64
  str << %{
@@ -68,7 +68,7 @@ class FormBuilder
68
68
  str << %{
69
69
  <dt><label for="#{p.name}">#{p.name}</label></dt>
70
70
  <dd>
71
- <input type="checkbox" name="${p.name}" />
71
+ <input type="checkbox" id="#{p.name}" name="#{p.name}" />
72
72
  </dd>
73
73
  }
74
74
  =begin
@@ -25,7 +25,7 @@ class RssBuilder
25
25
  for obj in objects
26
26
  item = RSS::Rss::Channel::Item.new
27
27
  item.title = obj.title if obj.respond_to?(:title)
28
- item.description = G::StringUtils.head(obj.body, 256) if obj.respond_to?(:body)
28
+ item.description = N::StringUtils.head(obj.body, 256) if obj.respond_to?(:body)
29
29
  item.link = "#$srv_url/#{obj.view_uri}" if obj.respond_to?(:view_uri)
30
30
  channel.items << item
31
31
  end
@@ -0,0 +1,119 @@
1
+ # George Moschovitis <gm@navel.gr>
2
+ # (c) 2005 Navel, all rights reserved.
3
+ # $Id$
4
+
5
+ require 'nitro/builders/xml'
6
+
7
+ module N
8
+
9
+ # = XhtmlBuilderMixin
10
+ #
11
+ # A helper mixin for programmatically building XHTML
12
+ # blocks.
13
+ #--
14
+ # TODO: add table generator, form generator
15
+ #++
16
+
17
+ module XhtmlBuilderMixin
18
+
19
+ # Render select.
20
+ #
21
+ # The first argument can be a String denoting the
22
+ # default option.
23
+ #--
24
+ # gmosx: hmmm String defines select, this is bad!
25
+ #++
26
+
27
+ def select(*args)
28
+ attrs = args.last.is_a?(Hash) ? args.pop : nil
29
+ start_tag('select', attrs)
30
+ self << %|<option>#{args.first}</option>| unless args.empty?
31
+ yield
32
+ end_tag('select')
33
+ end
34
+
35
+ # Render select options.
36
+ #
37
+ # [+opts+]
38
+ # The options to render, can be an Array or a
39
+ # Hash (allows you to explicitly set the value
40
+ # mapping).
41
+ #
42
+ # [+selected+]
43
+ # The value of the selected option.
44
+ #
45
+ # == Example
46
+ #
47
+ # options = ['Male', 'Female']
48
+ # o.select(:name => 'sex') {
49
+ # o.options(options, selected = 1)
50
+ # }
51
+ #
52
+ # or
53
+ #
54
+ # options = { 'Male' => 'm', 'Female' => 'f' }
55
+ # o.select(:name => 'sex') {
56
+ # o.options(options, selected = 1)
57
+ # }
58
+
59
+ def options(opts, selected = nil)
60
+ if opts.is_a?(Array)
61
+ selected = selected.to_i
62
+ opts.each_with_index do |label, value|
63
+ if value == selected
64
+ self << %|<option value="#{value}" selected="1">#{label}</option>|
65
+ else
66
+ self << %|<option value="#{value}">#{label}</option>|
67
+ end
68
+ end
69
+ else
70
+ opts.each do |label, value|
71
+ if value == selected
72
+ self << %|<option value="#{value}" selected="1">#{label}</option>|
73
+ else
74
+ self << %|<option value="#{value}">#{label}</option>|
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ # = XhtmlString
82
+ #
83
+ # A String extension with XHTML generation
84
+ # functionality.
85
+
86
+ class XhtmlString < String
87
+ include N::XmlBuilderMixin
88
+ include N::XhtmlBuilderMixin
89
+ end
90
+
91
+ # = XhtmlBuilder
92
+ #
93
+ # A class that encapsulats the XHTML generation
94
+ # functionality. Utilizes duck typing to redirect
95
+ # output to a target buffer.
96
+
97
+ class XhtmlBuilder
98
+ include N::XmlBuilderMixin
99
+ include N::XhtmlBuilderMixin
100
+
101
+ # The target receives the generated xml,
102
+ # should respond_to :<<
103
+
104
+ attr_accessor :target
105
+
106
+ def initialize(target = '')
107
+ @target = target
108
+ end
109
+
110
+ def << (str)
111
+ @target << str
112
+ end
113
+
114
+ def to_s
115
+ @target.to_s
116
+ end
117
+ end
118
+
119
+ end
@@ -0,0 +1,111 @@
1
+ # George Moschovitis <gm@navel.gr>
2
+ # (c) 2005 Navel, all rights reserved.
3
+ # $Id$
4
+
5
+ module N
6
+
7
+ # = XmlBuilderMixin
8
+ #
9
+ # A helper mixin for programmatically building XML
10
+ # blocks.
11
+
12
+ module XmlBuilderMixin
13
+
14
+ def method_missing(tag, *args, &block)
15
+ self.class.module_eval <<-"end_eval", __FILE__, __LINE__
16
+ def #{tag}(*args)
17
+ attrs = args.last.is_a?(Hash) ? args.pop : nil
18
+
19
+ if block_given?
20
+ start_tag('#{tag}', attrs)
21
+ yield
22
+ end_tag('#{tag}')
23
+ elsif (!args.empty?)
24
+ start_tag('#{tag}', attrs)
25
+ self << args.first
26
+ end_tag('#{tag}')
27
+ else
28
+ start_tag('#{tag}', attrs)
29
+ self << ' />'
30
+ end
31
+ end
32
+ end_eval
33
+
34
+ self.send(tag, *args, &block)
35
+ end
36
+
37
+ def start_tag(tag, attributes = nil)
38
+ unless attributes
39
+ self << "<#{tag}>"
40
+ else
41
+ self << "<#{tag}"
42
+ for name, value in attributes
43
+ if value
44
+ self << %| #{name}="#{value}"|
45
+ else
46
+ self << %| #{name}="1"|
47
+ end
48
+ end
49
+ self << ">"
50
+ end
51
+
52
+ return self
53
+ end
54
+
55
+ def end_tag(tag)
56
+ self << "</#{tag}>"
57
+
58
+ return self
59
+ end
60
+
61
+ def text(str)
62
+ self << str
63
+
64
+ return self
65
+ end
66
+
67
+ def comment(str)
68
+ self << "<!-- #{str} -->"
69
+
70
+ return self
71
+ end
72
+
73
+ end
74
+
75
+ # = XmlString
76
+ #
77
+ # A String extension with XML generation
78
+ # functionality.
79
+
80
+ class XmlString < String
81
+ include N::XmlBuilderMixin
82
+ end
83
+
84
+ # = XmlBuilder
85
+ #
86
+ # A class that encapsulats the XML generation
87
+ # functionality. Utilizes duck typing to redirect
88
+ # output to a target buffer.
89
+
90
+ class XmlBuilder
91
+ include N::XmlBuilderMixin
92
+
93
+ # The target receives the generated xml,
94
+ # should respond_to :<<
95
+
96
+ attr_accessor :target
97
+
98
+ def initialize(target = '')
99
+ @target = target
100
+ end
101
+
102
+ def << (str)
103
+ @target << str
104
+ end
105
+
106
+ def to_s
107
+ @target.to_s
108
+ end
109
+ end
110
+
111
+ end
@@ -62,7 +62,7 @@ $default_content_type = 'text/html'
62
62
  $services = { :index => N::Service }
63
63
 
64
64
  # The service method map.
65
- $methods = G::SafeHash.new
65
+ $methods = N::SafeHash.new
66
66
 
67
67
  # The shader. The default shader is very simple, here
68
68
  # is a typical example of a production shader pipeline:
@@ -82,8 +82,8 @@ if $DBG
82
82
 
83
83
  # Logger (redirect to STDERR)
84
84
 
85
- $log = Logger.new(STDERR);
86
- $log.level = Logger::DEBUG
85
+ Logger.set(Logger.new(STDERR))
86
+ Logger.get.level = Logger::DEBUG
87
87
 
88
88
  # If set to true disables xsl caching. Usefull when debugging xsls.
89
89
 
@@ -92,7 +92,7 @@ if $DBG
92
92
  # If set to true disables script compilation. Usefull when debugging
93
93
  # statically included scripts.
94
94
 
95
- $reload_scripts = true
95
+ $reload_scripts = true
96
96
 
97
97
  # Standard server setup for debugging.
98
98
 
@@ -105,8 +105,8 @@ else
105
105
 
106
106
  puts "\nRunning LIVE configuration.\n\n"
107
107
 
108
- $log = Logger.new("log/app.log", 10);
109
- $log.level = Logger::INFO
108
+ Logger.set(Logger.new("log/app.log", 10))
109
+ Logger.get.level = Logger::INFO
110
110
 
111
111
  # If set to true disables xsl caching. Usefull when debugging xsls.
112
112
 
@@ -63,7 +63,7 @@ class EventManager
63
63
  if event_handlers = @events[event]
64
64
  event_handlers.delete(name)
65
65
  else
66
- $log.debug "ev: cannot remove, handler #{name} not found for event #{event}" if $DBG
66
+ Logger.debug "ev: cannot remove, handler #{name} not found for event #{event}" if $DBG
67
67
  end
68
68
  end
69
69
 
@@ -141,7 +141,7 @@ module HtmlUtils
141
141
  # convert plain newlines into line breaks <br/>
142
142
 
143
143
  def self.convert_newlines(string)
144
- return nil unless G::StringUtils.valid?(string)
144
+ return nil unless N::StringUtils.valid?(string)
145
145
  xstring = string.gsub(/\n/, "<br/>")
146
146
  return xstring;
147
147
  end
@@ -1,17 +1,16 @@
1
- # code:
2
- # * George Moschovitis <gm@navel.gr>
3
- #
1
+ # George Moschovitis <gm@navel.gr>
4
2
  # (c) 2004 Navel, all rights reserved.
5
3
  # $Id$
6
4
 
7
5
  require 'glue/property'
8
6
 
9
- module G
7
+ module N
10
8
 
11
9
  #--
12
10
  # Override the default PropertyUtils implementation to
13
11
  # add markup support.
14
12
  #++
13
+
15
14
  module PropertyUtils
16
15
  # Override to add markup code.
17
16
  #
@@ -40,10 +39,6 @@ module PropertyUtils
40
39
  end
41
40
  end
42
41
 
43
- end # module
44
-
45
- module N
46
-
47
42
  # = Markup
48
43
  #
49
44
  # Generalised Markup transformations.
@@ -62,7 +57,7 @@ module N
62
57
  # here comes the #{obj.body} # => prints the expanded version.
63
58
  #
64
59
  # obj.body = N::Markup.expand(@params['body'])
65
- #
60
+
66
61
  module Markup
67
62
  def self.expand_html!(str)
68
63
  return unless str
@@ -82,39 +77,39 @@ module Markup
82
77
  end
83
78
 
84
79
  # Expand the markup code to produce the
85
- # actual content.
86
- #
80
+ # actual content. You should override this method
81
+ # in your application to call your custom markup
82
+ # methods.
83
+
87
84
  def self.expand(str)
88
85
  if str
89
86
  xstr = str.dup
90
87
  expand_html!(xstr)
91
- expand_wiki!(xstr)
92
88
  return xstr
93
- else
94
- return str
95
89
  end
90
+ return nil
96
91
  end
97
92
 
98
93
  # Compact (reverse) the content to the origial markup
99
94
  # code. Not all markup transformations are reversible.
100
- #
95
+ # You should override this method in your application
96
+ # to call your custom markup methods.
97
+
101
98
  def self.compact(str)
102
99
  if str
103
100
  xstr = str.dup
104
101
  compact_html!(xstr)
105
- compact_wiki!(xstr)
106
102
  return xstr
107
- else
108
- return str
109
103
  end
104
+ return nil
110
105
  end
111
106
 
112
107
  # Remove markup code from the input string.
113
108
  # NOT IMPLEMENTED.
114
- #
109
+
115
110
  def self.clear(str)
116
111
  end
117
112
 
118
113
  end
119
114
 
120
- end # module
115
+ end
@@ -25,8 +25,8 @@ module Scaffolding
25
25
  def scaffold(klass, options = {})
26
26
 
27
27
  oid = options[:oid] || 'oid'
28
- name = options[:name] || G::Inflector.name(klass.name)
29
- list_name = options[:list_name] || G::Inflector.plural_name(name)
28
+ name = options[:name] || N::Inflector.name(klass.name)
29
+ list_name = options[:list_name] || N::Inflector.plural_name(name)
30
30
  suffix = "_#{name}"
31
31
 
32
32
  # Add methods to the scaffolded class.
@@ -26,7 +26,7 @@ module AppServerMixin
26
26
  $sessions = DRbObject.new(nil, $drb_sessions_cluster)
27
27
  else
28
28
  # NoCluster mode: use standard Ruby onjects.
29
- $lm = G::SafeHash.new
29
+ $lm = N::SafeHash.new
30
30
  $sessions = N::SessionManager.new
31
31
  end
32
32
 
@@ -59,8 +59,8 @@ class AppServer < N::Server
59
59
  super
60
60
  initialize_app()
61
61
 
62
- $log.info "Web Server listening at #$srv_url"
63
- $log.info "App Server listening at http://#$appsrv_address:#$appsrv_port"
62
+ Logger.info "Web Server listening at #$srv_url"
63
+ Logger.info "App Server listening at http://#$appsrv_address:#$appsrv_port"
64
64
  end
65
65
  end
66
66