picombo 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/core/core.rb ADDED
@@ -0,0 +1,234 @@
1
+ # Picombo MVC Web Framework
2
+ #
3
+ # Author:: Jeremy Bush
4
+ # Copyright:: Copyright (c) 2010 Jeremy Bush
5
+ # License:: See LICENSE
6
+
7
+ # Picombo is a Rack-based Ruby MVC web framework with design principles taken from the Kohana PHP Framework.
8
+ #
9
+ # It's designed to be fast, lightweight and easy to use.
10
+
11
+ module Picombo
12
+ class Core
13
+ @@extension = 'html'
14
+
15
+ def self.extension()
16
+ @@extension
17
+ end
18
+ def self.extension=(extension)
19
+ @@extension = extension
20
+ end
21
+
22
+ # Standard call function that gets invoked by Rack
23
+ def call(env)
24
+ # start system benchmark
25
+ Picombo::Bench.instance.start('application')
26
+ Picombo::Bench.instance.start('loading')
27
+
28
+ @@env = env
29
+ @@req = Rack::Request.new(env)
30
+
31
+ @@extension = File.extname(@@req.path)[1..-1]
32
+ @@extension = 'html' if @@extension.nil?
33
+
34
+ @@response = Rack::Response.new
35
+ #@@response['Content-Type'] = Picombo::Config.load('mimes.'+@@extension)[0]
36
+ @@response['Content-Type'] = 'text/html'
37
+ @@response.status = 200
38
+ @@redirect = []
39
+
40
+ # Add directory extensions to the filesystem
41
+ Picombo::Config.get('config.extensions').each do |extension|
42
+ require extension
43
+ end
44
+ $LOAD_PATH.delete(APPPATH)
45
+ $LOAD_PATH.unshift(APPPATH)
46
+
47
+ # Load hooks
48
+ Picombo::Config.get('config.hooks').each do |hook|
49
+ Picombo::Core.find_file('hooks', hook).each do |file|
50
+ require file
51
+ end
52
+ end
53
+
54
+ ## intialize the input library
55
+ Picombo::Input.instance.set_request(@@req)
56
+ Picombo::Session.instance.init(@@req)
57
+ Picombo::Cookie.instance.init(@@req)
58
+ Picombo::Bench.instance.stop('loading')
59
+
60
+ Picombo::Log.write(:debug, 'Picombo Setup Complete')
61
+ output = Picombo::Router.new(@@req).process()
62
+
63
+ Picombo::Event.run('system.shutdown')
64
+
65
+ output
66
+ end
67
+
68
+ # Sets a system redirect
69
+ def self.redirect(location, status = 302)
70
+ # Add the base url if a relative path was requested
71
+ location = Picombo::Url.base+location unless location[0..3] == 'http'
72
+
73
+ @@redirect = [location, status]
74
+ render
75
+ end
76
+
77
+ # Adds content to the output buffer
78
+ def self.response(str, status = 200)
79
+ @@response.status = status
80
+ @@response.write(str)
81
+ end
82
+
83
+ # Allows access to raw response object
84
+ def self.raw_response
85
+ @@response
86
+ end
87
+
88
+ # Renders the output buffer. Called by Picombo::Router only.
89
+ def self.render
90
+ if ! @@redirect.empty?
91
+ @@response.redirect(*@@redirect)
92
+ return @@response.finish
93
+ end
94
+
95
+ Picombo::Event.run('system.display')
96
+
97
+ response = @@response.finish
98
+ @@response = Rack::Response.new
99
+ response
100
+ end
101
+
102
+ # Finds a file recursively in the CFS.
103
+ #
104
+ # Searches application, then extension locations in order, then system.
105
+ #
106
+ # Returns an array of files that are found
107
+ def self.find_file(directory, file, required = false, ext = 'rb')
108
+ ext = "."+ext
109
+
110
+ files = []
111
+ $LOAD_PATH.each do |path|
112
+ if File.exist?(path+'/'+directory+'/'+file+ext)
113
+ files.unshift(path+'/'+directory+'/'+file+ext)
114
+ end
115
+ end
116
+
117
+ raise LoadError if required and files.empty?
118
+
119
+ # reverse the array, to put application files first
120
+ return directory == 'config' ? files : files.reverse!
121
+ end
122
+
123
+ # Lists all files and directories in a resource path.
124
+ def self.list_files(directory)
125
+ files = []
126
+
127
+ $LOAD_PATH.each do |path|
128
+ if File.directory?(path+'/'+directory)
129
+ files.concat(Dir.new(path+'/'+directory).entries.collect! {|file|
130
+ unless (file == '.' or file == '..')
131
+ path+directory+'/'+file
132
+ end
133
+ })
134
+ end
135
+ end
136
+ files.delete('.')
137
+ files.delete('..')
138
+ files.compact
139
+ end
140
+ end
141
+
142
+ # Autoloader for missing Picombo classes
143
+ def Picombo.const_missing(name)
144
+ filename = name.to_s
145
+
146
+ require 'classes/'+filename
147
+
148
+ raise filename+' not found!' if ! const_defined?(name)
149
+
150
+ klass = const_get(name)
151
+ return klass if klass
152
+ raise klass+" not found!"
153
+ end
154
+
155
+ # == Model Module
156
+ #
157
+ # Models are the back end classes that handle business logic and data access. They accept input from controllers,
158
+ # and can manipulate data sources such as databases and other kinds of data.
159
+ #
160
+ # === Creating Model Files
161
+ #
162
+ # You can use any kind of modeling library to represent your models, such as DataMapper or ActiveRecord.
163
+ # You can also create "raw" models that don't use a library, and directly access a database. You will need
164
+ # to include your own database access methods in this case
165
+ #
166
+ # === Model Naming Conventions
167
+ # * Models live in the Picombo::Models namespace. They must be prefaced with these modules in the file
168
+ # * Models are placed in the /models directory
169
+ # * Model filenames must be named the same as the class name: class Foobar would live in /models/foobar.rb
170
+ # * Model filenames must be lowercase
171
+ module Models
172
+ # Autoloader for missing models
173
+ def Models.const_missing(name)
174
+ filename = name.to_s
175
+
176
+ require 'models/'+filename.downcase
177
+
178
+ raise filename+' not found!' if ! const_defined?(name)
179
+
180
+ klass = const_get(name)
181
+ return klass if klass
182
+ raise klass+" not found!"
183
+ end
184
+ end
185
+
186
+ # == Controller Module
187
+ #
188
+ # Controllers are the front level classes that expose your app to the web. They pass information to the model,
189
+ # retrieve information from the model, and pass data to views, which contain the final output for users.
190
+ #
191
+ # === Calling Controllers
192
+ # Controllers are called via URIs, i.e. http://example.com/foobar/baz
193
+ # * Segment #1 is the controller name
194
+ # * Segment #2 is the controller method to call
195
+ #
196
+ # Controller Naming Conventions
197
+ # * Controllers live in the Picombo::Controllers namespace. They must be prefaced with these modules in the file
198
+ # * Controllers are placed in the /controllers directory
199
+ # * Controller filenames must be named the same as the class name: class Foobar would live in /controllers/foobar.rb
200
+ # * Controller filenames must be lowercase
201
+ #
202
+ # === Controller Arguments
203
+ # Controller arguments are passed via URI segments after the second, i.e. http://example.com/foobar/baz/foo/bar
204
+ # * This would match the baz method of the foobar controller, and match the arg1 and arg2 method arguments
205
+ # * def baz(arg1, arg2)
206
+ # The arguments must match the method exactly or a 404 exception will occur
207
+ #
208
+ # === Example Controller
209
+ #
210
+ # module Picombo
211
+ # module Controllers
212
+ # class Foobar
213
+ # def index
214
+ # Picombo::Core.response('Hello World!')
215
+ # end
216
+ # end
217
+ # end
218
+ # end
219
+ # This controller and method could be called via http://example.com/foobar/index
220
+ module Controllers
221
+ # Autoloader for missing controller names
222
+ def Controllers.const_missing(name)
223
+ filename = name.to_s
224
+
225
+ require 'controllers/'+filename
226
+
227
+ raise LoadError if ! const_defined?(name)
228
+
229
+ klass = const_get(name)
230
+ return klass if klass
231
+ raise LoadError
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,13 @@
1
+ # Set up database
2
+ DataMapper.setup(:default,
3
+ {:host => Picombo::Config.get('datamapper.default.host'),
4
+ :adapter => Picombo::Config.get('datamapper.default.driver'),
5
+ :database => Picombo::Config.get('datamapper.default.database'),
6
+ :username => Picombo::Config.get('datamapper.default.username'),
7
+ :password => Picombo::Config.get('datamapper.default.password')})
8
+
9
+ module Picombo
10
+ class Model
11
+ include DataMapper::Resource
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ Picombo::Event.add('system.display') do
2
+ Picombo::View::Core.new('bench/footer').render()
3
+ end
@@ -0,0 +1,2 @@
1
+ <h1>Page Not Found</h1>
2
+ <p>The page you requested, <%= @uri %>, was not found.</p>
@@ -0,0 +1,22 @@
1
+ <table style="width: 100%">
2
+ <tr>
3
+ <th align="left">System Benchmarks</th>
4
+ <th align="right">Time</th>
5
+ </tr>
6
+ <tr>
7
+ <td>Picombo Setup</td>
8
+ <td align="right"><%= Picombo::Bench.instance.get('loading') %></td>
9
+ </tr>
10
+ <tr>
11
+ <td>Environment Setup</td>
12
+ <td align="right"><%= Picombo::Bench.instance.get('setup') %></td>
13
+ </tr>
14
+ <tr>
15
+ <td>Controller Execution</td>
16
+ <td align="right"><%= Picombo::Bench.instance.get('controller_execution') %></td>
17
+ </tr>
18
+ <tr>
19
+ <td>Total Execution</td>
20
+ <td align="right"><%= Picombo::Bench.instance.get('application') %></td>
21
+ </tr>
22
+ </table>
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: picombo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeremy Bush
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-04-23 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Picombo is a lightweight MVC framework inspired by the Kohana PHP MVC framework.
17
+ email: contractfrombelow@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/bootstrap.rb
26
+ - lib/classes/bench.rb
27
+ - lib/classes/cache.rb
28
+ - lib/classes/cache_file.rb
29
+ - lib/classes/config.rb
30
+ - lib/classes/cookie.rb
31
+ - lib/classes/e404.rb
32
+ - lib/classes/event.rb
33
+ - lib/classes/html.rb
34
+ - lib/classes/input.rb
35
+ - lib/classes/log.rb
36
+ - lib/classes/router.rb
37
+ - lib/classes/security.rb
38
+ - lib/classes/session.rb
39
+ - lib/classes/url.rb
40
+ - lib/classes/view
41
+ - lib/classes/view/xml.rb
42
+ - lib/classes/view.rb
43
+ - lib/config/cache.yaml
44
+ - lib/config/log.yaml
45
+ - lib/config/mimes.yaml
46
+ - lib/config/routes.yaml
47
+ - lib/controllers
48
+ - lib/controllers/error_404.rb
49
+ - lib/controllers/template.rb
50
+ - lib/core/core.rb
51
+ - lib/hooks/datamapper.rb
52
+ - lib/hooks/profiler.rb
53
+ - lib/views/404.rhtml
54
+ - lib/views/bench/footer.rhtml
55
+ has_rdoc: false
56
+ homepage: http://www.picombo.net/
57
+ post_install_message:
58
+ rdoc_options: []
59
+
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ version:
68
+ required_rubygems_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ requirements: []
75
+
76
+ rubyforge_project:
77
+ rubygems_version: 1.3.1
78
+ signing_key:
79
+ specification_version: 2
80
+ summary: A lightweight MVC web framework
81
+ test_files: []
82
+