nitro 0.8.0 → 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -4
- data/ChangeLog +418 -0
- data/LICENSE +1 -1
- data/README +157 -89
- data/RELEASES +50 -0
- data/Rakefile +5 -7
- data/benchmark/nitro/bench.rb +5 -0
- data/benchmark/nitro/simple-webrick-n-200.txt +44 -0
- data/benchmark/nitro/static-webrick-n-200.txt +43 -0
- data/benchmark/nitro/tiny-lhttpd-n-200-c-5.txt +43 -0
- data/benchmark/nitro/tiny-webrick-n-200-c-5.txt +44 -0
- data/benchmark/nitro/tiny-webrick-n-200.txt +44 -0
- data/benchmark/nitro/tiny2-webrick-n-200.txt +44 -0
- data/{lib/nitro/server/cluster.rb → bin/cluster} +26 -30
- data/bin/proto/README +2 -2
- data/bin/proto/{apache.conf → conf/apache.conf} +0 -0
- data/bin/proto/conf/app.conf.rb +22 -0
- data/bin/proto/conf/lhttpd.conf +236 -0
- data/bin/proto/ctl +4 -0
- data/bin/proto/lib/README +5 -0
- data/bin/proto/log/README +3 -0
- data/bin/proto/root/fcgi.rb +6 -0
- data/bin/proto/root/index.xhtml +65 -7
- data/bin/proto/root/m/nitro.png +0 -0
- data/examples/blog/README +7 -5
- data/examples/blog/{apache.conf → conf/apache.conf} +0 -0
- data/examples/blog/conf/app.conf.rb +56 -0
- data/examples/blog/conf/lhttpd.conf +236 -0
- data/examples/blog/ctl +4 -0
- data/examples/blog/lib/blog.rb +11 -136
- data/examples/blog/lib/blog/controller.rb +99 -0
- data/examples/blog/lib/blog/model.rb +39 -0
- data/examples/blog/log/README +3 -0
- data/examples/blog/root/comments.xhtml +2 -2
- data/examples/blog/root/fcgi.rb +6 -0
- data/examples/blog/root/index.xhtml +4 -5
- data/examples/blog/root/login.xhtml +2 -2
- data/examples/blog/root/style.xsl +9 -9
- data/examples/blog/root/view_entry.xhtml +2 -2
- data/examples/flash/conf/app.conf.rb +23 -0
- data/examples/flash/ctl +4 -0
- data/examples/flash/log/README +3 -0
- data/examples/flash/root/index.xhtml +0 -9
- data/examples/flash/root/show_inline_text.xhtml +10 -5
- data/examples/no_xsl_blog/README +12 -0
- data/examples/no_xsl_blog/conf/apache.conf +0 -0
- data/examples/no_xsl_blog/conf/app.conf.rb +57 -0
- data/examples/no_xsl_blog/conf/lhttpd.conf +236 -0
- data/examples/no_xsl_blog/ctl +4 -0
- data/examples/no_xsl_blog/lib/blog.rb +20 -0
- data/examples/no_xsl_blog/lib/blog/controller.rb +102 -0
- data/examples/no_xsl_blog/lib/blog/model.rb +39 -0
- data/examples/no_xsl_blog/lib/blog/template.rb +134 -0
- data/examples/no_xsl_blog/log/README +3 -0
- data/examples/no_xsl_blog/root/comments.xhtml +41 -0
- data/examples/no_xsl_blog/root/entry_form.xhtml +22 -0
- data/examples/no_xsl_blog/root/fcgi.rb +6 -0
- data/examples/no_xsl_blog/root/index.xhtml +39 -0
- data/examples/no_xsl_blog/root/login.xhtml +21 -0
- data/examples/no_xsl_blog/root/m/bubbles.gif +0 -0
- data/examples/no_xsl_blog/root/m/comments_curve.gif +0 -0
- data/examples/no_xsl_blog/root/m/down.gif +0 -0
- data/examples/no_xsl_blog/root/m/footer_bg.gif +0 -0
- data/examples/no_xsl_blog/root/m/garrow.gif +0 -0
- data/examples/no_xsl_blog/root/m/gbull.gif +0 -0
- data/examples/no_xsl_blog/root/m/grbull.gif +0 -0
- data/examples/no_xsl_blog/root/m/h1_bg.gif +0 -0
- data/examples/no_xsl_blog/root/m/header_bg.gif +0 -0
- data/examples/no_xsl_blog/root/m/nitro.gif +0 -0
- data/examples/no_xsl_blog/root/m/obull.gif +0 -0
- data/examples/no_xsl_blog/root/m/page_bg.gif +0 -0
- data/examples/no_xsl_blog/root/m/rss.gif +0 -0
- data/examples/no_xsl_blog/root/m/side_title_bg.gif +0 -0
- data/examples/no_xsl_blog/root/m/sidebar_bg.gif +0 -0
- data/examples/no_xsl_blog/root/recent_posts.xhtml +14 -0
- data/examples/no_xsl_blog/root/style.css +301 -0
- data/examples/no_xsl_blog/root/view_entry.xhtml +25 -0
- data/examples/no_xsl_blog/root/view_entry.xml +12 -0
- data/examples/og/run.rb +2 -2
- data/examples/tiny/README +2 -2
- data/examples/tiny/conf/apache.conf +5 -0
- data/examples/tiny/conf/app.conf.rb +21 -0
- data/examples/tiny/conf/lhttpd.conf +236 -0
- data/examples/tiny/ctl +4 -0
- data/examples/tiny/log/README +3 -0
- data/examples/tiny/root/fcgi.rb +6 -0
- data/examples/tiny/root/index.xhtml +7 -4
- data/examples/tiny/root/nitro.png +0 -0
- data/lib/glue.rb +13 -9
- data/lib/glue/array.rb +1 -1
- data/lib/glue/cache.rb +1 -1
- data/lib/glue/flexob.rb +12 -0
- data/lib/glue/hash.rb +1 -1
- data/lib/glue/inflector.rb +2 -2
- data/lib/glue/logger.rb +4 -8
- data/lib/glue/misc.rb +14 -0
- data/lib/glue/number.rb +1 -1
- data/lib/glue/object.rb +26 -0
- data/lib/glue/pool.rb +1 -1
- data/lib/glue/property.rb +84 -91
- data/lib/glue/string.rb +1 -1
- data/lib/glue/time.rb +1 -1
- data/lib/glue/validation.rb +1 -1
- data/lib/nitro.rb +18 -6
- data/lib/nitro/adaptors/cgi.rb +291 -0
- data/lib/nitro/adaptors/fastcgi.rb +42 -0
- data/lib/nitro/adaptors/runner.rb +123 -0
- data/lib/nitro/adaptors/webrick.rb +110 -0
- data/lib/nitro/buffering.rb +43 -0
- data/lib/nitro/builders/form.rb +1 -1
- data/lib/nitro/builders/rss.rb +1 -1
- data/{bin → lib/nitro}/cluster.rb +26 -30
- data/lib/nitro/context.rb +82 -0
- data/lib/nitro/controller.rb +50 -0
- data/lib/nitro/cookie.rb +46 -0
- data/lib/nitro/dispatcher.rb +105 -0
- data/lib/nitro/filters.rb +9 -10
- data/lib/nitro/localization.rb +42 -0
- data/lib/nitro/mail.rb +11 -14
- data/lib/nitro/render.rb +275 -0
- data/lib/nitro/request.rb +128 -0
- data/lib/nitro/response.rb +38 -0
- data/lib/nitro/scaffold.rb +11 -11
- data/lib/nitro/session.rb +84 -0
- data/lib/nitro/{server/shaders.rb → shaders.rb} +56 -36
- data/lib/nitro/ui/pager.rb +23 -26
- data/lib/nitro/{sitemap.rb → ui/sitemap.rb} +4 -12
- data/lib/nitro/uri.rb +1 -1
- data/lib/nitro/version.rb +10 -8
- data/lib/og.rb +66 -65
- data/lib/og/backend.rb +1 -1
- data/lib/og/backends/mysql.rb +48 -52
- data/lib/og/backends/psql.rb +34 -37
- data/lib/og/connection.rb +15 -15
- data/lib/og/enchant.rb +16 -9
- data/lib/og/meta.rb +127 -54
- data/lib/og/mock.rb +18 -18
- data/lib/og/version.rb +6 -4
- data/lib/parts/content.rb +4 -8
- data/test/glue/tc_logger.rb +3 -0
- data/test/glue/tc_property.rb +19 -3
- data/test/nitro/adaptors/tc_cgi.rb +63 -0
- data/test/nitro/adaptors/tc_webrick.rb +15 -0
- data/test/nitro/builders/tc_xml.rb +2 -2
- data/test/nitro/tc_context.rb +13 -0
- data/test/nitro/tc_controller.rb +47 -0
- data/test/nitro/tc_dispatcher.rb +64 -0
- data/test/nitro/tc_session.rb +20 -0
- data/test/nitro/{tc_sitemap.rb → ui/tc_sitemap.rb} +1 -1
- data/test/root/blog/list.xhtml +6 -0
- data/test/tc_og.rb +41 -4
- metadata +115 -59
- data/bin/proto/app.rb +0 -20
- data/bin/proto/config.rb +0 -77
- data/examples/blog/app.rb +0 -21
- data/examples/blog/config.rb +0 -95
- data/examples/blog/env.rb +0 -22
- data/examples/flash/README +0 -34
- data/examples/flash/app.rb +0 -20
- data/examples/flash/config.rb +0 -38
- data/examples/flash/lib/flash.rb +0 -40
- data/examples/flash/tmp.swf +0 -0
- data/examples/tiny/app.rb +0 -19
- data/examples/tiny/config.rb +0 -29
- data/examples/tiny/root/nitro-small.png +0 -0
- data/lib/nitro/application.rb +0 -217
- data/lib/nitro/config.rb +0 -128
- data/lib/nitro/events.rb +0 -122
- data/lib/nitro/html.rb +0 -151
- data/lib/nitro/http.rb +0 -102
- data/lib/nitro/l10n.rb +0 -30
- data/lib/nitro/server.rb +0 -59
- data/lib/nitro/server/appserver.rb +0 -67
- data/lib/nitro/server/cookie.rb +0 -87
- data/lib/nitro/server/dispatcher.rb +0 -62
- data/lib/nitro/server/filters.rb +0 -75
- data/lib/nitro/server/filters/autologin.rb +0 -51
- data/lib/nitro/server/fragment.rb +0 -70
- data/lib/nitro/server/handlers.rb +0 -127
- data/lib/nitro/server/render.rb +0 -426
- data/lib/nitro/server/request.rb +0 -658
- data/lib/nitro/server/requestpart.rb +0 -54
- data/lib/nitro/server/script.rb +0 -387
- data/lib/nitro/server/server.rb +0 -57
- data/lib/nitro/server/session.rb +0 -220
- data/lib/nitro/server/user.rb +0 -46
- data/lib/nitro/server/webrick.rb +0 -180
- data/lib/nitro/service.rb +0 -26
- data/lib/xsl/ui.xsl +0 -51
- data/lib/xsl/xforms.xsl +0 -28
- data/test/nitro/server/tc_cookie.rb +0 -34
- data/test/nitro/server/tc_filters.rb +0 -38
- data/test/nitro/server/tc_request.rb +0 -70
- data/test/nitro/server/tc_requestpart.rb +0 -28
- data/test/nitro/server/tc_session.rb +0 -34
- data/test/nitro/tc_events.rb +0 -44
- data/test/nitro/tc_html.rb +0 -79
- data/test/nitro/tc_http.rb +0 -18
data/examples/tiny/ctl
ADDED
@@ -5,7 +5,7 @@
|
|
5
5
|
<?r
|
6
6
|
# the code that populates the template comes here
|
7
7
|
|
8
|
-
unless name =
|
8
|
+
unless name = context['name']
|
9
9
|
name = 'World'
|
10
10
|
end
|
11
11
|
|
@@ -16,12 +16,14 @@
|
|
16
16
|
<!-- the template comes here -->
|
17
17
|
|
18
18
|
<p>
|
19
|
-
<img src="nitro
|
19
|
+
<img src="nitro.png" />
|
20
20
|
</p>
|
21
21
|
|
22
22
|
|
23
23
|
<strong>Hello #{name}</strong>
|
24
|
-
|
24
|
+
<!--
|
25
|
+
<p>#{context.headers.collect { |h| "#{h}<br/>" }}</p>
|
26
|
+
-->
|
25
27
|
<p>
|
26
28
|
<form id="my_form">
|
27
29
|
<strong>Enter your name:</strong>
|
@@ -34,6 +36,7 @@
|
|
34
36
|
Counter: #{session[:counter]}
|
35
37
|
</p>
|
36
38
|
<br />
|
37
|
-
|
39
|
+
|
40
|
+
<render href="include" />
|
38
41
|
|
39
42
|
</html>
|
Binary file
|
data/lib/glue.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
# = Glue
|
2
|
-
#
|
3
1
|
# General libraries used by various projects.
|
4
2
|
#
|
5
|
-
|
6
|
-
#
|
7
|
-
#
|
3
|
+
#--
|
4
|
+
# George Moschovitis <gm@navel.gr>
|
8
5
|
# (c) 2004-2005 Navel, all rights reserved.
|
9
|
-
# $Id: glue.rb
|
6
|
+
# $Id: glue.rb 215 2005-01-24 10:44:05Z gmosx $
|
7
|
+
#++
|
10
8
|
|
11
9
|
require 'English'
|
12
10
|
require 'pp'
|
@@ -14,10 +12,15 @@ require 'pp'
|
|
14
12
|
require 'glue/property'
|
15
13
|
require 'glue/attribute'
|
16
14
|
|
15
|
+
# The standard namespace module.
|
16
|
+
|
17
|
+
module N; end
|
18
|
+
|
17
19
|
class NilClass
|
20
|
+
|
18
21
|
# quite usefull for error tolerant apps.
|
19
22
|
# a bit dangerous? Will have to rethink this.
|
20
|
-
|
23
|
+
|
21
24
|
def empty?
|
22
25
|
return true
|
23
26
|
end
|
@@ -27,6 +30,7 @@ class Class
|
|
27
30
|
#--
|
28
31
|
# gmosx: is this really needed?
|
29
32
|
#++
|
33
|
+
|
30
34
|
def to_i
|
31
35
|
return self.hash
|
32
36
|
end
|
@@ -34,7 +38,7 @@ end
|
|
34
38
|
|
35
39
|
module Kernel
|
36
40
|
|
37
|
-
#
|
41
|
+
# Pretty prints an exception/error object
|
38
42
|
# usefull for helpfull debug messages
|
39
43
|
#
|
40
44
|
# Input:
|
@@ -42,7 +46,7 @@ module Kernel
|
|
42
46
|
#
|
43
47
|
# Output:
|
44
48
|
# the pretty printed string
|
45
|
-
|
49
|
+
|
46
50
|
def pp_exception(ex)
|
47
51
|
return %{#{ex.message}\n\tBACKTRACE:\n\t#{ex.backtrace.join("\n\t")}\n\tLOGGED FROM:\n\t#{caller[0]}}
|
48
52
|
end
|
data/lib/glue/array.rb
CHANGED
data/lib/glue/cache.rb
CHANGED
data/lib/glue/flexob.rb
ADDED
data/lib/glue/hash.rb
CHANGED
data/lib/glue/inflector.rb
CHANGED
@@ -44,13 +44,13 @@ module Inflector
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# Convert a class to a name.
|
47
|
-
|
47
|
+
|
48
48
|
def name(klass)
|
49
49
|
Inflector.underscore(Inflector.demodulize(klass.to_s))
|
50
50
|
end
|
51
51
|
|
52
52
|
# Convert a class to a name in plural
|
53
|
-
|
53
|
+
|
54
54
|
def plural_name(klass)
|
55
55
|
Inflector.pluralize(Inflector.underscore(Inflector.demodulize(klass.to_s)))
|
56
56
|
end
|
data/lib/glue/logger.rb
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
# code:
|
2
1
|
# * George Moschovitis <gm@navel.gr>
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# $Id: logger.rb 161 2004-11-18 10:51:51Z gmosx $
|
2
|
+
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
+
# $Id: logger.rb 248 2005-01-31 13:38:34Z gmosx $
|
6
4
|
|
7
5
|
require 'logger'
|
8
6
|
|
9
|
-
# = Logger
|
10
|
-
#
|
11
7
|
# A simple wrapper arround the Ruby logger. Mainly for
|
12
8
|
# compatibility purposes.
|
13
|
-
|
9
|
+
|
14
10
|
class Logger
|
15
11
|
alias_method :devel, :debug
|
16
12
|
alias_method :fine, :debug
|
@@ -42,7 +38,7 @@ class Logger
|
|
42
38
|
#
|
43
39
|
# This code comes straight from the dev-utils Gem.
|
44
40
|
# Author: Gavin Sinclair <gsinclair@soyabean.com.au>
|
45
|
-
|
41
|
+
|
46
42
|
def trace(expr, style=:p)
|
47
43
|
unless expr.respond_to? :to_str
|
48
44
|
warn "trace: Can't evaluate the given value: #{caller.first}"
|
data/lib/glue/misc.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# * George Moschovitis <gm@navel.gr>
|
2
|
+
# (c) 2004-2005 Navel, all rights reserved.
|
3
|
+
# $Id$
|
4
|
+
|
5
|
+
# Executes a Ruby block without warnings.
|
6
|
+
|
7
|
+
def silence_warnings
|
8
|
+
old_verbose, $VERBOSE = $VERBOSE, nil
|
9
|
+
begin
|
10
|
+
yield
|
11
|
+
ensure
|
12
|
+
$VERBOSE = old_verbose
|
13
|
+
end
|
14
|
+
end
|
data/lib/glue/number.rb
CHANGED
data/lib/glue/object.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
class Object #:nodoc:
|
4
|
+
def remove_subclasses_of(superclass)
|
5
|
+
subclasses_of(superclass).each { |subclass| Object.send(:remove_const, subclass) rescue nil }
|
6
|
+
end
|
7
|
+
|
8
|
+
def subclasses_of(superclass)
|
9
|
+
subclasses = []
|
10
|
+
ObjectSpace.each_object(Class) do |k|
|
11
|
+
next if !k.ancestors.include?(superclass) || superclass == k || k.to_s.include?("::") || subclasses.include?(k.to_s)
|
12
|
+
subclasses << k.to_s
|
13
|
+
end
|
14
|
+
subclasses
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Class #:nodoc:
|
19
|
+
def remove_subclasses
|
20
|
+
Object.remove_subclasses_of(self)
|
21
|
+
end
|
22
|
+
|
23
|
+
def subclasses
|
24
|
+
Object.subclasses_of(self)
|
25
|
+
end
|
26
|
+
end
|
data/lib/glue/pool.rb
CHANGED
data/lib/glue/property.rb
CHANGED
@@ -1,21 +1,19 @@
|
|
1
|
-
# code:
|
2
1
|
# * George Moschovitis <gm@navel.gr>
|
3
|
-
#
|
4
|
-
# (c) 2004 Navel, all rights reserved.
|
5
|
-
# $Id: property.rb
|
2
|
+
# * Michael Neumann <mneumann@ntecs.de>
|
3
|
+
# (c) 2004-2005 Navel, all rights reserved.
|
4
|
+
# $Id: property.rb 248 2005-01-31 13:38:34Z gmosx $
|
6
5
|
|
7
6
|
require 'glue/array'
|
8
7
|
require 'glue/hash'
|
9
8
|
|
10
9
|
module N
|
11
10
|
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
# we need extra metadata though, for example in relational mapping,
|
16
|
-
# or web form population.
|
11
|
+
# Ruby attributes are typeless and generally this is good.
|
12
|
+
# Some times we need extra metadata though, for example in
|
13
|
+
# relational mapping, or web form population.
|
17
14
|
#
|
18
|
-
# Only Fixnums, Strings, Floats, Times, Booleans are
|
15
|
+
# Only Fixnums, Strings, Floats, Times, Booleans are
|
16
|
+
# converted.
|
19
17
|
#
|
20
18
|
# The default = methods do not force the types. A special
|
21
19
|
# __force_set method should be used instead.
|
@@ -24,14 +22,23 @@ module N
|
|
24
22
|
# TODO:
|
25
23
|
# Perhaps a sync is needed in evals (!!!!)
|
26
24
|
#++
|
25
|
+
|
27
26
|
class Property
|
27
|
+
|
28
28
|
# the symbol of the property
|
29
|
+
|
29
30
|
attr_accessor :symbol
|
31
|
+
|
30
32
|
# the string representation of the symbol
|
33
|
+
|
31
34
|
attr_accessor :name
|
35
|
+
|
32
36
|
# the class of the property
|
37
|
+
|
33
38
|
attr_accessor :klass
|
39
|
+
|
34
40
|
# additional metadata (like sql declaration, sql index, etc)
|
41
|
+
|
35
42
|
attr_accessor :meta
|
36
43
|
|
37
44
|
def initialize(symbol, klass, meta = {})
|
@@ -53,7 +60,7 @@ end
|
|
53
60
|
# = PropertyUtils
|
54
61
|
#
|
55
62
|
# A collection of Property related utility methods.
|
56
|
-
|
63
|
+
|
57
64
|
module PropertyUtils
|
58
65
|
|
59
66
|
# Add accessors to the properties to the given target
|
@@ -65,6 +72,7 @@ module PropertyUtils
|
|
65
72
|
#--
|
66
73
|
# gmosx: Perhaps we 'll optimize this in the future.
|
67
74
|
#++
|
75
|
+
|
68
76
|
def self.enchant(target, force = false)
|
69
77
|
unless target.singleton_methods.include?('__props')
|
70
78
|
target.module_eval <<-"end_eval", __FILE__, __LINE__
|
@@ -91,7 +99,7 @@ module PropertyUtils
|
|
91
99
|
end
|
92
100
|
|
93
101
|
# Copy properties from src (Module or Class) to dest.
|
94
|
-
|
102
|
+
|
95
103
|
def self.copy_props(src, dest)
|
96
104
|
src.__props.each do |p|
|
97
105
|
add_prop(dest, p)
|
@@ -105,7 +113,7 @@ module PropertyUtils
|
|
105
113
|
end
|
106
114
|
|
107
115
|
# Add the property to the target (Class or Module)
|
108
|
-
|
116
|
+
|
109
117
|
def self.add_prop(target, prop)
|
110
118
|
if idx = target.__props.index(prop)
|
111
119
|
# override in case of duplicates. Keep the order of the props.
|
@@ -128,6 +136,7 @@ module PropertyUtils
|
|
128
136
|
|
129
137
|
# gmosx: __force_xxx reuses xxx= to allow for easier
|
130
138
|
# overrides.
|
139
|
+
|
131
140
|
if prop.meta[:writer]
|
132
141
|
target.module_eval %{
|
133
142
|
#{prop_setter(prop)}
|
@@ -154,7 +163,7 @@ module PropertyUtils
|
|
154
163
|
|
155
164
|
# Generates the property setter code. Can be overriden
|
156
165
|
# to support extra functionality (example: markup)
|
157
|
-
|
166
|
+
|
158
167
|
def self.prop_setter(prop)
|
159
168
|
s = prop.symbol
|
160
169
|
%{
|
@@ -165,11 +174,53 @@ module PropertyUtils
|
|
165
174
|
end
|
166
175
|
|
167
176
|
# Get the property metadata for the given symbol.
|
168
|
-
|
177
|
+
|
169
178
|
def self.get_prop(klass, sym)
|
170
179
|
return klass.__props.find { |p| p.symbol == sym }
|
171
180
|
end
|
172
181
|
|
182
|
+
# Include meta-language mixins
|
183
|
+
|
184
|
+
def self.include_meta_mixins(target)
|
185
|
+
target.module_eval %{ include N::Validation } if defined?(N::Validation)
|
186
|
+
# gmosx: TODO, make Og::MetaLanguage equivalent to Validation.
|
187
|
+
target.module_eval %{ extend Og::MetaLanguage } if defined?(Og::MetaLanguage)
|
188
|
+
end
|
189
|
+
|
190
|
+
# Resolves the parameters passed to the propxxx macros
|
191
|
+
# to generate the meta, klass and symbols variables. This
|
192
|
+
# way the common functionality is factored out.
|
193
|
+
#
|
194
|
+
# [+params+]
|
195
|
+
# The params to resolve.
|
196
|
+
# [+one_symbol+]
|
197
|
+
# If true, only resolves one symbol (used in prop).
|
198
|
+
|
199
|
+
def self.resolve_prop_params(*params)
|
200
|
+
meta = {}
|
201
|
+
klass = Object
|
202
|
+
symbols = []
|
203
|
+
|
204
|
+
for param in params.flatten
|
205
|
+
if param.is_a?(Class)
|
206
|
+
klass = param
|
207
|
+
elsif param.is_a?(Symbol)
|
208
|
+
symbols << param
|
209
|
+
elsif param.is_a?(TrueClass) or param.is_a?(TrueClass)
|
210
|
+
writer = param
|
211
|
+
elsif param.is_a?(Hash)
|
212
|
+
# the meta hash.
|
213
|
+
meta.update(param) { |k, a, b| [a,b].join(' ') }
|
214
|
+
else
|
215
|
+
raise 'Error when defining property!'
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
raise 'No symbols provided!' if symbols.empty?
|
220
|
+
|
221
|
+
return meta, klass, symbols
|
222
|
+
end
|
223
|
+
|
173
224
|
end
|
174
225
|
|
175
226
|
end # module
|
@@ -188,33 +239,19 @@ class Module
|
|
188
239
|
# --> creates only writer.
|
189
240
|
# prop Fixnum, :oid, writer = true, :sql => "integer PRIMARY KEY"
|
190
241
|
# --> creates reader and writer.
|
191
|
-
|
242
|
+
|
192
243
|
def prop(*params)
|
193
|
-
|
194
|
-
|
195
|
-
klass = Object
|
196
|
-
|
197
|
-
for param in params
|
198
|
-
if param.is_a?(Class)
|
199
|
-
klass = param
|
200
|
-
elsif param.is_a?(Symbol)
|
201
|
-
symbol = param
|
202
|
-
elsif param.is_a?(TrueClass) or param.is_a?(TrueClass)
|
203
|
-
writer = param
|
204
|
-
elsif param.is_a?(Hash)
|
205
|
-
# the meta hash.
|
206
|
-
meta = param
|
207
|
-
else
|
208
|
-
raise "Error when defining property!"
|
209
|
-
end
|
210
|
-
end
|
244
|
+
meta, klass, symbols = N::PropertyUtils.resolve_prop_params(params)
|
245
|
+
symbol = symbols.first
|
211
246
|
|
247
|
+
|
212
248
|
N::PropertyUtils.enchant(self)
|
213
249
|
|
214
250
|
if self.is_a?(Class)
|
215
251
|
|
216
252
|
# Add some extra code to append features to
|
217
253
|
# subclasses.
|
254
|
+
|
218
255
|
self.module_eval <<-"end_eval", __FILE__, __LINE__
|
219
256
|
|
220
257
|
def self.inherited(sub)
|
@@ -231,17 +268,17 @@ class Module
|
|
231
268
|
|
232
269
|
# Add some extra code for modules to append
|
233
270
|
# their features to classes that include it.
|
271
|
+
|
234
272
|
self.module_eval <<-"end_eval", __FILE__, __LINE__
|
235
273
|
|
236
274
|
def self.append_features(base)
|
237
275
|
N::PropertyUtils.enchant(base)
|
238
276
|
N::PropertyUtils.copy_props(self, base)
|
277
|
+
|
239
278
|
# gmosx: We have to define @@__props first to avoid reusing
|
240
279
|
# the hash from the module. super must stay at the end.
|
241
|
-
|
242
|
-
|
243
|
-
base.module_eval %{ include N::Validation }
|
244
|
-
end if defined?(N::Validation)
|
280
|
+
|
281
|
+
N::PropertyUtils.include_meta_mixins(base)
|
245
282
|
|
246
283
|
super
|
247
284
|
end
|
@@ -265,7 +302,8 @@ class Module
|
|
265
302
|
N::PropertyUtils.add_prop(self, property)
|
266
303
|
|
267
304
|
# gmosx: should be placed AFTER enchant!
|
268
|
-
|
305
|
+
|
306
|
+
N::PropertyUtils.include_meta_mixins(self)
|
269
307
|
end
|
270
308
|
|
271
309
|
# Helper method. Accepts a collection of symbols and generates
|
@@ -273,24 +311,9 @@ class Module
|
|
273
311
|
#
|
274
312
|
# Example:
|
275
313
|
# prop_reader String, :name, :title, :body, :sql => "char(32)"
|
276
|
-
|
314
|
+
|
277
315
|
def prop_reader(*params)
|
278
|
-
meta =
|
279
|
-
klass = Object
|
280
|
-
symbols = []
|
281
|
-
|
282
|
-
for param in params
|
283
|
-
if param.is_a?(Class)
|
284
|
-
klass = param
|
285
|
-
elsif param.is_a?(Symbol)
|
286
|
-
symbols << param
|
287
|
-
elsif param.is_a?(Hash)
|
288
|
-
# the meta hash.
|
289
|
-
meta = param
|
290
|
-
else
|
291
|
-
raise "Error when defining property!"
|
292
|
-
end
|
293
|
-
end
|
316
|
+
meta, klass, symbols = N::PropertyUtils.resolve_prop_params(params)
|
294
317
|
|
295
318
|
meta[:reader] = true
|
296
319
|
meta[:writer] = false
|
@@ -305,25 +328,10 @@ class Module
|
|
305
328
|
#
|
306
329
|
# Example:
|
307
330
|
# prop_writer String, :name, :title, :body, :sql => "char(32)"
|
308
|
-
|
331
|
+
|
309
332
|
def prop_writer(*params)
|
310
|
-
meta =
|
311
|
-
klass = Object
|
312
|
-
symbols = []
|
333
|
+
meta, klass, symbols = N::PropertyUtils.resolve_prop_params(params)
|
313
334
|
|
314
|
-
for param in params
|
315
|
-
if param.is_a?(Class)
|
316
|
-
klass = param
|
317
|
-
elsif param.is_a?(Symbol)
|
318
|
-
symbols << param
|
319
|
-
elsif param.is_a?(Hash)
|
320
|
-
# the meta hash.
|
321
|
-
meta = param
|
322
|
-
else
|
323
|
-
raise 'Error when defining property!'
|
324
|
-
end
|
325
|
-
end
|
326
|
-
|
327
335
|
meta[:reader] = false
|
328
336
|
meta[:writer] = true
|
329
337
|
|
@@ -337,25 +345,10 @@ class Module
|
|
337
345
|
#
|
338
346
|
# Example:
|
339
347
|
# prop_accessor String, :name, :title, :body, :sql => "char(32)"
|
340
|
-
|
348
|
+
|
341
349
|
def prop_accessor(*params)
|
342
|
-
meta =
|
343
|
-
klass = Object
|
344
|
-
symbols = []
|
350
|
+
meta, klass, symbols = N::PropertyUtils.resolve_prop_params(params)
|
345
351
|
|
346
|
-
for param in params
|
347
|
-
if param.is_a?(Class)
|
348
|
-
klass = param
|
349
|
-
elsif param.is_a?(Symbol)
|
350
|
-
symbols << param
|
351
|
-
elsif param.is_a?(Hash)
|
352
|
-
# the meta hash.
|
353
|
-
meta = param
|
354
|
-
else
|
355
|
-
raise "Error when defining property!"
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
352
|
meta[:reader] = true
|
360
353
|
meta[:writer] = true
|
361
354
|
|
@@ -371,6 +364,7 @@ class Module
|
|
371
364
|
#--
|
372
365
|
# gmosx: crappy implementation, recode.
|
373
366
|
#++
|
367
|
+
|
374
368
|
def meta(key, val)
|
375
369
|
self.module_eval <<-"end_eval", __FILE__, __LINE__
|
376
370
|
@@__meta[key] ||= []
|
@@ -380,4 +374,3 @@ class Module
|
|
380
374
|
end
|
381
375
|
|
382
376
|
end
|
383
|
-
|