cuca 0.01

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. data/application_skeleton/README +21 -0
  2. data/application_skeleton/app/_controllers/application.rb +7 -0
  3. data/application_skeleton/app/_layouts/simple.rb +19 -0
  4. data/application_skeleton/app/_widgets/sourcecode.rb +21 -0
  5. data/application_skeleton/app/_widgets/test.rb +23 -0
  6. data/application_skeleton/app/demo.rb +64 -0
  7. data/application_skeleton/app/index.rb +39 -0
  8. data/application_skeleton/app/user/__default_username/index.rb +7 -0
  9. data/application_skeleton/conf/environment.rb +16 -0
  10. data/application_skeleton/log/access.log +1 -0
  11. data/application_skeleton/log/error.log +1 -0
  12. data/application_skeleton/log/messages +1 -0
  13. data/application_skeleton/public/css/style.css +27 -0
  14. data/application_skeleton/public/dispatch.cgi +31 -0
  15. data/application_skeleton/public/dispatch.fcgi +36 -0
  16. data/application_skeleton/public/img/cuca-seagull.png +0 -0
  17. data/application_skeleton/scripts/console +5 -0
  18. data/application_skeleton/scripts/console.rb +5 -0
  19. data/application_skeleton/scripts/server-lighttpd-fcgi.rb +116 -0
  20. data/application_skeleton/scripts/server-lighttpd.rb +109 -0
  21. data/application_skeleton/scripts/server-webrick.rb +26 -0
  22. data/application_skeleton/scripts/test.rb +8 -0
  23. data/application_skeleton/tests/widgets/link.rb +22 -0
  24. data/bin/cuca +43 -0
  25. data/lib/cuca/app.rb +317 -0
  26. data/lib/cuca/cgi_emu.rb +67 -0
  27. data/lib/cuca/cgi_fix.rb +58 -0
  28. data/lib/cuca/const.rb +3 -0
  29. data/lib/cuca/controller.rb +240 -0
  30. data/lib/cuca/generator/markaby.rb +80 -0
  31. data/lib/cuca/generator/view.rb +121 -0
  32. data/lib/cuca/layout.rb +62 -0
  33. data/lib/cuca/mimetypes.rb +89 -0
  34. data/lib/cuca/session.rb +143 -0
  35. data/lib/cuca/sessionflash.rb +56 -0
  36. data/lib/cuca/sessionpage.rb +41 -0
  37. data/lib/cuca/stdlib/arform.rb +208 -0
  38. data/lib/cuca/stdlib/arview.rb +16 -0
  39. data/lib/cuca/stdlib/form.rb +137 -0
  40. data/lib/cuca/stdlib/formerrors.rb +20 -0
  41. data/lib/cuca/stdlib/link.rb +37 -0
  42. data/lib/cuca/stdlib/list.rb +3 -0
  43. data/lib/cuca/stdlib/listwidget/dblist.rb +122 -0
  44. data/lib/cuca/stdlib/listwidget/list.rb +189 -0
  45. data/lib/cuca/stdlib/listwidget/querydef.rb +167 -0
  46. data/lib/cuca/stdlib/listwidget/staticdatalist.rb +79 -0
  47. data/lib/cuca/stdlib/slink.rb +30 -0
  48. data/lib/cuca/test/helpers.rb +42 -0
  49. data/lib/cuca/urlmap.rb +267 -0
  50. data/lib/cuca/widget.rb +212 -0
  51. data/lib/cuca.rb +68 -0
  52. metadata +141 -0
@@ -0,0 +1,267 @@
1
+
2
+ if __FILE__ == $0 then
3
+ require 'rubygems'
4
+ require 'cuca'
5
+ end
6
+
7
+ module Cuca
8
+
9
+ # URLMap will throw this in case we can't find a controller
10
+ # file for a URL.
11
+ class RoutingError < StandardError # :nodoc:
12
+ end
13
+
14
+
15
+ # == URLMap
16
+ #
17
+ # URLMap is used internally to match a URL to a controller file.
18
+ # Call with ds = URLMap.new('/path/to/app', 'path/from/url')
19
+ #
20
+ # You can then fetch the following values:
21
+ #
22
+ # * script - path to the controller file
23
+ # * assigns - hash with variable assigns from the url (magick prefixes)
24
+ # * subcall - name of subcall or nil if a normal call was made
25
+ # * action - Action name (Note: action.capitalize+"Controller" is your controller class name)
26
+ # * action_path - Path to the action
27
+ # * action_path_full - Full path to application
28
+ # * action_module - The module the action should be loaded into (to avoid name conflicts, depends on action_path)
29
+ #
30
+ #
31
+ # == Match on other URL
32
+ #
33
+ # A widget/controller can make use of the URLMap object to scan on other directories (example to find out if a
34
+ # link url will be withing the same controller).
35
+ #
36
+ # See match? / submatch? and usubmatch?
37
+ #
38
+ #
39
+ # == Notes
40
+ #
41
+ # URL's ending with '/' will be scanned for default index files.
42
+ #
43
+ # URL's where last part (action) starts with '-' will be scanned for
44
+ # subcalls
45
+ #
46
+ # If no script is found or any other error it will raise a RoutingError exception
47
+ #
48
+ #
49
+ # == Example
50
+ #
51
+ # u = URLMap.new('/home/bones/src/cuca_app/app', 'customer/southwind_lda/show'
52
+ #
53
+ # u.script => '/home/bones/src/cuca_app/app/customer/__customer/show.rb'
54
+ # u.action => 'show'
55
+ # u.assigns => { 'customer' => 'southwind_lda' }
56
+ # u.action_path => 'customer/southwind_lda/'
57
+ #
58
+ class URLMap
59
+ attr_reader :assigns
60
+ attr_reader :script
61
+ attr_reader :subcall
62
+ attr_reader :action
63
+ attr_reader :action_path
64
+ attr_reader :action_path_full
65
+ attr_reader :action_module
66
+
67
+ DEF_ACT = Cuca::App::config['magic_action_prefix'] || '__'
68
+ DEF_IDX = [ 'index', 'default' ]
69
+
70
+ private
71
+ def scan_file(base, file)
72
+
73
+ if (file == '') then # check for default index file
74
+ DEF_IDX.each do |idxfile|
75
+ if File.exist?("#{base}/#{idxfile}.rb")
76
+ @action = idxfile
77
+ return "#{idxfile}.rb"
78
+ end
79
+ end
80
+ raise RoutingError.new("No default index file found in #{base}")
81
+ end
82
+
83
+ @action = file
84
+
85
+ # check if a regular file exists:
86
+ # puts "Checking file on #{check}"
87
+ return (file+".rb") if File.exist?("#{base}/#{file}.rb")
88
+
89
+ # check if the subcall file exists:
90
+ if (file[0].chr == '-') then
91
+ (action,subcall) = file.scan(/^\-(.*)\-(.*)$/).flatten
92
+ if action.nil? || subcall.nil? || action.strip.empty? then
93
+ raise RoutingError.new("Bad format on subcall: #{file}")
94
+ end
95
+ raise RoutingError.new("Script not found for subcall: #{file}: #{action}.rb") if !File.exist?("#{base}/#{action}.rb")
96
+ @subcall = subcall
97
+ @action = action
98
+ return "#{action}.rb"
99
+ end
100
+ end
101
+
102
+ private
103
+ def scan_dir(base, file)
104
+ return file if File.directory?("#{base}/#{file}")
105
+
106
+ d = Dir["#{base}/#{DEF_ACT}*"].collect { |f| f.split('/').last }
107
+
108
+ # puts "Directory not found, checking for default in #{base} - #{file}"
109
+
110
+ # puts d.inspect
111
+ #
112
+ raise RoutingError.new("Multiple default actions defined in #{base}") if d.size > 1
113
+ raise RoutingError.new("Routing Error in #{base}") if d.empty?
114
+
115
+
116
+ @assigns[d[0][DEF_ACT.size..-1]] = file
117
+ d[0]
118
+ end
119
+
120
+
121
+ private
122
+ def make_module(path)
123
+ const_name = "Appmod_#{path.gsub(/[\/\\]/, '_')}"
124
+
125
+ if Cuca::const_defined?(const_name.intern) then
126
+ return Cuca::const_get(const_name.intern)
127
+ end
128
+
129
+ m = Module.new
130
+ Cuca::const_set(const_name.intern, m)
131
+ return m
132
+ end
133
+
134
+
135
+ # scan will match an URI to a script and set assigns. (called from initialize)
136
+ private
137
+ def scan
138
+ files = @path_info.split('/')
139
+
140
+ files << '' if @path_info[@path_info.size-1].chr == '/' # add empty element if we point to a directory
141
+
142
+ # puts files.inspect
143
+ real_path = @base_path
144
+
145
+ # scan directory
146
+ files.each_index do |idx|
147
+ next if idx >= (files.size-1) # skip last element
148
+ r = scan_dir(real_path, files[idx])
149
+ raise RoutingError.new("Routing Error at #{real_path} - #{files[idx]}") if !r
150
+ real_path = "#{real_path}/#{r}"
151
+ end
152
+
153
+ @action_path = real_path[@base_path.length..-1]
154
+ @action_path_full = real_path
155
+ @action_module = make_module(@action_path)
156
+
157
+ # scan file (last element)
158
+ r = scan_file(real_path, files.last)
159
+
160
+ raise RoutingError.new("Routing Error - script not found at #{real_path} - #{files.last}") if !r
161
+
162
+ real_path = "#{real_path}/#{r}"
163
+
164
+ @script = File.expand_path(real_path)
165
+ self
166
+ end
167
+
168
+
169
+ # match will check if the supplied url maches with a script
170
+ # returns boolean
171
+ #
172
+ # Example:
173
+ # URLMap('/path/to/app', '/customer/southwind_lda/').match?('/path/to/app/customer/__custid/index.rb') => true
174
+ public
175
+ def match?(script)
176
+ m_script = @script
177
+ p_script = File.expand_path(script)
178
+
179
+ # $stderr.puts "URLMap::match - #{m_script} - #{p_script}"
180
+ return (m_script == p_script)
181
+ rescue RoutingError
182
+ false
183
+ end
184
+
185
+
186
+ # this will match if the current script can be found within a path
187
+ # from the parameters.
188
+ #
189
+ # Example:
190
+ # URLMap('/path/to/app', '/customer/southwind_lda/').submatch?('/customer/__custid/') => true
191
+ public
192
+ def submatch?(some_path)
193
+ # $stderr.puts "Submatch: #{some_path} with #{@script} - #{(@script.length < some_path.length).inspect} #{@script.include?(some_path)}"
194
+ return false if @script.length < some_path.length
195
+ return @script.include?(some_path)
196
+ end
197
+
198
+ # this will match the current script to a part of a url (link):
199
+ #
200
+ # Example:
201
+ # URLMap('/path/to/app', '/customer/southwind_lda/').submatch?('/customer/other_customer/') => true
202
+ public
203
+ def usubmatch?(some_path)
204
+ @path_info.include?(some_path)
205
+ end
206
+
207
+ # FIXME: needed?
208
+ public
209
+ def has_script?(script)
210
+ return !(@script == '')
211
+ end
212
+
213
+
214
+ def initialize(base_path, path_info, default_actions = ['index'])
215
+ @path_info = path_info
216
+ @base_path = base_path
217
+ @script = ''
218
+ @subcall = nil
219
+ @default_actions = default_actions
220
+ @assigns = {}
221
+ @action = ''
222
+ @action_path = ''
223
+ scan
224
+ self
225
+ end
226
+
227
+ end
228
+
229
+ end
230
+
231
+
232
+ #
233
+ # Testings:
234
+ #
235
+
236
+ if __FILE__ == $0 then
237
+ require 'app'
238
+
239
+ BASE = '/home/bones/src/cuca/app'
240
+ URL = 'user/martin/'
241
+
242
+ puts "Testing on '#{BASE}' - '#{URL}'"
243
+
244
+ module Cuca
245
+ ds = URLMap.new(BASE, URL)
246
+ begin
247
+ rescue RoutingError => e
248
+ puts "E: Invalid request #{$!}"
249
+ end
250
+
251
+
252
+
253
+ puts "Match with: #{ds.match?('/home/bones/src/cuca/app/user/__default_username/index.rb')}"
254
+ puts "Submatch with /user/__username/ #{ds.submatch?('/user/__username/')}"
255
+ puts "Submatch with '/user/' #{ds.submatch?('/user/')}"
256
+ puts "USubmatch with '/user/' #{ds.usubmatch?('/user/martin')}"
257
+ puts
258
+ puts "Script is: #{ds.script}"
259
+ puts "Assigns are: #{ds.assigns.inspect}"
260
+ puts "Subcall: #{ds.subcall.inspect}"
261
+ puts "Action: #{ds.action}"
262
+ puts "Action Path: #{ds.action_path}"
263
+ puts "Action Path Full: #{ds.action_path_full}"
264
+ puts "Action Module: #{ds.action_module.inspect}"
265
+ end
266
+
267
+ end
@@ -0,0 +1,212 @@
1
+ module Cuca
2
+ # === Widget
3
+ #
4
+ # All elements that generate content (e.g. html) are widgets. To implement a widget create
5
+ # a class derrived from Cuca::Widget and overwrite the +output+ method. The output method
6
+ # can take any argument or blocks - whatever you need to build your content. At the end you
7
+ # should write your result to @_content. For this it is advisable to use the content accessor
8
+ # or any of the Cuca::Generator 's.
9
+ #
10
+ # == Variables
11
+ #
12
+ # Instance variables shall be used by sub-widgets and generators. You can fetch them
13
+ # with get_assigns.
14
+ #
15
+ # == Naming
16
+ #
17
+ # Name all widgets like YournameWidget - when using them in a generator simply call them
18
+ # without the 'Widget' and directly with the paramenters of the output.
19
+ #
20
+ # == Examples
21
+ # An example widget without a generator:
22
+ #
23
+ # class BigfontWidget < Cuca::Widget
24
+ # def output(text_to_print)
25
+ # content << "<b><i>#{text_to_print}</i></b>"
26
+ # end
27
+ # end
28
+ #
29
+ #
30
+ # Example with the Markaby Generator - makes use of the BigfontWidget example above
31
+ #
32
+ # require 'cuca/generators/markaby'
33
+ #
34
+ # class HeadlineWidget < Cuca::Widget
35
+ # include Cuca::Generator::Markaby
36
+ #
37
+ # def output(text_to_print)
38
+ # @t = text_to_print # only instance variables are visisble to generators
39
+ # mab { div.headline { Bigfont(@t) }}
40
+ # end
41
+ # end
42
+ #
43
+ class Widget
44
+
45
+ # An accessor to @_content
46
+ # All 'generators' (like the mab -function) should append their
47
+ # generated clear text to @_content, latest with the before_to_s method
48
+ def content
49
+ @_content
50
+ end
51
+
52
+ # overwrite the content
53
+ def content=(newval)
54
+ @_content = newval
55
+ end
56
+
57
+
58
+ # an accessor to the current controller object - if available, otherwise nil
59
+ def controller
60
+ $controller_object || nil
61
+ end
62
+
63
+ # Hints is shared a shared container for all widgets. If you want to pass an information
64
+ # from one widget to another this can be useful.
65
+ # The last widget renered is the controller, then the Layout.
66
+ def hints
67
+ @@_hints
68
+ end
69
+
70
+ # clear all hints
71
+ def self.clear_hints
72
+ @@_hints = {}
73
+ end
74
+
75
+ # An accessor to the global cgi variables
76
+ def cgi
77
+ $cgi
78
+ end
79
+
80
+ # An accessor to the global logger variables
81
+ def log
82
+ $logger
83
+ end
84
+
85
+ # An accessor to the Cuca::app object
86
+ def app
87
+ $app
88
+ end
89
+
90
+
91
+ # an accessor to cgi.parameters variables. This is NOT params from the CGI class
92
+ # (see cgi_fix)
93
+ def params
94
+ $cgi.parameters
95
+ end
96
+
97
+ # accessor to cgi query parameters (http GET)
98
+ def query_parameters
99
+ $cgi.query_parameters
100
+ end
101
+
102
+ # accessor to the cgi request parameters (http POST)
103
+ def request_parameters
104
+ $cgi.request_parameters
105
+ end
106
+
107
+ # an accessor to request_method
108
+ def request_method
109
+ return $cgi.request_method
110
+ end
111
+
112
+ # Escape a string to use with URL etc..
113
+ def escape(text)
114
+ CGI::escape(text)
115
+ end
116
+
117
+ # Unescape an escaped string
118
+ def unescape(text)
119
+ CGI::unescape(text)
120
+ end
121
+
122
+ # escape a string on HTML codes
123
+ def escapeHTML(text)
124
+ CGI::escapeHTML(text)
125
+ end
126
+
127
+ # unescape an html escaped string
128
+ def unescapeHTML(text)
129
+ CGI::unescapeHTML(text)
130
+ end
131
+
132
+
133
+ # initialize - don't use widgets directly with .new.
134
+ #
135
+ # params[:assigns] variables in form of hash(var=>val) to make available to
136
+ # the generator blocks if they require/need
137
+ # params[:args] will be passed to the output method
138
+ # block will also be passed to the output method
139
+ def initialize(params = {}, &block)
140
+ @_assigns = params[:assigns] || {}
141
+ @_args = params[:args] || {}
142
+ @_profiler = params[:profiler] || nil
143
+ @_block = block
144
+ @_content = ""
145
+
146
+ @@_hints ||= {}
147
+ end
148
+
149
+ # will fetch a list of assigns to be passed to a code generator block
150
+ # this includes the :assigns from the constructor plus all instance
151
+ # variables from the widget
152
+ def get_assigns
153
+ a = @_assigns.clone
154
+
155
+ self.instance_variables.each do |v|
156
+ next if v.match(/^\@\_/)
157
+ next if v.include?('cancel_execution') # this is some internal key
158
+ a[v.gsub(/\@/,'')] = self.instance_variable_get(v)
159
+ end
160
+ return a
161
+ end
162
+
163
+ # clear widgets generated content
164
+ def clear
165
+ @_content = ""
166
+ end
167
+
168
+
169
+ # Overwrite this method with a function that takes the arguments and optionally
170
+ # a block as you like.
171
+ def output(*args, &block)
172
+ @_content = "This widget doesnt have any content"
173
+ end
174
+
175
+
176
+ # this method can be implemented by the generator
177
+ # to do finishing touches to @_content. Will be called before
178
+ # @content.to_s is returned to the controller/App
179
+ # def before_to_s
180
+ # end
181
+
182
+ # get cleartext for the widget
183
+ def to_s
184
+ if @_profiler then
185
+ require 'profiler'
186
+ Profiler__::start_profile
187
+ end
188
+
189
+ output(*@_args, &@_block)
190
+ before_to_s if self.methods.include?('before_to_s')
191
+ content = @_content.to_s
192
+
193
+ if @_profiler then
194
+ Profiler__::stop_profile
195
+ @_profiler.puts "____________________PROFILER #{self.class.inspect} ______________________"
196
+ Profiler__::print_profile(@_profiler)
197
+ end
198
+
199
+ return content
200
+ end
201
+
202
+
203
+ # this can be used by derrived classes
204
+ def self.define_attr_method(name, value=nil)
205
+ sing = class << self; self; end
206
+ sing.class_eval "def #{name}; #{value.inspect}; end"
207
+ # $stderr.puts "def #{name}; #{value.to_s.inspect}; end"
208
+ end
209
+
210
+ end
211
+
212
+ end # Module
data/lib/cuca.rb ADDED
@@ -0,0 +1,68 @@
1
+ # == Cuca - a widget-based web framework
2
+ #
3
+ # Cuca is a small web development framework mainly designed to build
4
+ # applications - there is little focus on design but more on coding
5
+ # efficiency.
6
+ #
7
+ # It implements the following concepts:
8
+ # * A Widget is a screen element. Can be a full page or part of it.
9
+ # The Controller and the Layout are Widgets, too.
10
+ # * A Controller deals with one request URI (get, post or both) and can set variables
11
+ # other widgets can make use of. It can also define a Layout and filters.
12
+ # * A Layout wraps the output of a controller and finally return the
13
+ # built web page.
14
+ # * A Generator (NOT "code generator") can be used within any Widget to help building the web content.
15
+ # Cuca comes with a Markaby and eruby Generator.
16
+ # * A Session can used optionally to keep stateful data.
17
+ #
18
+ #
19
+ # When you 'require' cuca you must set the global varibale $cuca_path to the root of your
20
+ # application structure. This is normally done by your dispatch.cgi or dispatch.fcgi
21
+ # script that comes with the cuca application skeleton.
22
+ #
23
+ # === See also
24
+ #
25
+ # * Cuca::Widget
26
+ # * Cuca::Controller
27
+ # * Cuca::Layout
28
+ # * Cuca::Session
29
+ # * Cuca::App
30
+
31
+ require 'cgi'
32
+ require 'cuca/cgi_fix'
33
+ require 'rubygems'
34
+
35
+ # All Classes are defined under this namespace
36
+ module Cuca
37
+
38
+ class CucaException < Exception # :nodoc:
39
+ end
40
+
41
+ # Any error on the application
42
+ class ApplicationException < Exception
43
+ end
44
+
45
+ end
46
+
47
+
48
+ if $cuca_path.nil? then
49
+ $stderr.puts "WARN: $cuca_path not found, assuming #{Dir.pwd}"
50
+ $cuca_path = Dir.pwd
51
+ end
52
+
53
+ require 'cuca/const'
54
+
55
+ $cuca_path = File.expand_path($cuca_path) + '/'
56
+
57
+ require 'cuca/app'
58
+
59
+ $LOAD_PATH << $cuca_path+'/lib'
60
+ begin
61
+ require $cuca_path+'/conf/environment'
62
+ rescue LoadError => e
63
+ $stderr.puts "WARN: Error loading conf/environment: #{e}"
64
+ end
65
+
66
+ require 'cuca/widget'
67
+ require 'cuca/controller'
68
+ require 'cuca/layout'
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cuca
3
+ version: !ruby/object:Gem::Version
4
+ version: "0.01"
5
+ platform: ruby
6
+ authors:
7
+ - Martin Boese
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-08 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: markaby
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0.5"
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: fcgi
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: 0.8.7
32
+ version:
33
+ description: Cuca is a light web development framework that supports CGI and FastCGI. It has a widget-bases approach to reuse functionality and does not implement an MVC architecture. Content can be generated directly by the controller with the help of external widgets that can generate code using markaby, eruby or any other user implemented 'generator'. It supports pretty URL's, layouts, sessions and the rendering of 'partials'.
34
+ email: boesemar@gmx.de
35
+ executables:
36
+ - cuca
37
+ extensions: []
38
+
39
+ extra_rdoc_files: []
40
+
41
+ files:
42
+ - bin/cuca
43
+ - lib/cuca.rb
44
+ - lib/cuca
45
+ - lib/cuca/cgi_fix.rb
46
+ - lib/cuca/controller.rb
47
+ - lib/cuca/stdlib
48
+ - lib/cuca/stdlib/arview.rb
49
+ - lib/cuca/stdlib/form.rb
50
+ - lib/cuca/stdlib/link.rb
51
+ - lib/cuca/stdlib/slink.rb
52
+ - lib/cuca/stdlib/arform.rb
53
+ - lib/cuca/stdlib/listwidget
54
+ - lib/cuca/stdlib/listwidget/querydef.rb
55
+ - lib/cuca/stdlib/listwidget/dblist.rb
56
+ - lib/cuca/stdlib/listwidget/staticdatalist.rb
57
+ - lib/cuca/stdlib/listwidget/list.rb
58
+ - lib/cuca/stdlib/list.rb
59
+ - lib/cuca/stdlib/formerrors.rb
60
+ - lib/cuca/generator
61
+ - lib/cuca/generator/markaby.rb
62
+ - lib/cuca/generator/view.rb
63
+ - lib/cuca/sessionflash.rb
64
+ - lib/cuca/widget.rb
65
+ - lib/cuca/mimetypes.rb
66
+ - lib/cuca/test
67
+ - lib/cuca/test/helpers.rb
68
+ - lib/cuca/sessionpage.rb
69
+ - lib/cuca/session.rb
70
+ - lib/cuca/cgi_emu.rb
71
+ - lib/cuca/app.rb
72
+ - lib/cuca/urlmap.rb
73
+ - lib/cuca/layout.rb
74
+ - lib/cuca/const.rb
75
+ - application_skeleton/log
76
+ - application_skeleton/log/messages
77
+ - application_skeleton/log/error.log
78
+ - application_skeleton/log/access.log
79
+ - application_skeleton/README
80
+ - application_skeleton/tests
81
+ - application_skeleton/tests/widgets
82
+ - application_skeleton/tests/widgets/link.rb
83
+ - application_skeleton/app
84
+ - application_skeleton/app/index.rb
85
+ - application_skeleton/app/demo.rb
86
+ - application_skeleton/app/_controllers
87
+ - application_skeleton/app/_controllers/application.rb
88
+ - application_skeleton/app/_layouts
89
+ - application_skeleton/app/_layouts/simple.rb
90
+ - application_skeleton/app/_widgets
91
+ - application_skeleton/app/_widgets/test.rb
92
+ - application_skeleton/app/_widgets/sourcecode.rb
93
+ - application_skeleton/app/user
94
+ - application_skeleton/app/user/__default_username
95
+ - application_skeleton/app/user/__default_username/index.rb
96
+ - application_skeleton/app/_views
97
+ - application_skeleton/scripts
98
+ - application_skeleton/scripts/server-lighttpd-fcgi.rb
99
+ - application_skeleton/scripts/console.rb
100
+ - application_skeleton/scripts/test.rb
101
+ - application_skeleton/scripts/server-lighttpd.rb
102
+ - application_skeleton/scripts/server-webrick.rb
103
+ - application_skeleton/scripts/console
104
+ - application_skeleton/lib
105
+ - application_skeleton/public
106
+ - application_skeleton/public/dispatch.fcgi
107
+ - application_skeleton/public/dispatch.cgi
108
+ - application_skeleton/public/css
109
+ - application_skeleton/public/css/style.css
110
+ - application_skeleton/public/img
111
+ - application_skeleton/public/img/cuca-seagull.png
112
+ - application_skeleton/conf
113
+ - application_skeleton/conf/environment.rb
114
+ has_rdoc: true
115
+ homepage: http://cuca.rubyforge.org/
116
+ post_install_message:
117
+ rdoc_options: []
118
+
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: "0"
126
+ version:
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: "0"
132
+ version:
133
+ requirements: []
134
+
135
+ rubyforge_project: cuca
136
+ rubygems_version: 1.1.1
137
+ signing_key:
138
+ specification_version: 2
139
+ summary: A widget-based web framework
140
+ test_files: []
141
+